(转载)人工智能入门-逻辑回归

128次阅读

一. 逻辑回归

在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的模型描述是因变量的期望与自变量之间的线性关系。比如常见的线性回归模型:

而在采用回归模型分析实际问题中,所研究的变量往往不全是区间变量而是顺序变量或属性变量,比如二项分布问题。通过分析年龄、性别、体质指数、平均血压、疾病指数等指标,判断一个人是否换糖尿病,Y= 0 表示未患病,Y= 1 表示患病,这里的响应变量是一个两点(0-1)分布变量,它就不能用 h 函数连续的值来预测因变量 Y(只能取 0 或 1)。
总之,线性回归模型通常是处理因变量是连续变量的问题,如果因变量是定性变量,线性回归模型就不再适用了,需采用逻辑回归模型解决。

逻辑回归(Logistic Regression是用于处理因变量为分类变量的回归问题,常见的是二分类或二项分布问题,也可以处理多分类问题,它实际上是属于一种分类方法。
二分类问题的概率与自变量之间的关系图形往往是一个 S 型曲线,如图所示,采用的 Sigmoid 函数实现。

这里我们将该函数定义如下:

函数的定义域为全体实数,值域在 [0,1] 之间,x 轴在 0 点对应的结果为 0.5。当 x 取值足够大的时候,可以看成 0 或 1 两类问题,大于 0.5 可以认为是 1 类问题,反之是 0 类问题,而刚好是 0.5,则可以划分至 0 类或 1 类。对于 0 - 1 型变量,y= 1 的概率分布公式定义如下:

y= 0 的概率分布公式定义如下:

其离散型随机变量期望值公式如下:

采用线性模型进行分析,其公式变换如下:

而实际应用中,概率 p 与因变量往往是非线性的,为了解决该类问题,我们引入了 logit 变换,使得 logit(p)与自变量之
间存在线性相关的关系,逻辑回归模型定义如下:

通过推导,概率 p 变换如下,这与 Sigmoid 函数相符,也体现了概率 p 与因变量之间的非线性关系。以 0.5 为界限,预

测 p 大于 0.5 时,我们判断此时 y 更可能为 1,否则 y 为 0。

得到所需的 Sigmoid 函数后,接下来只需要和前面的线性回归一样,拟合出该式中 n 个参数 θ 即可。test17_05.py 为绘

制 Sigmoid 曲线,输出上图所示。

  1. import matplotlib.pyplot as plt

  2. import numpy as np

  3. def Sigmoid(x):

  4. return 1.0 / (1.0 + np.exp(-x))

  5. x= np.arange(-10, 10, 0.1)

  6. h = Sigmoid(x)

  7. plt.plot(x, h)

  8. plt.axvline(0.0, color='k')

  9. plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')

  10. plt.axhline(y=0.5, ls='dotted', color='k')

  11. plt.yticks([0.0, 0.5, 1.0])

  12. plt.ylim(-0.1, 1.1)

  13. plt.show()


二. LogisticRegression 回归算法



LogisticRegression 回归模型在 Sklearn.linear_model 子类下,调用 sklearn 逻辑回归算法步骤比较简单,即:


(1) 导入模型。调用逻辑回归 LogisticRegression()函数。


(2) fit()训练。调用 fit(x,y)的方法来训练模型,其中 x 为数据的属性,y 为所属类型。


(3) predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。


代码如下:

  1. from sklearn.linear_model import LogisticRegression

  2. clf = LogisticRegression()

  3. print clf

  4. clf.fit(train_feature,label)

  5. predict['label'] = clf.predict(predict_feature)


输出结果如下:

  1. LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,

  2. intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,

  3. penalty='l2', random_state=None, solver='liblinear', tol=0.0001,

  4. verbose=0, warm_start=False)



其中,参数 penalty 表示惩罚项(L1、L2 值可选。L1 向量中各元素绝对值的和,作用是产生少量的特征,而其他特征


都是 0,常用于特征选择;L2 向量中各个元素平方之和再开根号,作用是选择较多的特征,使他们都趋近于 0。);C


值的目标函数约束条件:s.t.||w||1<C,默认值是 0,C 值越小,则正则化强度越大。


2. 正则化选择参数:penalty

LogisticRegression 和 LogisticRegressionCV 默认就带了正则化项。penalty 参数可选择的值为 "l1" 和 "l2". 分别对应 L1 的正则化和 L2 的正则化,默认是 L2 的正则化。

在调参时如果我们主要的目的只是为了解决过拟合,一般 penalty 选择 L2 正则化就够了。但是如果选择 L2 正则化发现还是过拟合,即预测效果差的时候,就可以考虑 L1 正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用 L1 正则化。

penalty 参数的选择会影响我们损失函数优化算法的选择。即参数 solver 的选择,如果是 L2 正则化,那么 4 种可选的算法 {‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’} 都可以选择。但是如果 penalty 是 L1 正则化的话,就只能选择‘liblinear’了。这是因为 L1 正则化的损失函数不是连续可导的,而 {‘newton-cg’,‘lbfgs’,‘sag’} 这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。

3. 优化算法选择参数:solver

solver 参数决定了我们对逻辑回归损失函数的优化方法,有 4 种算法可以选择,分别是:

