多分類邏輯回歸


使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM