阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

机器学习笔记(四):逻辑回归的多分类

  • 2020-04-04
  • 本文字数:2357 字

    阅读完需:约 8 分钟

机器学习笔记(四):逻辑回归的多分类

一般情况下,我们都认为逻辑回归(LR)用来解决二分类问题,模型输出是 y=1 的概率值。那逻辑回归能否用来做多分类任务呢,答案是肯定的。


这里有两种方法使得逻辑回归能进行多分类任务:


一、将多分类任务拆解成多个二分类任务,利用逻辑回归分类器进行投票求解;


二、对传统的逻辑回归模型进行改造,使之变为 softmax 回归模型进行多分类任务求解

多分类任务拆解成多个二分类器

首先了解下进行多分类学习任务的策略,第一种策略是直接采用支持多分类的模型,例如 K 近邻分类器、决策树等,第二种策略则是利用多个二分类学习期来解决多分类问题。第一种策略中的多分类模型后面会逐一详细介绍,这里重点介绍下第二种策略。


第二种策略的基本思路是“拆解”,将多分类任务拆为多个二分类任务求解,一般有 3 种拆分策略:


(1)OvO(一对一,One vs One):假如数据 D 中有 N 个类别,将 N 个类别进行两两配对,产生 N(N-1)/2 个二分类器,在预测中,将测试样本输入这 N(N-1)/2 个二分类器中得到相应个数的预测结果,然后再将被预测结果数最多的(Voting)作为最终分类结果。


下图是一个简单的例子,数据集中有 4 种类别,两两配对可以产生 6 个二分类器,将测试样本输入分类器中可得到 6 个预测结果,通过投票取最多的预测结果类别 1 作为最后的预测结果。



2)OvR(一对其余,One vs Rest): 将一个类别作为正例,其余所有类别作为反例,这样 N 个类别可以产生 N 个二分类器,将测试样本输入这些二分类器中中得到 N 个预测结果,如果仅有一个分类器预测为正类,则将对应的预测结果作为最终预测结果。如果有多个分类器预测为正类,则选择置信度最大的类别作为最终分类结果。


下图所示,数据集中共 4 个类别,产生 4 个二分类器,类别 2 对应的分类器 2 预测结果为正例,则最终预测结果为类别 2。



(3)MvM(多对多,Many vs Many):将数据集中的若干个类作为正例,若干个其他类作为反例。MvM 的正、反类构造必须有特殊的设计,而不是随意选取,通常采用“纠错输出码(ECOC)”,产生编码矩阵后划分类别。


编码:将 N 个类做 M 次划分,每次划分一些是正类,一些是负类。共产生 M 个二分类器。


解码:M 个分类器对新样本测试,其结果组成一个编码,与各个类别的编码比较,返回距离最小的类别为最终结果。


编解码的详细过程可参考周志华的西瓜书。


了解了多分类任务拆分为多个二分类问题的算法原理后,利用 sklearn 的鸢尾花数据集验证一下,该数据集有 4 个特征属性,3 种分类{‘setosa’, ‘versicolor’, ‘virginica’},我利用 OvR 和 MvM 两种策略进行多分类的学习及预测:


Python 代码


from sklearn import datasetsfrom sklearn.cross_validation import train_test_splitfrom sklearn.multiclass import OneVsRestClassifierfrom sklearn.multiclass import OneVsOneClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score
data_iris = datasets.load_iris()x, y = data_iris.data, data_iris.targetx_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3,random_state = 0)
# 使用multiclass的OvO多分类策略,分类器使用LogisticRegressionmodel = OneVsOneClassifier(LogisticRegression(C=1.0, tol=1e-6))model.fit(x_train, y_train)y_pred = model.predict(x_test)print(accuracy_score(y_test, y_pred))============================================0.9555555555555556
# 使用multiclass的OvR多分类策略,分类器使用LogisticRegressionmodel = OneVsRestClassifier(LogisticRegression(C=1.0, tol=1e-6))model.fit(x_train, y_train)y_pred = model.predict(x_test)print(accuracy_score(y_test, y_pred))============================================0.8888888888888888
复制代码


从验证结果上来看,OvO 策略和 OvR 策略类似,在大多数情况分类效果差不多(小数据量和少类别的情况下可能 OvO 效果更好),OvO 训练的分类器数目比 OvR 多,所以 OvO 的存储开销和训练时间通常比 OvR 更大,但由于训练时,OvR 的每个分类器需要用到所有训练样例,而 OvO 的每个分类器只用到两个类别的样例,所以在大数据集和类别较多的情况下,OvO 的训练时间开销比 OvR 更小。

softmax 回归

