LinearRegression() 和 Ridge(alpha=0) 的区别

spa*_*ath 5 python regression machine-learning linear-regression scikit-learn

当 alpha 参数接近零时,Tikhonov(岭)成本变得等同于最小二乘成本。在一切有关的主题scikit学习文档表示相同。因此我期待

sklearn.linear_model.Ridge(alpha=1e-100).fit(data, target)
Run Code Online (Sandbox Code Playgroud)

相当于

sklearn.linear_model.LinearRegression().fit(data, target)
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。为什么?

更新代码:

import pandas as pd
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
%matplotlib inline

dataset = pd.read_csv('house_price_data.csv')

X = dataset['sqft_living'].reshape(-1, 1)
Y = dataset['price'].reshape(-1, 1)

polyX = PolynomialFeatures(degree=15).fit_transform(X)

model1 = LinearRegression().fit(polyX, Y)
model2 = Ridge(alpha=1e-100).fit(polyX, Y)

plt.plot(X, Y,'.',
         X, model1.predict(polyX),'g-',
         X, model2.predict(polyX),'r-')
Run Code Online (Sandbox Code Playgroud)

注意:情节看起来相同alpha=1e-8alpha=1e-100

在此处输入图片说明

Rya*_*ker 5

根据文档alpha必须是正浮点数。你的例子有alpha=0一个整数。用一个小的正alpha,结果RidgeLinearRegression出现收敛。

from sklearn.linear_model import Ridge, LinearRegression
data = [[0, 0], [1, 1], [2, 2]]
target = [0, 1, 2]

ridge_model = Ridge(alpha=1e-8).fit(data, target)
print("RIDGE COEFS: " + str(ridge_model.coef_))
ols = LinearRegression().fit(data,target)
print("OLS COEFS: " + str(ols.coef_))

# RIDGE COEFS: [ 0.49999999  0.50000001]
# OLS COEFS: [ 0.5  0.5]
#
# VS. with alpha=0:
# RIDGE COEFS: [  1.57009246e-16   1.00000000e+00]
# OLS COEFS: [ 0.5  0.5]
Run Code Online (Sandbox Code Playgroud)

UPDATE 有问题alpha=0int上面似乎只要是与像上面的例子中的几个玩具问题的问题。

对于住房数据,问题之一是缩放。您调用的 15 度多项式导致数值溢出。要产生相同的结果LinearRegression,并Ridge尝试第一缩放您的数据:

import pandas as pd
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.preprocessing import PolynomialFeatures, scale

dataset = pd.read_csv('house_price_data.csv')

# scale the X data to prevent numerical errors.
X = scale(dataset['sqft_living'].reshape(-1, 1))
Y = dataset['price'].reshape(-1, 1)

polyX = PolynomialFeatures(degree=15).fit_transform(X)

model1 = LinearRegression().fit(polyX, Y)
model2 = Ridge(alpha=0).fit(polyX, Y)

print("OLS Coefs: " + str(model1.coef_[0]))
print("Ridge Coefs: " + str(model2.coef_[0]))

#OLS Coefs: [  0.00000000e+00   2.69625315e+04   3.20058010e+04  -8.23455994e+04
#  -7.67529485e+04   1.27831360e+05   9.61619464e+04  -8.47728622e+04
#  -5.67810971e+04   2.94638384e+04   1.60272961e+04  -5.71555266e+03
#  -2.10880344e+03   5.92090729e+02   1.03986456e+02  -2.55313741e+01]
#Ridge Coefs: [  0.00000000e+00   2.69625315e+04   3.20058010e+04  -8.23455994e+04
#  -7.67529485e+04   1.27831360e+05   9.61619464e+04  -8.47728622e+04
#  -5.67810971e+04   2.94638384e+04   1.60272961e+04  -5.71555266e+03
#  -2.10880344e+03   5.92090729e+02   1.03986456e+02  -2.55313741e+01]
Run Code Online (Sandbox Code Playgroud)