Kaggle本の個人的なメモ
Kaggleで勝つデータ分析の技術
- Kaggleの公式ブログ No Free Hunchで分析コンペの進め方やソリューションが解説されたインタビュー記事が公開されている。
- Fβ-scoreっは、F1-scoreからrecallとprecisionのバランスを、recallをどれだけ重視するかを表す係数βによって調整した指標、scikit-learnのmetricsモジュールのfbeta_scoreを用いる
欠損値を指定して取り込む方法
train = pd.read_csv('train.csv', na_values=['', 'NA', -1 , 9999])
- 標準化はscikit-learnのStandardScalerクラスで行える。
- 対数変換の一般化、Box-Cox変換
- 負の値を持つ変数にも適応可能、Yeo-Johnson変換
- ワイドからロングフォーマットにするには、DataFrameのstackメソッドを使う
- ロングからワイドフォーマットにするには、DataFrameのpivotメソッドを使う
3.11 時限削減・教師なし学習による特徴量
Otto Group Product Classification Challengeでは、t-SNEで得られた特徴量を加えるだけで大きく精度向上に寄与した。
特徴量作成が最も重要で、分析コンペの半分から8割の作業は特徴量作成に費やす
- ハイパラーパラメータは、変更した時にどのくらい影響があるか時折見ながら、本格的な調整は終盤で行う
- モデルはGBDTでますは進めていき、タスクの性質によってニューラルネットを検討したり、アンサンブルを考える場合は他のモデルも作成する
- データやタスクの理解が進むとともに、バリデーションの枠組みも変更することもある
- モデルの種類・ハイパラーパラメータ・特徴量のセットの組みの大きな枠組みでのモデルと捉えることができる。これを柔軟に入れ替えることのできるコードを書く。
分析コンペ用のクラスやフォルダ構成
- Modelクラス、Runnerクラスを作り計算を行う。また、UtilクラスやLoggerクラスについても作成する。
Modelクラス xgboostやscikit-learnの各モデルをラップしたクラスであり、学習や予測を行う。Modelクラスを継承し、ModelXgbやModelNNといったクラスを作成する。
Runnerクラス クロスバリデーションなどを含めて学習・予測の一連の流れを行うクラス。データの読み込みもここで対応する。Modelクラスを保持し、学習、予測はModelクラスに実行させる。継承せずに使用するが、データ読み込み処理を変更したい場合など、継承してその部分だけを変更し使用することがある。
Util、Loggerクラス * ユーティリティメソッド * ファイルの入出力なのどのユーティリティメソッド * ログの出力、表示 * 処理のログをファイルとコンソールに出力する。途中で異常終了した時の原因把握や処理にかかる時間を見積もりたいときには実行時刻をつけてログを残しておくと便利。 * 計算結果の出力、表示 * 各モデルのバリデーションスコアをファイルとコンソールに出力し、集計できるようにする
フォルダ構成 コードはcodeとcode-analysisディレクトリにのみ保存する。 input --- train.csv、test.csvなどの入力ファイルを入れるフォルダ code --- 計算用のコードフォルダ code-analysis ---- 分析用コードやjupyter notebookのフォルダ model --- モデルや特徴量を保存するフォルダ submission --- 提出用ファイルを保存するフォルダ
Modelクラス init( run_fold_name, prms) train(tr_x, tr_y, va_x, va_y) predict(te_x) save_model() load_model()
Runnerクラス init(run_name, model_cls, features, prms) run_train_fold(i_fold) run_train_cv() run_predict_cv() run_train_all() run_predict_all()
private method build_model(i_fold) load_x_train() load_y_train() load_x_test() load_index_fold(i_fold)
評価指標によっては各foldのスコアの平均とデータ全体での目的変数と予測値から計算したスコアが一致しない。例えばMAEやloglossではそれらが一致するが、RMSEでは各foldのスコアの平均はデータ全体で計算するより低くなる
foldごとに含まれるクラスの割合を等しくすることを層化抽出(stratified sampling)と呼ぶ。
まずベースとなるパラメータで学習させる、口にもし簡単に調整を行いたい場合は1-3種類のパラメータとそれzれお2-5個の候補程度でグリッドサーチを行う、本各区的に行う場合はベイズ最適化を行う
XGBoot Parametes, Notes on Parameter Tuning
- Parameters(lightgbmのドキュメント)、Parameter Tuning(lightgbmドキュメント)
- Complete Guide to Parameter Tuning in XGBoost(Analytics Vidhya)
- PARAMETERS( Laurae++)
- CatBoost vs. LightGBM vs. XGBoost( Towards data Science)
- Santander Product RecommendationのアプローチとXGBoostの小ネタ
xgboostの具体的なパラメータチューニング方法 * 本格的にはhyperoptに任せる * 決定木の数は十分多くして、あーリーストッピングにより制御 * 学習率etaはチューニングでは0.1、提出するときは小さくする * チューニングは時間短縮のため1foldのみ、実際にモデルを作成・予測する際は異なる乱数シードで分割したfold
実際のパラメータ探索範囲(種類、ベース、範囲) eta 0.1 固定 num_round、 - 、十分大きくしてアーリーストピングで最適な決定木の本数を設定 max_depth、 5、 3-9一様分布に従う、1刻み min_child_weight、1.0、0.1-10、対数が一様分布に従う gamma,0.0、1e-8-1.0対数が一様分布に従う colsample_bytree, 0.8, 0.6-0.95、一様分布に従う0.05刻み subsample , 0.8, 0.6-0.95、一様分布に従う0.05刻み alpha 0.0, デフォルト値としておき余裕があれば調整 lambda, 1.0,デフォルト値としておき余裕があれば調整
- KazAnovaのスタッキングソリューソン
- 2-3つのGBDT(決定木の深さが浅い、中、深いもの)
- 1-2つのランダムフォレスト(決定木の深さが浅い、深い)
- 1-2つのニューラルネット(層が多い、少ない)
1つの線形モデル
- kaggler-ja wiki
- kaggler-ja slack
- kaggle tokyo meetup資料
- データ分析コンテストの勝者解答から学ぶ
- データ分析コンテストの技術と最近の進展
Kaggle スタートブック
- light gbm
- 大きめの_max_binを使え,300
- 小さめのlearning_lateを使え、0.05
- 大きめのnum_leavesをつかえ,40