728x90
1. 하이퍼파라미터 설정 없이 DecisionTree로 학습하고 예측하기
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 예제 반복 시 마다 동일한 예측 결과 도출을 위해 random_state 설정
dt_clf = DecisionTreeClassifier(random_state=156)
dt_clf.fit(X_train , y_train)
pred = dt_clf.predict(X_test)
accuracy = accuracy_score(y_test , pred)
print('결정 트리 예측 정확도: {0:.4f}'.format(accuracy))
# DecisionTreeClassifier의 하이퍼 파라미터 추출
print('DecisionTreeClassifier 기본 하이퍼 파라미터:\n', dt_clf.get_params())
2. GridSearchCV로 하이퍼파라미터 튜닝 해보기
2-1. max_depth랑 min_samples_split 설정해서 학습 후, 최고 정확도 수치와 최적의 하이퍼 파라미터 출력
from sklearn.model_selection import GridSearchCV
params = {
'max_depth' : [ 6, 8 ,10, 12, 16 ,20, 24],
'min_samples_split': [16]
}
grid_cv = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv = 5, verbose=1)
grid_cv.fit(X_train , y_train)
print('GridSearchCV 최고 평균 정확도 수치:{0:.4f}'.format(grid_cv.best_score_))
print('GridSearchCV 최적 하이퍼 파라미터:', grid_cv.best_params_)
1) grid_cv의 전체 결과값 출력해서 보기
.cv_results_
# GridSearchCV객체의 cv_results_ 속성을 DataFrame으로 생성.
cv_results_df = pd.DataFrame(grid_cv.cv_results_)
# max_depth 파라미터 값과 그때의 테스트(Evaluation)셋, 학습 데이터 셋의 정확도 수치 추출
cv_results_df[['param_max_depth', 'mean_test_score']]
#cv_results_df
max_depth가 8일때 accuracy 점수가 가장 높은 것을 확인!
2-2. min_samples_split 추가하고, max_depth 범위 넓혀서 학습하고 예측 결과 보기
1) 학습해서 최적의 하이퍼 파라미터와 평균 정확도 수치 확인
params = {
'max_depth' : [ 8 , 12, 16 ,20],
'min_samples_split' : [16, 24],
}
grid_cv = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv=5, verbose=1 )
grid_cv.fit(X_train , y_train)
print('GridSearchCV 최고 평균 정확도 수치: {0:.4f}'.format(grid_cv.best_score_))
print('GridSearchCV 최적 하이퍼 파라미터:', grid_cv.best_params_)
📌2-1에서 수행했던 파라미터와 결과 같음
2) 학습된 모델로 예측 후 정확도 출력
GridSearchCV에서 refit=True가 디폴트 값이기 때문에 또 best_params로 학습시킬 필요 없음
best_df_clf = grid_cv.best_estimator_
pred1 = best_df_clf.predict(X_test)
accuracy = accuracy_score(y_test , pred1)
print('결정 트리 예측 정확도:{0:.4f}'.format(accuracy))
📌파라미터를 적용하지 않았을 때보다 결정 트리 예측 정확도 상승 (0.8548 → 0.8717)
3. 피처 중요도 확인해보기
피처중요도 (feature_importances_)
- 결정트리에서 노드를 분리할 때, 해당 피쳐가 클래스를 나누는데 얼마나 영향을 미쳤는지 표기하는 척도
ftr_importances_values = best_df_clf.feature_importances_
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns)
ftr_importances.sort_values(ascending=False)
표로 그려보기
import seaborn as sns
ftr_importances_values = best_df_clf.feature_importances_
# Top 중요도로 정렬을 쉽게 하고, 시본(Seaborn)의 막대그래프로 쉽게 표현하기 위해 Series변환
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns )
# 중요도값 순으로 Series를 정렬
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]
plt.figure(figsize=(8,6))
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20 , y = ftr_top20.index)
plt.show()
728x90
'머신러닝' 카테고리의 다른 글
[분류] 앙상블 학습 - 보팅, 배깅, 부스팅 (0) | 2024.03.03 |
---|---|
[분류] 랜덤포레스트 RandomForest (0) | 2024.03.03 |
[분류] 결정트리 파라미터 DecisionTree parameters (0) | 2024.03.03 |
anaconda Graphviz 설치 방법 (0) | 2024.03.03 |
[분류] 정밀도와 재현율의 Trade-off, predict_proba(), Binarizer() (0) | 2024.03.02 |