@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Kaggle: [30 Days of ML] Day 14

一日遅れ。今回の課題。

  1. Read this tutorial (from Lesson 6 of the Intermediate ML course)
  2. Complete this exercise (from Lesson 6 of the Intermediate ML course)
  3. Read this tutorial (from Lesson 7 of the Intermediate ML course)
  4. Complete this exercise (from Lesson 7 of the Intermediate ML course)

今回学んだことその一。Gradient boosting という手法。複数のモデルを組み合わせることを emsemble といい、Gradient boosting は、まだうまく自分の言葉で説明できるほど消化できていないけど、emsemble にモデルを反復的に(iterative)追加していくための手法のこと?

単純な Decision Tree から始めて、Random Forest がずっと良いスコアを出すというのを経て、XGBoost を使うとそもそもどのモデルを選ぶか自体を機械任せにできる、という感じなんだろうか。これ裏側で実際にどのモデルが選ばれてるかはどうでもいい、という態度でいいんだろうか(なんか気持ち悪い気がする)。まあ、実用の上では XGBoost を使っておけ、で一旦はいいのかもしれない。

今回学んだことその二。Data Leakage について。要は「モデルに学習させるべきではないデータを与えてしまい、テスト時は正確に見えるが実際のデータに対して推測するとでたらめになってしまうこと」という理解でいいのかな。Target leakage と Train-Test Contamination の二種類に分けられる。

Target leakage の例として、「肺炎になった後に抗生物質を使用したか(Bool)」というデータ列をモデルに与えてしまう例が挙げられている。このデータは「肺炎に罹ったか(Bool)」というデータと強い相関を示すが、時系列で考えれば当然である(肺炎に罹ったから、抗生物質を投与した)。なので、このデータから「抗生物質を使用していない患者は、肺炎にかかる可能性が低い」という推論を行うのは誤りである(肺炎にかかる前は、ほとんどの人が抗生物質を使わないので、このモデルはほとんどすべての「まだ肺炎にかかっていない人」に対して「肺炎にはならない」という結果を出してしまう)。

Train-Test Contamination は、うーん、いまいちピンときていないのでうまく説明できない。train_test_split() でトレーニングデータとバリデーションデータを分離する前に impute などをしてしまうと起こる、と説明されているのだが。そしてこれを防ぐには Pipeline を使うと良い、とも。多分これが理解できないのは、そもそも基本的なところで fitting (fit()) と impute とかの違いをちゃんと理解できていないからのような気がする。

とりあえず現時点では、

  • データの意味をよく考えてからモデルに学習させるか選択する
  • コーディングはなるべく小難しいことをせず、愚直に(何ならお手本のコピペで)済ませる

あたりを意識すべし、と考えておく。

そのあとの例で、「クレジットカードの申し込み審査の可否を判定するモデルに与える学習データに、『応募したそのカードで顧客が買い物をした支出額』というデータを与えると、このデータは審査結果と強い相関を示すので target leakage である」というのが出てくる。これはなぜかというと、カード審査に落ちた場合、そのカードによる支出額は 0 なので、モデルが「支出額が 0 の場合、そのカードの申し込みは審査に落ちる(落とす)」という結果を 98% という高精度で出すが、実際には、申し込んで、審査に通ったカードの支出額がいくらになるかは、審査に通る前には分からないので、このモデルは現実のデータに対しては役に立たない、ということだ。

以前の仕事で、データ分析の担当者から、アプリケーションがデータ分析基盤に送っている各種データについて、「このデータはどういう意味か?この値はどういう状態を表すか?」としつこく聞かれたことを思い出した。アプリケーション実装者にとっては自明のようなことでも、データ(のスナップショット)だけを後でまとめてみて分析を試みる人にとっては、前提や文脈が大幅に欠落して意味の把握が難しいものだったのだろう。

これにて Learn Intermediate Machine Learning Tutorials | Kaggle は終了。