관리 메뉴

솜씨좋은장씨

[DACON] 심리 성향 예측 AI 경진대회 2일차! 본문

DACON/심리 성향 예측 AI 경진대회

[DACON] 심리 성향 예측 AI 경진대회 2일차!

솜씨좋은장씨 2020. 10. 4. 14:30
728x90
반응형

 

심리 성향 예측 AI 경진대회

출처 : DACON - Data Science Competition

dacon.io

심리성향 예측 AI 경진대회 2일차!

오늘은 먼저 지난번에 GridSearchCV를 통해 얻은 최적의 파라미터 값을 바탕으로 결과를 내보기로 했습니다.

너무 욕심을 많이 부려서 너무 많은 파라미터를 넣은 탓인지 최적의 파라미터를 도출하는데까지

약 23시간의 시간이 소요되었습니다.

GridSearchCV에 관한 코드는 지난 1일차 게시물에 포함되어있습니다.

 

23시간이 소요된 끝에 얻은 파라미터는...!

Fitting 5 folds for each of 5460 candidates, totalling 27300 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 27300 out of 27300 | elapsed: 1402.2min finished
최적 평균 RMSE 값: 0.5659
최적 파라미터: {'learning_rate': 0.05, 'max_depth': 10, 'min_child_samples': 20, 'n_estimators': 100}
CPU times: user 14d 17h 19min 34s, sys: 1h 43s, total: 14d 18h 20min 18s
Wall time: 23h 22min 12s

위와 같습니다.

이를 적용하여 결과를 도출해보면

model = lgbm.LGBMClassifier(learning_rate=0.05, max_depth=10, min_child_samples=20, n_estimators=100)
model.fit(train_x, train_y)
pred_y = model.predict(test)
submission['voted']=pred_y
submission.to_csv('./data/sample_sub_baseline_04.csv')

0.6899659157 로 기존 baseline보다는 높은 정확도였지만 결과는 만족스럽지 않았습니다.

 

이번에는 baseline 코드에서 각 항목을 무시하고 모든 값을 1로 넣어주었던 부분을 수정하여 결과를 도출해보기로 했습니다.

#age_group, gender, race, religion
train_x['age_group']=1
train_x['gender']=1
train_x['race']=1
train_x['religion']=1

test['age_group']=1
test['gender']=1
test['race']=1
test['religion']=1

이렇게 막무가내로 1로 넣었던 항목들을 하나하나 살펴보기로 했습니다.

 

먼저 각 항목들이 어떤 값들로 구성되어있는지 확인해보았습니다.

train_x['race'].unique()
array(['White', 'Asian', 'Other', 'Black', 'Native American', 'Arab',
       'Indigenous Australian'], dtype=object)
train_x['gender'].unique()
array(['Female', 'Male'], dtype=object)
train_x['religion'].unique()
array(['Other', 'Hindu', 'Agnostic', 'Atheist', 'Christian_Other',
       'Christian_Catholic', 'Muslim', 'Buddhist', 'Christian_Protestant',
       'Jewish', 'Christian_Mormon', 'Sikh'], dtype=object)
train_x['age_group'].unique()
array(['30s', '20s', '40s', '50s', '10s', '60s', '+70s'], dtype=object)

각각 인종, 성별, 종교, 지역, 연령 정보를 가지고 있었습니다.

각각을 모두 1로 바꾸는 것이 아닌 각 항목을 살려 정수로 인코딩 해주기로 했습니다.

race_key = list(train_x['race'].unique())

race_dict = {}

for i, key in enumerate(race_key):
    race_dict[key] = i+1
from tqdm import tqdm

for i in tqdm(range(len(train_x['race']))):
    train_x['race'].iloc[i] = race_dict[train_x['race'].iloc[i]]
for i in tqdm(range(len(train_x['gender']))):
    if train_x['gender'].iloc[i] == 'Female':
        train_x['gender'].iloc[i] = 1
    elif train_x['gender'].iloc[i] == 'Male':
        train_x['gender'].iloc[i] = 2
religion_key = list(train_x['religion'].unique())

religion_dict = {}

for i, key in enumerate(religion_key):
    religion_dict[key] = i+1

for i in tqdm(range(len(train_x['religion']))):
    train_x['religion'].iloc[i] = religion_dict[train_x['religion'].iloc[i]]
age_group_key = list(train_x['age_group'].unique())

age_group_dict = {}

for i, key in enumerate(age_group_key):
    age_group_dict[key] = i+1

for i in tqdm(range(len(train_x['age_group']))):
    train_x['age_group'].iloc[i] = age_group_dict[train_x['age_group'].iloc[i]]
train_x['gender'] = pd.to_numeric(train_x['gender'])
train_x['religion'] = pd.to_numeric(train_x['religion'])
train_x['age_group'] = pd.to_numeric(train_x['age_group'])
train_x['race'] = pd.to_numeric(train_x['race'])

이렇게 바꾸어준 데이터를 활용해서 다시 LGBMClassifier를 활용해서 학습하고 결과를 도출해보겠습니다.

%%time
model = lgbm.LGBMClassifier(learning_rate=0.05, n_estimators=100, min_child_samples=20, max_depth=10)
model.fit(train_x, train_y)
race_key = list(test['race'].unique())

race_dict = {}

for i, key in enumerate(race_key):
    race_dict[key] = i+1

for i in tqdm(range(len(test['race']))):
    test['race'].iloc[i] = race_dict[test['race'].iloc[i]]
    

for i in tqdm(range(len(test['gender']))):
    if test['gender'].iloc[i] == 'Female':
        test['gender'].iloc[i] = 1
    elif test['gender'].iloc[i] == 'Male':
        test['gender'].iloc[i] = 2
        
religion_key = list(test['religion'].unique())

religion_dict = {}

for i, key in enumerate(religion_key):
    religion_dict[key] = i+1

for i in tqdm(range(len(test['religion']))):
    test['religion'].iloc[i] = religion_dict[test['religion'].iloc[i]]
    

age_group_key = list(test['age_group'].unique())

age_group_dict = {}

for i, key in enumerate(age_group_key):
    age_group_dict[key] = i+1

for i in tqdm(range(len(test['age_group']))):
    test['age_group'].iloc[i] = age_group_dict[test['age_group'].iloc[i]]
    

test['gender'] = pd.to_numeric(test['gender'])
test['religion'] = pd.to_numeric(test['religion'])
test['age_group'] = pd.to_numeric(test['age_group'])
test['race'] = pd.to_numeric(test['race'])
pred_y = model.predict(test)
submission['voted']=pred_y
submission.to_csv('./data/baselinne_05.csv')

결과는!

0.6587682249 결과를 얻을 수 있었습니다.

model = lgbm.LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
                importance_type='split', learning_rate=0.1, max_depth=-1,
                min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
                n_estimators=100, n_jobs=-1, num_leaves=31, objective=None,
                random_state=6670, reg_alpha=0.0, reg_lambda=0.0, silent=True,
                subsample=1.0, subsample_for_bin=200000, subsample_freq=0)

마지막으로 지난 pycaret 라이브러리를 활용한 AutoML에서 나온 Best3 모델 중 lgbm모델을 가져와 활용해보았습니다.

0.6627028493 결과를 얻을 수 있었습니다.

 

데이터를 이해하지 못한 상황에서 그냥 모델에 넣어보고 결과를 내보기에는 아쉬운 점이 있는 것 같습니다.

 

읽어주셔서 감사합니다.

Comments