12

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

这是我的代码和我遇到的错误:

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 无效


编辑:我通过获取最新的 scikit-learn 版本并使用以下内容解决了这个问题:

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

6 回答 6

12

只是试图结束这个长期悬而未决的问题......

您需要获取最新版本的 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)
于 2014-12-29T01:13:22.510 回答
8

以前的答案现在已经过时了。字典fit_params应该传递给fit方法。

GridSearchCV的文档中:

fit_params : 字典,可选

传递给 fit 方法的参数。

自 0.19 版起已弃用:作为构造函数参数的 fit_params 在 0.19 版中已弃用,并将在 0.21 版中删除。而是将拟合参数传递给 fit 方法。

于 2018-03-30T17:08:16.283 回答
4

在 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})
于 2015-06-26T21:35:36.107 回答
3

以下适用于 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)
于 2020-07-07T04:15:04.733 回答
0

好问题和好答案!(感谢@Sycorax、@AN6U5 和@user1771485)。他们都帮助我找到了具体案例的答案,我需要在 GridSearchCV 期间使用 sample_weight ,但我的估计器是使用 Pipeline 获得的。该问题与之前的解决方案不同,因为 Pipeline 不支持 fit_param;实际上,如果您尝试fit_param = {... }在(GridSearchCV 的)拟合步骤中使用,您将得到

Pipeline.fit 不接受 fit_param 参数。您可以使用 stepname__parameter 格式将参数传递给管道的特定步骤,例如Pipeline.fit(X, y, logisticregression__sample_weight=sample_weight)

我使用的管道是

pipe = Pipeline(steps=[('normalizer', norm), ('estimator', svr)])

哪里norm是归一化步骤,svr = SVR()和参数网格

parameters_svr = dict (estimator = [svr], estimator__kernel =  ['rbf', 'sigmoid'], ...)

然后,按照@user1771485 的建议

grid = GridSearchCV (estimator = pipe, param_grid = parameters_svr, cv = 3,                            
                     scoring = 'neg_mean_squared_error', 
                     return_train_score = True, refit = True, n_jobs = -1)

最后,(真正重要的部分)

grid.fit (X,y, estimator__sample_weight= weights)
于 2022-02-21T05:57:28.277 回答
0

OP的编辑和其他答案并不完全正确。而对于拟合fit_params={'sample_weight': weights}工作,这些权重不会用于计算验证损失!github问题)。

因此,交叉验证将报告未加权损失,因此超参数调整可能会转向错误的方向。

这是我使用准确性作为度量的类权重交叉验证的解决方法。还应该与其他指标一起使用。

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
)
于 2021-04-13T15:04:40.083 回答