コーセラの以下のコースを受講した際の聴講した内容を部分的にメモ。あくまで自分の理解で講義の中身そのものではないです。
coursera
Week1の聴講メモは以下。
Week2
主な内容はExploratory Data Analysis (EDA)、バリデーションの仕方、Data Leakages (データ漏れ?)について。
Exploratory Data Analysis (EDA)
EDAとは
データがどういうものか理解すること・そのデータセットの存在するドメイン特有の知識を得ること。新しい特徴生成やモデル作成のための知見を得たい。いきなり多数のモデルをスタッキングさせたりして精度を求めるのはx。
- ドメイン知識を得る
- それぞれのデータの持つ値がどのような意味を持つか理解する
- データがどのように生成されたのかを理解する
匿名化されたデータの解析
Data Leakages同様このようなコンペ特有のハックは実務では使うかわからないですが。
匿名化されたデータの例:テキストの単語をそれぞれ別の無意味な文字列に置き換えてエンコード
匿名化されたデータについては
- 元のデータが何だったか・どのような型をもつデータだったか
- 特徴間の関係や共通の匿名化された値を持つデータ間の関係をつかむ
ことをするべき。たとえデータの特徴名が匿名でも df.value_counts()
や df.is_null()
などを通して元のデータの形式を予測することができる。
可視化
欠損値や 異常値(outlier)を見つける・特徴間の関係を発見することに利用できる。
可視化の詳細については様々なチュートリアルなどがあるので省略。例えば以下のカーネルなど。
- 基本的な使い方
Data clearningなど
最後に、固定値をとる特徴や重複した特徴などの除去などの data cleaning を行う。特徴だけでなくサンプルの重複も確認して、なぜサンプル(dfの一行)が重複しているかを理解する。最後にデータが完全にランダムにサンプリングされているものか、何等かの時系列など規則に基づいてサンプリングされているかを確認する。
いくつかの離散値しかとらない特徴については、ジッタを加えることもある(オーバーフィットしないように、プロットが重ならないように、など?)。
バリデーション
コンペにおいては(コンペでなくとも)過学習をしたモデルを作らないようにすることが大切。
- ホールドアウト検証
- K-分割交差検証
- leave-one-out 交差検証(LOO: leave-one-out cross-validation)
などの解説。これらの分割の作り方は、データが時系列の時は注意する必要がある(テストデータよりも未来のデータを訓練データに含むべきではない)。
よくあるケースとしてテストデータの分割は
- ID
- タイムスタンプ
- (データが常に同じ分布から発生していると仮定するなら)ランダム抽出
で行う。特徴の作り方などによって分割の仕方が変わることもある。コンペの場合は、コンペの主催者がどのようにして(非公開の)テストデータを作成したか予測する必要がある。
コンペでは公開されたリーダーボードと非公開のリーダーボードがあり、最終的に非公開のリーダーボードでのスコアが結果になる。公開されたリーダーボードでのスコアが手元でのクロスバリデーションのスコアと比較して大きく下がってしまったときは
- リーダーボードで使用されているデータが少なすぎる
- 過学習している
- 公開されているデータとの分布が異なる
- クロスバリデーション時のデータ分割方法に問題がないか
などを検証する必要がある。
Data Leakages
以下のカーネルがこのトピックに対応する内容だと思われる。 つまるところ、実際に業務で予測モデルを運用しようと試みる人は予測モデルを運用するタイミングでの性能に近づくように正しいテストの設定・利用可能なデータの選択をする必要がある。
逆にコンペだと、target(教師データ)の情報を直接・間接的に含む特徴を見つけることができればモデルを作りこむことなく上位がとれる可能性もある。
kaggleに定期的に参加されている方だと以下を思い出す方も多いんじゃないでしょうか。ただ、データ漏れを見つけたとしてもそれがプライベートのリーダーボードで使用されるデータにも共通する性質か不明なので注意が必要。