我使用scikit-learn训练了一个ExtraTreesClassifier(gini索引),它非常适合我的需求。准确性不是很好,但使用10倍交叉验证,AUC为0.95。我想在我的工作中使用这个分类器。我是ML的新手,所以如果我问你一些概念错误的话,请原谅我。
我绘制了一些ROC曲线,通过它,似乎我有一个特定的阈值,我的分类器开始表现良好。我想在拟合的分类器上设置这个值,所以每次我调用预测时,分类器都会使用该阈值,我可以相信FP和TP的速率。
我也来到这篇文章(scikit .predict() default threshold),其中声明阈值不是分类器的通用概念。但由于ExtraTreesClassifier的方法是predict_proba,并且ROC曲线也与thresdholds定义有关,所以在我看来我应该可以指定它。
我没有找到任何参数,也没有找到任何类/接口来执行此操作。如何使用scikit-learn为训练有素的ExtraTreesClassifier(或任何其他人)设置阈值?
非常感谢, Colis
答案 0 :(得分:12)
这就是我所做的:
model = SomeSklearnModel()
model.fit(X_train, y_train)
predict = model.predict(X_test)
predict_probabilities = model.predict_proba(X_test)
fpr, tpr, _ = roc_curve(y_test, predict_probabilities)
然而,我很生气,预测会选择相当于0.4%真阳性的阈值(误报为零)。 ROC曲线显示了一个阈值,我更喜欢我的问题,其中真阳性约为20%(假阳性约为4%)。然后我扫描predict_probabilities以找出哪个概率值对应于我最喜欢的ROC点。在我的情况下,这个概率是0.21。然后我创建自己的预测数组:
predict_mine = np.where(rf_predict_probabilities > 0.21, 1, 0)
然后你去了:
confusion_matrix(y_test, predict_mine)
返回我想要的内容:
array([[6927, 309],
[ 621, 121]])
答案 1 :(得分:-1)
如果没有任何特定的代码示例,很难提供准确的答案。如果您已经进行了交叉验证,则可以考虑将AUC指定为要优化的参数:
shuffle = cross_validation.KFold(len(X_train), n_folds=10, shuffle=True)
scores = cross_val_score(classifier, X_train, y_train, cv=shuffle, scoring='roc_auc')