新卒1年目の技術に関する備忘録

自主学習で困ったこと、学んだことをまとめています

様々な前処理

データの前処理として、主にStandardScaler、RobustScaler、MinMaxScaler、Normalizerの変換の4つがある。

 

StandardScaler

平均が0、分散が1になるようにする(z変換)。

※特徴量の最大値や最小値が、ある範囲に入ることを保証するものではない。

 

RobustScaler

StandardScalerに似ていて、個々の特徴量が一定の範囲に入るように変換する。

平均値や分散の代わりに、中央値と四分位数を用いる。

※外れ値を無視する

 

MinMaxScaler

データがちょうど0から1の間に入るように変換する。

 

Normalizerの変換

図からもわかるように他の3つとはかなり異なる。

個々のデータポイントを特徴量ベクトルがユークリッド長1になるように変換する。

ユークリッド長とは

ユークリッド空間の意味を分かりやすく説明する - 具体例で学ぶ数学

言い換えると、データポイントを半径1の円(高次元なら超球面)に投射する。

全てのデータポイントに対して、それぞれ異なるスケール変換が行われる。

方向だけが問題になる場合に用いられる。

 

f:id:logz-developers:20181226165529p:plain

 

SVM(サポートベクタマシン)

SVMのパラメータ

gammaパラメータはガウシアンカーネルの幅を調整する

gammaパラメータを小さくするとガウシアンカーネルの直径が大きくなり、多くの点を近いと判断するようになる。

大きくすると複雑になる。

Cパラメータは正則化パラメータである

Cを大きくすると、データポイントの持つ影響力が強くなる。そのため、分類しようという力が強くなり、決定境界が複雑になる。

SVMはデータのスケールに敏感である。

SVMの短所

サンプル数が1万サンプルまでは上手く機能するが、10万サンプルぐらいになるとメモリなどの問題で上手くいかなくなる。

RBFカーネルのパラメータはガウシアンカーネルの幅を表すgammaのみである。

ニューラルネットワークのモデル基礎

隠れ層が1つでユニットが10の時は10の線分から構成される。

MLPClassifierのパラメータhidden_layerで隠れ層のユニット数を指定し、alpha値でL2正則化を制御することが出来る。

alphaを大きくすると正則化が強くなり、多くが重み0に近づく。

adamはスケールに敏感であるため、z変換が必要。

lbfgsは頑健であるが、モデルが大きい場合や大規模なデータセットに対しては訓練に時間がかかる。

より高度なSGDはさらに多くのパラメータがある。初心者はadamとlbfgsを使っておけば良い。

勾配ブースティング回帰木(勾配ブースティングマシン)

勾配ブースティングでは一つ目の決定木の誤りを、次の決定木で修正するようにして決定木を作っていく。

乱数性はないが、強力な事前枝切りが用いられる。

浅い決定木(弱学習機)を多数組み合わせるから、メモリが小さくなり予測も速くなる。

パラメータの影響を受けやすいモデルであるが、正しくパラメータを設定すれば勾配ブースティング回帰木の方が性能が良い。

パラメータは事前枝切りとアンサンブル、learning_rate(学習率)がある。

learning_rateを大きくすると、決定木同士の補正が強くなりモデルが複雑になる。

ランダムフォレスト

n_estimatorsで決定木の数を、n_jobsでCPUのコア数を指定することが出来る。

ランダムフォレストは乱数のシード(random_state)を変更すると、構築されるモデルが大きく変わる可能性がある。

決定木の数が増えると、シードの選択の影響を受けにくくなる。

max_featuresを大きくすると、ランダムフォレスト中の決定木が似たようになる。

そのため、max_featuresを小さくすると過剰適合が低減する。

決定木基礎

決定木の事前枝切り、枝切り。

決定木では枝切りをしないと過剰適合が起きやすくなる。

sckit-learnでは事前枝切りしか実装がされていない。

sklearnのDecisionTreeClassifierではmax_depthを指定することで決定木の深さを決めることが出来る。

max_depthを4とした場合は、深さが4になる(決定木の質問を4回する)

大規模データの線形回帰

サンプル点が10万、100万点のように非常に大きい場合も線形モデルは高速である。

このようにサンプル数が多い場合は、solver = 'sag'を指定すると高速化が見込める。

 

SGDClassifierクラスとSGDRegressorクラスを使う方法もある。

SGDは大規模なデータに適した線形モデルである。