关于 python 上的岭回归的问题:缩放和解释



我试图用python对波士顿住房数据运行Ridge回归,但我有以下问题,我在任何地方都找不到答案,所以我决定在这里发布它:

是否建议在拟合模型之前进行缩放?因为当我缩放和不缩放时,我得到的分数相同。另外,在选择最佳阿尔法方面,阿尔法/系数图的解释是什么?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns 
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import linear_model
df = pd.read_csv('../housing.data',delim_whitespace=True,header=None)
col_names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT','MEDV']
df.columns = col_names
X = df.loc[:,df.columns!='MEDV']
col_X = X.columns 
y = df['MEDV'].values
# Feature Scaling:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
clf = Ridge()
coefs = []
alphas = np.logspace(-6, 6, 200)
for a in alphas:
    clf.set_params(alpha=a)
    clf.fit(X_std, y)
    coefs.append(clf.coef_)
plt.figure(figsize=(20, 6))
plt.subplot(121)
ax = plt.gca()
ax.plot(alphas, coefs) 
ax.set_xscale('log')
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()

缩放 X 的阿尔法/系数图

未缩放 X 的 alpha/系数图

在缩放数据上,当我计算分数并通过 CV 选择 alpha 时,我得到:

from sklearn.linear_model import RidgeCV
clf = RidgeCV(alphas=[1e-3, 1e-2, 1e-1, 1, 5, 7]).fit(X_std, y)
> clf.score(X_std, y)
> 0.74038
> clf.alpha_
> 5.0

非缩放数据上,我什至在完全不同的 alpha 下获得了稍微好一点的分数:

clf = RidgeCV(alphas=[1e-3, 1e-2, 1e-1, 1, 6]).fit(X, y)
> clf.score(X, y)
> 0.74064
> clf.alpha_
> 0.01

感谢您对此事的见解,期待阅读您的答案!

我认为您应该进行缩放,因为 Ridge 正则化会惩罚较大的值,因此您不想因为缩放问题而丢失有意义的功能。也许您看不到区别,因为住房数据是一个玩具数据集,并且已经很好地缩放了。

较大的

alpha 对较大的值的惩罚更强。该图向您显示(尽管它没有标记),使用更强的 alpha,您可以将系数更强烈地发送到零。越渐进的线条权重越小,因此在 alpha 变得足够大之前,它们的影响较小或几乎完全没有影响。更锋利的重量更大,因此它们更快地下降到零。当他们这样做时,该功能将从您的回归中消失。

对于缩放数据,设计矩阵的量级较小,系数趋于较大(并且施加的L2惩罚更多)。为了最小化L2,我们需要越来越多的小系数。如何获得越来越多的小系数?方法是选择一个非常大的 alpha,这样我们就可以拥有更小的系数。这就是为什么如果你缩放数据,最佳 alpha 是一个很大的数字。

最新更新