2016-01-02 6 views
5

機械学習での線形回帰の過剰フィッティングの問題を軽減するには、パラメータの2乗を含めることによってコスト関数を変更することをお勧めします。これにより、パラメータの値が小さくなります。パラメータの値が小さいと、オーバーフィッティングの防止にどのように役立ちますか?

これは私には直感的ではありません。パラメータの値を小さくすると、仮説が簡単になり、過大なフィッティングが防止されます。

答えて

2

これは少し複雑です。それはあなたが使用しているアルゴリズムに非常に依存します。

簡単にやや馬鹿げた例を作る。代わりに

y = a*x1 + b*x2 

関数のパラメータを最適化するあなたは後者の場合には、それらを最大限にする必要があり、前者の場合には最小限に抑える場合も明らかに

y = 1/a * x1 + 1/b * x2 

のパラメータを最適化することができます。

パラメータの2乗を最小限にするほとんどのアルゴリズムでは、計算学習理論から来るという事実。

のは、あなたが

f(x) = a + bx + c * x^2 + d * x^3 +.... 

一つは、機能だけでゼロと異なっていたと主張することができます関数に学びたい、次のために想定してみましょうとbが異なっている機能、より可能性が高いですゼロを形成するなど。 に続いてオカムズカミソリ(あなたのデータを説明する2つの仮説がある場合、より単純な方が正しい可能性が高い)、より多くのパラメータがゼロの仮説を好むべきです。例を与えることを

は、あなたのデータ点が(x、y)= {(-1,0)、(1,0)} 機能あなたが

f(x) = 0 

または

を好むだろうと言うことができます
f(x) = -1 + 1*x^2 

これを少し拡大すると、ゼロのパラメータから小さなパラメータに進むことができます。

リニア関数からいくつかのデータポイントをサンプリングしてガウスノイズを追加することができます。完璧な多項式フィットを求めたい場合は、かなり大きな重みを持つかなり複雑な関数が必要です。ただし、正規化を適用すると、データ生成関数に近づきます。

しかし、堅実な理論上の基礎に推論を設定したい場合は、ベイシック統計を適用することをお勧めします。回帰関数より確率分布を定義するという考え方があります。そうすれば、「可能性のある」回帰関数が何であるかを自分で定義することができます。

(トム・ミッチェル実際に機械学習はかなり良いと、より詳細な説明が含まれています)

0

関数に正方形を追加すると(線形から多項式まで)、直線のみでなく曲線を描くことができます。多項式関数の

例:新たなデータがテストデータに閉じるように整合されていること結果とあまり試験データを以下の結果をもたらすことができるが、これを追加

y=q+t1*x1+t2*x2^2; 

。より多項式を追加する(3次、4次)。だから、多項式を追加するときには、データが過密になっていないことに注意する必要があります。

スプレッドシートにいくつかの曲線を描き、データに沿って曲線がどのように変化するかを確認します。

+0

しかし、コスト関数に四角形を追加しないかは私たちにシンプルな仮説を得ますか? 私はここであなたを得ませんでした。 –

3

私はむしろ人為的な例をまとめましたが、うまくいけばそれが役に立ちます。

import pandas as pd 
import numpy as np 

from sklearn import datasets 
from sklearn.linear_model import Ridge, Lasso 
from sklearn.cross_validation import train_test_split 
from sklearn.preprocessing import PolynomialFeatures 

最初のトレーニングとテスト分割して、線形データセットを構築します。 5各

X,y, c = datasets.make_regression(10,1, noise=5, coef=True, shuffle=True, random_state=0) 
X_train, X_test, y_train, y_test = train_test_split(X,y, train_size=5) 

Original Data

でない正則第5次多項式を使用してデータをフィット。

from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import StandardScaler 
pipeline = Pipeline([ 
     ('poly', PolynomialFeatures(5)), 
     ('model', Ridge(alpha=0.)) # alpha=0 indicates 0 regularization. 
    ]) 

pipeline.fit(X_train,y_train) 

ここ係数

pipeline.named_steps['model'].coef_ 
pipeline.named_steps['model'].intercept_ 

# y_pred = -12.82 + 33.59 x + 292.32 x^2 - 193.29 x^3 - 119.64 x^4 + 78.87 x^5 

No Regularization

を見るとモデルはすべてのトレーニングのポイントに触れたが、高い係数を持っており、テストポイントに触れていません。

はのは、もう一度試してみよう、しかし変更当社L2正則

pipeline.set_params(model__alpha=1) 

With regularization

y_pred = 6.88 + 26.13 x + 16.58 x^2 + 12.47 x^3 + 5.86 x^4 - 5.20 x^5 

は、ここでは、周りの少ないウィグリングで、より滑らかな形状を参照してください。それはもはやすべてのトレーニングポイントには触れませんが、より滑らかなカーブです。正則化が加えられているため係数は小さくなる。

関連する問題