[변수 생성] AutoEncoder로 파생변수 만들기 -2 (모델링 파트) Catboost

2019. 6. 2. 14:21분석 Python/Data Preprocessing

https://data-newbie.tistory.com/163

 

AutoEncoder로 파생변수 만들기

데이터 분석을 하다보면, 새로운 파생변수를 만들어야 할 때가 있다. 개인적으로 나도 그러한 부분에 관심이 있어서 여래개로 포스팅을 했는데, 한번 보시면 도움이 될 것 같다. https://data-newbie.tistory.com/..

data-newbie.tistory.com

## 모델링 파트

이전에 AutoEncoder에서 얻은 Code값을 이용해서 모델링을 해봤습니다.

 

모델은 tree-based model 중에서 그나마 Parameter에 크게 의존하지 않는다는 catboost로 하였습니다.

궁금하신분은 https://data-newbie.tistory.com/131?category=750846 참고하면 될 것 같습니다.

 

전처리는 각자 원하는 대로 하면 되고, 모델링 코드는 다음과 같습니다.

절대 원칙
test는 한번도 보지 못한 것으로 모든 전처리는 train 기준값을 활용한다
param = {'depth': 8, 'l2_leaf_reg': 1e-19, 'loss_function': 'Logloss'}
clf = CatBoostClassifier(iterations=2500,
                         loss_function = param['loss_function'],
                         depth=param['depth'],
                         l2_leaf_reg = param['l2_leaf_reg'],
                         eval_metric = 'TotalF1',
                         task_type = "CPU" , 
                         leaf_estimation_iterations = 10,
                         use_best_model=False)
X ,  y = catX_train , caty_train
clf.fit(X = X, y = y, cat_features = cat_features, verbose=False , plot= False )
test_X ,test_y =  catX_Test , caty_Test
test_pool = Pool( data =test_X, label = test_y , cat_features = list(cat_features))
CatBoost_eval = clf.eval_metrics(test_pool, ['AUC','Logloss', "F1"], plot=False)
F1_index  = np.argmax(CatBoost_eval['F1'])
CatBoost_AUC  = CatBoost_eval['AUC'][F1_index ]
CatBoost_Logloss = CatBoost_eval['Logloss'][F1_index]
CatBoost_F1 = CatBoost_eval['F1'][F1_index]
print("F1 : " ,CatBoost_F1)
print("AUC : ", CatBoost_AUC)
print("logloss : " , CatBoost_Logloss)

import seaborn as sns
sns.set(rc={'figure.figsize':(11.7,9.27)})
cat_feature_imp = pd.DataFrame([clf.feature_names_ , clf.feature_importances_]).T
cat_feature_imp.columns = ["feature","varimp"]
cat_feature_imp = cat_feature_imp.sort_values(by="varimp", ascending = False)
sns.barplot(y="feature", x="varimp",data = cat_feature_imp, )
plt.show()

## AutoEnocder 변수 추가할 시 모델링 결과

  • 변수 중요도에서변수 중요도에서 AutoEncoder 관련 변수들이 상위권에 있는 것을 알 수 있습니다.

  • 즉 함축된 코드를 데이터로 넣었을 때, 좋은 파생변수 역할을 한다는 것을 알 수 있습니다.

## 다음은 AutoEncoder Code 제외하고 그냥 했을 때,

...............  기대와는 다른 결과가 나왔다.

  • 왜 이런결과가 나왔는지에 대해서 생각을 해보면 다음과 같은 이유가 있을 수 있다.
    • 현재 사용하고 있던 param = {'depth': 8, 'l2_leaf_reg': 1e-19, 'loss_function': 'Logloss'} 은 기존에 AutoEncoder를 추가하지 안 하고 베이지안 최적화를 통해서 얻은 값이다. 
    • 그때 F1 Score를 기준으로 최대화를 시켰을 때 얻은 것을 그대로 이용했는데....
    • 변수 중요도를 보면 신기하게 기본적으로 파생한 변수가 아주 높은 순위에 오르게 된다.
    • 사실을 또 엄밀하게 제가 왜 또 중요해졌는지 봐야하는데... (귀찮....)
    • 그리고 다른 변수들은 다 중요도가 많이 떨어지게 돼서, 결국에는 6개 정도만 유의미하게 나오는데,
      • 그래도  Humidity3pm , WindGustSpeed , Pressure3pm 관련 변수 이렇게가 둘다 나오는 것을 보니 확실히 2개는 먼가 중요한 영향을 끼치는 변수 인 것 같다.
    • 이것의 성능은 좋게 나오기는 하는데,  오히려 유의미한 변수가 너무 적어서 잘 나왔다고 해야 하는지는 고민을 해보게 되는 것 같다.

 

결론

기대했던 바는 기존에는 성능이 아쉬웠던 모델이 AutoEncoder를 이용해서 파생변수를 만들어서

 

새로운 모델링을 했을 때 더 좋은 결과를 나오기를 기대했는데, 역시 예상과는 다른 것이 나왔고,

 

머 이유를 하나 생각해보자면 기존 변수가 28개이고, AutoEncoder로 만들어낸 변수가 24개인데, 

그러다 보니 기존 정보가 많이 묻혀버려서 그러는 건가 싶기도 하고........

여러 가지 망상이 든다.

 

- 끝 -

728x90