ML前処理メモ
Sampling
Class-Inbalance対策
正例負例に偏りがあるとバイアスがかかる。
Negative Downsampling, SMOTE ...
Upper Samplingはバイアスを強化してしまうので基本的にNegative Downsampling (+ Bagging) で良いと理解している
lightgbmのオプションだと neg_bagging_fraction がある
Wallace, B. C., Small, K., Brodley, C. E., & Trikalinos, T. A. (2011). Class imbalance, redux. In Proceedings - IEEE International Conference on Data Mining, ICDM (pp. 754–763). https://doi.org/10.1109/ICDM.2011.33 BIas Free Downsampling
あとで
SQL
limit句を利用する歳は偏りが生じないように order by some_hash_func(xxxx) する
Feature Engineering
Feature Combination
素性間の四則演算
e.g. df['new_feature'] = df['A']/df['B']
One-Hot-Encoding
使い捨てコードならPandas.DataFrame#get_dummiesでも良いが、使い回すメソッドならscikit-learnのOneHotEncoderを使った方がいい。訓練セットとテストセットに対する前処理を別々に適用可能になり柔軟な実験ができる。
冗長表現のため、係数が一意に定まらなくなる。が解釈が容易。
LightGBMでは不要
Count Encoding
カテゴリの出現回数を素性とする
訓練データに出現していない物は1とする
LabelCount Encoding
カテゴリ出現回数の順位を素性とする
Hashing Trick
カーディナリティの大きな属性 (e.g. IP Address)をOne-Hot-Encodingすると次元数が爆発してしまうのを
ハッシュ関数で指定した次元数に抑えこむテクニック
Logarithmic scale
numpy.log1p(x) をよく使う、log(1 + x) を返す関数であるがxがゼロに近い所でも精度の高い値が得られる。
Tree Baseの予測器の場合は不要、なぜならどこで分離するか決める処理が学習アルゴリズムに入っている
ロバスト性
Scalingや離散化はデータの性質が変わる事に対するロバスト性が得られる
例えば10刻みで得られていたデータが1刻みに変更される等 (実際にあった)
時系列
前回の出現時点からの経過時間や、その時点までの出現回数
サバイバル分析??
Cross Validation with TimeSeries Split
古いデータ使うと精度が落ちる事もある、非定常性の扱い
訓練データの分布 = テストデータの分布 を満たさないと機械学習は機能しない
レコード毎のWeightで直近のデータのWeightを上げると良いかもしれない
連続値
groupbyしたsum, max, median等
クラスタリング素性の追加
e.g. k-means
Sub model
重要な特徴量に欠損がある時に
欠損値を推定するモデルの出力を利用
特徴選択
future importanceはいくつかある
Boruta
Pandas
とにかくメモリを食う
型指定でメモリ削減
read_csv時に型指定
後から追加したSeriesはint64かfloat64, objectになってるのでastypeで型指定をする。 e.g. astype('int8')
カテゴリ列は astype('category')
疎行列
to_sparce
マージ高速化
code:python
df_test.merge(df_user, how='left', on='user_id')
↓
pd.concat([
df_test.reset_index(drop=True),
df_user.reindex(df_test'user_id'.values).reset_index(drop=True) ])
https://gyazo.com/abde1b15d24494116bd45fc6983b2d50