ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 머신 러닝 만들기 - 데이터 전처리
    기계학습 2021. 9. 17. 17:07

    Handling of Missing Data

    비어있는 데이터 채우기

    array([['India', 49.0, 86400.0],
           ['Brazil', 32.0, 57600.0],
           ['USA', 35.0, 64800.0],
           ['Brazil', 43.0, 73200.0],
           ['USA', 45.0, nan],
           ['India', 40.0, 69600.0],
           ['Brazil', nan, 62400.0],
           ['India', 53.0, 94800.0],
           ['USA', 55.0, 99600.0],
           ['India', 42.0, 80400.0]], dtype=object)

    'nan' 이라고, 되있는 부분이 비어있는 데이터 공간이다.

    이 공간을 같은 속성의 값을 가진 데이터들의 평균값으로 넣어줄 것이다.

    import numpy as np
    import pandas as pd
    
    from sklearn.impute import SimpleImputer # used for handling missing data
    
    imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
    imputer = imputer.fit(X[:, 1:])
    X[:, 1:] = imputer.transform(X[:, 1:])
    
    array([[49.0, 86400.0],
           [32.0, 57600.0],
           [35.0, 64800.0],
           [43.0, 73200.0],
           [45.0, 76533.33333333333],
           [40.0, 69600.0],
           [43.77777777777778, 62400.0],
           [53.0, 94800.0],
           [55.0, 99600.0],
           [42.0, 80400.0]], dtype=object)
           # 소수점이 긴 부분이 nan 부분이 었다.

    대략적으로 이런 흐름으로 코드를 짜면, 위와 같이 nan으로 되어있던 빈 공간이 채워지게 된다.

    Handling of Categorical Data

    비어있던 데이터를 채웠다. 하지만 앞의 국가 표시가 여러개 중복되어있다.

    이 부분을 간략하게 만드는 작업을 할 것이다.

    from sklearn.preprocessing import LabelEncoder # used for encoding categorical data
    
    from sklearn.preprocessing import LabelEncoder
    labelencoder_X = LabelEncoder()
    X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
    
    array([[1, 49.0, 86400.0],
           [0, 32.0, 57600.0],
           [2, 35.0, 64800.0],
           [0, 43.0, 73200.0],
           [2, 45.0, 76533.33333333333],
           [1, 40.0, 69600.0],
           [0, 43.77777777777778, 62400.0],
           [1, 53.0, 94800.0],
           [2, 55.0, 99600.0],
           [1, 42.0, 80400.0]], dtype=object)

    Feature Scaling

    이제 데이터를 아주 간단하게 나타내기 위해 minmaxscale을 해준다.

    이렇게 해주면, 데이터를 간결하게 만들어도, 데이터 간의 관계성을 해치지 않는다.

    minmaxscale

    from sklearn.preprocessing import StandardScaler # used for feature scaling
    
    from sklearn.preprocessing import  MinMaxScaler
    minmax_scaler = MinMaxScaler()
    X = minmax_scaler.fit_transform(X)
    print(X)
    
    [[0.5        0.73913043 0.68571429]
     [0.         0.         0.        ]
     [1.         0.13043478 0.17142857]
     [0.         0.47826087 0.37142857]
     [1.         0.56521739 0.45079365]
     [0.5        0.34782609 0.28571429]
     [0.         0.51207729 0.11428571]
     [0.5        0.91304348 0.88571429]
     [1.         1.         1.        ]
     [0.5        0.43478261 0.54285714]]

    여기서, 1은 MAX, 0 MIN 의미이다.

    데이터의 크기를 축소하고, 데이터끼리 비교가 쉽다.

    새로운 데이터 첨가

    넘파이로 데이터 준비

    import numpy as np
    fish_data = np.column_stack((fish_length,fish_weight))
    
    [[  25.4  242. ]
     [  26.3  290. ]
     [  26.5  340. ]
     [  29.   363. ]
     ...]
     
     fish_target = np.concatenate((np.ones(35), np.zeros(14))) # fish_target = [1]*35 + [0]*14
    
    [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
     1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0.]

    사이킷런으로 데이터 나누기

    from sklearn.model_selection import  train_test_split
    
    train_input, test_input, train_target, test_target = train_test_split(
        fish_data, fish_target, stratify=fish_target, random_state=42)

    이 상태로 이상한 물고기 데이터를 넣으면, 결과가 이상하게 나온다.

    오른쪽에 있는 도미에 가까운 물고기 이지만, 머신러닝은 이 물고기를 빙어로 판단하였다. 왜 이런 일이 생기는 것일까, 왜냐하면, 그래프를 표현하는 단위가 다르기 때문이다. X축의 length는 1만 올라가도, 큰 폭으로 좌우로 이동하지만, Y축의 weight는 1이 올라가도 이동이 미미하다. 그래서 이 괴리감을 줄이기 위해서, 단위를 재정의 해야한다.

     

     

     

     

    plt.xlim((0, 1000))
    # X축을 1000까지 늘렸다. Y축의 길이와 비슷하게

    표준 점수로 바꾸는 작업을 한다.

    mean = np.mean(train_input, axis=0) # mean 평균
    std = np.std(train_input, axis=0) # std 표준편차
    
    train_scaled = (train_input - mean) / std

    데이터를 축소해도, 그래프는 똑같이 나온다.

    전처리 데이터에서 모델 훈련

    kn.fit(train_scaled, train_target
    kn.score(test_scaled, test_target)
    1.0
    
    # new = ([25, 150] - mean) / std 수상한 물고기 데이터를 표준편차에 맞게 계산한 것이다.
    
    print(kn.predict([new]))
    [1.]
    
    distances, indexes = kn.kneighbors([new])
    # 새롭게 그래프를 그린다.

    결론

    데이터  전처리 하는 것은 중요하다.

    '기계학습' 카테고리의 다른 글

    머신러닝 만들기 - K최근접 이웃회귀  (0) 2021.09.24
    회귀  (0) 2021.09.24
    데이터 전처리  (0) 2021.09.17
    머신 러닝 만들기(파이썬을 이용) - 2  (0) 2021.09.10
    머신 러닝 만들기(파이썬을 이용)  (0) 2021.09.10

    댓글

Designed by Tistory.