source env/bin/activate顧客の属性情報などから定期預金キャンペーンの反応率を予測しよう。
顧客属性データおよび、過去のキャンペーンでの接触情報に基づいて口座を開設したかを予測するモデルの構築 ※本テーマ設定は練習問題に掲載のタスクと同様ですが、データは異なるものを使用しております。
| id | age | job | marital | education | default | balance | housing | loan | contact | day | month | duration | campaign | pdays | previous | poutcome | y | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 31 | services | married | secondary | no | 12294 | yes | no | cellular | 21 | nov | 101 | 3 | 498 | 0 | other | 0 |
| 1 | 1 | 29 | entrepreneur | single | tertiary | no | 43027 | no | no | cellular | 22 | aug | 158 | 2 | 702 | 0 | unknown | 1 |
| 2 | 2 | 35 | management | married | tertiary | no | 12252 | yes | no | cellular | 11 | nov | 351 | 1 | 826 | 0 | failure | 0 |
| 3 | 3 | 31 | technician | married | secondary | no | 99121 | yes | yes | unknown | 16 | may | 658 | 2 | 120 | 0 | failure | 0 |
| 4 | 4 | 48 | unemployed | married | primary | no | 42005 | yes | no | telephone | 3 | apr | 177 | 1 | 273 | 0 | unknown | 0 |
job = ['services' 'entrepreneur' 'management' 'technician' 'unemployed' 'blue-collar' 'admin.' 'retired' 'self-employed' 'housemaid' 'student']
marital = ['married' 'single' 'divorced']
education = ['secondary' 'tertiary' 'primary' 'unknown']
default = ['no' 'yes']
housing = ['yes' 'no']
loan = ['no' 'yes']
contact = ['cellular' 'unknown' 'telephone']
month = ['nov' 'aug' 'may' 'apr' 'sep' 'jun' 'jul' 'feb' 'oct' 'jan' 'mar']
poutcome = ['other' 'unknown' 'failure' 'success']train.csvには
可視化のリンク を見ながら異論値を可視化してみたり、検証してみたりしている。
27100 rows and 18 features in train set
18050 rows and 17 features in test set欠損値は存在しなかった。
| id | age | balance | day | duration | campaign | pdays | previous | y | |
|---|---|---|---|---|---|---|---|---|---|
| count | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 | 27100.000000 |
| mean | 13549.500000 | 36.073284 | 47682.901771 | 16.747528 | 229.325387 | 1.775830 | 432.482399 | 0.085720 | 0.077934 |
| std | 7823.240484 | 7.816417 | 31650.760036 | 8.569529 | 204.939958 | 0.950045 | 252.150648 | 0.365889 | 0.268072 |
| min | 0.000000 | 22.000000 | -6847.000000 | 1.000000 | 0.000000 | 1.000000 | -1.000000 | 0.000000 | 0.000000 |
| 25% | 6774.750000 | 31.000000 | 20015.750000 | 8.000000 | 121.000000 | 1.000000 | 214.000000 | 0.000000 | 0.000000 |
| 50% | 13549.500000 | 33.000000 | 47624.000000 | 17.000000 | 158.000000 | 1.000000 | 432.000000 | 0.000000 | 0.000000 |
| 75% | 20324.250000 | 37.000000 | 75330.000000 | 26.000000 | 345.000000 | 2.000000 | 650.000000 | 0.000000 | 0.000000 |
| max | 27099.000000 | 90.000000 | 102121.000000 | 31.000000 | 3076.000000 | 5.000000 | 870.000000 | 3.000000 | 1.000000 |
- pdaysが負の値を取ることはあるのだろうか
| 0 | 0.1 | |
|---|---|---|
| 0 | 1 | 0 |
| 1 | 2 | 0 |
| 2 | 3 | 0 |
| 3 | 4 | 0 |
| 4 | 5 | 0 |
JOIN
kaggleスタートブックの最初の提出と同じようなものを作った。
ウエイトが偏っているものが多く、そのままだと全員が
それを改善するために balanced をしたけれど、今度は
今日は元問題のチュートリアルに挑戦してみる。
がむしゃらに試してみたけど、うまくいかない。やっぱりしっかり統計を取ったうえでやらないとうまくいかないことばかり。提出を潰しまくっちゃったので、今日はもう少し慎重にやってみよう。
チュートリアル本の続きの章を見てみる。
ていうか、提出しなくてもスコアが計算できるようなシステムを構築したい。
K-Foldというものがあるらしい。これを使えば、多少のスコアリングをすることが可能っぽい(本当はほかにメリットがあるっぽいんだけどね)。
CV score: 0.9228617536309844 ってあるんだけどこれは完全にウソつかれてる!?
次の提出まで10分待たなければならなくなってしまった(日付変更待ち)
日付が変わりました。評価手法が正答率だと勘違いしてました。AUC っていう評価方法みたい。実際に CV score を出力している部分を見直してみたら、ちゃんと提出に近いスコアが出ました。
作った仕組みはうまく機能しているようだ。
CV score: 0.7349920143134512
下振れているが、誤差程度な気がする。
yes/noとの相関を取る図を作った。意外と使えそうな指標が多かったので、それらをデータに含めた。
CV score: 0.7725643721408056
思い切って全部使ってみる。
CV score: 0.8464308663310559
えっ
あとは軽微な特徴量の抽出で達成できそうだということに気づいた。
おしいね
pdaysをよく見てみたら、-1が多いことはなかったので、あれは参考にならなかったのかも。
CV score: 0.8468731866245648
欠損値が欠損値であることを明示してみました
CV score: 0.845756095993465
微増。
最終接触時間が外れ値を取っているものは、なぜかみんな
CV score: 0.8463772948044641
ほんとにちょっとずつ前進している。
働いていないを主張してみた。
CV score: 0.8465753206625435
機械学習コンペってこういうのとの戦いなのか___?
よくよく見たら欠損値関連の要素入れてスコアが減ってる。とりあえずなかったことにする。
CV score: 0.8479249355311586
あがった。
いやー今日はもう浮かばなさそうだし寝よう。データ可視化の本を借りたから、そこにエッセンスがあることを信じよう。
おはようございます(午後五時)。
箱ひげ図を描いてみたりヒストグラムを描いてみたりしている。案外外れ値として考えた方がいい物ってのもあるもの。
60歳以上のデータがy=0しかなかったので、高齢者フラグを立ててみた。
CV score: 0.8479249355311586
durationに関しても、四分位範囲から大きく離れているものはあるけれども、多分分布を説明するのには使いにくそう。
lightGBMの演算時間を増やしてみた。
CV score: 0.8479575177001765
stopping_roundsを増やすと、過学習しちゃうだね。
target encodingを試してみる。
CV score: 0.8466459094593587
スコアは微減だが、「上昇しているケースもある」「過学習気味の数値を見ていた」から、何とかなると思って提出。
ついでにハイパーパラメーターも調整した。
最高値であるが、目標には届いていない。
残りの気にするべき特徴量がもうわからない。
やるべきこと
- sub010のときの特徴量表現に戻る
- optunaを使った調整
おはようございます。イカをしている間に、ChatGPTと対話をして得られた情報がいくつかあった。
特徴量の洗練:
モデルに対する特徴の重要度を確認し、重要な特徴だけを残すか、または新しい特徴を生成することが考えられます。
特徴の組み合わせや交互作用を追加して、モデルがより複雑なパターンを捉えられるようにします。
Recursive Feature Elimination (RFE)などの手法を使用して、特徴の重要度を再評価することも考慮してください。
lightGBMで調整するべきパラメータ:
ハイパーパラメータの調整はモデルの性能向上に重要です。現在のパラメータに関しては、以下のような調整が考えられます:
num_leaves: より大きな値を試してみて、モデルがより複雑なパターンを学習できるかどうかを確認します。ただし、過学習には十分に注意してください。
max_bin: ビンの数を調整してみて、モデルの適合度を向上させられるか確認します。
learning_rate: より小さな学習率を試して、収束をよりゆっくり行うことで性能向上が見込まれるかもしれません。
アンサンブルモデルにふさわしいモデル:
アンサンブルモデルを構築する場合、異なる種類のモデルを組み合わせることが効果的です。例えば、Random Forest、Gradient Boosting、XGBoost、または異なるアルゴリズムを組み合わせてみてください。
不均衡なデータへの対処:
不均衡なデータの場合、以下のアプローチが考えられます:
サンプリング手法の利用(アンダーサンプリング、オーバーサンプリングなど)
クラスの重み付けの調整
適切な評価指標の選択(Precision、Recall、F1スコア、AUCなど)
LightGBMでのSHAP値やpartial dependence plotsの算出方法:
SHAP(SHapley Additive exPlanations)値は、モデルの各特徴が予測に対してどれだけ寄与しているかを示します。LightGBMでのSHAP値の算出には、shapライブラリを使用できます。例えば、shap.TreeExplainerを使用してSHAP値を計算できます。Partial Dependence Plots(PDP)は、ある特徴が変化するとモデルの予測がどのように変わるかを可視化するための手法です。これは、pdpboxなどのライブラリを使用して描画できます。
- shap値の算出
- アンダーサンプリング・オーバーサンプリング
- クラスの重み付けの調整
- アンサンブルモデル
- 特徴量の洗練
とりあえず上からやれることはやってみたい。
shapを使ってみた。housingが評価として非常に大きい役割を果たしていることが分かった。
monthがあまり役立ってないっぽい→すなわちdayも意味なさそうなので、順次消してみる。
0.83, 0.82を記録した。そんなことないみたいだ。
どうしようもないのでoptunaをしている。
その過程で、feature_fractionという物をみつけた
CV score: 0.8547131109557157
これは期待大だ。
もう色々な値をチューニングにかけて探してもらうしかないなぁ
33分かかってスコアが出てきた。
{'max_bin': 246, 'num_leaves': 27, 'feature_fraction': 0.41147373846921387, 'bagging_frafction': 0.7108898882747046, 'bagging_freq': 6 }
CV score: 0.852583678558059
クロスバリデーションしたスコアは低いけど、ちょっと出してみよう
Optunaを900分回して出た物を基に、パラメータを設定してみたものの
params = {
'objective': 'binary',
'max_bin': 198,
'learning_rate': 0.013,
'num_leaves': 31,
'feature_fraction':0.4456261609502345,
'bagging_fraction':0.9018636041074152,
'bagging_freq':7,
}
CV score: 0.8547954667054689
パラメーターチューニングだけで行けそうな領域に見える
CV score: 0.8550319188358504
もうわけわからないね
パラメータ量が多くてチューニングできてない感がすごい。
こんばんは。今日はアンサンブルをしていきたい。
結局アンサンブルなどいろいろしてみたけれども、一番効果があったのは「特徴量の洗練」でした。
- durationの変更
- previousの2値化
を加えることでどうにかなった。
