데이터 전처리(Data Scaling with sklearn)

데이터 스케일링이란 데이터 전처리 과정의 하나입니다.

데이터 스케일링을 해주는 이유는 데이터의 값이 너무 크거나 혹은 작은 경우에 모델 알고리즘 학습과정에서 0으로 수렴하거나 무한으로 발산해버릴 수 있기 때문입니다.

따라서, scaling은 데이터 전처리 과정에서 굉장히 중요한 과정입니다.

가볍게 살펴보도록 하겠습니다
1. scale이란?
1
!pip install mglearn
Collecting mglearn
  Downloading mglearn-0.1.9.tar.gz (540 kB)
     |████████████████████████████████| 540 kB 506 kB/s eta 0:00:01
[?25hRequirement already satisfied: numpy in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (1.18.1)
Requirement already satisfied: matplotlib in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (3.2.1)
Requirement already satisfied: scikit-learn in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (0.22.2.post1)
Requirement already satisfied: pandas in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (1.0.3)
Requirement already satisfied: pillow in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (7.0.0)
Requirement already satisfied: cycler in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (0.10.0)
Requirement already satisfied: imageio in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (2.8.0)
Requirement already satisfied: joblib in /opt/anaconda3/lib/python3.7/site-packages (from mglearn) (0.14.1)
Requirement already satisfied: python-dateutil>=2.1 in /opt/anaconda3/lib/python3.7/site-packages (from matplotlib->mglearn) (2.8.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/anaconda3/lib/python3.7/site-packages (from matplotlib->mglearn) (1.2.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/anaconda3/lib/python3.7/site-packages (from matplotlib->mglearn) (2.4.7)
Requirement already satisfied: scipy>=0.17.0 in /opt/anaconda3/lib/python3.7/site-packages (from scikit-learn->mglearn) (1.4.1)
Requirement already satisfied: pytz>=2017.2 in /opt/anaconda3/lib/python3.7/site-packages (from pandas->mglearn) (2019.3)
Requirement already satisfied: six in /opt/anaconda3/lib/python3.7/site-packages (from cycler->mglearn) (1.14.0)
Building wheels for collected packages: mglearn
  Building wheel for mglearn (setup.py) ... [?25ldone
[?25h  Created wheel for mglearn: filename=mglearn-0.1.9-py2.py3-none-any.whl size=582638 sha256=6bf4e55bc798dd18a2ce5a5d67e6f134dfc35d54bb51cd8020f85b838a7173b1
  Stored in directory: /Users/wglee/Library/Caches/pip/wheels/f1/17/e1/1720d6dcd70187b6b6c3750cb3508798f2b1d57c9d3214b08b
Successfully built mglearn
Installing collected packages: mglearn
Successfully installed mglearn-0.1.9
1
2
import mglearn
mglearn.plots.plot_scaling()
output_3_0
(1) StandardScaler
각 feature의 평균을 0, 분산을 1로 변경합니다. 모든 특성들이 같은 스케일을 갖게 됩니다.


(2) RobustScaler
모든 특성들이 같은 크기를 갖는다는 점에서 StandardScaler와 비슷하지만, 평균과 분산 대신 median과 quartile을 사용합니다. RobustScaler는 이상치에 영향을 받지 않습니다.


(3) MinMaxScaler
모든 feature가 0과 1사이에 위치하게 만듭니다. 데이터가 2차원 셋일 경우, 모든 데이터는 x축의 0과 1 사이에, y축의 0과 1사이에 위치하게 됩니다.


(4) Normalizer
StandardScaler, RobustScaler, MinMaxScaler가 각 columns의 통계치를 이용한다면 Normalizer는 row마다 각각 정규화됩니다. Normalizer는 유클리드 거리가 1이 되도록 데이터를 조정합니다. (유클리드 거리는 두 점 사이의 거리를 계산할 때 쓰는 방법)
2. Code
scikit-learn에 있는 아이리스 데이터셋으로 데이터 스케일링을 해보겠습니다.
1
2
3
4
5
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)
데이터를 학습용과 테스트용으로 분할했습니다.

scaler를 사용하기 이전에 주의해야될 점을 먼저 살펴보겠습니다.

scaler는 fit과 transform 메서드를 지니고 있습니다. fit 메서드로 데이터 변환을 학습하고, transform 메서드로 실제 데이터의 스케일을 조정합니다. 

이때, fit 메서드는 학습용 데이터에만 적용해야 합니다. 그 후, transform 메서드를 학습용 데이터와 테스트 데이터에 적용합니다. scaler는 fit_transform()이란 단축 메서드를 제공합니다. 학습용 데이터에는 fit_transform()메서드를 적용하고, 테스트 데이터에는 transform()메서드를 적용합니다.
(1) StandardScaler code
1
2
3
4
5
6
7
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scale = scaler.fit_transform(X_train)
print('스케일 조정 전 features Min value : {}'.format(X_train.min(axis=0)))
print('스케일 조정 전 features Max value : {}'.format(X_train.max(axis=0)))
print('스케일 조정 후 features Min value : {}'.format(X_train_scale.min(axis=0)))
print('스케일 조정 후 features Max value : {}'.format(X_train_scale.max(axis=0)))
스케일 조정 전  features Min value : [4.3 2.2 1.1 0.1]
스케일 조정 전  features Max value : [7.9 4.4 6.9 2.5]
스케일 조정 후  features Min value : [-1.73905934 -2.11220356 -1.37231262 -1.32054283]
스케일 조정 후  features Max value : [2.32920943 3.06374081 1.74766642 1.68511841]
(2) RobustScaler code
1
2
3
4
5
6
7
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
X_train_scale = scaler.fit_transform(X_train)
print('스케일 조정 전 features Min value : {}'.format(X_train.min(axis=0)))
print('스케일 조정 전 features Max value : {}'.format(X_train.max(axis=0)))
print('스케일 조정 후 features Min value : {}'.format(X_train_scale.min(axis=0)))
print('스케일 조정 후 features Max value : {}'.format(X_train_scale.max(axis=0)))
스케일 조정 전  features Min value : [4.3 2.2 1.1 0.1]
스케일 조정 전  features Max value : [7.9 4.4 6.9 2.5]
스케일 조정 후  features Min value : [-1.01818182 -1.47826087 -0.82993197 -0.70588235]
스케일 조정 후  features Max value : [1.6        2.34782609 0.74829932 0.70588235]
(3) MinMaxScaler code
1
2
3
4
5
6
7
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_scale = scaler.fit_transform(X_train)
print('스케일 조정 전 features Min value : {}'.format(X_train.min(axis=0)))
print('스케일 조정 전 features Max value : {}'.format(X_train.max(axis=0)))
print('스케일 조정 후 features Min value : {}'.format(X_train_scale.min(axis=0)))
print('스케일 조정 후 features Max value : {}'.format(X_train_scale.max(axis=0)))
스케일 조정 전  features Min value : [4.3 2.2 1.1 0.1]
스케일 조정 전  features Max value : [7.9 4.4 6.9 2.5]
스케일 조정 후  features Min value : [0. 0. 0. 0.]
스케일 조정 후  features Max value : [1. 1. 1. 1.]
(4) Normalizer code
1
2
3
4
5
6
7
from sklearn.preprocessing import Normalizer 
scaler = Normalizer()
X_train_scale = scaler.fit_transform(X_train)
print('스케일 조정 전 features Min value : {}'.format(X_train.min(axis=0)))
print('스케일 조정 전 features Max value : {}'.format(X_train.max(axis=0)))
print('스케일 조정 후 features Min value : {}'.format(X_train_scale.min(axis=0)))
print('스케일 조정 후 features Max value : {}'.format(X_train_scale.max(axis=0)))
스케일 조정 전  features Min value : [4.3 2.2 1.1 0.1]
스케일 조정 전  features Max value : [7.9 4.4 6.9 2.5]
스케일 조정 후  features Min value : [0.67017484 0.2383917  0.16783627 0.0147266 ]
스케일 조정 후  features Max value : [0.86093857 0.60379053 0.63265489 0.2553047 ]
3. 적용해보기
의사결정나무(decisionTree)로 breat_cancer 데이터셋을 학습해보겠습니다.
먼저, 데이터 스케일링을 적용하지 않은 채 진행하겠습니다.
1
2
3
4
5
6
7
8
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
tree = DecisionTreeClassifier(criterion='entropy', max_depth=1)
tree.fit(X_train, y_train)
print('test accuracy : %3f' %tree.score(X_test, y_test))
test accuracy : 0.881119


다음은 데이터를 MinMaxScaler로 스케일을 조정하고 의사결정나무 모델로 학습시켜보겠습니다.
1
2
3
4
5
6
7
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_train_scale = scaler.fit_transform(X_train)
X_test_scale = scaler.fit_transform(X_test)
tree.fit(X_train_scale, y_train)
print('test accuracy : %3f' %tree.score(X_test_scale, y_test))
test accuracy : 0.860140


비슷하게 나온 것을 알 수 있습니다.
1
2


1
2


You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.