在超参数优化之后我对随机森林分类器的性能有问题,显然我正在使用的得分手与我希望它做的相反 . 你能帮我搞清楚错误在哪里吗?这里的细节 .

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

fO5_scorer = make_scorer(fbeta_score, beta=0.5)

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

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]]

由于我的问题非常不 balancer ,并且我想使用precision and recall评估我的模型,所以从混淆矩阵我可以计算:

  • 模型精度:0.67

  • 型号召回:0.90

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

[[  826   397]
 [  154 13669]]

具有非优化参数精度的

  • 模型:0.84
    具有非优化参数的
  • 型号召回:0.68

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

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

beta参数确定组合分数中的精度权重 . beta <1给精确度带来更多的权重,而beta> 1有利于召回(beta - > 0仅考虑精确度,beta - > inf仅召回) .

所以,因为我已经将我的beta设置为0.5,所以我应该提高精度 . 根据wikipedia definition,这似乎也是正确的:

推导出F-度量,以便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])