Scikit Learn:RidgeCV似乎没有给出最佳选择



这是我的X

 X =  np.array([[  5.,   8.,   3.,   4.,   0.,   5.,   4.,   0.,   2.,   5.,  11.,
              3.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   1.,   4.,   0.,   3.,   5.,  13.,
              4.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   4.,   4.,   0.,   3.,   5.,  12.,
              2.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   1.,   4.,   0.,   4.,   5.,  12.,
              4.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   1.,   4.,   0.,   3.,   5.,  12.,
              5.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   2.,   4.,   0.,   3.,   5.,  13.,
              3.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   2.,   4.,   0.,   4.,   5.,  11.,
              4.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   2.,   4.,   0.,   3.,   5.,  11.,
              5.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   1.,   4.,   0.,   3.,   5.,  12.,
              5.,  19.,   2.],
           [  5.,   8.,   3.,   4.,   0.,   1.,   4.,   0.,   3.,   5.,  12.,
              5.,  19.,   2.]])

这是我的响应y

y = np.array([ 70.14963195,  70.20937046,  70.20890363,  70.14310389,
        70.18076206,  70.13179977,  70.13536797,  70.10700998,
        70.09194074,  70.09958111])

RIDGE回归

    # alpha = 0.1
    model = Ridge(alpha = 0.1)
    model.fit(X,y)
    model.score(X,y)   # gives 0.36898424479816627
    # alpha = 0.01
    model1 = Ridge(alpha = 0.01)
    model1.fit(X,y)
    model1.score(X,y)     # gives 0.3690347045143918 > 0.36898424479816627
    # alpha = 0.001
    model2 = Ridge(alpha = 0.001)
    model2.fit(X,y)
    model2.score(X,y)  #gives 0.36903522192901728 > 0.3690347045143918
    # alpha = 0.0001
    model3 = Ridge(alpha = 0.0001)
    model3.fit(X,y)
    model3.score(X,y)  # gives 0.36903522711624259 > 0.36903522192901728

因此,从这里开始应该很明显alpha = 0.0001是最好的选择。确实,阅读文档说得分是确定系数。如果最接近1的系数描述了最佳模型。现在让我们看看RidgeCV告诉我们的

RIDGECV回归

modelCV = RidgeCV(alphas = [0.1, 0.01, 0.001,0.0001], store_cv_values = True)
modelCV.fit(X,y)
modelCV.alpha_  #giving 0.1
modelCV.score(X,y)  # giving 0.36898424479812919 which is the same score as ridge regression with alpha = 0.1

出了什么问题?当然,我们可以像我所做的那样手动检查所有其他alpha都更好。因此,它不仅不是选择最好的alpha,而且还选择了最坏的!

有人可以向我解释出什么问题吗?

这是完全正常的行为。

您的手动方法是不做任何交叉验证,因此train-和testdata是相同的!

# alpha = 0.1
model = Ridge(alpha = 0.1)
model.fit(X,y)   #!!
model.score(X,y) #!!

在分类器上有一些温和的假设(例如凸优化问题)和求解器(保证的epsilon-convergence),这意味着您将始终获得最低正则化模型的最低分数((过拟合!):在您的情况下:alpha = 0.0001。(看看Ridgeregression的公式)

使用 ridgecv 交叉验证是默认情况下选择的激活被选择。用于确定最佳参数的评分过程不是使用相同的数据进行火车和测试。

您可以在使用store_cv_values = True时打印出平均cv_values_

print(np.mean(modelCV.cv_values_, axis=0))
# [ 0.00226582  0.0022879   0.00229021  0.00229044]
# alpha [0.1, 0.01, 0.001,0.0001]
# by default: mean squared errors!
# left / 0.1 best; right / 0.0001 worst 
# this is only a demo: not sure how sklearn selects best (mean vs. ?)

这是预期的,但不是一般规则。由于您现在使用两个不同的数据集进行评分,因此您正在优化不要过度fit,并且需要高概率一些正规化!

sascha的答案是正确的。这是Ridgecv确实选择正确的Alpha的证据。

i编写一个函数,以测试Alpha的最小交叉验证错误的索引是否匹配了Alphas列表中0.1的索引。

def test_RidgeCV(alphas):
    modelCV = RidgeCV(alphas = alphas, store_cv_values = True)
    modelCV.fit(X,y)
    modelCV.score(X,y)
    # print(modelCV.alpha_)
    CV_values =modelCV.cv_values_
    mean_error = np.min(CV_values, axis=0)
    return alphas.index(0.1) == np.argmin(mean_error)

然后,我浏览了问题中提供的alpha列表的全部排列。无论我们放置0.1,其索引始终符合最小错误的索引。
这是详尽的测试。我们有24个真实的。

alphas=[0.1, 0.01, 0.001,0.0001]
from itertools import permutations
alphas_list = list(permutations(alphas))
for i in range(len(alphas_list)):
    print(test_RidgeCV(alphas=alphas_list[i]))

out:真的真的...true

最新更新