多分类逻辑回归

使用R语言做多分类逻辑回归。

任务是 有250个样本,给定三个特征,已经人为分类完成共5组,建立模型来给新数据分类,

先是使用了多元线性回归,三个自变量都比较显著,R2也有90多,实际测了下分类效果还可以。

注意:使用多元线性回归的四个前提条件:

线性、独立、正态、齐性。
(1)自变量与因变量之间存在线性关系
这可以通过绘制”散点图矩阵”进行考察因变量随各自变量值的变化情况。如果因变量Yi 与某个自变量X i 之间呈现出曲线趋势,可尝试通过变量变换予以修正,常用的变量变换方法有对数变换、倒数变换、平方根变换、平方根反正弦变换等。
(2)各观测间相互独立
任意两个观测残差的协方差为0 ,也就是要求自变量间不存在多重共线性问题。对于如何处理多重共线性问题,请参考《多元线性回归模型中多重共线性问题处理方法》
(3)残差e 服从正态分布N(0,σ2) 。其方差σ2 = var (ei) 反映了回归模型的精度, σ 越小,用所得到回归模型预测y的精确度愈高。
(4) e 的大小不随所有变量取值水平的改变而改变,即方差齐性。

model<-data.frame(x1,x2,x3,y)
lm.model<-lm(y~x1+x2+x3,data=model)
summary(lm.model)
验证:
newdata<-data.frame(x1=45.94,x2=440.85,x3=401.94)
pre<-predict(lm.model,newdata,interval="prediction",level=0.95)
pre
参数比较
par(mfrow=c(2,2))
plot(lm.model)
pairs(as.data.frame(model))
逐步回归,计算AIC,AIC最小最好
step(lm.model)

Residuals:
Min 1Q Median 3Q Max
-1.10134 -0.23090 -0.08533 0.18198 1.41325

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.1676990 0.0947661 12.32 <2e-16 ***
x1 -0.0473706 0.0015497 -30.57 <2e-16 ***
x2 0.0041012 0.0003501 11.71 <2e-16 ***
x3 0.0055826 0.0002839 19.66 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3621 on 246 degrees of freedom
Multiple R-squared: 0.9355, Adjusted R-squared: 0.9347
F-statistic: 1189 on 3 and 246 DF, p-value: < 2.2e-16

 

但是想试一下高大上的方法,多分类逻辑回归

本质上都是线性的方程,不过计算残差的方式不同,多元线性用的是最小二乘法,逻辑回归用的是最大似然估计求系数(应该是最大后验估计MAP),也可以用梯度下降法计算。

MLE和MAP的差别在于后者对于参数的分布有一个先验分布。https://www.cnblogs.com/ChengQH/p/e5dd604ee211533e50187c6fd37787bd.html

K分类相对于1-0二分类差别在于后者只有一个回归方程,前者有K-1个,实际运用的时候,分别将数字带入到K-1个方程,求出K个结果,这K个

结果加起来的概率是1,看看谁最大就分再哪一类,下面会有例子。

library(nnet)
mult.model<-multinom(y~x1+x2+x3,data=model)
summary(mult.model)
结果:
Call:
multinom(formula = y ~ x1 + x2 + x3, data = model)

Coefficients:
(Intercept) x1 x2 x3
2 -31.62676 -2.840015 -0.006918136 0.6887930
3 -92.60060 -2.829223 0.064854545 0.7629433
4 -117.06100 -4.655324 0.353874358 0.7030203
5 -56.99175 -15.434314 0.308886310 1.2465785

Std. Errors:
(Intercept) x1 x2 x3
2 0.0892275594 2.96814050 0.1539108 0.6157820
3 0.5937775712 2.96600663 0.1559612 0.6170211
4 0.5727510249 6.29296018 1.5538534 1.2203119
5 0.0008759248 0.02666315 0.5326499 0.4966581

Residual Deviance: 9.206181
AIC: 41.20618

验证分类效果
pred <- data.frame(x1 = model$x1, x2 = model$x2,x3=model$x3)
predict(mult.model,newdata= pred,"probs")
结果:250个数据,3个错分,247个分类正确,准确率98.8%

   1                        2                      3                    4                      5
1 1.000000e+00 3.809208e-42 3.113060e-52 5.888049e-64 1.593863e-272
2 1.000000e+00 2.496620e-43 8.490470e-56 4.182889e-76 1.092888e-283
3 1.000000e+00 5.716927e-37 7.904043e-47 1.434314e-51 6.259564e-234
4 1.000000e+00 2.369321e-39 1.059408e-50 5.163321e-59 9.525827e-240
5 1.000000e+00 4.486598e-41 1.185941e-52 1.147564e-60 6.150251e-242
6 1.000000e+00 2.402970e-38 9.300929e-50 3.962257e-58 3.398255e-236

.

.

.

246 1.472326e-165 8.303059e-59 2.691976e-61 1.355816e-60 1.000000e+00
247 3.872388e-184 1.369526e-66 2.500785e-68 5.881583e-70 1.000000e+00
248 3.461965e-223 8.696351e-99 2.264981e-94 2.667693e-74 1.000000e+00
249 9.254150e-211 5.398944e-98 2.012101e-93 4.646237e-66 1.000000e+00
250 3.166047e-231 2.421611e-111 1.171982e-105 8.246868e-76 1.000000e+00

数学推导见以下公式

https://blog.csdn.net/Gamer_gyt/article/details/85209496

以下为参考网站

https://www.cnblogs.com/nxld/p/6170690.html

https://rpubs.com/heruwiryanto/multinom-reg

https://blog.csdn.net/li603060971/article/details/50282769

library(nnet)

mult.model<-multinom(y~x1+x2+x3,data=model)

summary(mult.model)

mult.model1<-update(mult.model,~.-1)#做系数的显著性检验

mult.model2<-update(mult.model,~.-x1)

mult.model3<-update(mult.model,~.-x2)

mult.model4<-update(mult.model,~.-x3)

anova(mult.model,mult.model1)

anova(mult.model,mult.model2)

anova(mult.model,mult.model3)

anova(mult.model,mult.model4)

step.model<-step(mult.model)  #逐步回归选元

summary(step.model)

exp(coef(step.model))#用以解释模型

model.pred<-predict(step.model) #做预测

model.pred

table(model$y,model.pred)

n<-table(model$y,model.pred);n  #预测正确的百分比

Category<-levels(model$y)

Percantage<-c(n[1,1]/sum(n[1,]),n[2,2]/sum(n[2,]),n[3,3]/sum(n[3,]))

rbind(Category,Percantage)

model.pred2<-predict(step.model,type="p")

model.pred2

posted @ 2019-07-18 15:29  谷子弟  阅读(5115)  评论(0编辑  收藏  举报