머신러닝의 최종실습을 통해 최종정리를 하겠습니다.
처음으로는 필요한 패키지를 불러옵니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format = 'retina'
warings은 오류는 아니지만 경고를 알려주는 해당 경고를 안띄우게 해주는 설정입니다.
다음으로는 데이터를 가져옵니다.
path = '데이터주소'
data = pd.read_csv(path)
데이터를 불러왔다면 다음으로는 데이터에 대해서 분석을 진행합니다. 데이터 분석에는 다양한 방법이 있는데 .head()
나 .tail()
을 사용해줍니다. 전체적인 변수의 정보를 확인하기 위해서는 .info()
를 사용합니다. 기술통계(표준편차, 사분위수, 평균등)을 정보를 얻고자 한다면 .describe()
를 사용합니다.
데이터 분석이 끝났다면 머신러닝을 위한 데이터 준비에 들어갑니다.
우선 x, y로 데이터를 분리해줍니다.
# target 확인
target = '타겟명'
# 데이터 분리
x = data.drop(target, axis=1)
y = data.loc[:,target]
타겟은 y값으로 예측으로 통해 알고자하는 변수를 적어줍니다.
데이터 분리 후에는 가변수화가 필요한 변수들이 있으면 one-hot encoding을 통한 가변수화를 진행해줍니다.
# 가변수화 대상 선정
dumm_cols = ['컬럼명1', '컬럼명2']
# 가변수화
x = pd.get_dummies(x, columns=dumm_cols, drop_first=True )
# 확인
x.head()
성별이나 등급 객실처럼 object타입이거나 int타입이라해도 0,1,2,3같이 연속된 숫자가 아닌 변수들에 한해서 가변수화를 진행해줍니다. 단, 타겟의 변수는 절대 건들지 않도록합니다. 그래서 데이터를 분리한 후에 x에 대해서만 가변수화를 진행해주면 이런 문제를 방지할 수 있습니다.
가변수화까지 진행이 다 됐다면 학습용과 평가용 데이터로 분리합니다. 캐글에서는 평가용 데이터가 따로 있어서 데이터 분리를 할 필요가 없다고는 하지만 그럼 검증을 위해 하는 단계라고 이해하면 될 것 같습니다 학습용과 검증용 데이터 분리를 진행합니다.
# 모듈 불러오기
from sklearn.model_selection import train_test_split
# 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
변수명은 약속이기 때문에 틀에서 벗어나지 않도록 합니다. 사이킷런의 model_selection
모듈에서 train_test_split
을 가져와서 데이터 셋을 분리해줍니다.
평가용과 검증용(테스트용)의 데이터분리가 끝나면 정규화를 진행합니다. 정규화가 필요한 알고리즘은 KNN과 SVM이 있는데 정규화를 진행한 후에 다른 데이터에 그대로 사용해도 무방하기 때문에 정규화 작업을 해준 후 사용해도 됩니다.
# 모듈 불러오기
from sklearn.preprocessing import MinMaxScaler
# 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
정규화를 진행하면 데이터타입은 리스트 타입으로 바뀌기 때문에 필요하다면 데이터프레임으로 바꾸는 형태도 기억하면 좋습니다.
# 모듈 불러오기
from sklearn.preprocessing import MinMaxScaler
x_cols = list(x)
# 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
x_train = pd.DataFrame(x_train, columns = x_cols)
x_test = pd.DataFrame(x_test, columns=x_col)
이제 머신러닝을 위한 모든 데이터 준비가 완료되었습니다. 이제는 머신러닝을 실시하겠습니다.
※필요에 따라서는 pip install을 통해 필요 모듈들을 설치해야됩니다.
먼저 머신러닝에 사용할 함수들을 불러옵니다.
# 불러오기
from sklearn.metrics import *
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRFRegressor
from lightgbm import LGBMRegressor
result = {}
평가 방법은 sklearn.metrics
에 있기 때문에 모든 패키지를 불러온다는 *
를 사용하여 모든 평가 방법을 가져와줍니다. 그리고 해당 실습에서는 회귀예측을 위해 회귀 방법의 알고리즘들을 불러왔습니다. 항상 회귀 예측인지 분류 예측인지 잘 생각해야됩니다. 왜냐하면은 회귀와 분류에 사용하는 알고리즘이 다르고 평가 방법이 다르기 때문입니다. result는 알고리즘 별로 결과값을 저장해서 확인하기 위해 알고리즘 이름을 키 값으로 그리고 결과 값을 value값으로 저장하기 위해 dictionary 만들어주었습니다.
모든 알고리즘은 K-Fold CV를 사용해서 교차검증을 진행했습니다.
먼저 Linear Regression 사용방법을 보겠습니다.
# 선언하기
model = LinearRegression()
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv = 10)
# 결과확인
print(cv_score)
print('평균', cv_score.mean())
# 결과수집
result['Linear Regression'] = cv_score.mean()
다음으로 KNN알고리즘 사용방법을 보겠습니다.
# 선언하기
model = KNeighborsRegressor()
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv =10)
# 결과확인
print(cv_score)
print('평균 :',cv_score.mean())
# 결과수집
result['KNN'] = cv_score.mean()
다음으로는 Decision Tree에 대한 사용방법을 보겠습니다.
# 선언하기
model = DecisionTreeRegressor(max_depth=5, random_state=1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv = 10)
# 결과확인
print(cv_score)
print('평균', cv_score.mean())
# 결과수집
result['Decision Tree'] = cv_score.mean()
다음으로는 SVM에 대한 사용법을 보겠습니다.
# 선언하기
model = SVR(kernel='poly', gamma=1 ,C=3)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv =10)
# 결과확인
print(cv_score)
print('평균:', cv_score.mean())
# 결과수집
result['SVR'] = cv_score.mean()
다음으로는 Random Forest에 대한 사용법을 보겠습니다.
# 선언하기
model = RandomForestRegressor(max_depth=5, random_state=1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=10)
# 결과확인
print(cv_score)
print('평균 :',cv_score.mean())
# 결과수집
result['Random Forest'] = cv_score.mean()
다음으로는 XGBoost에 대한 사용법을 보겠습니다.
# 선언하기
model = XGBRFRegressor(max_depth = 5, random_state = 1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=10)
# 결과확인
print(cv_score)
print('평균', cv_score.mean())
# 결과수집
result['XGBoost'] = cv_score.mean()
다음으로는 LightGBM에 대한 사용법을 보겠습니다.
# 선언하기
model = LGBMRegressor(max_depth=5, random_state = 1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=10)
# 결과확인
print(cv_score)
print('평균 :',cv_score.mean())
# 결과수집
result['LightGBM'] = cv_score.mean()
이로써 배운 모든 머신러닝 알고리즘을 한번씩 사용해봤습니다. 물론 아직 하이퍼파라미터에 대해 Search기법을 사용하지 않았지만 먼저 각 알고리즘에 대해 성능평가를 확인하고 잘나온 모델에 대해서 최적의 하이퍼파라미터를 찾아주겠습니다.
result에 각 알고리즘에 대한 결과를 넣었기 때문에 result를 확인하겠습니다.
for m_name, score in result.items():
print(m_name, score.round(3))
시각화로도 확인할 수 있습니다.
# 성능 시각화 비교
plt.barh(list(result.keys()), result.values())
plt.show()
해당 결과 확인을 통해 가장 성능이 좋았던 알고리즘을 선택해서 최종 알고리즘으로 결정을 합니다. 결정이 된 알고리즘을 가지고 이제 하이퍼파라미터 튜닝을 통해 더 좋은 성능을 기대할 수 있도록 최적의 하이퍼파라미터 값을 찾습니다.
저는 XGBoost가 가장 성능이 높게 나와서 XGBoost에 대해 튜닝을 진행하겠습니다.
먼저 최종 알고리즘에 대해 튜닝 준비를 해줍니다.
# 기본 모델 선언
model_xg = XGBRFRegressor(random_state=1)
# 파라미터 지정
# max_depth
param = {'max_depth' : range(1,21)}
# 모델 선언
model = GridSearchCV(model_xg, param, cv=10)
XGBoost는 결정트리 기반이기 때문에 max_deapth
나 min_samples_leaf
등의 하이퍼파라미터를 가지고 있습니다. 하지만 파라미터의 갯수가 많아지면 튜닝 속도가 오래걸리기 때문에 max_deapth
에 대해서만 튜닝을 진행했습니다.
파라미터 지정과 모델선언이 끝났다면 학습을 진행해줍니다.
# 학습하기
model.fit(x_train, y_train)
학습횟수는 파라미터 범위 20, CV값(K값) 10을 곱한 값으로 200번 진행합니다.
학습이 완료되면 결과확인을 통해 최적의 파라미터 값과 최고의 성능을 알아냅니다.
# 최적 파라미터, 예측 최고 성능
print('최적의 파라미터 :', model.best_params_)
print('최고의 성능 :', model.best_score_)
그리고 변수의 중요도를 시각화해서 각 변수별로 중요도를 확인합니다. XGBoost에서 변수 중요도를 시각화해서 보는 방법은 아래와 같습니다.
# 변수 중요도 시각화
plt.barh(list(x), model.best_estimator_.feature_importances_)
plt.show()
XGBoost에서 변수중요도 확인은 모델.best_estimator_.feature_importances_
를 사용해주면 확인할 수 있습니다.
이제 마지막으로 최종 성능평가를 진행합니다.
# 예측하기
y_pred = model.predict(x_test)
# 성능평가
print('MAE : ', mean_absolute_error(y_test, y_pred))
print('R2 : ', r2_score(y_test, y_pred))
평가 방법으로는 회귀모델이기 때문에 r2_score
와 MAE
를 사용했습니다.
오늘로 이제 머신러닝에 대해 공부를 마쳤습니다. 학습데이터에서 성능이 좋았다고 최종평가에서 성능이 좋게 나오는 것은 아니지만 배운 것을 최대한 활용하고 튜닝을 해서 성능을 끌어올려야겠다고 생각했습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.