본문 바로가기
자격증/빅데이터 분석기사 (실기)

03_03. 머신러닝 프로세스

by 이민우 2022. 6. 4.
728x90
반응형

출처 : https://book.naver.com/bookdb/book_detail.nhn?bid=21488029 

 

공개적 빅데이터분석기사 실기

본 도서는 한국데이터산업진흥원에서 실시하는 빅데이터분석기사 국가기술자격 실기시험 대비 도서입니다.본 교재는 PYTHON을 활용하여 쉽고 빠른 자격증 취득으로 이어질 수 있도록 도움을 줄

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.


 

데이터 출처: https://www.kaggle.com/code/lottoexpecter/python-5-data-search-data-preprocessing/data?select=vote.csv 

 

 

범주변수 변환

  • 범주형 변수는 주로 원핫인코딩을 적용하여 변환할 수 있다.
  • 원핫 인코딩이랑 각 변수의 하위 범주를 변수로 만들어 해당하면 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