자기계발/Python

[빅데이터분석기사] 09 데이터 정규화

호등 2022. 6. 19. 11:16
반응형

이전에 데이터 정규화 간단히 진행했던거랑 내용 거의 비슷하다.

복습하는 느낌으로 기록해본다.

 

1) 데이터 불러오기 및 확인

import pandas as pd
data=pd.read_csv('Fvote.csv', encoding='utf-8')
data.head()

역시나 이전에 만들어놨던 선거행동 Fvote.csv 데이터 불러온다.

head()로 기술통계 살펴보면 평균, 편차 수준이 다르기 때문에 데이터 정규화가 필요하다.

data.hist(figsize=(20,10))

히스토그램을 봐도 변수들 분포가 연속성이 떨어지는 것을 볼 수 있다.

 

2) 특성(x)과 레이블(y) 나누기

#특성(x)과 레이블(y) 나누기
X=data.loc[:, 'gender_female':'score_intention']
y=data[['vote']]

print(X.shape)
print(y.shape)

특성 변수와 레이블 변수를 나누어 주었다.

이번엔 loc를 이용해서 나누었다.

 

3) train-test 데이터 나누기

#train_test 데이터셋 나누기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)

print(y_train.mean())
print(y_test.mean())

레이블(y)이 범주형이므로 stratify = y 옵션을 추가해주었다.

이후 학습데이터와 테스트데이터의 투표여부(0, 1) 비율이 유사한지 평균을 구해서 확인해보았다.

 

4) 연속형 특성의 Scaling

① Min-Max 스케일링

#Min-Max 스케일링
from sklearn.preprocessing import MinMaxScaler
scaler_minmax = MinMaxScaler()

scaler_minmax.fit(X_train)
X_scaled_minmax_train = scaler_minmax.transform(X_train)

pd.DataFrame(X_scaled_minmax_train).describe()

fit은 train 데이터에만(test데이터에는 하지 않음) 하는 것 정도 주의하면 되겠다.

X_scaled_minmax_test = scaler_minmax.transform(X_test)
pd.DataFrame(X_scaled_minmax_test).describe()

train데이터에 이어 test데이터도 정규화를 진행했다.

 

② Standardization 스케일링

#Standardization 스케일링
from sklearn.preprocessing import StandardScaler
scaler_standard = StandardScaler()

scaler_standard.fit(X_train)
X_scaled_standard_train = scaler_standard.transform(X_train)

pd.DataFrame(X_scaled_standard_train).describe()

역시나 fit은 train 데이터에만 적용한다.

standard 방법으로 정규화를 하면 모든 변수가 거의 평균 0, 표준편차 1로 맞춰진다.

X_scaled_standard_test = scaler_standard.transform(X_test)
pd.DataFrame(X_scaled_standard_test).describe()

추가로 test 데이터도 정규화를 진행해주었다.

 

5) 모델 학습

#모델 학습
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

#Min-Max 정규화 데이터 적용 결과
import numpy as np
model.fit(X_scaled_minmax_train, np.ravel(y_train))
pred_train = model.predict(X_scaled_minmax_train)
model.score(X_scaled_minmax_train, y_train)

pred_test = model.predict(X_scaled_minmax_test)
model.score(X_scaled_minmax_test, y_test)

LogisticRegression()을 불러와 학습 데이터에 적용해주었다.

또 이전 포스팅에서 겪었던 것과 동일한 경고가 뜨길래,

fit 부분에 y_train을 np.ravel로 감싸주었다. (numpy 임포트 필수!)

#혼동행렬 확인
from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬: \n", confusion_train)

confusion_test = confusion_matrix(y_test, pred_test)
print("테스트데이터 오차행렬: \n", confusion_test)

Min-Max 방법 : 훈련데이터 오차행렬 결과
Min-Max 방법 : 테스트데이터 오차행렬 결과

학습데이터와 테스트 데이터의 혼동행렬을 살펴보았는데

투표를 안 한(0) 사람들의 예측 분류가 잘 안되고 있는 것이 확인 되었다.

주어진 특성치(X)로 투표를 할지 안 할지 예측하는 것이 어렵다는 의미이다.

#Standardize 정규화 데이터 적용 결과
model.fit(X_scaled_standard_train, np.ravel(y_train))

pred_train = model.predict(X_scaled_standard_train)
model.score(X_scaled_standard_train, y_train)

pred_test = model.predict(X_scaled_standard_test)
model.score(X_scaled_standard_test, y_test)

표준화 정규화 데이터 적용 결과도 살펴보았다.

훈련데이터에서는 정확도가 min-max 방법보다 근소하게 높게 나타났지만,

테스트 데이터의 정확도는 오히려 낮게 나타났다. (훈련데이터에 과대적합된 결과로 해석할 수 있음)

#혼동행렬 확인
from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬:\n", confusion_train)

confusion_test = confusion_matrix(y_test, pred_test)
print("테스트데이터 오차행렬:\n", confusion_test)

Standardization 방법 : 훈련데이터 오차행렬 결과
Standardization 방법 : 테스트데이터 오차행렬 결과

standardization 정규화의 혼동행렬도 확인해보았다.

min-max 정규화와 standardization 정규화 둘 중 어느 것이 더 좋다는 결론을 내리기 애매하다.

 

일반적으론 머신러닝, 딥러닝에서 min-max 방법을 더 선호하는 편이다.

특히 딥러닝에선 여러번 행렬연산을 통해 가중치와 데이터를 곱하기 때문에 min-max가 더 안정적이다.

(표준화 방법은 이론상 무한대의 값이 나타날 수도 있음)

 

반응형