2020-06-11

利用广义线性模型实现的分类——Logistic回归

本文作者:王 歌
文字编辑:孙晓玲
技术总编:张 邯

利用广义线性模型实现线性回归以及它的正则化——岭回归和LASSO回归,它们解决的都是对连续数值进行预测的回归问题,其实我们还可以利用回归的思想来解决分类问题,这就是我们今天要介绍的Logistic回归。

一、算法原理

1.模型形式——利用Sigmoid函数

Logistic回归适用于数值型或标称型(目标变量的结果只在有限目标集中取值,而且只存在‘是’和‘否’两种不同的结果)数据,因此就需要将数值型的数据转化为类别值,如二分类问题,最终是对输出的值0或者1进行分类,这就需要引入函数来对输入的数据进行处理。在数学中,Heaviside阶跃函数(或称为单位阶跃函数)就具有这样的性质,即假设输入的值为x,则:


image

从上面的表达式我们可以看到阶跃函数在定义域上是不连续的,这不利于我们处理连续值并进行最优化,因此我们使用另一个数学性质更优越的函数——Sigmoid函数:

image

它也是一种阶跃函数,其不同坐标尺度下的函数图像如下图所示:

image

可以看到当x为0时,Sigmoid函数值为0.5。当x>0时,随着x的增大,对应的Sigmoid值将逼近于1;而随着x的减小,Sigmoid值将逼近于0。如果横坐标刻度足够大,如第二张坐标图所示,此时Sigmoid函数的形式就很接近单位阶跃函数的取值形式了。
因此,假设我们现在面临二分类任务,类标签值为0和1,那么按照线性回归的思想,我们能够得到模型

image

但此时我们得到的只是预测的数值而并非类标签,因此我们就要用到刚才介绍的Sigmoid函数,即Logistic模型的形式为

image

2.模型的优化
在得到上面的模型后,我们可以对其变形为

image

y和1-y可分别看作是y取1和0时的后验概率,所以我们也将Logistic回归称为对数几率回归(简称对率回归),因此我们可以进一步得到


image

image

所以对数似然函数为

image

这就是我们要进行优化的目标函数,一般我们会选择梯度下降法、牛顿法、拟牛顿法、梯度上升法等方法求解,具体的过程我们就不在这里介绍了,大家感兴趣可以自行查阅资料。

依据因变量类型,可分为二分类Logistic回归模型和多分类Logistic回归模型;根据多分类因变量是否有序,又可以分为多分类有序Logistic回归模型和多分类无序Logistic回归模型。在进行多分类时,相当于是多次Logistic回归,进行多次二分类,这就需要对数据集进行拆分,如OvR(“一对多”样本)、MvM(“多对多”样本)的方式。当然Logistic 回归模型可以直接推广到多类别分类,不必组合和训练多个二分类器,称为 Softmax 回归。

二、类参数介绍

我们这里使用的是sklearn. linear_model中的LogisticRegression()来实现Logistic算法。那么首先我们来看看这个类中的参数:
(1)solver确定逻辑回归损失函数的优化方法,'liblinear'使用坐标轴下降法来迭代优化损失函数。'lbfgs'是拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。'newton-cg'则是牛顿法的一种。'sag'为平均随机梯度下降算法。'saga'是sag的一类变体,它支持非平滑的L1正则选项penalty='l1'。'lbfgs', 'sag'和'newton-cg'求解器只支持L2罚项以及无罚项,对某些高维数据收敛更快。默认为'liblinear';
(2)penalty确定惩罚项,可为'l1' 或 'l2'。'newton-cg', 'sag', 'lbfgs'只支持'l2',即L2正则化;
(3)C表示正则化系数的倒数,取值必须为正浮点数,默认为1.0;
(4)multi_class用来选择分类方式,默认为' one-vs-rest'即OvR方式,表示对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。也可以设置为'multinomial'即MvM,此时若模型有K类,每次在所有的K类样本里面选择两类样本出来,把所有输出为这两类的样本进行二元Logistic回归得到模型参数,一共需要K(K-1)/2次分类;
(5)class_weight用来设定各类型样本的权重,默认为None,此时所有类型权重均为1,也可设为'balanced',此时按照输入样本的频率大小来调整权重;
(6)dual选择目标函数为原始形式还是对偶形式,转化为原函数的对偶函数时更易于优化,默认为False,对偶方法通常只用在正则化项为'liblinear'的L2惩罚项上;
(7)fit_intercept表示模型中是否含常数项,默认为True;
(8)intercept_scaling仅在正则化项为'liblinear'且fit_intercept设置为True时有用,默认为1;
(9)max_iter表示算法收敛的最大迭代次数,默认为100,仅在正则化优化算法为'newton-cg','sag'和'lbfgs'才有用;
(10)tol用来设置优化算法终止的条件,当迭代前后的函数差值小于等于tol时就停止,默认为0.0001;
(11)random_state设定随机数种子;
(12)verbose控制是否输出训练过程,默认为0表示不输出,取1时偶尔输出,大于1时对每个子模型都输出;
(13)warm_start表示是否使用上次训练结果作为初始化参数,默认为False;
(14)n_jobs表示用CPU的几个内核运行程序,默认为1,当为-1的时候表示用所有CPU的内核运行程序。

三、算法实例

我们这里使用的依然是鸢尾花的数据集,参数使用默认设置,程序如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, mean_squared_error, r2_score

iris_sample = load_iris()
x_train, x_test, y_train, y_test = train_test_split(
    iris_sample.data, iris_sample.target, test_size=0.25, random_state=123)
logclf = LogisticRegression()
logclf.fit(x_train, y_train)
print('系数为:', logclf.coef_)
print('截距为:', logclf.intercept_)
y_pre = logclf.predict(x_test)
print(y_test)     #输出测试集真实数据
print(y_pre)     #输出测试集预测结果
print('均方误差为:', mean_squared_error(y_test, y_pre))
print('r2为:', r2_score(y_test, y_pre))
print('测试集准确度为:', accuracy_score(y_test, y_pre))

结果如下:

image

可以看到准确度比较高。Logistic 回归作为被人们广泛使用的算法,具有高效且计算量小,又通俗易懂容易实现的优点,但同时也有容易欠拟合,分类精度可能不高的缺点。因此我们在选择方法时要注意自己数据的特点来选择合适的分类器。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354