728x90
반응형
출처 : https://book.naver.com/bookdb/book_detail.nhn?bid=21488029
*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.
상세 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.
범주변수 변환
- 범주형 변수는 주로 원핫인코딩을 적용하여 변환할 수 있다.
- 원핫 인코딩이랑 각 변수의 하위 범주를 변수로 만들어 해당하면 1, 아니면 0을 입력하는 방식이다.
- 파이썬에서는 Pandas의 get_dummies 함수를 사용하면 쉽게 구현이 가능하다.
- 다만 한 가지 주의해야 할 것은 데이터셋을 훈련-테스트 데이터셋으로 나누기 전에 수행하는 것이 편리하고 오류가 적다는 점이다.
- 먼저 데이터 셋을 불러와 확인한다.
import pandas as pd
data = pd.read_csv('/vote.csv', encoding='utf-8')
data.head()
- 데이터에서 범주형 자료는 gender와 region이다.
- 범주형 자료를 대상으로 원핫인코딩을 수행한다.
data_one = data[['gender', 'region']]
data = data[['edu', 'income', 'age', 'score_gov', 'score_progress', 'score_intention', 'vote', 'parties']]
# 먼저 문자형으로 변환 (칼럼명)
data_one['gender'] = data_one['gender'].replace([1, 2], ['male', 'female'])
data_one['region'] = data_one['region'].replace([1, 2, 3, 4, 5], ['Sudo', 'Chungcheung', 'Honam', 'Youngnam', 'Others'])
# 원핫인코딩
data_one = pd.get_dummies(data_one)
data_one.head()
- 데이터 변환이 완료되었다면 추후 사용을 위해 데이터를 통합하고 저장한다.
data = pd.concat([data_one, data], axis = 1)
data.to_csv('oneHotVote.csv', index=False, sep=',', encoding='utf-8')
데이터셋 분할과 모델 검증
- 모델 학습에는 주로 학습 데이터와 테스트 데이터가 필요하지만, 이 외에도 교차 검증을 위해 검증 데이터를 별도로 두는 방법도 존재한다.
- 즉 train-test-valid 데이터 총 세 개의 데이터셋으로 구분하여 학습을 수행하여 보다 일반화된 모델을 생성할 수 있다.
- 공부를 위해 이전 단계에서 저장한 oneHotVote.csv파일을 불러와 x, y로 구분한다.
import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('/oneHotVote.csv', encoding='utf-8')
x = data[data.columns[0:13]]
y = data['vote']
x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=42)
- 교차 검증을 수행하는 방법은 랜덤 없이 훈련 데이터를 나누는 cross_val_score와 랜덤하게 훈련 데이터를 무작위 추출하여 섞어 사용하는 K-Fold가 있다.
- 먼저 cross_val_score은 다음과 같이 학습할 수 있다.
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
model = LogisticRegression()
scores = cross_val_score(model, x_train, y_train, cv = 5)
print('각 세트별 정확도:', scores)
print('평균 정확도:', scores.mean())
- 다음으로 K-Fold는 다음과 같이 사용한다.
from sklearn.model_selection import KFold
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
score = cross_val_score(model, x_train, y_train, cv=kfold)
print('각 세트별 정확도:', score)
print('평균 정확도:', score.mean())
- 위의 두 방법은 일정하게 학습 데이터와 검증 데이터를 분할하기에 각 데이터는 반드시 각 데이터 셋에 한 번 이상 속하게 된다.
- 임의분할기법은 위와 달리 데이터가 학습 데이터과 검증 데이터 둘 중 한 군데에 반드시 속하지 않게 하는 기법을 말한다.
- 임의분할기법은 ShuffleSplit 라이브러리를 사용하여 구현이 가능하다.
from sklearn.model_selection import ShuffleSplit
shuffleSplit = ShuffleSplit(test_size = 0.5, train_size=0.5, random_state=42) # 5:5 비율로 구성
score = cross_val_score(model, x_train, y_train, cv=shuffleSplit)
print('각 세트별 정확도:', score)
print('평균 정확도:', score.mean())
- 추가로 굳이 라이브러리를 사용하지 않아도 train_test_split을 이용해 검증 데이터를 생성할 수도 있다.
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, random_state=42)
model.fit(x_train, y_train)
score = cross_val_score(model, x_train, y_train, cv=5)
print('각 세트별 정확도:', score)
print('평균 정확도:', score.mean())
데이터 정규화
- 정규화를 위해서는 먼저 데이터의 분포를 확인해야 한다.
- 분포 확인은 그래프를 통해 연속성이 떨어지는지 여부를 확인하면 된다.
import pandas as pd
data = pd.read_csv('/oneHotVote.csv', encoding='utf-8')
data.hist(figsize=(20, 10))
- 그래프를 보면 연속성이 떨어지는 변수들이 대부분이다.
- 데이터 셋을 특성과 레이블로 나눈 후 정규화를 적용한다.
- 정규화는 MinMax, 표준화 스케일링이 존재한다.
- MinMax는 최대값이 1, 최소값이 0이 되도록 정규화하는 작업이다.
- 표준화 스케일링은 평균이 0, 표준편차가 1이 되도록 정규화하는 작업이다.
x = data[data.columns[0:13]]
y = data[['vote']]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 42)
# MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
minMaxScaler = MinMaxScaler()
minMaxScaler.fit(x_train)
x_train_m = minMaxScaler.transform(x_test)
x_test_m = minMaxScaler.transform(x_test)
# StandardScaler
from sklearn.preprocessing import StandardScaler
standScaler = StandardScaler()
standScaler.fit(x_train)
x_train_s = minMaxScaler.transform(x_train)
x_test_s = minMaxScaler.transform(x_test)
모델 훈련과 세부튜닝
- 세부튜닝은 최적의 하이퍼파라미터를 찾는 작업이다.
- 예시로 들 로지스틱 회귀의 경우 핵심적인 하이퍼파라미터는 C이다
- C의 디폴트는 1이다. 해당 C의 최적의 하이퍼파라미터를 찾는 방법을 구해본다.
import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('/oneHotVote.csv', encoding='utf-8')
x = data[data.columns[0:13]]
y = data[['vote']]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 42)
- 세부튜닝은 그리드 탐색과 랜덤 탐색이 존재한다.
- 그리드 탐색는 분석자가 하이퍼파라미터의 특정값을 지정하고, 각각 모델에 적용하여 모델 적합도를 지정한다.
- 그리드 탐색은 sklearn의 GridSearchCV 라이브러리를 사용하면 쉽게 구할 수 있다.
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import warnings
warnings.filterwarnings('ignore')
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}
# cv : 교차검증 수
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5, return_train_score=5)
grid_search.fit(x_train, y_train)
print("Best Prameter: {}".format(grid_search.best_params_))
print("Best Cross-validity Score: {:.3f}".format(grid_search.best_score_))
- 만약 그리드서치 하이퍼파라미터, cross validation 별 상세 결과값을 확인하고 싶다면 cv_results_를 확인하면 된다.
pd.DataFrame(grid_search.cv_results_)
- 다음은 랜덤 탐색이다.
- 랜덤 탐색은 RandomizedSearchCV 라이브러리를 사용한다.
- 사용법은 범위만 정해주면 무작위로 C 값을 찾아내게 된다.
- 최소는 low, 최대는 high 키워드로 값을 입력하면 된다.
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distribs = {'C' : randint(low=0.001, high=100)}
# n_iter : 랜덤 수행 횟수 (디폴트 10)
random_search = RandomizedSearchCV(LogisticRegression(), param_distributions=param_distribs, cv=5, n_iter=20, return_train_score = True)
random_search.fit(x_train, y_train)
print('Best Pramater: {}'.format(random_search.best_params_))
print('Best Cross-Validity Score: {:.3f}'.format(random_search.best_score_))
- 마찬가지로 cv_results_를 사용하면 상세한 정보 확인이 가능하다.
pd.DataFrame(random_search.cv_results_)
모델 평가
- 앞서 하이퍼파라미터 탐색 결과로 나온 C=3 옵션을 준 로지스틱 회귀로 학습을 수행하고 결과를 반환한다.
model = LogisticRegression(C=6)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
model.score(x_test, y_test)
- 가장 먼저 확인해볼 것은 오차행렬이다.
- 오차행렬은 confusion_matrix를 사용하면 쉽게 구현할 수 있다.
from sklearn.metrics import confusion_matrix
cfmatrix = confusion_matrix(y_test, y_pred)
cfmatrix
- 오차 행렬을 이용하면 정밀도, 재현율 등을 계산할 수 있다.
- 파이썬에서는 굳이 수작업으로 계산하지 않더라도 classification_report 라이브러리를 통해 손쉽게 위의 수치들을 확인할 수 있다.
from sklearn.metrics import classification_report
cfreport = classification_report(y_test, y_pred)
print(cfreport)
- 다음으로 확인해볼 것은 ROC이다.
- ROC는 FP와 TP의 비율을 구해 확인할 수 있다.
from sklearn.metrics import roc_curve, auc
from sklearn import metrics
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, model.decision_function(x_test))
roc_auc = metrics.roc_auc_score(y_test, model.decision_function(x_test))
roc_auc
- ROC Curve도 FP, TP의 비율 간 관계로 도표를 그릴 수 있다.
import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.xlabel('FP ( 1 - Specificity )')
plt.ylabel('TP (Sensitivity)')
plt.plot(false_positive_rate, true_positive_rate, 'b', label='Model (AUC=%0.2f)'% roc_auc)
plt.plot([0,1], [1,1], 'y--')
plt.plot([0,1], [0,1], 'r--')
plt.legend(loc='lower right')
plt.show()
다중분류
- 이전까지는 이진분류를 연습했으니, 다중분류를 연습해본다.
- 다중분류는 결과값인 라벨이 이진분류처럼 0/1 이 아니라, 그 이상의 범주를 가진 데이터를 분류하는 작업이다.
- oneHotVote.csv 파일의 parties 변수는 [1, 2, 3, 4] 총 네 개의 범주로 되어있으니 이를 활용하여 다중분류를 수행한다.
- 모델은 LogisticRegression을 사용한다.
import pandas as pd
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv('/oneHotVote.csv', encoding='utf-8')
# 훈련-테스트 데이터 셋 분할
x = data[data.columns[0:13]]
y = data[['parties']]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 42)
# 최적 파라미터 탐색
param_grid = {'C' : [0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5, return_train_score=5)
grid_search.fit(x_train, y_train)
C = grid_search.best_params_['C']
model = LogisticRegression(C=C)
model.fit(x_train, y_train)
print(model.score(x_test, y_test))
728x90
반응형
'자격증 > 빅데이터 분석기사 (실기)' 카테고리의 다른 글
04. 머신러닝 핵심 알고리즘 (2) (0) | 2022.06.06 |
---|---|
04. 머신러닝 핵심 알고리즘 (1) (0) | 2022.06.05 |
03_02. 회귀 (0) | 2022.06.04 |
03_01. 분류 (0) | 2022.05.30 |
03_머신러닝 프로세스 (0) | 2022.05.30 |