めも

これはメモなんじゃ。

How to Win a Data Science Competition: Learn from Top Kagglers(一週目)のメモ

コーセラの以下のコースを受講した際の聴講した内容を部分的にメモ。あくまで自分の理解で講義の中身そのものではないです。

coursera

コース全体を通しての大まかな内容

1~5週に分かれており、順番に

  • コンペの仕組み・基本的なアルゴリズムの前処理など
  • EDA(Exploratory Data Analysis)とデータの漏れのチェック、バリデーションデータの作成
  • mean encodingなどの特徴エンジニアリングと評価指標について
  • ハイパラチューニングとアンサンブル手法
  • 実際のコンペで実践

の流れになっている。最後の課題は以下のコンペ。

Final project: predict future sales | Kaggle

Week1

コンペティションと実際の業務の違い

実際の業務は

  • 解くべき問題を見つける
  • 問題を定式化する
  • データを集める
  • 前処理とモデルを作成する
  • テストを行う
  • 実際にモデルを運用するためのインフラ整備など

の順番で行われるが、コンペティションで扱うのは「前処理と予測モデルの作成」のみ。

基本的なMLアルゴリズムの復習

k-NN、線形モデル、SVM、勾配ブースティングなどのモデルのアルゴリズムの基本的な箇所のみ紹介するがアルゴリズムの詳細には立ち入らない。コンペでよく使うpythonライブラリの紹介にとどめている。k-NNの実装やLight-BGMなどへのリンクは以下より。

XGBoostやLight-BGMのパラメータについては以下のサイトも参考になるかもしれない。

Laurae++: xgboost / LightGBM

必要なソフトウェア・ハードウェア

RAMが16Gあることを想定して以降は続く。 オプションとしてはAWSなど。

前処理の基本

前処理

データの前処理について。スケーリングをなぜするか。scikit-learnのドキュメントも参考になる。スケーリングなしだとPCAの結果がどのように変わるかをプロットしている。

Importance of Feature Scaling — scikit-learn 0.19.2 documentation

異常値(outliers)の扱いについてよくある回帰の例とヒストグラムを例にして説明。

2.7. Novelty and Outlier Detection — scikit-learn 0.19.2 documentation

ランク形式への変換。つまり [0, 0.1, 1, 100]を [0, 1, 2, 3]へと変換する。 min-maxの場合と比較して分布が偏っているときにはこちらが適切な場合がある。 ほかlogやsqrtの例など。Winsorizationについては以下。

特徴生成

GBTなどは特徴間の掛け合わせや割り算の特徴を作るのが難しいからEDAを通じて必要な可能性がある特徴は作成すべき。

ただしこれらの特徴生成や前処理はモデルの特性を意識して行う必要がある。決定木ベースの手法はスケーリングやランキングの前処理によっては性能の変化はないが、決定木でない手法は影響を大きく受ける、など。

カテゴリカル特徴・順序特徴

順序特徴(ordinal feature)は自動車のライセンスなどの順番がある特徴のこと。

カテゴリカル特徴にはいくつかエンコードの仕方がある。

  • one-hot-encoding
  • frequency encoding

など。

Datetimeの特徴量

  • 周期性
  • XXから何日
  • 特徴間の日数差

に注意する。他にも祝日フラグなどドメイン知識に基づいたフラグの追加なども考えられる。

座標の特徴量

データ内の代表的な場所の特徴を利用。クラスタリングなどで近い場所をまとめる。エリアごとに集約した統計量を用いる、クラスタの中心点までの距離など、

決定木ベースの手法を使うときは、座標上に斜めの境界ができないように回転させると精度が上がる可能性がある(より少ない木で境界を表現できるため)。

クラスタリングの具体的な方法は述べられていないが、たとえばkmeansやxmeans, tsne, umapなど。

講義とは関係ないけど、CNNで座標のデータを扱うときはフィルタの位置情報をフィルタに入れるとよくなるタスクが存在する。

欠損値

Hidden-NaNについて。KDD2018の以下の論文の disguised missing values (DMVs)に相当するもの(だろう)。ほとんどの記録されたレコードでは欠損値に相当する箇所に明示的にNaNが入れられているのではなく、-1や0が入れられている。それらの暗黙的な欠損値を分布の偏りなどから見つけ出して適切に扱うべき。

KDD 2018 | FAHES: A Robust Disguised Missing Values Detector

欠損値を埋めるアプローチの場合は

  • [-1]などの値で埋める
  • 全体の平均とか
  • 欠損した箇所を予測して埋める
  • 欠損しているというフラグの特徴を追加するなど

scikit-learnの対応モジュールは sklearn.preprocessing.Imputer — scikit-learn 0.19.2 documentation

テキストと画像

すこし読みにくいですが以下のカーネルに基本的なものが出てくる。

Basic NLP: Bag of Words, TF-IDF, Word2Vec, LSTM | Kaggle

日本語用の構文解析は以下の記事のライブラリのどれかでいい(少なくともjanomeはpip installですぐに使える)。

英語の場合は大文字・小文字を同様に扱うか、過去形や過去分詞をどうするかなどのオプションが存在する。日本語でもカタカナ・ひらがな表記を同じに扱うか、など考慮する必要があるかもしれない。(lemmatization)

stemmingも似たような処理であり、似たような名詞・動詞から共通する箇所を抜き出して一つにまとめる。(走る、走った→走など)

word2vec

bag-of-wordsと比較して小さいサイズのベクトルで済む。しかし、ベクトルの各値の意味はbag-of-wordsと比較すると不明瞭。近い意味をもつ単語は近い空間に embedding される。

Word2Vec Tutorial - The Skip-Gram Model · Chris McCormick

Baseline Horror: What is Word2Vec? | Kaggle

一週目の最後はCNNのファインチューニングとdata-augmentationについて、省略。以下はdata-augmentationの例、回転などの一般的な変形はほとんどのライブラリで実装されている。ぼかしなどを加えるのはデータセットの特徴をみて判断したい。

Week2