3. 데이터 변환, 정제, 통합, 균형 (Data Transformation, Cleaning, Integration and Balancing)
이 글의 실습 코드는 제 깃허브에서 보실 수 있습니다.
데이터 변환Data Transformation
머신러닝에서는 데이터가 가진 특성들의 상관관계를 찾아내는데, 이때 특성 간의 스케일 차이가 심하면 스케일이 큰 특성에 집중하는 문제가 발생한다.
이러한 문제를 해결하기 위해 데이터 표준화나 정규화 기법을 사용한다.
데이터 표준화Data Standardization
$$ x_{standard} = \frac{x-\text{mean}(x)}{\text{std}(x)}$$
데이터 정규화Data Normalization
$$ x_{normal} = \frac{x-\text{min}(x)}{\text{max}(x)-\text{min}(x)}$$
일반적으로 정규화가 표준화보다 유용하나, 데이터가 bell-shape 이거나, 이상치가 있는 데이터일 경우 표준화가 유용하다.
사이킷런을 이용하여 표준화와 정규화를 수행할 수 있다.
from sklearn.preprocessing import StandardScaler, MinMaxScaler
stdScale = StandardScaler() # 표준화
normScale = MinMaxScaler() # 정규화
std = stdScale.fit_transform(x)
norm = normScale.fit_transform(x)
데이터 정제Data Cleaning
np.nan, np.NaN, None 등의 결측치를 해결하는 것이다.
주로 평균(mean), 중위값(median value), 최빈값(most frequent value)로 빈 값을 채우거나, 빈 값이 포함된 행을 삭제한다.
사이킷런을 이용하여 결측치를 처리할 수 있다.
from sklearn.impute import SimpleImputer
im = SimpleImputer(strategy='mean') # strategy로 mean, median, most_frequent를 설정
x = im.fit_transform(x)
데이터 통합Data Integration
데이터 여러 개를 하나로 합치는 작업.
판다스를 이용하여 수행할 수 있다.
import pandas as pd
df1 = pd.read_csv('고객_정보.csv')
df2 = pd.read_csv('고객_매출.csv')
pd.merge(df1, df2, on='id') # on 열을 기준으로 데이터 병합
데이터 균형Data Balancing
분류를 목적으로 하는 데이터에서, 특정 클래스의 데이터가 타 클래스에 비해 적거나 많은 경우를 데이터 불균형Data Imbalance이라 한다. 의사결정트리와 앙상블 모델은 상대적으로 이런 불균형에 강건한 특징이 있다.
이를 해결하기 위한 방법으로 과소포집과 과대포집이 있는데, 일반적으로 과대포집이 유용하다.
과소포집Undersampling
많은 데이터를 가진 클래스의 데이터를 임의로 제거하여 다른 클래스와 비율을 맞춰주는 방법이다.
과대포집Oversampling
소수 데이터를 가진 클래스의 데이터를 복제하여 비율을 맞춰주는 방법이다. 대표적인 방법론은 아래와 같다.
- SMOTE: Synthetic Minority Oversampling Technique)
- ADASYN: Adaptive Synthetic Sampling Method)
과대포집 실습 코드
실험을 위해 가짜 데이터를 만들어보자.
# 더미 불균형 데이터 생성
from collections import Counter
from sklearn.datasets import make_classification
X, y = make_classification(n_classes=3, weights=[0.03, 0.07,0.9],n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, n_samples=200, random_state=154)
print('Original dataset shape %s' % Counter(y))
가짜 불균형 데이터의 분포를 출력해보자.
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y,
s=100, edgecolor="k", linewidth=1)
plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
노란색으로 표시된 클래스에 비해, 다른 클래스는 적은 것을 알 수 있다. 이제 과대포집을 수행해보자.
import matplotlib.pyplot as plt
from imblearn.over_sampling import SMOTE, ADASYN
sm = SMOTE(random_state=777)
X_res, y_res = sm.fit_resample(X, y)
plt.scatter(X_res[:, 0], X_res[:, 1], marker='o', c=y_res,
s=100, edgecolor="k", linewidth=1)
plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
import matplotlib.pyplot as plt
ada=ADASYN(random_state=777)
X_syn,y_syn=ada.fit_resample(X,y)
plt.scatter(X_syn[:, 0], X_syn[:, 1], marker='o', c=y_syn,
s=100, edgecolor="k", linewidth=1)
plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
과소포집 실습코드
from imblearn.under_sampling import NearMiss
# define the undersampling method
undersample = NearMiss(version=3, n_neighbors_ver3=3)
# transform the dataset
X_Under, y_Under = undersample.fit_resample(X, y)
import matplotlib.pyplot as plt
plt.scatter(X_Under[:, 0], X_Under[:, 1], marker='o', c=y_Under,
s=100, edgecolor="k", linewidth=1)
plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
'학부 수업 > 머신러닝' 카테고리의 다른 글
5. 선형 회귀 (Linear Regression) (0) | 2020.10.21 |
---|---|
4.5. 머신러닝의 정확도, 정밀도, 재현율 (Accuracy, Precision, Recall) (0) | 2020.09.23 |
4. K-최근접 이웃 알고리즘 (K-Nearest Neighbor) (0) | 2020.09.23 |
2. 데이터 실수화 (Data Vectorization) (0) | 2020.09.11 |
1. 데이터 전처리 (Data Pre-Processing) (0) | 2020.09.11 |
댓글
이 글 공유하기
다른 글
-
4.5. 머신러닝의 정확도, 정밀도, 재현율 (Accuracy, Precision, Recall)
4.5. 머신러닝의 정확도, 정밀도, 재현율 (Accuracy, Precision, Recall)
2020.09.23 -
4. K-최근접 이웃 알고리즘 (K-Nearest Neighbor)
4. K-최근접 이웃 알고리즘 (K-Nearest Neighbor)
2020.09.23 -
2. 데이터 실수화 (Data Vectorization)
2. 데이터 실수화 (Data Vectorization)
2020.09.11 -
1. 데이터 전처리 (Data Pre-Processing)
1. 데이터 전처리 (Data Pre-Processing)
2020.09.11