Kiva/クラウドファンディングの資金調達額予測

マルチモーダルコンペティション!Ridgelinezとの共同開催です

賞金: 200,000 参加ユーザー数: 231 3年弱前に終了
スポンサー
Ridgelinez株式会社

[振り返り]効いた・効かなかった解法について

皆様、お疲れさまでした。

今回、私のベストスコアはLB 312.95360で、解法は、 A. 公開したLightGBM(LB338前後)をベース https://comp.probspace.com/competitions/kiva2021/discussions/newduck-Postf5ea4dab7f098d55daa8 B. TAGSをone-hotエンコーディング(空白等を除くと29列に)、DESCRIPTION_TRANSLATEDとLOAN_USEはyshr10icさん公開のBERTを利用した方法で数値化、更にCURRENCY_EXCHANGE_COVERAGE_RATEはfillnaで補完 C. その上で各種エンコーディングを行い、上記のLBに1月4日に到達したようです。 CV(MAE)は260前後、importaceを見てみるとTOWN_NAMEが一番効いていると言う状態でした。

-- この時点でLBで300を切っている人が多くいて、差が大きいなあと思っていたのですが、その後、スコアを全く改善できなかったので、是非、効いた解法をこの場で議論して/教えていただければと思っています。

-- 私の場合を少しまとめてみますと、、、 ■今回一番効いたと思うもの(最終スコアは良くなかったですが、、、) TOWN_NAMEのターゲットエンコーディング

■やったけどスコアに効かなかったもの(実装が悪かった?) ①時系列データとのことで(恐らく時系列順の?)LOAN_IDで後半(例:通貨交換レートに0.0が出た以降)を切り出し学習 ⇒過学習で?スコアは大きく悪化

②特徴量作成  今回の訓練データは、(前述の)数値化されるテキストの2つ及び重複分等を除いては、10種全てカテゴリ形式でしたので、xfeatを用い組合せを10C2, 10C3,10C4,10C5まで作りラベルエンコーディングして特徴量として利用 ⇒特徴量は最大で677列でしたが、今回はサンプル数が少な目ですので、colab proで問題なく学習できました ⇒TOWN_NAME絡みは若干効いていたのと、3つ以上組合せてくるといろいろimportanceには響いてくるようでしたが、肝心のCVとLBはあまり改善しませんでした ⇒xfeatを調べている際にAutoGluonと組み合わせると言う記事を見つけ試しましたがAuoGluon部分はパラメーター等含め20行程度で9モデルの評価が可能でしたので「初手LightGBM」は正しいと思っていますが、例えば超短時間コンペ等であれば「初手AutoGluon」で様子見も良いかと思いました(因みに訓練ファイルを少し整形したものを入力してLB353.14450相当のスコアでした)

③モデルの追加 CatBoost⇒カテゴリ型に効くのかと思い実装しましたが、スコア改善出来ませんでした RFR⇒TutorialのコードがRFRでしたので時折②で作った特徴量を入力する等しましたがベストスコアでLB346.85254でした

④NLTK(token/stem/lemmatize化等)や正規表現の利用、tf-idfやLDAを使った処理 ⇒「pythonではじめる機械学習」の7章にある内容で勉強にはなりましたが、yshr10icさんのコードの方がスコアには効いたようでした。

⑤回帰から分類へのすり替え(もしくは外れ値としての検討) LOAN_AMOUNTを見てみると50刻みや100,500,1000刻みに集中しており、回帰ではなくて分類へすり替えられないか検討しましたが、うまく実装できませんでした。 また、外れ値と考える(例えばKaggleのElo Merchant Category Recommendationのような)事が出来ないかと、例えばLOAN_AMOUNTで2000以下の値のみを切り出し学習等しましたが、MAEは大幅に改善しますが、それは2000以下の値に適合しているだけで、LB改善に効果はありませんでした。

⑥アンサンブル (どうも、ここが今回、差がついたところなのかと思っていますが)、  ・②で作った特徴量を10C3まで3つ加えたものと、10C5まで5つ加えたもの  ・⑤で作った2000以下の切り出し  等を単純な加重平均や、2値分類で作った2000以上のLOAN_AMOUTになりそうな部分の予測に基づき置き換え等してみましたが、時間切れで、あまり深く検討できませんでした。

■やりたかったけど出来なかったこととして、  ・NNでのモデル構築  ・TOWN_NAMEの欠損値の補完(これはとりあえず国名でfillnaすると言うのは少しだけ効くようでした)  ・DESCRIPTION_TRANSLATEDからの情報の収拾(希望金額、性別、年齢等)  ・DESCRIPTIONの利用(翻訳して等が効くか、、、)  ・画像処理(手作業で処理してもスコア改善に役立つのか確信がもてなかったのですが、、、、)

 ・(そしてこのコンペの最大の目的、、、、)Kivaへの投資、、、、、⇒まだ間に合うかw   思い出したら追記しますが、まずはこの位です。

それでは皆様、効いた解法、効かなかった解法、コメント・アドバイス、是非教えて頂ければと思います。  

Aws4 request&x amz signedheaders=host&x amz signature=b6a5bdda6c22a284c1aeff17621eb674a66e71a9d8f86976f01ef8b8e35e5fdd
maruyama

■やりたかったけど出来なかったこととして、
 ・DESCRIPTION_TRANSLATEDからの情報の収拾(希望金額、性別、年齢等)

私はLightGBM試していないので予想ですが、希望金額を抽出して説明変数に加えると精度上がると思います。
2~3割のデータに希望金額らしきものが含まれていて、かつ通貨別にみると融資額とかなり強く相関していたので、かなり効くんじゃないかと。
NNだとfine-tuningの過程で希望金額を抽出するよう勝手に学習すると思いますが、LightGBMだとBERTの重みが固定されていて希望金額を抽出するようにはならないので、人手で明示的に入れてあげる必要があります。

Icon5
XS330

DESCRIPTION_TRANSLATEDからの情報抽出についてですが、実際に私は行いました。 希望金額については、

①希望金額にあたる数字を抽出(正規表現などを用いて)

②各通貨ごとに1米ドルに変換したときのレートを計算

③各通貨のレートの中央値をとり、希望金額が記載されているデータについては「記載金額÷レートの中央値」を計算し、それを予測値に変換

①~③を行うことで、CV,LBともに40ほど改善しました。(もしかしたらソリューションとコードをトピックに公開するかもしれません)

性別や年齢の抽出も行いましたが、(自分のやり方が良くなかったかもしれませんが)精度は改善されませんでした。

Icon2
newduck

お二人ともコメントありがとうございます。LBの上の方にいて凄いなあと見てました。

maruyamaさん>NNだとfine-tuningの過程で希望金額を抽出するよう勝手に学習する ⇒この辺りは公開(して頂けるはずの)コードで勉強させて貰おうと思います。

XS330さん>②が、かなり後半でしたが議論のあったbananabanaさんの通貨交換レートについての質問から難しいのかなあと思い、私は断念してしまっていました。 ⇒(LBで点数つけて競争と言う形だと公平性等から、外部データ禁止って必要なルールなのかもしれませんが)、いろいろ役立つ手段とか情報は使いたく、何かうまいしばりってないのかなあと思いました(Probspace上で全員に公開した外部データ・利用法は利用OK、(権利等問題なく利用できる)APIや公開情報・オープンデータは利用OK等々)

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。