scikit-learn:在grid_search中使用sample_weight

时间:2012-10-24 14:49:39

标签: scikit-learn

是否可以执行grid_search(以获得最佳SVM的C)并使用scikit-learn指定sample_weight?

这是我遇到的错误:

gs = GridSearchCV(svm.SVC(C = 1),[{'kernel':['linear'],'C':[。1,1,10],'probability':[True],' sample_weight':sw_train}])

gs.fit(Xtrain,ytrain)

  
    

>> ValueError:估算器SVC的参数sample_weight无效

  

由于

[编辑]

感谢FP: 我需要获取SKL的最新版本并使用以下内容:

  
    

gs.fit(Xtrain,ytrain,fit_params = {'sample_weight':sw_train})

  

5 个答案:

答案 0 :(得分:9)

试图结束这个悬而未决的问题......

您需要获取SKL的最新版本并使用以下内容:

gs.fit(Xtrain, ytrain, fit_params={'sample_weight': sw_train})

但是,它更符合将fit_params传递给构造函数的文档:

gs = GridSearchCV(svm.SVC(C=1), [{'kernel': ['linear'], 'C': [.1, 1, 10], 'probability': [True], 'sample_weight': sw_train}], fit_params={'sample_weight': sw_train})

gs.fit(Xtrain, ytrain)

答案 1 :(得分:3)

在版本0.16.1中,如果使用Pipeline,则需要将参数传递给GridSearchCV构造函数:

clf = pipeline.Pipeline([('svm', svm_model)])
model = grid_search.GridSearchCV(estimator = clf, param_grid=param_grid,
    fit_params={'svm__sample_weight': sw_train})

答案 2 :(得分:2)

以前的答案现已过时。字典companyNameCheckPromise.then((data) => { return new Promise((resolve, reject) => { ... resolve(data); // do not return it }); }); 应该传递给fit_params方法。

来自GridSearchCV的文档:

  

fit_params :dict,optional

     

传递给fit方法的参数。

     
    

自版本0.19后不推荐使用:fit_params作为构造函数参数在版本0.19中已弃用,将在版本0.21中删除。将拟合参数传递给fit方法。

  

答案 3 :(得分:0)

以下在Sklearn 0.23.1中起作用,

grid_cv = GridSearchCV(clf, param_grid=param_grid,
                       scoring='recall', n_jobs=-1, cv=10)

grid_cv.fit(x_train_orig, y=y_train_orig,
            sample_weight=my_sample_weights)

答案 4 :(得分:0)

适合 fit_params={'sample_weight': weights} 作品。

但是,验证仍然没有 (github issue)。本质上,交叉验证会报告未加权的损失,因此超参数调整可能会被引导到错误的方向。

这里有一个解决方法的准确性。还应使用其他指标。

from sklearn.metrics import accuracy_score
from sklearn.utils import compute_sample_weight
from sklearn.metrics import make_scorer


def weighted_accuracy_eval(y_pred, y_true, **kwargs):
    balanced_class_weights_eval = compute_sample_weight(
        class_weight='balanced',
        y=y_true
    )
    out = accuracy_score(y_pred=y_pred, y_true=y_true, sample_weight=balanced_class_weights_eval, **kwargs)
    return out


weighted_accuracy_eval_skl = make_scorer(weighted_accuracy_eval)

gridsearch = GridSearchCV(
    estimator=model,
    scoring=weighted_accuracy_eval,
    param_grid=paramGrid,
)

cv_result = gridsearch.fit(
    X_train,
    y_train,
    fit_params=fit_params
)