Sklearn f-beta评分实施问题

时间:2018-05-25 16:43:35

标签: python machine-learning scikit-learn random-forest

在超参数优化之后我对随机森林分类器的性能有问题,显然我正在使用的得分手做了我想要它做的相反的事情。你能帮我搞清楚错误在哪里吗?这里有详细信息。

我正在使用scikit-learn make_scorer()函数来实现一个使用fbeta_score()并且beta = 0.5作为得分函数的得分手:

fO5_scorer = make_scorer(fbeta_score, beta=0.5)

我在10倍cross-validation程序中使用此记分器,使用randomized search在字典param_dist中定义的参数上查找随机森林分类器的最佳超参数( 'min_samples_leaf','min_samples_split','n_estimators'等):

RF_clf = RandomForestClassifier(n_jobs=-1)
cv = cross_validation.KFold(len(X_train), n_folds=10)
random_search_f05 = RandomizedSearchCV(RF_clf, param_distributions=param_dist, scoring=fO5_scorer, n_iter = 50, cv=cv)
tuned_RF = random_search_f05.fit(X_train,y_train)

然后我计算混淆矩阵以评估我的模型在测试集上的性能,因为我正在处理二进制分类问题,这是一个2x2矩阵:

[[ 1109   114]
[  557 13266]]

由于我的问题非常不平衡,therefore the accuracy is always very high我想使用precision and recall来评估我的模型,所以从混淆矩阵我可以计算出:

  • 模型精度:0.67
  • 型号召回:0.90

为了理解我的超参数优化是否改进了我的结果,我将这个随机森林的性能与另一个随机森林的性能进行了比较:

[[  826   397]
 [  154 13669]]
  • 具有非优化参数精度的模型:0.84
  • 具有非优化参数的模型召回:0.68

我可以看到,使用优化的超参数调用模型会增加其召回率并降低其精度。

问题在于,由于我使用f-0.5测量来定义得分手,所以我期待相反的行为!实际上,也是根据documentation

  

beta参数确定组合分数中的精确度。 beta< 1使得精确度更高,而β> 1。 1赞成召回(beta - > 0仅考虑精确度,beta - > inf仅召回)。

所以,因为我已经将我的beta设置为0.5,所以我应该提高精度。根据{{​​3}}:

,这似乎也是正确的
  

推导出F-measure,以便F-β“测量检索的有效性,对于那些重视β次的重要性的用户而言,恢复精度”

那为什么我会得到相反的结果呢?我是否以错误的方式定义了我的得分手?

编辑:

评估混淆矩阵和精度并召回我使用以下内容:

from sklearn.metrics import confusion_matrix
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score

然后对于带有“默认”参数的模型:

y_pred_def = RF_default.predict(X_test)
cm_def = confusion_matrix(y_true, y_pred_def,labels = [1,0])

和具有优化超参数的模型:

y_pred = tuned_RF.predict(X_test)
cm = confusion_matrix(y_true, y_pred,labels = [1,0])

0 个答案:

没有答案