交叉验证中的准确性和混淆矩阵
Posted
技术标签:
【中文标题】交叉验证中的准确性和混淆矩阵【英文标题】:Accuracy and Confusion Matrix in Cross Validation 【发布时间】:2022-01-19 12:18:47 【问题描述】:我正在使用 scikitlearn 训练一个模型来解决二元分类问题,我希望进行 5 折交叉验证。
作为指标,我希望获得 5 折的平均准确率和混淆矩阵。
因此,使用cross_validate
我可以将多个指标传递给scoring
参数。
根据这个link,我可以def
一个在每个折叠处返回混淆矩阵的函数。在那段代码中,它使用X
通过.predict(X)
预测一些输出。但是不应该使用测试集x_test
来代替吗?而且由于在每一折中,从cross_validate
获得不同的测试集,我不明白我们如何将X
传递给confusion_matrix_scorer()
和.predict()
。另一个问题,clf = svm
在吗?
【问题讨论】:
【参考方案1】:Docs 声明一个可调用的记分员应该满足
可以用参数(estimator, X, y)调用,其中estimator是应该评估的模型,X是验证数据,y是X的ground truth target(在有监督的情况下)或None(在无人监督的情况下)。
当调用cross_validate 时,cv 折叠为first generated 并传递给独立的拟合过程。在这些过程中,测试数据集被传递给私有_score
方法。来自source code
test_scores = _score(estimator, X_test, y_test, scorer, error_score)
使用定义的参数(estimator, X, y)
source code调用输入scorrer
scores = scorer(estimator, X_test, y_test)
如果您想同时获得平均准确率和混淆矩阵,您可以通过dictionary返回这些分数
示例代码
from sklearn.metrics import accuracy_score, confusion_matrix
def confusion_matrix_scorer(clf, X, y):
y_pred = clf.predict(X)
cm = confusion_matrix(y, y_pred)
acc = accuracy_score(y, y_pred)
return
'acc': acc,
'tn': cm[0, 0],
'fp': cm[0, 1],
'fn': cm[1, 0],
'tp': cm[1, 1]
【讨论】:
你好,米格尔。我理解返回字典的那一部分,但我的问题是关于这里使用的变量X
。 X
不是整个输入数据吗?你不应该.predict()
只是X
的一小部分(测试集,让我们调用X_test
)吗?如果您从cross_validate
获取该变量,您如何将X_test
传递给confusion_matrix_scorer
?
输入 X
是您的测试数据,因为您根据测试数据评估模型性能。所以你将X_test
和y_test
传递给自定义记分器函数并返回一些指标值,cross_validate 只返回每个折叠的评估指标。
cross_validate 只是为训练和测试样本生成索引,在 _fit_and_score
内部进行了拆分。 Reference以上是关于交叉验证中的准确性和混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章