目次
0.結論
1.コンペティション概要
2.前処理
3.モデリング
4.おわりに
0. 結論
SIGNATE Cup2024に参加。
順位:558 位 / 1,226人投稿
なかなか順位を上げることができなかったものの、AIコンペ完走することができ、多くの学びがあった。
1. コンペティション概要
旅行会社の保有する顧客データ(属性や志向、営業担当との接触履歴等)を元に、旅行パッケージの成約率を予測するモデルを構築するコンペティション。
2. 前処理
特徴量 | 処理概要 | Nan値埋め |
---|---|---|
Age (顧客の年齢) |
①漢数字を数字に変換 ②全角の数字を半角に変換 ③〇代は〇5に変換(例.20代→25、10代のみ18に変換) |
平均値(整数) |
DurationOfPitch (営業担当者による顧客への売り込み時間) |
①分数を秒数へ変換(例.5→300) | 平均値(整数) |
Gender (顧客の性別) |
①表記ゆれの修正(例.fe male→female) | - |
NumberOfFollowups (セールストーク後に営業担当者が行ったフォローアップの合計数) |
①外れ値処理(3桁値を100で割って1桁にする)(例.500→5) | 平均値(整数) |
ProductPitched (営業担当者による商品の売り込み) |
①名寄せ処理(例.klng→king) | - |
NumberOfTrips (顧客の年間旅行数) |
①年での回数に修正(例.「年に1回→1」 | 平均値(整数) |
Designation (現在の組織における顧客の指定) |
①名寄せ処理(例.m@nager→manager) | - |
MonthlyIncome (顧客の月収) |
①文字列値含め数値型(int)に修正(例.月収30万円→300000) | 平均値(整数) |
customer_info (顧客の情報のメモ(婚姻状況や車の有無、旅行の子どもの同伴の有無について記載されている)) |
①区切り文字の統一化 ②婚姻状況、車の有無、子供の人数に分割 |
上記前処理における名寄せ処理について以下にサンプルを記載する。
!pip install Levenshtein
from Levenshtein import ratio, distance
def find_closest_word_and_similarity_1(word, correct_words):
if correct_words.size > 0:
# 各単語とのLevenshtein類似度を計算
similarities = [ratio(word, correct_word) for correct_word in correct_words]
# 最大類似度の単語とその類似度を返す
return correct_words[np.argmax(similarities)]
else:
return word
df1_test = pd.DataFrame({"word":["appli","banana","lennon","grap","おざなり"]})
df2_true = pd.DataFrame({"target":["grape", "apple", "banana", "lemon","なおざり"]})
df1_test['closest_word'] = df1_test['word'].apply(lambda x: find_closest_word_and_similarity_1(x, df2_true['target'].values))
上記スクリプトでは編集距離(Levenshtein Distance)を用い、正解の語句群へ誤字が含まれる語句群を参照することで誤字を訂正することとしています。
編集距離(Levenshtein Distance)については以下の記事が詳しいので、必要に応じてご確認下さい。
編集距離(Levenshtein Distance)の計算方法・計算量を考える
3. モデリング
モデリングには以下の6個及びそれらの出力を平均したものを利用しました。
①Random Forest
②AdaBoost
③Gradient Boosting
④XGBoost
⑤CatBoost
⑥LightGBM
平均して良い結果が出ていたのはCatBoostです。
しかし、木系のモデルでは分類に間違っていたサンプルに対して、出力平均を用いた結果では分類に成功していることもあり、アンサンブルの効果を実感しました。
また、本コンペの検討点の一つとして、不均衡データ(購入無:2992、購入有:497)の取り扱いが挙げられます。
今回は以下の記事を参考に対策としてアンダーサンプリング+バギングを実施しました。
機械学習の課題: 不均衡データへのアンダーサンプリング解決策
具体的にはモデリングの際に(購入無:497、購入有:497)のように多数クラスのサンプル数を少なく選定し、さらに選定の際にはランダム抽出を行なっています。
上記、アンダーサンプリング+バギングを行うことで、識別境界がロバストとなることが今回の学びです。
4. おわりに
初めてAIコンペに参加してみました。
完走はできたものの、結果は振るわず。。。というものでした。
しかしながら、技術的な部分での学びは多く次回以降のコンペに対しても精力的に取り組みたいです!!
また、データ探索についても行なったので、他データを用いて同様のデータ探索を行なってみたいと思います。
長い文章を最後までお読みいただき、ありがとうございました!!