-
머신 러닝 만들기 - 데이터 전처리기계학습 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