How to Win a Data Science Competition - Week1 - メモ
昨年末くらいから、Courseraの「How to Win a Data Science Competition」をやってます。
Kaggleでどうやって入賞するかがコースの目的ですが、前処理をどうするか、特徴量をどう作るかなど、様々な方法が説明されていて勉強になります。
とはいえ、なかなか難しく、進捗はあまりよくありません。内容が難しいというよりも、ロシアなまりのの英語が最大の障壁になっています。字幕も間違えていることが多く、理解できない部分もちらほらあったりします。(英語力が低いのが問題だとは思いますが。)
とはいえ、非常に実践的で良い内容ですので、是非チャレンジしてみてください。
という訳で、以下に1章をやったときのメモを残しておきます。
目次
- Introduction & Recap
- Feature preprocessing and generation with respect to models
- Feature extraction from text and images
Introduction & Recap
Recap of main ML algorithms
線形モデル
Tree-Based Methods
特徴
- 線形依存があるデータの場合、多くの分割が必要となるため、値を補足することが難しくなる。
代表例
- Decision Trees
- random forest
- Gradient Boosted Decision Trees (XGBoost, LightGBM)
k-NN based Methods
k-NN: k-Nearest Neighbors
- 参考リンク
Neural Network
特徴
- 解釈が困難だが、滑らかな非線形決定境界を生成する。
参考リンク
No Free Lunch Theorem.
全ての問題に対して高性能な汎用アルゴリズムは存在しない。
アルゴリズムは、特定の前提条件(データの事前分布など)に依存しているため
- 参考リンク
Feature preprocessing and generation with respect to models
Numeric features
特徴量のスケールに依存するモデル/しないモデル
スケールに依存 | モデル |
---|---|
しない | ・ツリー系 |
する | ・再近傍法 ・線形モデル ・ニューラルネットワーク系 |
大きい値の特徴量が存在する場合、予測値がその特徴量の値に引きずられててしまうことがある。このため特徴量を同じスケールに変換してやる処理が必要。
スケールが予測値に影響する場合、スケーリングを重要なハイパーパラメータとして扱うことができる。
スケール方法
- MinMaxScaler
- StandardScaler
外れ値
以下の手法は、線形モデル、kNN、ニューラルネットワーク系に有用
winsorize
線形モデルの場合、特徴量だけでなく、目的変数に外れ値があった場合も予測値に悪い影響がある。この場合、上限値と下限値でクリッピングをして外れ値を除外する。
財務のデータでこの処理をやることをwinsorizeという
rank
- 数値間が等間隔になるように並べる。外れ値がある場合、外れ値が他の値に近づくためMinMaxScalerより優れたオプションとなる。
rank([-100, 0-, 1e5]) == [0, 1, 2]
- ソートした配列のインデックス値を使用する。
rank([1000,1,10]) = [2,0,1]
log/sqrt
ログ変換、平方根、いずれも大きすぎる特徴量の値を平均に近づけることができる。
特徴量生成
- 事前知識とEDAが重要
- 加算、乗算、除算、その他の特徴量の相互作用は線形モデルだけでなく役立つ
(例) - 商品価格の小数点以下を新しい特徴量として追加(人の価格に対する認識の違いを表現できる)
Categorical and ordinal features
Label Encoding
- カテゴリ変数を単純に整数に置き換える。
- 決定木ベースのモデルで効果的(*)
決定木以外のモデルの場合は、適さない
(*)カテゴリ変数の特定の水準のみが目的変数に影響がある場合でも、分岐を繰り返すことで遅く値に反映できるため
やりかた
アルファベット順
sklearn.preprocessing.LabelEncoder
ColumnA S C Q ↓
ColumnA 2 1 3 出現順序
Pandas.factorize
ColumnA S C Q ↓
ColumnA 1 2 3
frequency encoding
- 出現頻度or出現回数でカテゴリ変数を変換する
- 値の分布に関する情報が保持されるので、線形モデル、決定木モデルで有用
- 値の頻度が目的変数に相関している場合、有用
- 変数の分割数を減らすのに役立つ
- 同じ頻度で複数の変数があった場合は、区別できないので注意
encoding = titanic.groupby('Embarked').size() encoding = encoding/len(titanic) titanic['enc'] = titanic.Embarked.map(encoding) # 同じ頻度の変数があった場合、以下でランク付けするのも可 from scipy.stats import rankdata
One-hot encoding
- 一意の値ごとに新しい列を作り、1を立てる。それ以外は全て0
- 線形モデル、kNN、ニューラルネットワーク系で機能する
- 0 or 1のため既にスケーリングされている
- 重要な数値特徴量がなく、One-hotで多くの特徴量が出来てしまう場合は、ツリー系のモデルはうまくいかない可能性が高い。
スパース行列
- カテゴリ変数に一意の値が大きい場合にOne-Hotを行うと、数値がほとんど0の列がたくさん生成される。これらの配列を効率的に保存するにはスパース行列を利用する。
- スパース行列を使うことで、メモリを節約することができる。
- カテゴリ変数、テキストデータを処理するのに役立つ。
- XGBoost、LightGBM、sklearnなどは、スパース行列を直接処理できる。
(参考)
Feature interactions
- ターゲットがカテゴリ特徴量Aとカテゴリ特徴量Bの両方に依存している場合、これらの2つの特徴量のあらゆる組み合わせを作成し、One-hot encodingを行う。
- 特徴量間の相互作用を考慮することができるので、非ツリーベースモデルに有用。
Datetime and coordinates
Datetime
- Time moments
- 秒、分、時間、週の日、月、年
- 休日フラグ
- 経過時間
- 特定の日にちからの経過日数
- 特定イベントからの経過日数
- 時間差
- 休日までの日数
- アクション間の日数(顧客購入日~顧客へ電話した日の差など)
Coordinates(座標)
- 重要ポイントまでの距離
- 病院、学校、最寄り店舗までの距離など
- クラスター中心までの距離
- 重要ポイントがない場合は、特定の地点(地価予測の場合は、地価の高い場所)を中心として、その中心までの距離を出す
- 非常に古い建物があるなど、特別な地点を中心として、中心までの距離を出す
- 集計値を計算
- ポイント周辺の平均地価などの統計値を算出する
座標の回転
価格の高い土地と、低い土地を斜めに走る通りで区切られていた場合を考える。
この場合、ツリー系のモデルだと、斜めに切れないため、ジグザグな形で切ることになる。しかし、座標を回転することで、まっすぐな線で切ることが出来るようになる。
Missing Values
- 状況により欠損値を埋める方法を選択する
- 一般的な方法:-999など範囲外の値で穴埋めする
- ツリー系モデル:欠損値を別カテゴリとして扱えるため有益
- 線形モデル、NN:パフォーマンスが下がる可能性がある。
- 一般的な方法:中央値、平均値などで穴埋めする
- 線形モデル、NNに有益
- ツリー系の場合、欠損値と判断することが難しくなる⇒ NULLの場合に、isnull特徴量を追加
- 欠損値の再構築
- 時系列データなどで、欠損値がある場合は、前後のデータから概算した数字を補完する
- 特徴量生成の前に欠損値の穴埋めは避ける
- 例えば-999で穴埋めし、各カテゴリの平均値の特徴量を生成する場合、-999の値に引っ張られてしまう場合がある。
- XGBoostは欠損値を扱える
- 外れ値を欠損値として扱う
- TestデータにありTrainデータには存在しないカテゴリを扱う場合
- Trainデータ、Tesetデータ両方のデータを使用したfrequency encodingを試してみる。
参考Links
- Preprocessing in Sklearn
- Feature Scaling and the effect of standardization for machine learning algorithms
- Discover Feature Engineering, How to Engineer Features and How to Get Good at It
- Discussion of feature engineering on Quora
Feature extraction from text and images
Text
- Bog of words
- Embeddings(~word2vec)
Bag of words
- 各単語の出現回数をカウント
sklearn.feature_extraction.text.CountVectorizer
- TFiDF
- TF: 単語の出現頻度
- iDF: 逆文書頻度. レアな単語の数値を高く
# Term frequency tf = 1 / x.sum(axis=1)[:,None] x = x * tf # Inverse Document frequency idf = np.log(x.shape[0]/(x>0).sum(0)) x = x * idf
sklearnを使用
sklearn.feature_extraction.text.TfidfVectorizer
- N-gram ※参考
Text preprocessing
- Lowercase
- 単語を小文字に揃える。
- Lemmatization
- 見出し語化
- 例)
- was → be
- eating → eat
- had → have
- Stemming
- 語尾変化した語の語幹を揃える。
- 例)
- cats → cat
- trouble → troubl
- troubled → troubl
- Stopwords
- 冠詞や前置詞のように重要な情報を含まない単語を除外
word2vec
- 単語の特徴ベクトル。
- BoWと比べ比較的ベクトルは小さい
- 似た意味の単語は似たベクトルを持つ
- 事前トレーニングモデル
Image
- ネットワークで画像処理をする際、途中のレイヤーから特徴量を抽出できる
- 事前学習済みモデルを使用してもよい
- 事前学習済みモデルにfine-tuningを実施することで精度を高めることができる
- データ拡張(data augmentation)により精度を高めることができる
- グルーピング、回転、ノイズ etc..