-
sklearn-01 preprocessing 1 scaling머신러닝/sklearn 2023. 5. 4. 20:02
1. 데이터 전처리
데이터 전처리란 데이터를 학습하기 좋게 가공하는 것을 의미한다.
2. 스케일링
스케일링이란 특성별로 데이터의 스케일이 다를 때 모든 특성의 범위를 같게 만들어 주는 것이다.
StandardScaling, MinMaxScaling, MaxAbsScailng, RobustScaling 등이 있다.
3. MinMaxScaling
모든 값의 범위를 0~1 사이로 변경한다. 이상치에 매우 민감하다.
import numpy as np import pandas as pd import sklearn import matplotlib.pyplot as plt import os from os.path import join import warnings warnings.filterwarnings('ignore')
필요한 모듈 불러온다.
abalone_path= join('.','abalone.txt') column_path = join('.','abalone_attributes.txt') abalone_columns = list() for l in open(column_path): abalone_columns.append(l.strip())#파일을 가져올 떄 끝에 군더더기가 붙을 수 있기 때문에 스트립한 형태 data = pd.read_csv(abalone_path,header= None,names = abalone_columns)#헤더 삭제, 칼럼 붙여주기 data Sex Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 M 0.455 0.365 0.095 0.5140 0.2245 0.1010 0.1500 15 1 M 0.350 0.265 0.090 0.2255 0.0995 0.0485 0.0700 7 2 F 0.530 0.420 0.135 0.6770 0.2565 0.1415 0.2100 9 3 M 0.440 0.365 0.125 0.5160 0.2155 0.1140 0.1550 10 4 I 0.330 0.255 0.080 0.2050 0.0895 0.0395 0.0550 7 ... ... ... ... ... ... ... ... ... ... 4172 F 0.565 0.450 0.165 0.8870 0.3700 0.2390 0.2490 11 4173 M 0.590 0.440 0.135 0.9660 0.4390 0.2145 0.2605 10 4174 M 0.600 0.475 0.205 1.1760 0.5255 0.2875 0.3080 9 4175 F 0.625 0.485 0.150 1.0945 0.5310 0.2610 0.2960 10 4176 M 0.710 0.555 0.195 1.9485 0.9455 0.3765 0.4950 12 4177 rows × 9 columns
전복 데이터를 업로드하고 리스트로 만든다. 리스트를 판다스에 전달하고 데이터 프레임을 구성한다.
data.head() Sex Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 M 0.455 0.365 0.095 0.5140 0.2245 0.1010 0.150 15 1 M 0.350 0.265 0.090 0.2255 0.0995 0.0485 0.070 7 2 F 0.530 0.420 0.135 0.6770 0.2565 0.1415 0.210 9 3 M 0.440 0.365 0.125 0.5160 0.2155 0.1140 0.155 10 4 I 0.330 0.255 0.080 0.2050 0.0895 0.0395 0.055 7 data.shape (4177, 9)
데이터의 헤드와 모양 확인한다.
label = data['Sex'] del data['Sex'] data.head() Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 0.455 0.365 0.095 0.5140 0.2245 0.1010 0.150 15 1 0.350 0.265 0.090 0.2255 0.0995 0.0485 0.070 7 2 0.530 0.420 0.135 0.6770 0.2565 0.1415 0.210 9 3 0.440 0.365 0.125 0.5160 0.2155 0.1140 0.155 10 4 0.330 0.255 0.080 0.2050 0.0895 0.0395 0.055 7
성별 데이터를 삭제한다.
data.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 4177 entries, 0 to 4176 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Length 4177 non-null float64 1 Diameter 4177 non-null float64 2 Height 4177 non-null float64 3 Whole weight 4177 non-null float64 4 Shucked weight 4177 non-null float64 5 Viscera weight 4177 non-null float64 6 Shell weight 4177 non-null float64 7 Rings 4177 non-null int64 dtypes: float64(7), int64(1) memory usage: 261.2 KB
데이터의 정보를 확인한다.
data2 = (data - np.min(data)) / (np.max(data)-np.min(data)) # minmax scailing data2 Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 0.513514 0.521008 0.084071 0.181335 0.150303 0.132324 0.147982 0.500000 1 0.371622 0.352941 0.079646 0.079157 0.066241 0.063199 0.068261 0.214286 2 0.614865 0.613445 0.119469 0.239065 0.171822 0.185648 0.207773 0.285714 3 0.493243 0.521008 0.110619 0.182044 0.144250 0.149440 0.152965 0.321429 4 0.344595 0.336134 0.070796 0.071897 0.059516 0.051350 0.053313 0.214286 ... ... ... ... ... ... ... ... ... 4172 0.662162 0.663866 0.146018 0.313441 0.248151 0.314022 0.246637 0.357143 4173 0.695946 0.647059 0.119469 0.341420 0.294553 0.281764 0.258097 0.321429 4174 0.709459 0.705882 0.181416 0.415796 0.352724 0.377880 0.305431 0.285714 4175 0.743243 0.722689 0.132743 0.386931 0.356422 0.342989 0.293473 0.321429 4176 0.858108 0.840336 0.172566 0.689393 0.635171 0.495063 0.491779 0.392857
데이터 - 최소값 / 최댓값-최솟값 공식에 대입하면 모든 값을 0~1 사이의 값으로 치환할 수 있다.
from sklearn.preprocessing import MinMaxScaler mMscaler = MinMaxScaler() data3 =mMscaler.fit_transform(data) data3 array([[0.51351351, 0.5210084 , 0.0840708 , ..., 0.1323239 , 0.14798206, 0.5 ], [0.37162162, 0.35294118, 0.07964602, ..., 0.06319947, 0.06826109, 0.21428571], [0.61486486, 0.61344538, 0.11946903, ..., 0.18564845, 0.2077728 , 0.28571429], ..., [0.70945946, 0.70588235, 0.18141593, ..., 0.37788018, 0.30543099, 0.28571429], [0.74324324, 0.72268908, 0.13274336, ..., 0.34298881, 0.29347285, 0.32142857], [0.85810811, 0.84033613, 0.17256637, ..., 0.49506254, 0.49177877, 0.39285714]])
sklearn의 minmaxscaler를 이용해서 스케일링을 진행한다. fit으로 데이터를 입히고 transform으로 데이터를 변환한다.
mMscaled_data = pd.DataFrame(data4, columns=data.columns) mMscaled_data.head() Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 0.513514 0.521008 0.084071 0.181335 0.150303 0.132324 0.147982 0.500000 1 0.371622 0.352941 0.079646 0.079157 0.066241 0.063199 0.068261 0.214286 2 0.614865 0.613445 0.119469 0.239065 0.171822 0.185648 0.207773 0.285714 3 0.493243 0.521008 0.110619 0.182044 0.144250 0.149440 0.152965 0.321429 4 0.344595 0.336134 0.070796 0.071897 0.059516 0.051350 0.053313 0.214286
어레이 배열을 컬럼을 지정하여 데이터프레임으로 바꿔준다.
4. StandardScaling
특성들의 평균을 0, 분산을 1로 스케일링하는 방법이다. 이상치에 매우 민감하다.
from sklearn.preprocessing import StandardScaler sdscaler = StandardScaler() sdscaled_data = sdscaler.fit_transform(data) sdscaled_data = pd.DataFrame(sdscaled_data, columns=data.columns) sdscaled_data.head() Length Diameter Height Whole weight Shucked weight Viscera weight Shell weight Rings 0 -0.574558 -0.432149 -1.064424 -0.641898 -0.607685 -0.726212 -0.638217 1.571544 1 -1.448986 -1.439929 -1.183978 -1.230277 -1.170910 -1.205221 -1.212987 -0.910013 2 0.050033 0.122130 -0.107991 -0.309469 -0.463500 -0.356690 -0.207139 -0.289624 3 -0.699476 -0.432149 -0.347099 -0.637819 -0.648238 -0.607600 -0.602294 0.020571 4 -1.615544 -1.540707 -1.423087 -1.272086 -1.215968 -1.287337 -1.320757 -0.910013
공식은 데이터 - 평균 / 표준편차이며 표준이 0이고 분산이 1이므로 -1~1 사이의 값이 나온다.
'머신러닝 > sklearn' 카테고리의 다른 글
sklearn-04 preprocessing 4 categorical variable to numeric variable (0) 2023.05.07 sklearn-03 preprocessing 3 dimensionality reduction (0) 2023.05.07 sklearn-02 preprocessing 2 sampling (0) 2023.05.07 sklearn-05 모델 평가 지표 (0) 2023.05.04