正則化

Group Lassoの正則化

前回、【正則化のLasso回帰とRidge回帰】について説明しました。 今回の記事はLasso進化形のGroup Lassoの正則化について解説します。   Group Lassoとは Group Lassoは、説明変数の属性に基づいていくつかのグループに分けられるとき、変数選択においてグループ単位で選択したいときに利用する方法です。 Lassoというのは、正則化項にL1normを使ったいわゆるL1正則化のことで、大部分の重みが0に潰れて疎な解が得られます。   この進化形として、Group Lassoという手法があります。Group Lassoでは、重みベクトルの次元をグループ分けして、各グループごとのL2normを正則化項として使います。 使うメリットは以下になります。 カテゴリー変数の効果をモデルに反映 例えば、都道府県を説明変数に入れる場合があります。この場合は、各都道府県をフラグ化して、変数にします。しかしこの方法では「都道府県じたい」が効果のある変数かどうかを判定したい場合にはわかりません。そのためカテゴリー変数じたいの効果の有無を調べる場合にGroup Lassoを使うとわかります。   大規模な線形分類、回帰のライブラのsklearn-contrib-lightningをインストールします。 pip install scikit-learnpip install sklearn-contrib-lightning   ライブラリのインポート from sklearn.datasets import fetch_20newsgroups_vectorizedfrom lightning.classification import CDClassifier   20 newsgroupsはこのブログでも過去何回か取り上げまたしが、ベクトル化済みのデータです。 (130,107のカラム) bunch = fetch_20newsgroups_vectorized(subset=”all”)X = bunch.datay = bunch.targetprint(X.shape)print(y.shape) (18846, 130107)(18846,)   分類の設定と学習 clf = CDClassifier(penalty=”l1/l2″,                   loss=”squared_hinge”,                   multiclass=True,                   max_iter=20,                   alpha=1e-4,                   …

Group Lassoの正則化 Read More »

過学習の対策

今回は前回の記事の続きの過学習Overfittingの対策」を紹介します。過学習と未学習の説明はこちらです。 訓練誤差とテスト誤差の理論 学習が進むほど訓練誤差が低下していきます。つまりテストデータに対する予測精度は向上するが、テストのデータセットに入っていないデータに対する予測精度が下がり、テスト誤差が上がってしまうものです。いわゆる過学習(Over Fitting)という状態になっていきます。   過学習は訓練データとテストデータの影響があります。訓練データが少ないほど、訓練誤差は小さく、汎化誤差は大きくなります。訓練データが十分に多いと、訓練誤差も汎化誤差も、ノイズの強さで頭打ちになります。   過学習の対策Overfitting prevention 1)データセットを増やす トレーニングデータが多ければ多いほど、それが過剰適合する可能性がより低いになります。 最初の過学習対策、過学習に対して最も効果がある対処法は訓練データを増やすことです   2)Data augmentation & Noiseの加工   データセットを増やすことは面倒と手間のことです。またデータセットを増やすことができない場合もあります。その場合は Data augmentation と Noiseのデータ加工の方法が役に立ちます。学習用のデータに対し人工的なノイズなどを付加した画像を生成し,生成した画像を元の学習用データに追加することで性能の向上が期待される技術になります。   前回の記事の「Data Augmentationの解説」はこちらです。   3)単純なモデルへ変化する 複雑すぎるモデルは過学習の原因の事があります。モデルはあまりにも強力であるかもしれません。 そのモデルの複雑さを軽減することができます。推定量の数を減らしたり、モデルのパラメーターを変更したりするには、モデルを単純にしても当てはまりませんが、データから学習するには複雑にすることができます。 これには、モデルをより軽量にし、より速く訓練し、そしてより速く走らせるという利点もあります。   4)早期停止 早期停はニューラル ネットワークの過学習対策です。早期停止とは、基本的に、テストデータの損失が増加し始めたら(つまり検証精度が低下し始めたら)、トレーニングを停止することです。監視する値、監視する値について改善として判定される最小変化値、訓練が停止し,値が改善しなくなってからのエポック数のパラメーターを設定することができます。   5)L1 と L2 正則化 機械学習では、過学習を防ぐ方法として正則化が行われることが多いです。過学習を避けるためには、学習モデルの選択、特徴量・次元の選定およびそれらに対応した学習データの数を注意深く考慮して設定していく必要があります。正則化とは、複雑さが増すことに対するペナルティを設け、このペナルティを訓練誤差に加えた量が最も小さくなる学習モデルを求めるようにすることにより汎化性能を高めようとするものです。一般的に使用されるのは、L1正則化とL2正則化です。 L1正則化 特定のデータの重みを0にする事で、不要なデータを削除します。 L2正則化 データの大きさに応じて0に近づけて、滑らかなモデルです。   正則化の例はこちらです。   6)DropoutとDropConnect ニューラルネットワークにおける過学習対策になりますが、DropoutとDropConnectです。 Dropoutは、設定した割合に応じて、ランダムにユニットを選択し、そのユニットの重みを「ゼロ」にします。 DropConnectは、上記の「ゼロ」を任意の重みに設定できます。さらに言うと、中間層の線形結合の「結合」に注目し、設定した割合に応じて、ランダムに「結合」を取り上げます。そして、結合に重みをかけて、活性化関数にかけます。   まとめ 今回は過学習対策を説明しました。過学習はデータサイエンティストの一般的な問題です。この記事で紹介したテクニックを使えば、過学習問題を克服して、良いモデルを作成することができるでしょう。

