【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight

solver

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight_第1张图片

真不会,搁置了,回头会补一下矩阵求导,更深入的内容就以后吧

multi_class

OvO策略

拆分策略

OvO基本过程是将每个类别对应数据集单独拆分成一个子数据集,然后令其两两组合,再来进行模型训练。例如,对于四分类数据集,根据标签类别可将其拆分成四个数据集,然后再进行两两组合,总共有6种组合,也就是 C 4 2 C_{4}^{2} C42种组合。拆分过程如下所示:
【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight_第2张图片
然后在这6个新和成的数据集上,我们就能训练6个分类器。当然,如果是N分类问题,则需要训练 C N 2 = N ( N − 1 ) 2 C_{N}^{2}=\frac{N(N-1)}{2} CN2=2N(N1)个模型

集成策略

当模型训练完成之后,接下来面对新数据集的预测,可以使用投票法从6个分类器的判别结果中挑选最终判别结果。

在这里插入图片描述

OvR策略

拆分策略

OvR策略每次将一类的样例作为正例、其他所有数据作为反例来进行数据集拆分。对于上述四分类数据集,OvR策略最终会将其拆分为4个数据集,基本拆分过程如下:
【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight_第3张图片
此4个数据集就将训练4个分类器。注意,在OvR的划分策略种,是将rest无差别全都划分为负类。如果数据集总共有N个类别,则在进行数据集划分时总共将拆分成N个数据集。

集成策略

OvR对于新数据的预测,如果仅有一个分类器将其预测为正例,则新数据集属于该类。若有多个分类器将其预测为正例,则根据分类器本身准确率来进行判断,选取准确率更高的那个分类器的判别结果作为新数据的预测结果。

OvO和OvR的比较

对于这两种策略来说,尽管OvO需要训练更多的基础分类器,但由于OvO中的每个切分出来的数据集都更小,因此基础分类器训练时间也将更短。因此,综合来看在训练时间开销上,OvO往往要小于OvR。而在性能方面,大多数情况下二者性能类似。

MvM策略

MvM要求同时将若干类化为正类、其他类化为负类,并且要求多次划分,再进行集成。

拆分策略

此时对于上述4分类数据集,拆分过程就会变得更加复杂,我们可以任选其中一类作为正类、其余作为负类,也可以任选其中两类作为正类、其余作为负数,以此类推。由此则诞生出了非常多种子数据集,对应也将训练非常多个基础分类器。

将某一类视作正类和将其余三类视作正类的预测结果相同,对调下预测结果即可,此处不用重复划分。

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight_第4张图片
根据上述划分方式,总共将划分 C 4 1 + C 4 2 = 10 C_{4}^{1}+C_{4}^{2}=10 C41+C42=10个数据集,对应构建,对应的我们可以构建10个分类器。

集成策略

接下来我们进行模型集成。如果是以图片中出现的方式划分四个数据集,我们可以将每次划分过程中正例或负例的标签所组成的数组视为每一条数据自己的编码。
同时,我们使用训练好的四个基础分类器对新数据进行预测,也将产生四个结果,而这四个结果也可构成一个四位的新数据的编码。接下来,我们可以计算新数据的编码和上述不同类别编码之间的距离,从而判断新生成数据应该属于哪一类。
【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元回归与多元回归:重要参数solver & multi_class & class_weight_第5张图片

链接:多分类学习(OvO、OVR、MVM 原理区别)_cy^2的博客-CSDN博客_多分类学习

在sklearn中的参数multi_class可以选择分类方式
输入"ovr", “multinomial”, “auto"来告知模型,我们要处理的分类问题的类型。默认是"ovr”。
‘ovr’:表示分类问题是二分类,或让模型使用"一对多"的形式来处理多分类问题。
‘multinomial’:表示处理多分类问题,这种输入在参数solver是’liblinear’时不可用。
“auto”:表示会根据数据的分类情况和其他参数来确定模型要处理的分类问题的类型。比如说,如果数据是二分类,或者solver的取值为"liblinear",“auto"会默认选择"ovr”。反之,则会选择"multinomial"。

来看看鸢尾花数据集上,multinomial和ovr的区别怎么样:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression as LR

iris = load_iris() # 标签是0,1,2为多分类问题

for multi_class in ('multinomial','ovr'):
    clf = LR(solver='sag',max_iter=100,random_state=42,multi_class=multi_class).fit(iris.data,iris.target)
    print("training score : %.3f (%s)"% (clf.score(iris.data,iris.target),multi_class))
---
training score : 0.987 (multinomial)
training score : 0.960 (ovr)

OvR相对简单,但大部分情况下分类效果相对略差,MvM分类相对精确,但是分类速度没有OvR快。

链接:机器学习笔记(逻辑回归) - 知乎 (zhihu.com)

样本不平衡与参数class_weight

使用参数class_weight对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重,即自动1:1。当误分类的代价很高的时候,我们使用”balanced“模式,我们只是希望对标签进行均衡的时候,什么都不填就可以解决样本不均衡问题。
但是,sklearn当中的参数class_weight变幻莫测,我们很难去找出这个参数引导的模型趋势,或者画出学习曲线来评估参数的效果,因此可以说是非常难用。
我们有着处理样本不均衡的各种方法,其中主流的是采样法,是通过重复样本的方式来平衡标签,可以进行上采样(增加少数类的样本),比如SMOTE,或者下采样(减少多数类的样本)。对于逻辑回归来说,上采样是最好的办法。在案例中,会给大家详细来讲如何在逻辑回归中使用上采样。

你可能感兴趣的:(菜菜的sklearn课堂,sklearn,逻辑回归,回归,python)