【问题标题】:Difference between LinearRegression() and Ridge(alpha=0)LinearRegression() 和 Ridge(alpha=0) 的区别
【发布时间】:2017-03-27 00:08:15
【问题描述】:

当 alpha 参数接近零时,Tikhonov (ridge) 成本等于最小二乘成本。 scikit-learn docs about the subject 上的所有内容都表示相同。所以我期待

sklearn.linear_model.Ridge(alpha=1e-100).fit(data, target)

等价于

sklearn.linear_model.LinearRegression().fit(data, target)

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

已更新代码:

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-')

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

【问题讨论】:

    标签: python machine-learning scikit-learn regression linear-regression


    【解决方案1】:

    根据documentationalpha 必须是正浮点数。您的示例将 alpha=0 作为整数。使用一个小的正数 alphaRidgeLinearRegression 的结果似乎会收敛。

    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]
    

    更新 上面alpha=0int 的问题似乎只是上面例子中的一些玩具问题的问题。

    对于住房数据,问题在于缩放比例。您调用的 15 度多项式导致数值溢出。要从 LinearRegressionRidge 产生相同的结果,请先尝试缩放您的数据:

    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]
    

    【讨论】:

    • 谢谢,但是将 alpha 设置为非常小的正浮点数并不能解决问题。请查看附加代码及其生成的图。
    • 缩放修复了它,谢谢!有趣的是它如何溢出脊而不是规则的最小二乘。取系数范数时可能会发生这种情况,根据未处理的数据计算时,系数范数很大。
    猜你喜欢
    • 2018-08-26
    • 2021-06-13
    • 2018-04-08
    • 2017-02-28
    • 2018-02-27
    • 2011-04-27
    • 2018-02-15
    • 2015-06-17
    相关资源
    最近更新 更多