Kerasの Mnistで深層学習入門 正則化 時間/精度比較

前回の記事は「Mnistで深層学習入門 活性化関数 時間/精度比較」でrelu, tanh, sigmoid, eluのパラメーターでの結果を比較しました。今回の記事は正則化について解説します。 KerasからMnistのデータセットの深層学習モデルを実験します。 import numpy as np from keras.models import Sequential from keras.layers.core import Dense, Activation from keras.optimizers import SGD from sklearn import datasets from sklearn.model_selection import train_test_split from tensorflow.examples.tutorials.mnist import input_data   %matplotlib inline import matplotlib.pyplot as plt   mnist = input_data.read_data_sets(‘MNIST_data’, one_hot=True) Extracting MNIST_datatrain-images-idx3-ubyte.gz Extracting MNIST_datatrain-labels-idx1-ubyte.gz Extracting MNIST_datat10k-images-idx3-ubyte.gz Extracting MNIST_datat10k-labels-idx1-ubyte.gz …

Kerasの Mnistで深層学習入門 正則化 時間/精度比較 Read More »

正則化のLasso回帰とRidge回帰

前回は線形回帰とロジスティック回帰を説明しました。この記事では、正則化したLasso回帰とRidge回帰をお話になります。 回帰モデルで過学習を防ぐ方法の1つとして、誤差関数(二乗誤差関数など)に次の式で表される正則化項を加えて最小化します。正則化項を用いる回帰をリッジ回帰と呼びます。 正則化項を加えるメリットは以下になります。1.変数が多い時に発生する過学習を抑える事が出来る。2.相関があるような変数の影響を抑える事が出来る(但し一致性は保証されない)。3.相関の高い変数群がある場合、Lasso/Ridgeはその中の1つしか変数として選択できない。4.係数が小さくなる。 Ridge回帰 Ridge回帰では、L2正則化を用いています。L2ノルム(係数のユークリッド長)に対してペナルティを与えます。alpha値を設定することにより、係数への制約を調整できます。 pythonでRidge回帰を作成しましょう。先ず、ライブラリーのインポートとデータセットを作成します。 import matplotlib.pyplot as plt import numpy as np from sklearn.cross_validation import train_test_split from sklearn.datasets import make_regression from sklearn.linear_model import Ridge from sklearn.metrics import mean_squared_error # サンプルデータ作成 1000サンプル、300 特徴量 X, y, w = make_regression(n_samples=1000, n_features=300, coef=True,                           random_state=1, bias=3.5, noise=35)   モデル作成し、test scoreを計算します。 alphas = 0.1, 1,5, 10, 100   # 学習 テスト 分ける X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=3)   clf …

正則化のLasso回帰とRidge回帰 Read More »