如何调整Sklearn中投票分类器的权重

5

我想要做以下事情:

vc = VotingClassifier(estimators=[('gbc',GradientBoostingClassifier()),
                       ('rf',RandomForestClassifier()),('svc',SVC(probability=True))],
                       voting='soft',n_jobs=-1)

params = {'weights':[[1,2,3],[2,1,3],[3,2,1]]}
grid_Search = GridSearchCV(param_grid = params, estimator=vc)
grid_Search.fit(X_new,y)
print(grid_Search.best_Score_)

在这里,我想要调整参数weights。如果我使用GridSearchCV,那么会花费很多时间,因为它需要为每次迭代拟合模型,而我认为这并非必需。更好的做法是使用像sklearn.model_selection中的SelectModelFrom函数中所用的prefit之类的东西。还有其他选项吗?还是我对某些事情的理解有误?

GridSearchCV会根据提供的cv将数据分成训练集和测试集,然后在测试数据上对它们进行评分。由于您不想重新拟合估算器,所以您希望它们在哪些数据上进行评分:训练集、测试集还是所有数据? - Vivek Kumar
如果我使用GridSearchCV,它将为我指定的每个weight_list创建模型。但是我想要实现的是对于我给出的所有权重使用相同的模型。我想使用prefit,但在GridSeachCV中没有prefit选项。 - Abhinav Gupta
@VivekKumar 我已经编辑了问题代码以便更好地解释。请查看。 - Abhinav Gupta
1
不好意思,您可能没有理解我的意思。请查看GridSearchCV的“cv”参数。如果您不指定它,那么将使用默认的3折交叉验证。这意味着将使用2个数据集来训练估算器,第三个数据集用于评分。我的问题是,您想在哪些数据上获得分数? - Vivek Kumar
我建议您为此编写自定义代码。 您可以使用ParameterGrid来扩展参数,然后相应地使用它们。 - Vivek Kumar
2个回答

1
以下代码(在我的存储库中)会实现这个功能。
其中包含一个类。它首先对所有分类器进行交叉验证预测。然后循环遍历所有权重,选择最佳组合,并使用预先计算的预测结果。

0
一个更加计算友好的方法是先在训练数据上单独对每个分类器进行参数调整。然后根据验证数据中的目标指标(比如accuracy_score),按比例加权每个分类器。
# parameter tune
models = {
   'rf': GridSearchCV(rf_params, RandomForestClassifier()).fit(X_trian, y_train),
   'svc': GridSearchCV(svc_params, SVC()).fit(X_train, y_train),
}

# relative weights
model_scores = {
   name: sklearn.metrics.accuracy_score(
      y_validate,
      model.predict(X_validate),
      normalized=True
   )
   for name, model in models.items()
}
total_score = sum(model_scores.values())

# combine the parts
combined_model = VotingClassifier(
  list(models.items()),
  weights=[
    model_scores[name] / total_score
    for name in models.keys()
  ]
).fit(X_learn, y_learn)

最后,您可以将组合模型与您的学习(训练+验证)数据拟合并使用测试数据进行评估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接