草庐IT

python机器学习classification_report()函数 输出模型评估报告

侯小啾 2023-04-15 原文

classification_report()是python在机器学习中常用的输出模型评估报告的方法。

classification_report()函数介绍

classification_report()语法如下:

classification_report(
         y_true,
         y_pred,
         labels=None,
         target_names=None,
         sample_weight=None,
         digits=2,
         output_dict=False,
         zero_division=“warn”
)

参数描述
y_true真实值 ,一维数组形式(也可以是列表元组之类的)
y_pred预测值,一维数组形式(也可以是列表元组之类的)
labels标签索引列表,可选参数,数组形式
target_names与标签匹配的名称,可选参数,数组形式
sample_weight样本权重,数组形式
digits格式化输出浮点值的位数。默认为2。当“output_dict”为“True”时,这将被忽略,并且返回的值不会四舍五入。
output_dict是否输出字典。默认为False,如果为True则输出结果形式为字典。
zero_division设置存在零除法时返回的值。默认为warn。如果设置为“warn”,这相当于0,但也会引发警告。

使用示例

from sklearn.metrics import classification_report

# 测试集真实数据
y_test = [1, 2, 3, 1, 2, 3, 1, 2, 3]
# 预测结果
y_predicted = [1, 2, 3, 3, 2, 1, 3, 2, 3]

以这两行数据为例,不难直接看出,
预测中预测了

  • 2次1标签,成功1次,1标签预测的准确率率为0.5
  • 3次2标签,成功3次,2标签预测的准确率为1.0
  • 4次3标签,成功2次,3标签预测的准确率为0.5
print(classification_report(y_test, y_predicted))

也可以加上target_names参数,效果如下:

print(classification_report(y_test, y_predicted, target_names=['a类', 'b类', 'c类']))

如图左边显示出了新传入的标签名。


输出分析

由图可见,precisoin即准确率,也称查准率
recall是召回率 ,也称查全率
f1-score简称F1

对于其中一个标签预测结果进行评估,引入以下概念:

名称简写通俗描述
真正例TP预测结果是该标签,实际是该标签的样例个数
假正例FP预测结果是该标签,实际不是该标签的样例个数
假反例FN预测结果不是该标签,实际是该标签的样例个数
真反例TN预测结果不是该标签,实际不是该标签的样例个数

其中, 满足TP+FP+FN+TN=样例总数

查准率的定义公式为

P = T P T P + F P \displaystyle P = \frac{TP}{TP+FP} P=TP+FPTP

可以描述为 预测结果是该标签的样例中,实际是该标签的所占比。

查全率的定义公式为

P = T P T P + F N \displaystyle P = \frac{TP}{TP+FN} P=TP+FNTP

可以描述为 实际是该标签的样例中,预测结果是该标签的所占比。


以该例的标签’3’为例,
‘3’标签预测了4次,成功了2次,则查准率

P = T P T P + F P = 2 2 + 2 = 0.5 \displaystyle P = \frac{TP}{TP+FP} = \frac{2}{2+2}=0.5 P=TP+FPTP=2+22=0.5

所有标签一共预测了9次,其中3标签预测了4次,则其它标签预测了5次,这五次中有1次是3标签,即FN=1则查全率为:

P = T P T P + F N = 2 2 + 1 = 0.67 \displaystyle P =\frac{TP}{TP+FN}= \frac{2}{2+1}=0.67 P=TP+FNTP=2+12=0.67

查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往会偏低,查全率高时,查准率往往会偏低。通常只可能在一些简单任务中,才可能使查准率和查全率都很高。

此时结合名字,不难看出:查全率,是在衡量关于某标签的预测结果涵盖的是否“周全”,查全率高意味着,即某个标签预测得准确率不一定高,但是其真实值会大量存在于或者被包含于预测值中。


f1-score也称F1,

F 1 = 2 × P × R P + R = 2 × P × R 样 例 总 数 + T P − T N \displaystyle F1 =\frac{2×P×R}{P+R}= \frac{2×P×R}{样例总数+TP-TN} F1=P+R2×P×R=+TPTN2×P×R

F1是基于查准率查重率 的调和平均定义的:

1 F 1 = 1 2 ( 1 P + 1 R ) \displaystyle \frac{1}{F1} = \frac{1}{2}(\frac{1}{P}+\frac{1}{R}) F11=21(P1+R1)


accruracy 整体的准确率 即正确预测样本量与总样本量的比值。(不是针对某个标签的预测的正确率)

macro avg 即宏均值,可理解为普通的平均值。
macro-P 宏查准率
macro-R 宏查全率
macro-F1 宏F1

对应的概念还有 微均值 micro avg
以 micro-P 为例,不是直接对各个准确率求平均,而是求其构成元素TP、FP、TN、FN的平均值,分别记作   T P ˉ \displaystyle\ \bar{TP}  TPˉ   F P ˉ \displaystyle\ \bar{FP}  FPˉ   T N ˉ \displaystyle\ \bar{TN}  TNˉ   F N ˉ \displaystyle\ \bar{FN}  FNˉ。然后按照原公式计算出的即为micro-P。
公式经过等价转换,分子分母同时乘以标签个数,micro-P等价于所有类别中预测正确量与总样本量的比值。
micro-R 同理,即所有类别中预测正确的量占该标签实际数量的比例

有关python机器学习classification_report()函数 输出模型评估报告的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

随机推荐