为了减少机器学习中线性回归的过拟合问题,建议通过包括参数的平方来修改成本函数。这导致较小的参数值。
这对我来说根本不直观。如何使用较小的参数值可以得出更简单的假设,并有助于防止过度拟合?
答案 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)
使用没有正则化的五阶多项式拟合数据。
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
此处模型触及所有训练点,但系数较高且不接触测试点。
让我们再试一次,但改变我们的L2正规化
pipeline.set_params(model__alpha=1)
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阶)。因此,在添加多项式时,您必须注意数据不会过度拟合。
要更深入地了解这一点,请在电子表格中绘制一些曲线,并查看曲线如何随数据变化。