[英]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.