R语言 | 二分类和多分类的逻辑回归实现
目錄
- 二分類邏輯回歸
- 數(shù)據(jù)準(zhǔn)備
- 模型構(gòu)建
- 模型檢驗(yàn)
- 多分類邏輯回歸
二分類邏輯回歸
首先,我先展示下我邏輯回歸的總體代碼,如果有基礎(chǔ)的同志需要的話,可以直接修改數(shù)據(jù)和參數(shù)拿去用呀:
library(lattice) library(ggplot2) library(caret) library(e1071) library(foreign) library(survival) library(MASS) library(nnet) library(epiDisplay) library(pROC)# 數(shù)據(jù)導(dǎo)入 data<-read.csv('E:/TestData/Number10.2.csv',header = T)# 共線性診斷 XX<-cor(data[-1]) kappa(XX,exact = TRUE) # 也可以計(jì)算條件數(shù)kappa(X),k<100,說(shuō)明共線性程度小;如果100<k<1000,則存在較多的多重共線性;若k>1000,存在嚴(yán)重的多重共線性。# 劃分訓(xùn)練集與測(cè)試集 train_sub = sample(nrow(data),7.5/10*nrow(data)) train_data = data[train_sub,] test_data =data[-train_sub,]# 模型構(gòu)建 model6<-glm(mort~.,data=train_data,family = binomial) summary(model6) #展示模型的# 模型預(yù)測(cè) pre_logistic<-as.numeric(predict(model6,newdata = test_data,type = "response")>0.5)# 模型檢驗(yàn) conMat4<-confusionMatrix(factor(pre_logistic),factor(test_data$mort),positive="1") logistic.display(model6) #輸出OR值# 繪制ORC曲線 roc1<-roc(test_data$mort,pre_logistic,plot=TRUE, print.thres=TRUE, print.auc=TRUE,levels = c(0,1),direction = "<")# 檢驗(yàn)線性假設(shè)是否成立 pre<-predict(model6,newdata = test_data,type = "response") par(mfrow=c(2,2)) scatter.smooth(test_data[,2],log(pre/(1-pre)),cex=0.5) scatter.smooth(test_data[,3],log(pre/(1-pre)),cex=0.5) scatter.smooth(test_data[,4],log(pre/(1-pre)),cex=0.5) scatter.smooth(test_data[,5],log(pre/(1-pre)),cex=0.5)數(shù)據(jù)準(zhǔn)備
在將數(shù)據(jù)導(dǎo)入R之前,根據(jù)自己的需求對(duì)數(shù)據(jù)進(jìn)行清理。本例中,因變量為二分類,代表患者的出院和死亡,實(shí)驗(yàn)?zāi)康臑轭A(yù)測(cè)患者死亡相關(guān)因素。因此,我們將死亡設(shè)置為1,住院設(shè)置為0。
R語(yǔ)言數(shù)據(jù)的導(dǎo)入支持很多格式,本例中導(dǎo)入的是csv格式,可以使用read.csv()函數(shù),也可以使用read.table()函數(shù);如果想要導(dǎo)入.xlsx文件,可以調(diào)用library(openxlsx)包,使用read.xlsx()函數(shù),需要的同志可以自己去查。
本例中,首先我們導(dǎo)入數(shù)據(jù)
data<-read.csv('E:/TestData/Number10.2.csv',header = T)#header = T 表明直接把文件中的標(biāo)題行導(dǎo)入
數(shù)據(jù)導(dǎo)入效果展示如下(因?yàn)榭赡苌婕暗矫舾行畔?#xff0c;這里我將標(biāo)題行抹去啦,實(shí)際導(dǎo)入進(jìn)來(lái)是有標(biāo)題行的)
在進(jìn)行數(shù)據(jù)分析之前,我們需要檢驗(yàn)一下自變量之間是否存在多重共線性:
本例中,計(jì)算得出的k=2.857281,說(shuō)明自變量間的共線程度較小,可以不予考慮。
然后我們按 7.5 : 2.5 的比例將數(shù)據(jù)劃分為測(cè)試集和訓(xùn)練集
train_sub = sample(nrow(data),7.5/10*nrow(data)) train_data = data[train_sub,] # 訓(xùn)練集 test_data =data[-train_sub,] # 測(cè)試集模型構(gòu)建
R語(yǔ)言中二分類邏輯回歸,可以調(diào)用glm()函數(shù),具體實(shí)現(xiàn)如下:
model6<-glm(mort~.,data=train_data,family = binomial)#實(shí)際模型建立的時(shí)候,可以采用mort~colname1+colname2+colname3的形式,mort ~代表將剩余所有的列作為自變量放入模型
summary(model6) #模型展示結(jié)果如下:
上圖中,我們可以看到模型中,所有的變量P值均顯著(若此步驟中有不顯著的自變量,可以考慮將其剔除,然后重新構(gòu)建模型)
模型構(gòu)建成功以后,我們根據(jù)模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè),將概率>0.5的歸為死亡分類,概率<0.5的歸為出院分類:
pre_logistic<-as.numeric(predict(model6,newdata = test_data,type = "response")>0.5)模型檢驗(yàn)
為了檢驗(yàn)?zāi)P偷念A(yù)測(cè)效果,我們利用library(caret)包下的confusionMatrix()函數(shù)輸出預(yù)測(cè)值和真實(shí)值的混淆矩陣,以及模型的準(zhǔn)確率,敏感性和特異性:
conMat4<-confusionMatrix(factor(pre_logistic),factor(test_data$mort),positive="1") logistic.display(model6) #輸出OR值#需要注意的是,confusionMatrix()函數(shù)要求輸入變量是factor類型,在此,我們可以利用library(e1071)包下的factor()函數(shù),或者as.factor()函數(shù)將數(shù)據(jù)強(qiáng)制轉(zhuǎn)換為factor類型,如上述代碼所示。
混淆矩陣輸出結(jié)果展示如下:
由上圖可知,模型的準(zhǔn)確率Accuracy為0.9681,敏感性Sensitivity為0.80882,特異性Specificity為0.98861。總體上來(lái)看,模型的敏感性較低,特異性高,可能存在的原因是數(shù)據(jù)不平衡,導(dǎo)致模型對(duì)數(shù)據(jù)量偏少的那個(gè)分類不夠敏感。建議可以采用過(guò)采樣,SMOTE平衡等方法對(duì)數(shù)據(jù)進(jìn)行處理,具體實(shí)現(xiàn)方法,需要的同志可以自行百度。
除了輸出混淆矩陣,也可以通過(guò)繪制ROC曲線,得到模型敏感性Sensitivity和特異性Specificity:
roc1<-roc(test_data$mort,pre_logistic,plot=TRUE, print.thres=TRUE, print.auc=TRUE,levels = c(0,1),direction = "<")ROC曲線展示如下:
其實(shí)從上圖我們可以看到,我這里ROC曲線中的AUC值和通過(guò)混淆矩陣輸出的AUC是有偏差的(經(jīng)評(píng)論大神指點(diǎn),AUC和準(zhǔn)確率不是一回事,我開(kāi)始沒(méi)搞明白,這樣AUC和混淆矩陣中的Accuracy不一致就可以理解了~~)。
到此為止,二分類的邏輯回歸模型就建立好啦。模型建立過(guò)程中做了很多工作,經(jīng)常會(huì)出現(xiàn)模型擬合不好的情況,本來(lái)想記錄的詳細(xì)點(diǎn),但文筆邏輯有限,發(fā)現(xiàn)過(guò)程中有些感想不是很容易寫出來(lái),最終還是只寫了大概的過(guò)程。其實(shí)模型構(gòu)建過(guò)程中,經(jīng)常會(huì)因?yàn)閿?shù)據(jù)問(wèn)題或者操作不當(dāng)出現(xiàn)各種各樣的,難以言喻的錯(cuò)誤,比如超過(guò)2個(gè)level的無(wú)序多分類自變量最好設(shè)置為啞變量(R語(yǔ)言邏輯回歸中,將原始數(shù)據(jù)設(shè)置為A B C等用字母表示的數(shù)據(jù),代入glm()模型中就會(huì)自動(dòng)以第一個(gè)分類為參考將其設(shè)置為啞變量,有需求的同志可以自行百度);再有,如果有非線性關(guān)系,而且關(guān)系不明,可能需要generalized additive models,對(duì)應(yīng)著gam()函數(shù)。如果非線性關(guān)系明確,就轉(zhuǎn)化成線性的,用glm()函數(shù):比如通過(guò)線性診斷發(fā)現(xiàn)某自變量的函數(shù)關(guān)系呈現(xiàn)二次型的,可以將該自變量轉(zhuǎn)化為平方,再將新的變量代入模型重新構(gòu)建(線性假設(shè)的檢驗(yàn)我的總體代碼中又給,有興趣的同志可以自己嘗試一下)。
線性檢驗(yàn)出來(lái)的結(jié)果大概如下:
如上圖中,圖3很明顯的大概是二次型的關(guān)系,因此可以將圖3中的自變量化為其自身的二次型,然后再構(gòu)建新的模型。
多分類邏輯回歸
介紹完二分類回歸,我們來(lái)看一下多分類的邏輯回歸,其R語(yǔ)言實(shí)現(xiàn)過(guò)程與二分類回歸大同小異。同樣,我先展示下總體代碼:
library(lattice) library(ggplot2) library(caret) library(e1071) library(nnet) library(pROC)# 數(shù)據(jù)準(zhǔn)備 data<-read.csv('D:/多分類邏輯回歸/iris.csv',header = T) train_sub = sample(nrow(data),7.5/10*nrow(data)) train_data = data[train_sub,] test_data =data[-train_sub,]# 多元分類模型構(gòu)建 train_data$class2<-relevel(as.factor(train_data$class),ref = "Iris-setosa") # 選擇參考分類 mult.model<-multinom(class~A+B+C+D,data=train_data) summary(mult.model)# 系數(shù)顯著性檢驗(yàn) z <- summary(mult.model)$coefficients/summary(mult.model)$standard.errors p <- (1 - pnorm(abs(z), 0, 1))*2 p# 相對(duì)危險(xiǎn)度(相對(duì)危險(xiǎn)風(fēng)險(xiǎn)比,或者也叫odds),與OR等價(jià) exp(coef(mult.model))# 利用head()函數(shù)得到模型的擬合值 # head(pp<-fitted(mult.model))# 測(cè)試集結(jié)果預(yù)測(cè) pre_logistic<-predict(mult.model,newdata = test_data) # 預(yù)測(cè)正確百分比 # table(test_data$class,pre_logistic) # 多分類混淆矩陣 conMat4<-confusionMatrix(factor(pre_logistic),factor(test_data$class))本例中,多分類的邏輯回歸利用的是library(nnet)包中的multinom()函數(shù)。該函數(shù)有兩個(gè)特點(diǎn):一是需要選擇參考分類;二是不能計(jì)算系數(shù)的顯著性(需要自己計(jì)算)。多元邏輯回歸中,假設(shè)有3個(gè)分類,會(huì)以參考分類作為參考,構(gòu)建兩個(gè)分類模型。模型計(jì)算的是該條數(shù)據(jù)屬于3個(gè)分類的概率,取概率最大的分類為最終分類。(詳細(xì)的教程可以參考:多元分類詳細(xì)教程)
在此不再對(duì)多元回歸的代碼做詳細(xì)的解釋。示例代碼采用的數(shù)據(jù)是經(jīng)典鳶尾花案例數(shù)據(jù),需要的可以自行下載:鳶尾花數(shù)據(jù)集
總結(jié):感覺(jué)就是,像算法啊,數(shù)據(jù)分析啊這種東西還是要自己動(dòng)手寫,只看或者只聽(tīng),到自己動(dòng)手的時(shí)候還是一團(tuán)糟。所以,如果有機(jī)會(huì),就多加練習(xí)吧!
總結(jié)
以上是生活随笔為你收集整理的R语言 | 二分类和多分类的逻辑回归实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: leaflet添加marker出现偏移,
- 下一篇: 拯救者Y9000P 加装固态