Scikit learn 为什么精确性和召回率的价值与代表性不足阶层的精确性和召回率几乎相同

Scikit learn 为什么精确性和召回率的价值与代表性不足阶层的精确性和召回率几乎相同,scikit-learn,precision,precision-recall,imbalanced-data,Scikit Learn,Precision,Precision Recall,Imbalanced Data,我有二元分类,其中一个类的大小几乎是另一个类的0.1 我正在使用sklearn创建一个模型并对其进行评估。我正在使用这两个功能: print(precision_recall_fscore_support(y_real,y_pred)) out: (array([0.99549296, 0.90222222]), # precision of the first class and the second class array([0.98770263, 0.96208531]), # re

我有二元分类,其中一个类的大小几乎是另一个类的0.1

我正在使用sklearn创建一个模型并对其进行评估。我正在使用这两个功能:

print(precision_recall_fscore_support(y_real,y_pred))

out: 
(array([0.99549296, 0.90222222]), # precision of the first class and the second class
 array([0.98770263, 0.96208531]), # recall of the first class and the second class
 array([0.99158249, 0.93119266]), # F1 score of the first class and the second class
 array([1789,  211]))             # instances of the first class and the second class
返回每个类的precison、recal、fscore和支持

print(precision_score(y_real,y_pred),recall_score(y_real,y_pred))

out:
0.90222222 , 0.96208531 # precsion and recall of the model
返回预测的精度和召回率


为什么precision和recall函数返回的类的值与实例较少的类完全相同(这里是具有211个实例的类)?

这可能是由于数据集不平衡造成的。您可以尝试从表示不足的类进行过采样,也可以从表示过度的类进行欠采样,具体取决于数据中的差异级别。我对不平衡的数据也有类似的问题,这篇文章帮助了我:


仔细查看这两个参数的文档,您将看到两个参数-
pos\u label
,默认值为
1
,和
average
,默认值为
'binary'

位置标签:str或int,默认为1

如果
average='binary'
且数据为二进制,则要报告的类

平均值:*字符串,[None,'binary'(默认值),'micro','macro','samples','weighted']*

'binary'

仅报告由
pos\u label
指定的类别的结果。这是 仅当目标(
y{true,pred}
)为二进制时适用

换句话说,正如文档中明确解释的那样,这两个函数分别只返回一个类的精度和召回率—用标签
1
指定的类

从你展示的情况来看,这门课似乎是你在这里所说的“第二课堂”,结果确实与你的报告一致

相比之下,
precision\u recall\u fscore\u支持
功能,根据(emphasis mine):

计算每个类别的精确度、召回率、F-度量值和支持度


换句话说,这里没有什么奇怪或意外的事情;并没有“整体”的精确性和召回率,而且它们总是按照每一类计算机的定义。实际上,在像这里这样的不平衡二进制设置中,它们通常只针对少数类进行计算。

可能是类别内的预测变量具有类似的方差。如果不了解更多关于数据集的信息,很难说。另一个解决方案可能是添加更多功能(预测变量)并重新训练模型。或者,如果您有很多功能,Scikit learn具有一些功能选择功能,可以帮助您确保为您的模型提供最有助于区分类别的功能。这是一个关于sklearn功能
精度评分
召回评分
返回什么的问题,与模型的过采样、欠采样、方差或再培训无关,无论是否具有附加功能。类的标签是什么,哪个是少数类的标签?0和1是类,1是少数类@desertnaut