簡體   English   中英

為什么 RandomizedSearchCV 返回線性估計器的度數或伽馬值?

[英]Why RandomizedSearchCV reeturn a value of degree or gamma for linear estimator?

對於 Sklearn,我使用的是 RandomizedSearchCV,在特定情況下,最好的估計器是:

SVR(C=1594.0828461797396, degree=0.8284528822863231, gamma=1.1891370222133257,kernel='linear')

但根據sklearn 文檔degreegamma僅適用於rbfpoly內核。 為什么我得到帶有gammadegree值的linar估計器?

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import expon, reciprocal

param_distribs = {
        'kernel': ['linear', 'rbf','poly','sigmoid'],
        'C': reciprocal(20, 200000),
        'gamma': expon(scale=1.0),
        'degree': expon(scale=1.0),
    }

svm_reg = SVR()
rnd_search = RandomizedSearchCV(svm_reg, param_distributions=param_distribs,
                                n_iter=50, cv=5, scoring='neg_mean_squared_error',
                                verbose=2, random_state=42)
rnd_search.fit(X, y)

RandomizedSearchCV將始終為估計器隨機設置所有指定參數,而不管這些限制如何,因為沒有實施內部方法來檢查哪些組合對特定估計器有意義。 由於gammadegree在與linear kernel 結合使用時會被忽略,因此它也不會引發錯誤,並且算法只是在每次設置所有參數的情況下運行。

如果您想避免這種行為,您可以將參數 grid 作為字典列表傳遞,指定允許哪些組合。 文檔針對此類情況指定:

如果給定一個字典列表,首先對字典進行均勻采樣,然后使用該字典對參數進行采樣,如上所述。

例如,假設您將以下內容定義為參數網格:

param_distribs = [
    {
        'kernel': ['rbf','poly'],
        'C': reciprocal(20, 200000),
        'gamma': expon(scale=1.0),
        'degree': expon(scale=1.0)
    },
    {
        'kernel': ['linear','sigmoid'],
        'C': reciprocal(20, 200000)
    }
]

這將避免RandomizedSearchCV在迭代中選擇具有linear kernel 的字典時設置gammadegree 相反,如果它在特定迭代中選擇另一個字典,它也會設置gammadegree

暫無
暫無

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

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