[변수 생성] AutoEncoder로 파생변수 만들기 -2 (모델링 파트) Catboost
2019. 6. 2. 14:21ㆍ분석 Python/Data Preprocessing
https://data-newbie.tistory.com/163
## 모델링 파트
이전에 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
'분석 Python > Data Preprocessing' 카테고리의 다른 글
[변수 처리] Python에서 범주형 변수(Categorical) 다루기 (0) | 2019.09.13 |
---|---|
[ 변수 처리] 파이썬 결측치 대체 알고리즘 비교 예시 (4) | 2019.09.10 |
[변수 처리] 011011 같은 값을 multiple label encoding 으로 만들어주기 (0) | 2019.07.16 |
[변수 생성] AutoEncoder로 파생변수 만들기 (0) | 2019.06.02 |
[ 변수 생성] pandas groupby 와 merge로 파생변수 넣기 (0) | 2019.05.21 |