여러 개의 분류 모형의 결과를 대상으로 투표를 통해 최종 클래스 라벨을 정하는 방법
다수결 투표
- 높은 득표수를 보이는 클래스로 예측
과반수 투표
- 다수결이 아닌 절반 이상의 분류기의 표를보이는 클래스로 예측
이진 분류 문제를 푼다고 했을 때, 동일한 에러율 를 가진 개의 분류기를 가정해보자
모든 분류기의 오차는 서로 독립적이고, 서로 상관관계 가 없다고 가정한다.
이런 가정 아래 개의 분류기로 구성된 앙상블 모형의 오차 확률은 따르며 아래의 식과 같다
분류기가 틀리려면 X는 K보다 크거나 같아야 한다.
예를들어 9개의 분류기로 구성된 앙상블 분류기가 있다고 할때, 최소 5개의 분류기의 예측이 틀려야 한다.
각 분류기의 에러율이 0.3이라고 하면 아래와 같다
개별 분류기의 에러율 0.3보다 작은 0.09가 되었다.
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
clf = DecisionTreeClassifier(random_state=13, max_depth=4)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
accuracy_score(y_test, pred)
>>>
0.8096369189005769
from sklearn.model_selection import GridSearchCV
params = {
'max_depth' : [6,8,10,12,16,20,24]
}
grid_cv = GridSearchCV(clf, param_grid=params, scoring='accuracy',
cv = 5 , return_train_score=True)
grid_cv.fit(X_train, y_train)
# 여기서는 scoring 을 사용
grid_cv.best_score_
>>>
0.8543335321892183
grid_cv.best_params_
>>>
{'max_depth': 8}
cv_result_df = pd.DataFrame(grid_cv.cv_results_)
cv_result_df[['param_max_depth', 'mean_test_score','mean_train_score']]
pred = grid_cv.predict(X_test)
accuracy_score(y_test, pred1)
>>>
0.8743
from sklearn.ensemble import RandomForestClassifier
params = {
'max_depth' : [6,8,10],
'n_estimators' : [50,100,200],
'min_samples_leaf' : [8,12],
'min_samples_split' : [8,12]
}
rf_clf = RandomForestClassifier(random_state=13, n_jobs=-1)
grid_cv = GridSearchCV(rf_clf, param_grid=params ,cv = 2 , n_jobs=-1)
grid_cv.fit(X_train, y_train)
cv_result_df = pd.DataFrame(grid_cv.cv_results_)
target_col = ['rank_test_score', 'mean_test_score', 'param_n_estimators', 'param_max_depth']
cv_result_df[target_col].sort_values('rank_test_score').head()
from sklearn.metrics import accuracy_score
rf_clf_best = grid_cv.best_estimator_
pred1 = rf_clf_best.predict(X_test)
accuracy_score(y_test, pred1)
>>>
0.9205972175093315
best_col_values = rf_clf_best.feature_importances_
best_cols = pd.Series(best_col_values, index=X_train.columns)
top20_cols = best_cols.sort_values(ascending=False)[:20]
top20_cols
# feature_importances_ 를 먹여서 들고와야 한다
import seaborn as sns
plt.figure(figsize=(8,8))
sns.barplot(x=top20_cols , y=top20_cols.index)
plt.show()
# seaborn 에서도 barh 그리기 가능!
X_train_re = X_train[top20_cols.index]
X_test_re = X_test[top20_cols.index]
y_train.values.reshape(-1)
rf_clf_best_re = grid_cv.best_estimator_
rf_clf_best_re.fit(X_train_re, y_train) # 왜 바꿔줬찌..?
pred1_re = rf_clf_best_re.predict(X_test_re)
accuracy_score(y_test, pred1_re)
>>>
0.8177807940278249
- 성능은 조금 떨어졌지만 속도는 빠를것