我目前正在开发一个随机森林分类模型,该模型包含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 1
的5,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_true
和y_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]])
从你提供的信息中无法判断这是否是原因,这很好地提醒了你为什么应该始终提供你的实际代码,而不是口头描述你认为你的代码在做什么。。。