目录
回归问题与分类问题
在讲解Logistic回归的原理前,我们先看两类统计学中时常面临的问题:回归问题和分类问题。
在统计学中,变量常分为两种类型:定量变量与定性变量。
定量变量常常呈现数值性,即用数值(可以是连续的,也可以是离散的)来描述定量变量。比如:年龄、身高、收入都是定量变量,我们谈及18岁、身高183cm、月入15000元这些概念时,都能意识到这些概念可以用数值来量化,且这种量化方式是具有现实意义的。
另外一种变量类型为定性变量。一个定性变量是一个包含了相互区别元素的范畴,比如某人购买皮包的种类A、B、C,或疾病诊断结果E、F、G、H。在数据处理上我们可以将定性变量用数值编码,比如记皮包类型A、B、C为1、2、3,或疾病诊断结果为1、2、3、4,但这里的数字只是一种编码方式,对应于不同类别,却很难说有什么实际意义。(本质上不能用数量关系描述)因此我们说,通过编码方式使元素相互区分,但数值本身不具有(或者说很难被认为有)实际意义的变量,叫做定性变量。定性变量一定是离散的。
在基于预测变量对影响变量作出预测时,我们进行这样的分类:若一个问题的响应变量是定量变量,那么称这种问题为回归问题;若一个问题的响应变量是定性变量,那么称这种问题为分类问题。
回归问题的例子有:
(1)通过某地区税率、人均犯罪率、非住宅用地占比等一系列社会经济指标预测该地区房价;
(2)通过运动员战绩、职业生涯年限、所在联盟等信息推测其收入。
(3)通过职工受教育年限、以往业绩、所在部门等信息推断其年薪。
分类问题的例子有:
(1)临床上监测患者的生理指标,如血压、血氧饱和度、体温、心率等,判断患者健康状态。(好/不好,对应记为1和0,或再分多类)
(2)医生根据患者症状下诊断。中风记为1,服药过度为2,癫痫发作为3。
回归结果:信息-->年薪12万,12.5万,11.7万....
分类结果:信息-->患者健康(1),不健康(0)。
值得注意的是,回归问题和分类问题的界限并不绝对,比如下面要介绍的Logsitic回归既是分类模型,又可以看做对于概率的回归。
Logistic回归模型
Logistic回归(Logistic Regression)是一种分类模型,可用于解决分类问题,即根据自变量来预测定性变量的响应值。在这里,我们仅讨论二分类的Logistic回归模型,即将预测结果只有两种分类的Logistic回归。
引入Logistic回归而非线性回归进行分类,是因为线性回归并不适用于分类问题。线性回归中,我们虽然可以用哑变量0和1表示两种分类建立线性回归模型,但分类结果可能在[0,1]之外,难以解释。引入Logistic回归使预测结果始终落在[0,1]之间。具体原理如下:
Sigmoid函数
首先介绍Sigmoid函数。Sigmoid函数源于生物学中的S型生长曲线(种群数量随时间增长,初态增速缓慢,继而增长迅速,最终趋于稳定),在机器学习中运用广泛。Sigmoid函数表达式为:
Sigmoid函数图象
Sigmoid函数在实数集R上有定义且光滑、连续,下确界为0,上确界为1,同时具有良好的性质:光滑,且严格单调增。Sigmoid函数是Logistic回归用到的重要形式。
某数据点的分类概率
设预测变量为X,X可以是一元的也可以是多元的(向量化)。. Y为响应变量,两个取值为0和1。对于数据点,其属于1类的概率记为。
现在设是一个和x同维数的系数待定的向量,。是一个常数。
将作为一个整体带入Sigmoid函数中,令
将上式作为x被分到1类的概率。则x被分到0类的概率为1-p(x),即
很显然,两个分类概率都在[0,1]之间,是名副其实的概率。这是Sigmoid函数的有界性决定的。
参数估计
接下来,对和进行参数估计,选取二者适当的值让如下的似然函数最大:
这个似然函数中是各样本点被分到1的概率,而则是分类结果0或1.如果分类效果较好,则实际被分到1类的点被分到1类的概率应该尽可能大,同时实际被分到0类的点被分到0类的概率尽可能小。
从似然函数的形式上可以看出,让似然函数最大化,能较好地实现这一点。指数上取1的时候,底数(分类概率)尽可能大,则似然函数会尽可能大。对似然函数进行优化,得到的参数能达到较好的分类效果,这便是我们想要的分类模型。
似然函数是乘积的形式,不便利用优化算法求极大值。进行对数变换:
最大化原极大似然函数等价于最小化.用牛顿法、梯度下降法等优化算法可以实现。
设定阈值、分类
参数估计后被确定,我们得到了作为x被分到1类的概率。光有概率不够,我们要设定一个阈值,若p(x)大于该阈值,则分类为1;小于该阈值,则分类为0.一般来说我们设置阈值为0.5.
例如:是得到的模型
对应,被分类到1;
对应,被分类到0.
根据不同的数据集特征可以选择不同的阈值。以上即为二分类Logistic模型的基本原理。
Matlab代码
程序
%使用说明:1.改文件名2.数据集如果需要变形就变形,原数据集除最后一列外都是预测变量,最后一列是分类变量
clear;
load('data.mat')
%数据预处理,x为预测变量,y为响应变量,测试训练集8:2
%默认最后一列为分类,否则需要调整
[a,b]=size(data);
y=data(:,b);
x=data(:,1:b-1);
train=floor(a*0.8);
trainx=x(1:train,:);trainy=y(1:train,:);
testx=x(train+1:a,:);testy=y(train+1:a,:);
%逻辑回归
beta=fminsearch(@f,[zeros(1,b)])%系数
newx=[testx,ones(length(testx),1)];
predicty=(1+exp(-newx*beta')).^-1;
u1=predicty;u2=testy;
%分类
predicty=(predicty>0.5);testy=(testy>0.5);
%评价
TP=sum(and(testy==1,predicty==1))
FP=sum(and(testy==0,predicty==1))
TN=sum(and(testy==0,predicty==0))
FN=sum(and(testy==1,predicty==0))
Accuracy=(TP+TN)/(TP+FP+FN+TN)
Recall=TP/(TP+FN)
Precision=TP/(TP+FP)
rocx=[];rocy=[];
for j=1:999
n=j/1000;
py=(u1>n);
ty=(u2>n);
TP2=sum(and(ty==1,py==1));
FP2=sum(and(ty==0,py==1));
TN2=sum(and(ty==0,py==0));
FN2=sum(and(ty==1,py==0));
FPR=FP2/(FP2+TN2);
TPR=TP2/(TP2+FN2);
rocx=[rocx,FPR];
rocy=[rocy,TPR];
end
plot(rocx,rocy)
title('ROC curve')
AUC=-trapz(rocx,rocy)
function y=f(w)
%加载数据
load('data.mat')
[a,b]=size(data);
%数据预处理,x为预测变量,y为响应变量
x=data(:,1:b-1);
y=data(:,b);
train=floor(a*0.8);
trainx=x(1:train,:);trainy=y(1:train,:);
s=length(trainy);
sum=0;
for i=1:s%最小化损失函数
u=0;
for j=1:b-1
u=u-w(j)*x(i,j);
end
u=u-w(b);
p1=1/(1+exp(u));
sum=sum+trainy(i,1)*log(p1);
sum=sum+(1-trainy(i,1))*log(1-p1);
end
y=-sum/(100*s);
end
说明:
(1)原程序包括求解拟合参数(程序中为beta)、输出混淆矩阵值、绘制ROC曲线、计算AUC值的功能。
(2)原程序中导入的数据集名为data.mat,导入数据集需要将你自己的数据集命名为data。
(3)数据集默认的是最右侧一列为响应变量,其他列为预测变量。
示例
data是一个1250*7的数据集,1-6列为预测变量,7列为响应变量:
data数据集截图(部分)
调用程序,在训练集(80%)上训练模型,在测试集上测试效果,得到的结果如下:
测试结果