softmax 回归其实是逻辑回归的一种变形,逻辑回归模型输出的是两种类别的概率,softmax 回归输出的 K 种类别的概率。模型公式如下:



参数θ是一个矩阵,矩阵的每一行可以看做是一个类别所对应分类器的参数,总共有 k 行,输出的 K 个数就表示该类别的概率,总和为 1。这样,softmax 回归模型对于一个测试样本,可以得到多个类别对应的概率值,模型选取概率最高的类别作为最终判定结果。


在 sklearn 中使用 softmax 回归还是调用 linear.model.LogisticRegression,设置一下 multi_class 参数即可,内部即会使用 softmax 函数计算出每个类别的概率。


Python 代码


# 采用softmax回归进行分类model = LogisticRegression(C=1.0, tol=1e-6, multi_class='multinomial', solver='newton-cg')model.fit(x_train, y_train)y_pred = model.predict(x_test)print(accuracy_score(y_test, y_pred))====================================0.9777777777777777
输出每个测试样例的类别预测概率print (model.predict_proba(x_test))
复制代码

多个二分类器策略和 softmax 回归的区别

softmax 回归中对一个测试样本得到的属于各类别的概率和一定为 1,而多个二分类器策略中,不管是 OvO、OvR 还是 MvM 策略,一个样本在多个二分类器上得到的概率和不一定为 1。因此当分类之间是互斥的情况下(e.g 数字手写识别、动物识别),通常采用 softmax 回归;而目标类别不是互斥时(e.g 华语音乐、流行音乐、重金属音乐等)则采用多个二分类器策略进行预测。


作者:华为云专家周捷


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-04-04 16:598036

评论

发布
暂无评论
发现更多内容

Struts 校验器(Validate)

表单校验 Struts2 9月月更

软件测试 | 测试开发 | 如何提取 IOS Document_apis

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 如何提取 IOS Runtime Headers

测吧(北京)科技有限公司

测试

MobSDK 客户端API

MobTech袤博科技

API an'droid

新书上市 | 连接组,向人类科学的最终前沿进军

图灵社区

神经网络 大脑 脑科学

企业级npm仓库搭建

龙之幽谷

前端 nexus NPM仓库

MobSDK 快速集成文档

MobTech袤博科技

Android Studio an'droid

软件测试 | 测试开发 | JVM内存溢出问题排查

测吧(北京)科技有限公司

测试

新书上市 | 连接组,向人类科学的最终前沿进军

图灵教育

神经网络 大脑 脑科学

JS基础——JS数据类型

龙之幽谷

前端 js

Eclipse Theia技术揭秘——脚手架源码分析

龙之幽谷

开发工具

软件测试 | 测试开发 | 浅谈Shiro框架在Spring Boot中的认证应用

测吧(北京)科技有限公司

测试

DophineSheduler上下游任务之间动态传参案例及易错点总结

Apache DolphinScheduler

大数据 DolphinScheduler 任务调度 大数据 开源 参数传递

软件测试 | 测试开发 | web自动化测试-执行 JavaScript 脚本

测吧(北京)科技有限公司

测试

VSCode技术揭秘(一)

龙之幽谷

vscode 开发工具

软件测试 | 测试开发 | 从几个开源项目浅谈IOS视频流输出方案

测吧(北京)科技有限公司

测试

刘奇:能否掌控复杂性,决定着分布式数据库的生死存亡

PingCAP

#TiDB

如何建设前端物料平台?

龙之幽谷

前端 组件化

Eclipse Theia技术揭秘——构建桌面IDE

龙之幽谷

开发工具

Eclipse Theia技术揭秘——自定义布局

龙之幽谷

开发工具

leetcode 572. Subtree of Another Tree 另一棵树的子树 (简单)

okokabcd

LeetCode 数据结构与算法

heco火币生态链智能合约dapp系统开发案例,合约部署

开发微hkkf5566

软件测试 | 测试开发 | Mysql 之执行计划

测吧(北京)科技有限公司

测试

开发者有话说 | 一位工作十余年工程师的成长之路

矜辰所致

个人成长 经历分享 9月月更 成长感悟

Eclipse Theia技术揭秘——初识Theia

龙之幽谷

开发工具

企业级前端组件建设

龙之幽谷

前端 组件库

软件测试 | 测试开发 | web 控件的交互进阶

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 网页 frame 与多窗口处理

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 了解磁盘IO的那些事

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 使用 ReportLab 绘制 PDF

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Windows-Python 应用:使用消息操作窗口

测吧(北京)科技有限公司

测试

机器学习笔记(四):逻辑回归的多分类_ArchSummit_华为云开发者联盟_InfoQ精选文章