[머신 러닝] 분류 문제
문제 정의: binary classifier(0 or 1)
목표 : sklearn의 여러model로 Classifier를 학습하고 생성한 Classifier의 성능을 개선
해보자.
(패스트캠퍼스 강의 내용을 기반으로 연습을 진행하였다.)
📁 colab을 사용하여 구현하자.
colab은 Jupyter에서 작업해야하는 Machine learning을 쉽게 사용할 수 있고 GPU도 서버를 통해 제공해준다.
또한, Cloud Service 기반으로 라이브러리를 별도로 설치할 필요가 없다.
필요한 라이브러리,데이터를 로드한다.
import numpy as np import pandas as pd import matploit.pyplot as plt import seaborn as sns df=df.read_csv('./exercise1.csv')
데이터를 df.head()로 확인한다.
- target을 정답(y,종속변수, target), 나머지 컬럼들(X,독립변수, feature)은 학습하기 위한 자료로 설정한다.
데이터를 분할하고 모델을 생성,학습,평가한다.
from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score X=df.iloc[:,:6] y=df['target'] X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2, random_state=42, stratify=y) model=DecisionTreeClassifier(random_state=42) model.fit(X_train,y_train) y_pred = model.predict(X_test) accuracy_score(y_test,y_pred)
df.iloc[] : row는 전체 , col은 5번째까지 학습으로 사용한다.
y : 정답이다.
train_test_split : test 데이터를 20%로 설정한다.
(random_state : 다시 실행했을 때 동일한 형태(seed)로 뽑히도록 해준다.
stratify : train, test데이터 뽑을 때 골고루 뽑히도록 해준다.)model.fit : 학습시킨다.
y_pred : 예측값이다.
accuracy_score : 예측값과 실제값을 비교하여 정확도를 나타낸다.
결과
DecisionTreeClassifier은 과적합에 빠지기 쉽다. 다른 모델의 성능도 같이 알아본다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBClassifier
rf_cls = RandomForestClassifier(random_state=42)
gb_cls = GradientBoostingClassifier(random_state=42)
xgb_cls = XGBClassifier(random_state=42)
lgb_cls = LGBMClassifier(random_state=42)
rf_cls.fit(X_train, y_train)
gb_cls.fit(X_train, y_train)
xgb_cls.fit(X_train, y_train)
lgb_cls.fit(X_train, y_train)
y_pred_rf = rf_cls.predict(X_test)
y_pred_gb = gb_cls.predict(X_test)
y_pred_xgb = xgb_cls.predict(X_test)
y_pred_lgb = lgb_cls.predict(X_test)
print('RF accuracy:{}'.format(accuracy_score(y_test,y_pred_rf)))
print('GB accuracy:{}'.format(accuracy_score(y_test,y_pred_gb)))
print('XGB accuracy:{}'.format(accuracy_score(y_test,y_pred_xgb)))
print('LGB accuracy:{}'.format(accuracy_score(y_test,y_pred_lgb)))
RandomForestClassifier, GradientBoostingClassifier, XGBClassifier, LGBClassifier모델을 만들어 학습시키고 평가한 결과이다.
의사 결정 나무 기반의 모델이기 때문에 scaling 없이 데이터 적용해도 좋은 결과를 얻을 수 있다.
⚡BONUS
그렇다면 soft vector machine모델을 생성하고 학습 시켰을 때 모델의 성능을 높이기 위해 해야 할 것은? → 바로 데이터 scaling!
거리를 이용하는 모델을 사용하기 위해 현재 각 값들의 scale을 맞춰야한다.
scale 안 해줬을 때 모델 성능
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_scale = sc.fit_transform(X)
X_train,X_test,y_train,y_test = train_test_split(X_scale, y , test_size=0.2,
random_state=42, stratify = y)
svc = SVC()
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)
accuracy_score(y_test,y_pred)
scale 맞출 때 주의할 점 : train과 test에 사용할 학습 데이터 값의 기준이 달라지면 안된다 !!
X_scale : scale 맞출 x를 넣어 데이터를 변환하고 다시 train, test로 쪼갠다.
결과