随机森林中的class_weight超参数改变了混淆矩阵中的样本数量



我目前正在开发一个随机森林分类模型,该模型包含24000个样本,其中20000个属于class 0,4000个属于class 1。我做了一个train_test_split,其中testronget是整个数据集的0.2(test_set中大约有4800个样本)。由于我处理的是不平衡数据,所以我研究了旨在解决这个问题的超参数class_weight

我在设置class_weight='balanced'时面临的问题,看看训练集的confusion_matrix,我得到了这样的东西:

array([[13209, 747], [ 2776, 2468]])

正如您所看到的,下面的数组对应于False Negative = 2776,然后是True Positive = 2468,而上面的数组对应着True Negative = 13209,之后是False Positive = 747。问题是根据confusion_matrix属于class 1的样本量是2,776 (False Negative) + 2,468 (True Positive),其总和为属于class 15,244 samples。这没有任何意义,因为整个数据集只包含4000个属于class 1的样本,其中只有3200个样本在train_set中。看起来confusion_matrix返回了矩阵的Transposed版本,因为training_set中属于class 1的样本的实际数量应总计为train_set中的3200个样本和test_set中的800个样本。通常,正确的数字应该是747+2468,总计3215,这是属于class 1的正确样本量。有人能解释一下我使用class_weight时会发生什么吗?confusion_matrix返回矩阵的transposed版本是真的吗?我是不是看错了?我试着寻找答案,并访问了几个在某种程度上相似的问题,但没有一个真正涵盖这个问题。

这些是我看过的一些来源:

scikit学习:随机林class_weight和sample_weight参数

如何使用Scikit Learn在随机森林中调整参数?

https://datascience.stackexchange.com/questions/11564/how-does-class-weights-work-in-randomforestclassifier

https://stats.stackexchange.com/questions/244630/difference-between-sample-weight-and-class-weight-randomforest-classifier

用RandomForest分类器在不平衡数据集中使用sample_weight和class_weight

任何帮助都将不胜感激,谢谢。

从文档中再现玩具示例:

from sklearn.metrics import confusion_matrix
y_true = [0, 1, 0, 1]
y_pred = [1, 1, 1, 0]
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
(tn, fp, fn, tp)
# (0, 2, 1, 1)

因此,您提供的混淆矩阵的读数似乎是正确的。

confusion\ymatrix是否真的返回了的转置版本矩阵?

正如上面的例子所示,没有。但一个非常容易(看起来很无辜)的错误可能是,您交换了y_truey_pred参数的顺序,这确实很重要;结果将是一个转置矩阵:

# correct order of arguments:
confusion_matrix(y_true, y_pred)
# array([[0, 2],
#        [1, 1]])
# inverted (wrong) order of the arguments:
confusion_matrix(y_pred, y_true)
# array([[0, 1],
#        [2, 1]])

从你提供的信息中无法判断这是否是原因,这很好地提醒了你为什么应该始终提供你的实际代码,而不是口头描述你认为你的代码在做什么。。。

相关内容

  • 没有找到相关文章

最新更新