
이전에 데이터 정규화 간단히 진행했던거랑 내용 거의 비슷하다.
복습하는 느낌으로 기록해본다.
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)


학습데이터와 테스트 데이터의 혼동행렬을 살펴보았는데
투표를 안 한(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 정규화의 혼동행렬도 확인해보았다.
min-max 정규화와 standardization 정규화 둘 중 어느 것이 더 좋다는 결론을 내리기 애매하다.
일반적으론 머신러닝, 딥러닝에서 min-max 방법을 더 선호하는 편이다.
특히 딥러닝에선 여러번 행렬연산을 통해 가중치와 데이터를 곱하기 때문에 min-max가 더 안정적이다.
(표준화 방법은 이론상 무한대의 값이 나타날 수도 있음)
'자기계발 > Python' 카테고리의 다른 글
| [빅데이터분석기사] 11 모델평가 (0) | 2022.06.20 |
|---|---|
| [빅데이터분석기사] 10 하이퍼파라미터(Grid Search, Random Search) (0) | 2022.06.19 |
| [빅데이터분석기사] 08 데이터셋 분할과 모델검증 (0) | 2022.06.18 |
| [빅데이터분석기사] 07 범주변수의 변환(원핫인코딩) (0) | 2022.06.17 |
| [빅데이터분석기사] 06 회귀문제 (0) | 2022.06.16 |