Kaggle

5차시 타이타닉 모델링 to_frame(), display(), standardscaler, OneHotEncoder(), knnimputer, dendrogram, missingno, re, fit_transform(), rename()

Olivia-BlackCherry 2024. 3. 27. 17:22

to_frame(), display(), standardscaler,  OneHotEncoder(), knnimputer, dendrogram, missingno, re, fit_transform(), rename()목차

     

    <참고 kaggle >

    Titanic_model_with_98%_accuracy (kaggle.com)

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    import klib
    import plotly_express as px
    import missingno as mogn
    import warnings
    from dash import Dash,dcc,html,Input,Output
    from dython.nominal import associations
    warnings.filterwarnings('ignore')
    
    from sklearn.preprocessing import OneHotEncoder
    
    #First we will used KNNImputer
    from sklearn.experimental import enable_iterative_imputer
    from sklearn.impute import KNNImputer,SimpleImputer
    from feature_engine.wrappers import SklearnTransformerWrapper
    from sklearn.preprocessing import StandardScaler
    from sklearn.ensemble import ExtraTreesRegressor
    from sklearn.impute import IterativeImputer

     

     

     

    1. to_frame() 

    series 객체에서만 사용

    series를 dataframe 데이터프레임으로 변환하는데 사용. 

     

     

     

    2. .T transpose

    트랜스포즈라고 부른다. 데이터프레임의 행과 열을 바꿔준다.

     

     

     

    3. display()

    데이터프레임을 보기 좋게 출력하는데 유용하다. 

    print() 함수 대안이 될 수 있으며, dataframe, series 같은 판다스 객체를 출력할 때 더 깔끔한 결과를 제공한다.

    #check the value of rows
    for col in train_df.select_dtypes('object'):
        display(train_df[col].value_counts().to_frame().T)

     

     

     

    4. 타입힌트

    - 데이터 컬럼별 결측값 찾기 사용자함수

    사용자함수에서 인수로 받는 부분에 : 콜론 표시가 있다. 

    이것은 파이썬3.5버전이상에서 사용할 수 있는 것으로, 

    타입힌트라고 불린다. 

    함수의 인자나 반환값이 어떤 타입이어야 하는지 명시적으로 지정하는 기능이다.

    def missing_value(train_df:pd.DataFrame):
        """null 값 찾기 """
        missing_train_df=train_df.isnull().sum()
        total_record=train_df.shape[0]
        perc_missing=round((missing_train_df/total_record)*100,3)
        missing_train_df=pd.DataFrame(data={'columns_name':missing_train_df.index,
                                      'num_missing':missing_train_df.values,
                                      'perc_missing':perc_missing.values})
    
        return missing_train_df.sort_values(by='perc_missing',ascending=False)
    missing_value(train_df)

    위의 경우에서 missing value의 인수는 train_df를 예시로, dataFrame 타입이어야 함을 나타낸다. 

    이런 타입힌트를 통해 코드의 가독성을 높인다.

     

     

     

    5. klib 라이브러리

    전처리에 유용한 함수

    missingval_plot 데이터셋 결측치 시각적 분석

    import klib
    klib.missingval_plot(test_df)

     

     

     

     

    6. dendrogram

    missingno는 결측 데이터를 시각화, 분석하는데 도움주는 라이브러리다. 

      dendrogram은 계층적 클러스터링에서 사용되는 시각화방법이다. 

    데이터를 유사도에 따라 그룹화하는 방법. 

    각 데이터 포인트를 독립적인 클러스터로 시작하여, 가장 가까운 클러스터끼리 차례대로 합치면서, 최종적으로 하나의 클러스터가 될 때까지 진행된다.

    import missingno as mogn
    mogn.dendrogram(train_df)

     

     

    7. rename , str, lower()

    컬럼 이름을 바꾼다. 

      str 문자열 메소드 쓰기 위함

      lower() 소문자로

      upper() 대문자로

    train_df.rename(columns={'PassengerId':'Passenger_id','SibSp':'Sib_Sp'},inplace=True)
    test_df.rename(columns={'PassengerId':'Passenger_id','SibSp':'Sib_Sp'},inplace=True)
    train_df.columns=train_df.columns.str.lower()
    test_df.columns=test_df.columns.str.lower()

     

     

     

    8. re

    정규표현식 regular expression을 지원하기 위해 제공되는 표준 라이브러리이다.

    특정 패턴을 검색, 대체, 분리하는 복잡한 문자열 처리를 쉽게 할 수 있다. 

     

    < 주요 함수 >

      match()   문자열의 시작부터 패턴이 일치하는지 확인

    findall()   패턴과 일치하는 모든 부분을 리스트로 반환

    sub()   패턴과 일치하는 모든 부분을 주어진 문자열로 대체

      search()   문자열 전체에서 패턴과 일치하는 부분 검색

    compile()   정규 표현식 패턴을 컴파일하여 객체 생성

    dataset['deck'] = dataset['cabin'].map(lambda x: re.compile("([a-zA-Z]+)").search(x).group())

    re.compile("([a-zA-Z]+)") : 알파벳에 해당하는 문자열 패턴을 컴파일한다.

    .search(x).group() x문자열에서 검색을 수행하고, 일치하는 부분의 문자열을 반환한다.

     

     

     

    9. 결측값 처리 전후 비교

    < 그래프 >

    df_con=train_df.copy()
    #전: 오렌지색 / 후: 파랑색
    df_con.age.plot.kde(color='orange',label='age')
    df_con.age.fillna(value=df_con.age.median()).plot.kde(color='blue',label='age_fillna')

     

    < 표준편차 >

    round(df_con.age.std(),2),round((df_con.age.fillna(value=df_con.age.median())).std(),2)

     

     

     

    10. StadardScaler

    데이터 표준화하는 데 사용하는 함수. 

      feature의 평균을 0, 분산을 1로 조정하여 데이터의 스케일을 표준화한다.

    # 숫자형 dtype 컬럼만 뽑기
    num_name=list(train_df.select_dtypes('number').drop(['passenger_id','survived'],axis=1).columns)
    # 숫자형 dtype의 df 뽑기
    number_df=train_df.select_dtypes('number').drop(['passenger_id','survived'],axis=1)
    
    # 스케일러 선택하기
    scaler=StandardScaler()

    https://olivia-blackcherry.tistory.com/532

     

    머신러닝 과정 전체, preprocessing.StandardScaler(), fit(), transform(), fit_transform(), gridsearchCV, scores

    목차 빅데이터를 가지고 머신러닝 모델로 데이터의 insight를 얻기 위한 일련의 과정을 경험해본다. 1.Data 아래의 두 데이터를 보면, 첫 번째는 완전히 정형화되지 않은 형태의 데이터이고, 두 번

    olivia-blackcherry.tistory.com

     

     

     

     

    11. fit_transform

    데이터전처리과정에서 fit과 transform 동시에 수행. 

      fit : 데이터 변환을 위한 기준 정보(평균, 표준편차 등)들을 계산

      transform : 기준 정보를 사용하여 데이터를 변환한다.

    ---> 데이터변환을 위한 기준을 설정하고, 그 기준에 따라 데이터를 변환.

    + 데이터의 특성별로 값의 범위가 다를 때, 이를 일정한 범위로 조정하는 과정에서 사용된다.

    from sklearn.preprocessing import StandardScaler
    def scaler_data(df,scaler,columns):
        """
        function to scaler the data
        """
        df_scaler=df.copy()
        if columns:
            df_scaler[columns]=scaler.fit_transform(df_scaler[columns])
        else:
            columns=[col for col in df_scaler]
            df_scaler[columns]=scaler.fit_transform(df_scaler[columns])
        return df_scaler,scaler
    
    df_scaled,scaler=scaler_data(number_df,scaler=scaler,columns=num_name)
    df_scaled.head()

     

     

     

    12. KNNImputer (K-nearest Neighbors) 

    최근접 이웃 알고리즘이다. 주어진 데이터셋에서 누락된 값이 있는 샘플의 가장 가까운 k개의 이웃을 찾아, 그 이웃들의 평균값으로 누락값을 대체한다. 

    from sklearn.impute import KNNImputer,SimpleImputer
    knn_imputer=SklearnTransformerWrapper(transformer=KNNImputer(n_neighbors=3,weights='distance'),variables=num_name)
    df_imputed = knn_imputer.fit_transform(df_scaled)

     

    SklearnTransformerWrapper와 KNNImputer을 활용해 누락값을 채워보자. 

      n_neighbors 이웃수

      weights : 이웃의 거리에 따라 가중치를 다르게 적용

      distance : 가까운 이웃일수록 더 큰 가중치

      transformer : 선택한 feature에 대해 skcitlearn변환기를 적용하는 wrapper.

      variable : 파라미터를 통한 변환을 적용할 변수를 지정.

     

    < 시각화 >

    # 기본 age 그래프(오렌지)
    df_con.age.plot.kde(color='orange',label='age')
    # scaler된 age 그래프(파랑)
    df_imputed.age.plot.kde(color='blue',label='age_knn')
    # age에 null각ㅄ을 0을 바꾼상황에서 
    df_con.age.fillna(value=df_con.age.median()).plot.kde(color='green',label='age_fillna')
    plt.legend()
    plt.show()
    print(round(df_con.age.std(),2),round(df_imputed.age.std(),2))

     

     

     

    13. IterativeImputer

    누락된 값을 예측하기 위해 각 특성을 다른 특성의 함수로 모델링하는 전략. 

    라운드 로빈 방식으로 진행되며, extraTreeRegressor을 예측 모델로 사용했다.

     

    train_data 변환

    miss_forest=IterativeImputer(estimator=ExtraTreesRegressor(),
                                 initial_strategy='median',max_iter=200)
    tree_imputed=miss_forest.fit_transform(number_df)
    tree_imputed_df=pd.DataFrame(data=tree_imputed,columns=miss_forest.get_feature_names_out())

     

    test_data 변환

    test_imputed=miss_forest.transform(test_df[num_name])
    test_imputed_df=pd.DataFrame(data=test_imputed,columns=miss_forest.get_feature_names_out())

     

     

    <시각화>

    tree_imputed_df.age.plot.kde(color='red',label='age_tree')
    
    print(round(df_con.age.std(),2),round(df_imputed.age.std(),2),round(tree_imputed_df.age.std(),2))

     

    <변환된 값으로 다시 바꾸기>

    train_df['age']=tree_imputed_df['age']
    test_df['age']=test_imputed_df['age']
    test_df['fare']=test_imputed_df['fare']
    #fill  the missing value with the mode value
    
    train_df['embarked'].fillna(value='S' ,inplace=True)

     

     

     

    14. OnehotEncoder 원핫인코딩

    필요없는 열은 삭제한다.

    for df in data:
        df.drop(['name','ticket','passenger_id'],axis=1,inplace=True)

     

    원핫인코딩 함수를 만든다.

    from sklearn.preprocessing import OneHotEncoder,LabelEncoder
    from sklearn.preprocessing import StandardScaler
    
    def ohe_encoder(data):
        df=data.copy()
        ohe_cols=[col for col in df if df[col].dtype in ['object','category']]
        ohe=OneHotEncoder(drop='first',sparse_output=False)
        ohe_encoder=ohe.fit_transform(df[ohe_cols])
        df_ohe_encoded=pd.DataFrame(ohe_encoder,columns=ohe.get_feature_names_out())
        df_encoded=pd.concat([df_ohe_encoded,df],axis=1)
        df_encoded.drop(ohe_cols,axis=1,inplace=True)
        return df_encoded

     

    OneHotEncoder(drop='first', sparse_output=False)

      drop='first'

    각 특성에서 첫 번째 범주를 삭제한다. 

    dummy variable trap을 피하고, multicollinearity 다중공선성 문제를 줄이는 데 도움이 됨

      sparse_output=False

    밀집된 출력을 생성하도록 한다. 

     

    df_encoded=ohe_encoder(train_df)
    df_encoded.head()

     

    https://olivia-blackcherry.tistory.com/575

     

    categorical data to numerical data, value_counts(), Categorical(), qcut(), .cat.codes, get_dummies(), pivot(), heatmap

    목차 Categorical data Data that is divided into a limited number of qualitative groups 어떠한 기준에 의해 분류되는 데이터이다. 데이터분석에서는 카테고리테이터를 numerical data, 숫자형 데이터로 바꾸는 작업이

    olivia-blackcherry.tistory.com

     

     

     

    15. normalize

      standardscaler를 이용하여 정규화 시켜준다.

    평균0, 표준편차1의 분포로!

    def normalize_data(data):
      df=data.copy()
      scaler=StandardScaler()
      for col in df:
        if col != 'survived':
          df[col]=scaler.fit_transform(df[[col]])
      return df
    scaled_df=normalize_data(df_encoded)

     

     

    올리비아코딩스쿨