【问题标题】:Getting probabilities of best model for RandomizedSearchCV获得 RandomizedSearchCV 最佳模型的概率
【发布时间】:2018-10-17 06:23:09
【问题描述】:

我正在使用RandomizedSearchCV 通过 10 倍交叉验证和 100 次迭代获得最佳参数。这很好用。但现在我还想从性能最好的模型中获取每个预测测试数据点(如predict_proba)的概率。

如何做到这一点?

我看到两个选项。首先,也许可以直接从RandomizedSearchCV 获得这些概率,或者第二,从RandomizedSearchCV 获得最佳参数,然后再次进行 10 倍交叉验证(使用相同的种子,以便我得到相同的分割) 使用这个最佳参数。

编辑:以下代码对于获得最佳性能模型的概率是否正确? X 是训练数据,y 是标签,模型是我的 RandomizedSearchCV,其中包含一个 Pipeline,其中包含缺失值、标准化和 SVM。

cv_outer = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
y_prob = np.empty([y.size, nrClasses]) * np.nan
best_model = model.fit(X, y).best_estimator_

for train, test in cv_outer.split(X, y):
    probas_ = best_model.fit(X[train], y[train]).predict_proba(X[test])
    y_prob[test] = probas_

【问题讨论】:

  • RandomizedSearchCV 确实有一个predict_proba(),它将访问具有最佳参数的拟合模型。那是你要的吗?或者您想对测试折叠中的每个值进行预测?
  • @VivekKumar 我已经更新了我的问题。你认为这会奏效吗?
  • 请添加您如何定义model 以及您如何使用cv_outer

标签: python machine-learning scikit-learn grid-search


【解决方案1】:

如果我理解正确,您希望获得测试组中每个样本的个人分数,以获取最高 CV 分数的案例。如果是这种情况,您必须使用可以控制拆分索引的 CV 生成器之一,例如:http://scikit-learn.org/stable/tutorial/statistical_inference/model_selection.html#cross-validation-generators

如果您想使用性能最佳的模型计算新测试样本的分数,只要您的基础模型支持,RandomizedSearchCVpredict_proba() 函数就足够了。

例子:

import numpy
skf = StratifiedKFold(n_splits=10, random_state=0, shuffle=True)
scores = cross_val_score(svc, X, y, cv=skf, n_jobs=-1)
max_score_split = numpy.argmax(scores)

现在您知道您的最佳模型出现在 max_score_split,您可以自己拆分并拟合您的模型。

train_indices, test_indices = k_fold.split(X)[max_score_split]
X_train = X[train_indices]
y_train = y[train_indices]
X_test = X[test_indices]
y_test = y[test_indices]
model.fit(X_train, y_train) # this is your model object that should have been created before

最后通过以下方式获得您的预测:

model.predict_proba(X_test)

我自己没有测试过代码,但应该稍作修改。

【讨论】:

  • 您的理解是正确的,谢谢您的回答。但我还是很困惑。当然,我可以通过使用 best_estimator_ 从 RandomizedSearchCV 获得性能最好的模型,然后我可以再次进行交叉验证并在这个最佳模型上使用 predict_proba() 但在这个交叉验证中,我应该再次用最好的模型训练模型参数,而不是只使用最好的模型。
  • 我已经对我的问题进行了更新,这让我的意思更清楚了
  • 我更新了我的答案,如果有效,请告诉我。
  • 我认为这不是我想要的,请在问题中查看我的代码。您的代码搜索得分最高的拆分,但我想要的是在所有拆分中得分最高的模型,即最佳参数。
【解决方案2】:

您需要查看cv_results_,这将为您提供所有折叠的分数和平均分数,以及平均拟合时间等...

如果您想为每次迭代使用predict_proba(),这样做的方法是循环遍历cv_results_ 中给出的参数,然后为每个迭代重新拟合模型,然后预测概率,如据我所知,各个模型没有缓存在任何地方。

best_params_ 将为您提供最佳拟合参数,因为如果您想下次只使用最佳参数来训练模型。

在信息页面http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html中查看cv_results_

【讨论】:

  • 或者我可以在交叉验证中再次在 best_estimator_ 上调用 fit() 吗?
  • 这应该是可能的,或者您可以直接在best_estimator_ 上致电predict_proba()
  • 我已经对我的问题进行了更新,这使我的意思更清楚了。你认为这段代码行得通吗?
  • 查看您的代码,这似乎是一个很好的方法,但我不确定实际的数据拆分是否与您稍后调用StratifiedKFold 得到的数据相同。一种验证方法是查看训练/测试分数是否与cv_results_中的分数相匹配
  • 但是当我在 RandomizedSearchCV 中设置 cv=cv_outer 时,拆分应该是相同的,因为我在 cv_outer 中设置了 random_state=0,还是我错了?
猜你喜欢
  • 2017-12-17
  • 2022-11-07
  • 1970-01-01
  • 2015-09-21
  • 2020-05-07
  • 1970-01-01
  • 2017-08-20
  • 2023-04-05
  • 2018-12-09
相关资源
最近更新 更多