유전체 정보 품종 분류 AI 경진대회

[Private 1위] CatboostEncoder+OverSampling+VotingClassifier

공동작성자

stroke
2023.01.18 01:08 5,580 조회 language

이번 대회를 하면서 sklearn에 내장된 모든 Classifier 및 Boosting계열 모델, 딥러닝모델(TabNet) 등등을 사용해봤습니다.

실험한 모델이 36개정도 되는데 각각 FeatureSelection 및 Parameter Tuning을 진행하였고 최종 9개 모델을 선별하여 사용했습니다.

딥러닝 모델들 같은 경우는 생각보다 성능이 잘 나오지 않아 사용 모델 목록에서 제외하였습니다.

sklearn에 내장된 모든 classifier 모델들은 all_algorithm을 통해 불러와서 실험을 해보았습니다.

Boosting계열 및 sklearn에 내장된 모델들을 Parameter Tuning 해보았는데 데이터셋이 아무래도 작다 보니 튜닝 전과 후가 거의 차이가 없던것도 특징이었던거 같습니다.

파생변수같은 경우는 SNP_info에 있는 chrom, cm 등등을 Clustering해서 특징 별로 SNP 결합도 해보았고 여러 파생변수를 만들어서 최종 80여개 정도 만들었고 Feature Selection을 진행하여 최종 피처셋을 결정하였습니다.

또한 EDA결과 클래스 불균형이 있는걸로 판단하여 OverSampling, UnderSampling 및 모델에서 class_weight, sample_weight를 조절하는등 여러 실험을 한 결과 BorderlineSMOTE를 사용하는게 가장 좋았습니다.

이번 대회 같은 경우는 데이터셋이 작고 다중 분류인 특성 때문에 앙상블을 진행하지 않으면 생각보다 일반화 성능이 떨어질 것이라 예상하여서 처음부터 방향성을 최대한 많은 모델들을 실험해보는 쪽으로 잡았습니다.

다들 고생하셨습니다.(국민대 화이팅!)

PDF
코드
로그인이 필요합니다
0 / 1000
카즈하
2023.01.18 08:23

고생하셨습니다! 국민대 파이팅

국민대민쑤
2023.01.18 14:26

파이팅!

초밥좋아
2023.01.18 10:01

멋지네요. 잘 보고 갑니다!

국민대민쑤
2023.01.18 14:26

감사합니다.

백남진
2023.01.18 13:00

감사합니다 잘 봐씁니다.

국민대민쑤
2023.01.18 14:27

감사합니다.

자강사123
2023.01.18 14:07

감사합니다. 잘 봤습니다.
최종모델에서 파라미터 조절도 어떻게 하셨는지 궁금합니다.

국민대민쑤
2023.01.18 14:48

실험할 때는 Optuna를 이용하여 파라미터 조절을 했습니다.
파라미터 조절 같은 경우는 sklearn 내장모델은 sklearn에 나와있는 각각 모델 파라미터들을 찾아서 Optuna로 조절 해주었고 boosting 계열 같은 경우는
CatBoostClassifier(objective='MultiClass', eval_metric="TotalF1:average=Macro")
LGBMClassifier(objective='multiclass') -> fit함수에서 eval_metric을 custom해서 "f1_macro" loss를 줄이는방식으로 학습되게함
XGBClassifier(objective='multi:softmax', num_class=3) 을 고정으로 사용하였고 Optuna로 튜닝한 파라미터는 일반적으로 성능에 영향을 크게 주는 learning_rate, n_estimators, max_depth 같은 파라미터들 위주로 튜닝을 했었습니다.

최종모델은 데이터셋이 작고 분류이다 보니 Optuna 사용 전후가 class_weight 파라미터를 제외하면 기본 모델과 predict 결과 값 차이가 없어서 Optuna를 사용한 코드를  제외하고 모델 기본 파라미터에 seed만 고정해서 제출했습니다.

만약에 데이터셋이 크거나 회귀였다면 파라미터 튜닝 및 시드 앙상블 같은 기법은 필수라고 생각됩니다.

자강사123
2023.01.19 14:26

감사합니다.

동동구
2023.01.18 22:05

감사합니다. 참고하여 공부해보겠습니다!

국민대민쑤
2023.01.19 14:48

감사합니다.

shki
2023.01.19 10:00

한수 배웁니다!

국민대민쑤
2023.01.19 14:48

감사합니다.

씩씩한오리너구리
2023.02.06 22:04

일등 축하드립니다  파생변수 생성관련해서 질문드립니다.
코드에 들어가있는 파생변수 만드는 부분
------------------------------------------------
train_x['2_BTA'] = train_x['SNP_01']
train_x['chrom_6'] = train_x['SNP_02'] + '-'+ train_x['SNP_03'] + '-' + 
.
.
------------------------------------------------
이 부분은 더 많은 파생변수들 중에서 feature selection을 통해 선택된 파생변수들인 것인가요?
그리고 feature selection은 어떤 라이브러리를 사용하셨는지 궁급합니다..!

국민대민쑤
2023.02.13 22:19

1. 더 많은 파생변수들 중에서 feature selection을 통해 선택된 파생변수들인 것인가요? 
: feature selection한 결과를 참고하였지만 feature selection을 통해 선택된 파생변수는 아닙니다.
파생변수 생성같은 경우도 궁금하실꺼 같아서 올려드리자면 80여개를 생성하였고 예를 들어 코드중 일부를 공유해드리자면
predict = pd.DataFrame()
for i in range(len(info_list)):
  model = KMeans(n_clusters=6, random_state=CFG.SEED)
  model.fit(info_list[i])
  predict = pd.concat([predict,pd.DataFrame(model.predict(info_list[i]))],axis=1)
predict.columns = ['chrom_clust','cm_clust','pos_clust','chorm_cm_clust','chorm_pos_clust','cm_pos_clust','chrom_cm_pos_clust']
snp_info = pd.concat([snp_info,predict], axis=1)
처럼 snp_info.csv 파일을 활용하여 clustering 및 SNP_합,분할 등등을 한 피처를 생성하였습니다.
feature selection을 하였을 때 SNP_합, ACG개수 등등이 중요하게 찍히고 나머지 피처도 중요하지 않은것은 아니었지만 위 코드에서 사용한 피처만으로도 충분히 고도화된 성능이 나와서 최종 피처를 결정하였습니다.

2. feature selection은 어떤 라이브러리를 사용하셨는지 궁급합니다..! 
 :  Shap와 percentile 두 개의 라이브러리를 사용하였고 추가적으로  feature importance를 찍어보면서 선별했습니다.