a) liblinear:使用了开源的 liblinear 库实现,内部使用了坐标轴下降法来迭代优化损失函数。

b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG 是一种线性收敛算法,这个速度远比 SGD 快。关于 SAG 的理解,参考博文线性收敛的随机优化算法之 SAG、SVRG(随机梯度下降)

从上面的描述可以看出,newton-cg, lbfgs 和 sag 这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的 L1 正则化,只能用于 L2 正则化。而 liblinear 通吃 L1 正则化和 L2 正则化。

同时,sag 每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于 10 万,sag 是第一选择。但是 sag 不能用于 L1 正则化,所以当你有大量的样本,又需要 L1 正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到 L2 正则化。

在 sklearn 的官方文档中,对于 solver 的使用说明如下:

In a nutshell, one may choose the solver with the following rules:

CaseSolverSmall dataset or L1 penalty“liblinear”Multinomial loss or large dataset“lbfgs”,“sag”or“newton-cg”Very Large dataset“sag”


从上面的描述,大家可能觉得,既然 newton-cg, lbfgs 和 sag 这么多限制,如果不是大样本,我们选择 liblinear 不就行了嘛!错,因为 liblinear 也有自己的弱点!我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有 one-vs-rest(OvR)和 many-vs-many(MvM)两种。而 MvM 一般比 OvR 分类相对准确一些。郁闷的是 liblinear 只支持 OvR,不支持 MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择 liblinear 了。也意味着如果我们需要相对精确的多元逻辑回归不能使用 L1 正则化了。

总结而言,liblinear 支持 L1 和 L2,只支持 OvR 做多分类,“lbfgs”,“sag”“newton-cg”只支持 L2,支持 OvR 和 MvM 做多分类。

具体 OvR 和 MvM 有什么不同我们下一节讲。

4. 分类方式选择参数:multi_class

multi_class 参数决定了我们分类方式的选择,有 ovr 和 multinomial 两个值可以选择,默认是 ovr。

ovr 即前面提到的 one-vs-rest(OvR),而 multinomial 即前面提到的 many-vs-many(MvM)。如果是二元逻辑回归,ovr 和 multinomial 并没有任何区别,区别主要在多元逻辑回归上。

OvR 的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第 K 类的分类决策,我们把所有第 K 类的样本作为正例,除了第 K 类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第 K 类的分类模型。其他类的分类模型获得以此类推。

而 MvM 则相对复杂,这里举 MvM 的特例 one-vs-one(OvO)作讲解。如果模型有 T 类,我们每次在所有的 T 类样本里面选择两类样本出来,不妨记为 T1 类和 T2 类,把所有的输出为 T1 和 T2 的样本放在一起,把 T1 作为正例,T2 作为负例,进行二元逻辑回归,得到模型参数。我们一共需要 T(T-1)/ 2 次分类。

从上面的描述可以看出 OvR 相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下 OvR 可能更好)。而 MvM 分类相对精确,但是分类速度没有 OvR 快。

如果选择了 ovr,则 4 种损失函数的优化方法 liblinear,newton-cg, lbfgs 和 sag 都可以选择。但是如果选择了 multinomial, 则只能选择 newton-cg, lbfgs 和 sag 了。

5. 类型权重参数:class_weight

class_weight 参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择 balanced 让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于 0,1 的二元模型,我们可以定义 class_weight={0:0.9, 1:0.1},这样类型 0 的权重为 90%,而类型 1 的权重为 10%。

如果 class_weight 选择 balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。

sklearn 的官方文档中,当 class_weight 为 balanced 时,类权重计算方法如下:

n_samples / (n_classes * np.bincount(y)),n_samples 为样本数,n_classes 为类别数量,np.bincount(y)会输出每个类的样本数,例如 y =[1,0,0,1,1], 则 np.bincount(y)=[2,3]

那么 class_weight 有什么作用呢?在分类模型中,我们经常会遇到两类问题:

第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。

第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据 10000 条,里面合法用户有 9995 条,非法用户只有 5 条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有 99.95%,但是却没有任何意义。这时,我们可以选择 balanced,让类库自动提高非法用户样本的权重。

提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。

当然,对于第二种样本失衡的情况,我们还可以考虑用下一节讲到的样本权重参数:sample_weight,而不使用 class_weight。sample_weight 在下一节讲。

6. 样本权重参数:sample_weight

上一节我们提到了样本不失衡的问题,由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在 class_weight 使用 balanced。第二种是在调用 fit 函数时,通过 sample_weight 来自己调节每个样本权重。

在 scikit-learn 做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是 class_weight*sample_weight.

以上就是 scikit-learn 中逻辑回归类库调参的一个小结,还有些参数比如正则化参数 C(交叉验证就是 Cs),迭代次数 max_iter 等,由于和其它的算法类库并没有特别不同,这里不多累述了。

人工智能教程:
https://www.captainbed.net/york142857


原文链接:https://www.bilibili.com/read/cv3253417/

正文完
 
不知道
版权声明:本站原创文章,由 不知道 2023-09-05发表,共计5648字。
转载说明:声明:本站内容均来自互联网,归原创作者所有,如有侵权必删除。 本站文章皆由CC-4.0协议发布,如无来源则为原创,转载请注明出处。