Ana*_*ngh 6 machine-learning linear-regression
为了减少机器学习中线性回归的过拟合问题,建议通过包括参数的平方来修改成本函数.这导致较小的参数值.
这对我来说根本不直观.如何使用较小的参数值可以得出更简单的假设,并有助于防止过度拟合?
我整理了一个相当人为的例子,但希望它有帮助。
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
Run Code Online (Sandbox Code Playgroud)
首先构建一个线性数据集,并进行训练和测试划分。每个 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)
Run Code Online (Sandbox Code Playgroud)
使用无正则化的五阶多项式拟合数据。
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)
Run Code Online (Sandbox Code Playgroud)
查看系数
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
Run Code Online (Sandbox Code Playgroud)
这里模型触及所有训练点,但系数较高且不触及测试点。
让我们再试一次,但是改变我们的 L2 正则化
pipeline.set_params(model__alpha=1)
Run Code Online (Sandbox Code Playgroud)
y_pred = 6.88 + 26.13 x + 16.58 x^2 + 12.47 x^3 + 5.86 x^4 - 5.20 x^5
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到形状更平滑,摆动更少。它不再触及所有训练点,但它是一条平滑得多的曲线。由于添加了正则化,系数更小。
这有点复杂。这很大程度上取决于您使用的算法。
举一个简单但有点愚蠢的例子。而不是优化函数的参数
y = a*x1 + b*x2
Run Code Online (Sandbox Code Playgroud)
您还可以优化参数
y = 1/a * x1 + 1/b * x2
Run Code Online (Sandbox Code Playgroud)
显然,如果您在前一种情况下最小化,那么您需要在后一种情况下最大化它们。
对于大多数算法来说,最小化参数的平方这一事实来自计算学习理论。
让我们假设您想学习以下函数
f(x) = a + bx + c * x^2 + d * x^3 +....
Run Code Online (Sandbox Code Playgroud)
有人可能会说,只有 a 与零不同的函数比 a 和 b 与零不同的函数更有可能,依此类推。遵循奥卡姆剃刀原理(如果您有两个假设来解释您的数据,则越简单的假设越可能是正确的),您应该更喜欢其中更多参数为零的假设。
举个例子,假设您的数据点是 (x,y) = {(-1,0),(1,0)} 您更喜欢哪个函数
f(x) = 0
Run Code Online (Sandbox Code Playgroud)
或者
f(x) = -1 + 1*x^2
Run Code Online (Sandbox Code Playgroud)
稍微扩展一下,您可以从零参数到较小的参数。
如果您想尝试一下,可以从线性函数中采样一些数据点并添加一些高斯噪声。如果你想找到一个完美的多项式拟合,你需要一个相当复杂的函数,并且通常具有相当大的权重。但是,如果您应用正则化,您将接近您的数据生成函数。
但如果您想将推理建立在坚如磐石的理论基础上,我建议您应用贝叶斯统计。这里的想法是定义回归函数的概率分布。这样您就可以自己定义什么是“可能的”回归函数。
(实际上 Tom Mitchell 的《机器学习》包含了非常好的且更详细的解释)