Logistic回归原理及Matlab代码

本文介绍了回归问题与分类问题的区别,重点阐述了Logistic回归模型,包括Sigmoid函数在概率估计中的作用,参数估计方法,以及如何设定阈值进行分类。通过Matlab代码示例展示了如何使用Logistic回归进行二分类,并计算性能指标如ROC曲线和AUC值。
摘要由CSDN通过智能技术生成

目录

回归问题与分类问题

Logistic回归模型

Sigmoid函数

某数据点的分类概率

参数估计

设定阈值、分类

Matlab代码

程序

示例


回归问题与分类问题

在讲解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(x)=\frac{1}{1+e^{-x}}

Sigmoid函数图象

Sigmoid函数在实数集R上有定义且光滑、连续,下确界为0,上确界为1,同时具有良好的性质:光滑,且严格单调增。Sigmoid函数是Logistic回归用到的重要形式。

某数据点的分类概率

设预测变量为X,X可以是一元的也可以是多元的(向量化)。x=({x}_1,{x}_2,...,{x}_n).  Y为响应变量,两个取值为0和1。对于数据点x,其属于1类的概率记为p(x)=probabilty(y=1|x)

现在设w是一个和x同维数的系数待定的向量,w=({w}_1,{w}_2,...,{w}_n)b是一个常数。

w^{T}x+b作为一个整体带入Sigmoid函数中,令

                                                       p(x)=\frac{1}{1+e^{-(w^{T}x+b)}}

将上式作为x被分到1类的概率。则x被分到0类的概率为1-p(x),即

                                                          1-p(x)=\frac{e^{-(w^{T}x+b)}}{1+e^{-(w^{T}x+b)}}

很显然,两个分类概率都在[0,1]之间,是名副其实的概率。这是Sigmoid函数的有界性决定的。

参数估计

接下来,对wb进行参数估计,选取二者适当的值让如下的似然函数最大:

                                  l(w,b)=\prod p({x}_i)^{y_i}(1-p({x}_i))^{1-y_i}

这个似然函数中p(x_i)是各样本点被分到1的概率,而y_i则是分类结果0或1.如果分类效果较好,则实际被分到1类的点被分到1类的概率应该尽可能大,同时实际被分到0类的点被分到0类的概率尽可能小。

从似然函数的形式上可以看出,让似然函数最大化,能较好地实现这一点。指数上取1的时候,底数(分类概率)尽可能大,则似然函数会尽可能大。对似然函数进行优化,得到的参数w,b能达到较好的分类效果,这便是我们想要的分类模型。

似然函数是乘积的形式,不便利用优化算法求极大值。进行对数变换:

                        ln(w,b)=\sum[y_iln(p(x_i))+(1-y_i)ln(1-p(x_i))]

                    =\sum [y_iln(\frac{1}{1+e^{-(w^{T}x+b)}})+(1-y_i)ln(\frac{e^{-(w^{T}x+b)}}{1+e^{-(w^{T}x+b)}})]

                    =-\sum ln({1+e^{-(w^{T}x+b)}})+(y_i-1)(w^{T}x+b)

最大化原极大似然函数等价于最小化-ln(w,b).用牛顿法、梯度下降法等优化算法可以实现。

设定阈值、分类

参数估计后w,b被确定,我们得到了p(x)=\frac{1}{1+e^{-(w^{T}x+b)}}作为x被分到1类的概率。光有概率不够,我们要设定一个阈值,若p(x)大于该阈值,则分类为1;小于该阈值,则分类为0.一般来说我们设置阈值为0.5.

例如:p(x)=\frac{1}{1+e^{-2x_1+1.5x_2-0.3}}是得到的模型

x=(5,6)对应p(x)=\frac{1}{1+e^{-2*5+1.5*6-0.3}}=\frac{1}{1+e^{-1.3}}\approx 0.786,被分类到1;

x=(0,1)对应p(x)=\frac{1}{1+e^{-2*0+1.5*1-0.3}}=\frac{1}{1+e^{1.2}}\approx 0.231,被分类到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%)上训练模型,在测试集上测试效果,得到的结果如下:

测试结果

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值