RandomizedSearchCV 精度分数在随机森林中不匹配
RandomizedSearchCV precision score doesn't match in Random Forest
我正在尝试使用 RandomizedSearchCV
在 随机森林 上执行一些超参数优化。我将评分方式设置为平均精度。 rand_search.best_score_
大约是 0.38(我的数据集的合理结果),但是当我使用 rand_search.best_estimator_
计算相同的平均精度分数时,结果接近 1(见下文)。
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) randsearch.best_score_
是测试对训练数据的平均分数,因此当您使用完整数据计算分数时将不匹配。
2) RandomizedSearchCV 将在找到最佳参数组合(产生 best_score_
的参数组合)后对整个数据进行训练(拟合)。所以当你在相同的数据上打分时,预计会给出更高的结果。
3) 当您指定 scoring='average_precision'
时,它在内部转换为以下内容:
average_precision_scorer = make_scorer(average_precision_score,
needs_threshold=True)
这里的参数needs_threshold
是True
,这意味着计分器需要估计器输出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点,分数会更高。
我正在尝试使用 RandomizedSearchCV
在 随机森林 上执行一些超参数优化。我将评分方式设置为平均精度。 rand_search.best_score_
大约是 0.38(我的数据集的合理结果),但是当我使用 rand_search.best_estimator_
计算相同的平均精度分数时,结果接近 1(见下文)。
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) randsearch.best_score_
是测试对训练数据的平均分数,因此当您使用完整数据计算分数时将不匹配。
2) RandomizedSearchCV 将在找到最佳参数组合(产生 best_score_
的参数组合)后对整个数据进行训练(拟合)。所以当你在相同的数据上打分时,预计会给出更高的结果。
3) 当您指定 scoring='average_precision'
时,它在内部转换为以下内容:
average_precision_scorer = make_scorer(average_precision_score,
needs_threshold=True)
这里的参数needs_threshold
是True
,这意味着计分器需要估计器输出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点,分数会更高。