在随机森林中,RandomizedSearchCV精度得分不匹配

时间:2018-07-04 11:14:53

标签: python scikit-learn random-forest grid-search

我正在尝试使用RandomizedSearchCV随机森林上进行一些超参数优化。我将评分方法设置为平均精度rand_search.best_score_大约为 0.38 (对我的数据集来说是一个合理的结果),但是当我使用rand_search.best_estimator_计算相同的平均精度得分时,结果接近 1 < / strong>(请参见下文)。

clf = RandomForestClassifier()
randsearch = RandomizedSearchCV(clf,
                                scoring='average_precision',
                                param_distributions=parameters,
                                n_iter=1,
                                cv=StratifiedShuffleSplit(n_splits=10),
                                n_jobs=1, 
                                verbose=2)

randsearch.fit(X, y)
randomized_best_score = randsearch.best_score_

best_estimator_avg_precision = average_precision_score(y, 
                               randsearch.best_estimator_.predict(X))

best_estimator_avg_precision_probs = average_precision_score(y, 
                          randsearch.best_estimator_.predict_proba(X)[:, 1])

print(randomized_best_score)
print(best_estimator_avg_precision)
print(best_estimator_avg_precision_probs)

>>> randomized_best_score: 0.3836
>>> best_estimator_avg_precision: 0.983577210629
>>> best_estimator_avg_precision_probs: 1.0

知道为什么会发生这种情况吗?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

这里有很多事情要注意。

1)randsearch.best_score_是测试数据相对于训练数据的平均得分,因此当您使用完整数据计算得分时将不匹配。

2)找到最佳参数组合(产生best_score_的参数组合)后,将对(拟合的)整个数据进行RandomizedSearchCV训练。因此,当您对相同数据评分时,预期会得到更高的结果。

3)当您指定scoring='average_precision'时,内部将其转换为以下内容:

average_precision_scorer = make_scorer(average_precision_score,
                                       needs_threshold=True)

此处的参数needs_thresholdTrue,这意味着计分员需要估算器输出predict_proba()decision_function()。因此,您的第二个输出best_estimator_avg_precision是不可比较的。

对于您的best_estimator_avg_precision_probs,请执行以下操作以检查它是否有所不同:-

best_estimator_avg_precision_probs = average_precision_score(y, 
                      randsearch.best_estimator_.predict_proba(X))

但是,由于第2点,得分将更高。