簡體   English   中英

Scikit 學習:RidgeCV 似乎沒有給出最佳選擇?

[英]Scikit learn: RidgeCV seems not to give the best option?

這是我的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])

嶺回歸

    # 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,而且還選擇了最差的 alpha!

有人可以向我解釋它出了什么問題嗎?

這是完全正常的行為。

您的手動方法沒有進行任何交叉驗證,因此訓練數據和測試數據是相同的!

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

對分類器(例如凸優化問題)和求解器(保證 epsilon 收斂)有一些溫和的假設,這意味着,對於最不正規化的模型(過度擬合!),您將始終獲得最低分數:在您的情況下: 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. ?)

這是預期的,但不是一般規則。 由於您現在正在使用兩個不同的數據集進行評分,因此您正在優化以防止過度擬合,並且很有可能需要進行一些正則化!

sascha的答案是正確的。 這是 RidgeCV 確實選擇了正確的 alpha 的證據。

我編寫了一個函數來測試 alpha 的最小交叉驗證錯誤的索引是否與 alpha 列表中的索引 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 個 True。

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

出:真真……真

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM