logistic回归报错问题:Warning messages: 1: glm.fit:算法没有聚合 2: glm.fit:拟合機率算出来是数值零或一

原创 2016年07月26日 10:40:48

logistic回归的时候报错问题包括下面两种

Warning: glm.fit: algorithm did not converge

Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred 

Warning messages:

1: glm.fit:算法没有聚合 

2: glm.fit:拟合機率算出来是数值零或一 

做logistic回归的时候这个问题比较常见,下面来举例,为什么会出现这些问题。

首先是glm函数介绍:

glm(formula, family=family.generator, data,control = list(...))

family:每一种响应分布(指数分布族)允许各种关联函数将均值和线性预测器关联起来。

 常用的family:

binomal(link='logit')         ----响应变量服从二项分布,连接函数为logit,即logistic回归

binomal(link='probit')       ----响应变量服从二项分布,连接函数为probit

poisson(link='identity')     ----响应变量服从泊松分布,即泊松回归

 

control:控制算法误差和最大迭代次数

glm.control(epsilon = 1e-8, maxit = 25, trace = FALSE)  

     -----maxit:算法最大迭代次数,改变最大迭代次数:control=list(maxit=100)

 glm函数使用:

library("ggplot2")
data<-iris[1:100,]
samp<-sample(100,80)
names(data)<-c('sl','sw','pl','pw','species')
testdata<-data[samp,]
traindata<-data[-samp,]
lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(lgst)
## 
## Call:
## glm(formula = testdata$species ~ pl, family = binomial(link = "logit"), 
##     data = testdata)
## 
## Deviance Residuals: 
##        Min          1Q      Median          3Q         Max  
## -2.202e-05  -2.100e-08  -2.100e-08   2.100e-08   3.233e-05  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -97.30   87955.20  -0.001    0.999
## pl             39.56   34756.04   0.001    0.999
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.1045e+02  on 79  degrees of freedom
## Residual deviance: 2.0152e-09  on 78  degrees of freedom
## AIC: 4
## 
## Number of Fisher Scoring iterations: 25

 

注意在使用glm函数就行logistic回归时,出现警告:

Warning messages:
1: glm.fit:算法没有聚合 
2: glm.fit:拟合機率算出来是数值零或一

同时也可以发现两个系数的P值都为0.999,说明回归系数不显著。

第一个警告:算法不收敛。
     由于在进行logistic回归时,依照极大似然估计原则进行迭代求解回归系数,glm函数默认的最大迭代次数 maxit=25,当数据不太好时,经过25次迭代可能算法 还不收敛,所以可以通过增大迭代次数尝试解决算法不收敛的问题。但是当增大迭代次数后算法仍然不收敛,此时数据就是真的不好了,需要对数据进行奇异值检验等进一步的处理。

lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata,control=list(maxit=100))
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(lgst)
## 
## Call:
## glm(formula = testdata$species ~ pl, family = binomial(link = "logit"), 
##     data = testdata, control = list(maxit = 100))
## 
## Deviance Residuals: 
##        Min          1Q      Median          3Q         Max  
## -8.134e-06  -2.110e-08  -2.110e-08   2.110e-08   1.204e-05  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -106.14  237658.98       0        1
## pl              43.16   93735.01       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.1070e+02  on 79  degrees of freedom
## Residual deviance: 2.7741e-10  on 78  degrees of freedom
## AIC: 4
## 
## Number of Fisher Scoring iterations: 27

如上,通过增加迭代次数,解决了第一个警告,此时算法收敛。

但是第二个警告仍然存在,且回归系数P=1,仍然不显著。

 

第二个警告:拟合概率算出来的概率为0或1

首先,这个警告是什么意思?
我们先来看看训练样本的logist回归结果,拟合出的每个样本属于'setosa'类的概率为多少?

 

lgst<-glm(testdata$species~pl,binomial(link='logit'),data=testdata,control=list(maxit=100))
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
p<-predict(lgst,type='response')
qplot(seq(-2,2,length=80),sort(p),col='predict')


可以看出训练样本为'setosa'类的概率不是几乎为0,就是几乎为1,并不是我们预想中的logistic模型的S型曲线,这就是第二个警告的意思。

 

  那么问题来了,为什么会出现这种情况?
 (以下内容只是本人参考一些解释的个人理解)

  这种情况的出现可以理解为一种过拟合,由于数据的原因,在回归系数的优化搜索过程中,使得分类的种类属于某一种类(y=1)的线性拟合值趋于大,分类种类为另一   类(y=0)的线性拟合值趋于小。

由于在求解回归系数时,使用的是极大似然估计的原理,即回归系数在搜索过程中使得似然函数极大化:

 

                                                      

 

 

所以在搜索过程中偏向于使得y=1的h(x)趋向于大,而使得y=0的h(x)趋向于小。

 

                                                                

即系数Θ使得 Y=1类的 -ΘTX 趋向于大,使得Y=0类的 -ΘTX 趋向于小。而这样的结果就会导致P(y=1|x;Θ)-->1  ; P(y=0|x;Θ)-->0  .

 

那么问题又来了,什么样的数据会导致这样的过拟合产生呢?

 先来看看上述logistic回归中种类为setosa和versicolor的样本pl值的情况。(横轴代表pl值,为了避免样本pl数据点叠加在一起,增加了一个无关的y值使样本点展开)

testdata$y <- c(1:80)
qplot(pl,y,data =testdata,colour =factor(species))


可以看出两类数据明显的完全线性可分

故在回归系数搜索过程中只要使得一元线性函数h(x)的斜率的绝对值偏大,就可以实现y=1类的h(x)趋向大,y=0类的h(x)趋向小。

所以当样本数据完全可分时,logistic回归往往会导致过拟合的问题,即出现第二个警告:拟合概率算出来的概率为0或1。

出现了第二个警告后的logistic模型进行预测时往往是不适用的,对于这种线性可分的样本数据,其实直接使用规则判断的方法则简单且适用(如当pl<2.5时则直接判断为setosa类,pl>2.5时判断为versicolor类)。

 

以下,对于不完全可分的二维训练数据展示logistic回归过程。

 

data<-iris[51:150,]
samp<-sample(100,80)
names(data)<-c('sl','sw','pl','pw','species')
testdata<-data[samp,]
traindata<-data[-samp,]
lgst<-glm(testdata$species~sw+pw,binomial(link='logit'),data=testdata)
summary(lgst)
## 
## Call:
## glm(formula = testdata$species ~ sw + pw, family = binomial(link = "logit"), 
##     data = testdata)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.68123  -0.12839  -0.01807   0.07783   2.24191  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -12.792      5.828  -2.195 0.028168 *  
## sw            -4.214      1.970  -2.139 0.032432 *  
## pw            15.229      3.984   3.823 0.000132 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 110.854  on 79  degrees of freedom
## Residual deviance:  21.382  on 77  degrees of freedom
## AIC: 27.382
## 
## Number of Fisher Scoring iterations: 7


拟合概率曲线图:(基本上符合logistic模型的S型曲线)

p<-predict(lgst,type='response')
qplot(seq(-2,2,length=80),sort(p),col="response")


训练样本散点图及分类边界:

(画logistic回归的分类边界即画曲线h(x)=0.5)

x3<-seq(1.5,4,length=80)
y3<-(4.284/15.656)*x3+13.447/15.656
aaa<-data.frame(x3,y3)

p <- ggplot()
p+geom_point(data = testdata,aes(x=sw,y=pw,colour=factor(species)))+
geom_line(data = aaa,aes(x = x3,y = y3,colour="line"))


 内容参考于原博主,为加深印象,我自己做了一遍,图换成了ggplot2,原文参考如下连接:

来源: http://www.cnblogs.com/runner-ljt/p/4574275.html
版权声明:本文为博主原创文章,转载请注明来源。

logistic回归报错问题:Warning messages: 1: glm.fit:算法没有聚合 2: glm.fit:拟合機率算出来是数值零或一

logistic回归的时候报错问题包括下面两种 Warning: glm.fit: algorithm did not converge Warning: glm.fit: fitted pr...
  • csqazwsxedc
  • csqazwsxedc
  • 2016年07月26日 10:40
  • 9164

聚类分析中几种算法的比较

将数据库中的对象进行聚类是聚类分析的基本操作,其准则是使属于同一类的个体间距离尽可能小,而不同类个体间距离尽可能大,为了找到效率高、通用性强的聚 类方法人们从不同角度提出了近百种聚类方法,典型的有K-...
  • jiary5201314
  • jiary5201314
  • 2014年01月13日 16:46
  • 18764

大学算法分析与设计复习总结

大学算法分析与设计复习总结 为了拿大学的那悲剧的学分,好好弄懂以下所有知识点吧。把老师的复习的提纲,特意汇总了所有考点,方便童鞋们复习。不喜勿喷!!! 这本书是《算法设计与分析》 王红梅 ...
  • wwj_748
  • wwj_748
  • 2013年06月08日 11:49
  • 13859

Machine Learning第三讲[Logistic回归] --(四)解决过拟合问题

内容来自Andrew老师课程Machine Learning的第三章内容的Solving the Problem of Overfitting部分。一、The Problem of Overfitti...
  • quiet_girl
  • quiet_girl
  • 2017年04月21日 15:33
  • 400

Machine Learning 之Logistic回归算法中最小二乘法的Matlab曲线拟合

Machine Learning 之Logistic回归算法中最小二乘法的Matlab曲线拟合逻辑回归是机器学习(Machine Learning)中常见的机器学习算法,在处理逻辑回归(Logisti...
  • zhangphil
  • zhangphil
  • 2017年12月15日 19:14
  • 409

【python图像处理】直线和曲线的拟合与绘制(curve_fit()详解)

在数据处理和绘图中,我们通常会遇到直线或曲线的拟合问题,python中scipy模块的子模块optimize中提供了一个专门用于曲线拟合的函数curve_fit()。...
  • guduruyu
  • guduruyu
  • 2017年04月21日 11:45
  • 7510

【python数据挖掘课程】十四.Scipy调用curve_fit实现曲线拟合

前面系列文章讲过各种知识,包括绘制曲线、散点图、幂分布等,而如何在在散点图一堆点中拟合一条直线,也变得非常重要。这篇文章主要讲述调用Scipy扩展包的curve_fit函数实现曲线拟合,同时计算出拟合...
  • Eastmount
  • Eastmount
  • 2017年05月07日 12:54
  • 9060

python指数、幂数拟合curve_fit

python指数、幂数拟合curve_fit 1、一次二次多项式拟合 一次二次比较简单,直接使用numpy中的函数即可,polyfit(x, y, degree)。 2、指数幂数...
  • yefengzhichen
  • yefengzhichen
  • 2016年10月09日 16:33
  • 8238

第三集 欠拟合与过拟合的概念、局部加权回归、logistic回归、感知器算法

课程大纲   欠拟合的概念(非正式):数据中某些非常明显的模式没有成功的被拟合出来。如图所示,更适合这组数据的应该是而不是一条直线。                              ...
  • qrlhl
  • qrlhl
  • 2015年08月19日 14:48
  • 1137

Linking fails : relocation truncated to fit: R_X86_程序占用内存大于2GB所导致的问题

1   Problem(Abstract) This technote explains how to resolve a Purify engine: Error: The linker ...
  • crazyhacking
  • crazyhacking
  • 2011年12月26日 21:10
  • 2025
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:logistic回归报错问题:Warning messages: 1: glm.fit:算法没有聚合 2: glm.fit:拟合機率算出来是数值零或一
举报原因:
原因补充:

(最多只允许输入30个字)