在超参数优化之后我对随机森林分类器的性能有问题,显然我正在使用的得分手做了我想要它做的相反的事情。你能帮我搞清楚错误在哪里吗?这里有详细信息。
我正在使用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来评估我的模型,所以从混淆矩阵我可以计算出:
为了理解我的超参数优化是否改进了我的结果,我将这个随机森林的性能与另一个随机森林的性能进行了比较:
[[ 826 397]
[ 154 13669]]
我可以看到,使用优化的超参数调用模型会增加其召回率并降低其精度。
问题在于,由于我使用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])