如何使用较小的参数值有助于防止过度拟合?

时间:2016-01-02 19:37:00

标签: machine-learning linear-regression

为了减少机器学习中线性回归的过拟合问题,建议通过包括参数的平方来修改成本函数。这导致较小的参数值。

这对我来说根本不直观。如何使用较小的参数值可以得出更简单的假设,并有助于防止过度拟合?

3 个答案:

答案 0 :(得分:4)

我把一个相当人为的例子放在一起,但希望它有所帮助。

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

使用没有正则化的五阶多项式拟合数据。

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

在这里,我们看到更平滑的形状,周围较少摆动。它不再触及所有训练点,但它是一条更平滑的曲线。由于增加了正则化,系数较小。

答案 1 :(得分:3)

这有点复杂。这在很大程度上取决于您使用的算法。

制作一个简单而略显愚蠢的例子。而不是优化函数的参数

  y = a*x1 + b*x2 

您还可以优化

的参数
  y = 1/a * x1 + 1/b * x2 

显然,如果你在前一种情况下最小化,你需要在后一种情况下最大化它们。

大多数算法最小化参数平方的事实来自计算学习理论

让我们假设你想学习一个函数

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

有人可以说,一个函数只有一个不同于零更可能而不是一个函数,其中a和b不同于零,依此类推。 遵循 Occams razor (如果您有两个假设解释您的数据,更简单的更可能是正确的),您应该更喜欢一个假设,其中您的更多参数为零。

举一个例子,假设你的数据点是(x,y)= {( - 1,0),(1,0)} 你更喜欢哪种功能

f(x) = 0 

f(x) = -1 +  1*x^2

稍微扩展一下,你可以从零参数变为小参数。

如果您想尝试一下,可以从线性函数中采样一些数据点并添加一些高斯噪声。如果你想找到一个完美的多项式拟合,你需要一个非常复杂的函数,通常具有相当大的权重。但是,如果您应用正则化,您将接近数据生成功能。

但是如果你想在坚如磐石的理论基础上设定你的推理,我建议你应用 Baysian统计数据。这个想法是你定义了回归函数的概率分布。这样你就可以自己定义一个“可能的”回归函数。

(实际上Tom Mitchell的机器学习包含了一个非常好的和更详细的解释)

答案 2 :(得分:0)

将正方形添加到函数中(从线性到多项式),可以绘制曲线而不是直线。

多项式函数的例子:

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

然而,添加它会导致测试数据过多的结果,因为新数据匹配接近测试数据。添加越来越多的多项式(第3,第4阶)。因此,在添加多项式时,您必须注意数据不会过度拟合。

要更深入地了解这一点,请在电子表格中绘制一些曲线,并查看曲线如何随数据变化。