最近做了一个随机森林的多分类multiclass任务,要在sklearn中使用make_scorer自定义一个评价指标scoring,发现网上没有太多相关经验贴,走了很多弯路,最终还是在官方文档中找到了答案,在此记录一下。

这是sklearn.metrics.make_scorer的官方文档
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html

  1. 首先介绍一下我的数据集,这是一个4分类的任务。特征df和标签labels都是dataframe格式,其中labels没有做onehot编码,就是[1,2,3,4]这样的标签。

  2. 下面自定义scoring函数。我想将错误分类的样本比例error_rate作为交叉验证时的scoring,按照文档,我们导入所需要的包,然后定义我们的函数。函数的入参为 y_true 和 y_pred ,尝试后发现,由于labels定义为dataframe,所以y_true其实是 (n,1) 的矩阵,而y_pred是 (n,) 的一维向量,两个入参维度不同,所以很多计算会莫名其妙出错,这一点要注意。要不避开,要不将y_true转换成 (n,) 的。

也就是这个样子

y_true=np.array([[1],[2],[3],[4]])
y_pred=np.array([1,2,3,4])

了解这个小问题之后,我们开始写代码。为了避免上面提到的问题,我用了混淆矩阵计算错分类个数。

import pandas as pd
import numpy as np
from sklearn.metrics import make_scorer,confusion_matrix  # 自定义CV评估指标, 混淆矩阵def misclassified_error(y_true, y_pred):'''自定义错分类率为CV评估指标'''cm = confusion_matrix(y_true, y_pred, labels = [1,2,3,4])   # 打印混淆矩阵correct = np.trace(cm)                         # 混淆矩阵的迹是正确分类的个数error = (len(y_true)-correct)/len(y_true)      # 错分类率=错分类样本数/总样本数return error'''
通过make_scorer将函数变成sklearn认识的scoring,
greater_is_better指是否该指标越高代表模型效果越好,
needs_proba指自定义的函数中y_pred是否需要一个y_pred_proba这样的概率值
'''
error_rate = make_scorer(misclassified_error, greater_is_better=False)
  1. 看起来准备完善。然后我开始跑随机森林
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifierrandom_forest = RandomForestClassifier()RF_score = cross_val_score(random_forest, df, labels, scoring=error_rate, n_jobs=4)

竟然得出来是负值!为什么比例会是负值!
让我们回到原文档中找一下答案。


原来问题出在greater_is_better这个参数上。当它为False的时候,最终的得分会取你定义的值的相反数。

那么,我们在定义的时候加上一个负号可不可以呢?这样greater_is_better这个参数就要改为True,最后得到的还是负值。所以只需在跑出结果之后,取相反数就好了。

sklearn多分类任务自定义cv交叉验证scoring相关推荐

  1. 逻辑回归预测瘀血阻络证||LogRegression 二分类 python3|五折交叉验证

    要求 把数据集分为训练集和测试集使用逻辑回归训练.预测,得出相应的分类指标准确率accuracy,精确率precision,召回率recall,F1-score,并画出最终的ROC曲线,得出AUC值. ...

  2. k折交叉验证法python实现_Jason Brownlee专栏| 如何解决不平衡分类的k折交叉验证-不平衡分类系列教程(十)...

    作者:Jason Brownlee 编译:Florence Wong – AICUG 本文系AICUG翻译原创,如需转载请联系(微信号:834436689)以获得授权 在对不可见示例进行预测时,模型评 ...

  3. sklearn做交叉验证

    交叉验证是经常用到的验证方法 使用sklearn可以很大程度上简化交叉验证的过程 使用过程见下方: from sklearn import cross_validation gbdt=Gradient ...

  4. Sklearn——交叉验证(Cross Validation)

    文章目录 1.前言 2.非交叉验证实验 3.交叉验证实验 4.准确率与平方误差 4.1.准确率实验 4.2.均方误差实验 5.Learning curve 检查过拟合 5.1.加载必要模块 5.2.加 ...

  5. python机器学习库sklearn——交叉验证(K折、留一、留p、随机)

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 学习预测函数的参数,并在相 ...

  6. 【大数据专业】机器学习分类模型评估和优化之交叉验证的多种方法

    学习目标: 机器学习: 分类评估模型及优化之交叉验证 交叉验证的三种基本方法: 1.将拆分与评价合并执行 sklearn.model_selection.cross_val_score 2.同时使用多 ...

  7. 【Python学习】 - sklearn学习 - 交叉验证中的常用函数

    首先调入库:from sklearn.model_selection import train_test_split train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例 ...

  8. 使用sklearn的cross_val_score进行交叉验证

    在构建模型时,调参是极为重要的一个步骤,因为只有选择最佳的参数才能构建一个最优的模型.但是应该如何确定参数的值呢?所以这里记录一下选择参数的方法,以便后期复习以及分享. (除了贝叶斯优化等方法)其它简 ...

  9. python中sklearn实现交叉验证

    质量要比数量重要,就像一个本垒打胜过两个双打.--<蚂蚁金服> 1.概述 在实验数据分析中,有些算法需要用现有的数据构建模型,如卷积神经网络(CNN),这类算法称为监督学习(Supervi ...

最新文章

  1. Spring越来越强,而我们越来越快餐!离开了Spring,居然API都写不出来了!
  2. __name__ == '__main__'的作用
  3. android图片跳转动画效果,Android实现Activity界面切换添加动画特效的方法
  4. TEXT和_T,_TEXT
  5. 屏蔽朋友圈的第一天的感悟
  6. 为什么要两次调用encodeURI来解决乱码问题
  7. 【bzoj1726/Usaco2006 Nov】Roadblocks第二短路——SPFA
  8. 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
  9. php 合并数组成父子关系,php - 将电子表格解析为PHP数组并返回具有父子关系的嵌套MLM表 - SO中文参考 - www.soinside.com...
  10. VMware和NVIDIA推出新一代混合云架构
  11. mysql基础知识理解和sql题讲解分析面试实战(四)之函数讲解和字符串的操作...
  12. java实现word模板导出
  13. 职称英语职称计算机如何折算为学时,发表论文算继续教育多少学时
  14. 黑马JAVA P121 时间日期:Date、SimpleDateformat、Calendar
  15. 100%代码覆盖率的悲剧
  16. 阿里小蜜技术学习笔记--知识点整理
  17. Vscode的beautify插件使用
  18. 河南学业水平计算机,河南高中学业水平考试查询系统
  19. WPF 3D开发教程(四)
  20. PMP : PMP备考心得 (1)

热门文章

  1. 未转变者服务器3.26物品id,Unturned未转变者3.21版本物品ID代码汇总
  2. 2020中兴开发岗笔试题
  3. 为什么心跳包(HeartBeat)是必须的?
  4. LeetCode——11. 盛最多水的容器
  5. 数据库系统概论——绪论——1.1 数据库系统概述
  6. PS简单操作快捷键,上手快
  7. Linux运维基本功(肆)---Linux文件管理
  8. 使用 adb logcat 显示 Android 日志
  9. WinForm—控件TabIndex的作用和设置
  10. 【C++】Placement New