一文“妙”解逻辑斯蒂回归(LR)算法
一、前言
在感知器算法中,如下圖
如果我們使用一個f(z)=z函數(shù),作為激勵函數(shù),那么該模型即為線性回歸。而在邏輯斯蒂回歸中,我們將會采用f(z)=sigmoid(z)?函數(shù)作為激勵函數(shù),所以它被稱為sigmoid回歸也叫邏輯斯蒂回歸(logistic regression)。需要注意的是,雖然邏輯斯蒂回歸的名字中帶有回歸,但事實上它并不是一種回歸算法,而是一種分類算法。作為經(jīng)典的二分類算法,邏輯斯蒂回歸的應(yīng)用極為廣泛。
本文第2節(jié)介紹了邏輯斯蒂回歸模型的原理,第3節(jié)闡述了模型的代價函數(shù),第4節(jié)講解了模型的權(quán)重更新,第5節(jié)介紹了模型的決策邊界,第6節(jié)演示了R編程實戰(zhàn),第7節(jié)作出總結(jié)。
二、邏輯斯蒂回歸的原理
邏輯斯蒂回歸是針對線性可分問題的一種易于實現(xiàn)而且性能優(yōu)異的分類模型。對于二分類問題,假設(shè)某件事發(fā)生的概率為p,那么這件事不發(fā)生的概率為(1-p),需要通過一個函數(shù)將線性回歸模型??的輸出值映射到[0,1]范圍內(nèi),這個函數(shù)就是邏輯斯蒂函數(shù)(logistic function), 也稱為sigmoid函數(shù)。
其中:z=??,為樣本特征與權(quán)重的線性組合。函數(shù)圖像如下:
為什么變量與因變量要選用logistic關(guān)系呢,因為這里(1)我們需要Y代表的是概率即Y∈(0,1); (2)我們需要樣本特征與權(quán)重的線性組合在0附近變化幅度比較大,并且是非線性的變化。而在很大或很小的時候,幾乎不變化,這是基于概率的一種認(rèn)識與需要。感性的一個例子,想想你學(xué)習(xí)努力的程度與從60分提高到80分和80提高到100分并不是線性的;(3)這個關(guān)系的公式要在之后形成的cost function是凸函數(shù)。所以就選擇了sigmoid函數(shù)。可參考邏輯斯蒂(logistic)回歸深入理解、闡述與實現(xiàn) - happy_lion - 博客園。
于是對于某個樣本x,它的預(yù)測概率為
y表示為:當(dāng)輸入為x時,它被分為1類的概率為p,也屬于1類別的條件概率, 即p(y=1|x)。
如在預(yù)測天氣的時候,我們需要預(yù)測出明天屬于晴天和雨天的概率,已知根天氣相關(guān)的特征和權(quán)重,定義y=1為晴天,y=0為雨天,根據(jù)天氣的相關(guān)特征和權(quán)重可以獲得z,然后再通過sigmoid函數(shù)可以獲取到明天屬于晴天的概率?(z)=P(y=1|x),一般我們?nèi)∶魈鞂儆谇缣斓母怕书撝禐?0%,那么當(dāng)?(z)>=0.5時,就屬于晴天,小于0.5時就屬于雨天。邏輯斯蒂回歸除了應(yīng)用于天氣預(yù)測之外,還可以應(yīng)用于某些疾病預(yù)測,所以邏輯斯蒂回歸在醫(yī)療領(lǐng)域也有廣泛的應(yīng)用。
三、邏輯斯蒂回歸的代價函數(shù)
對于線性回歸問題,定義的代價函數(shù)為所有數(shù)據(jù)誤差的平方和。但是對于邏輯回歸來說,這樣定義所得的代價函數(shù)為非凸函數(shù),容易陷入局部最優(yōu)。比如下圖
左邊為凸函數(shù),局部最優(yōu)即全局最優(yōu);右邊為非凸函數(shù),容易陷入局部最優(yōu)。于是,邏輯斯蒂回歸的代價函數(shù)轉(zhuǎn)變?yōu)?#xff1a;
上面的式子其實由最大似然函數(shù)推導(dǎo)過來,想深入了解的話可移步用最大似然估計求邏輯回歸參數(shù) - CSDN博客, 圖像如下:
如上圖所示,縱坐標(biāo)為損失值,藍(lán)線為??的圖像,紅線為??的圖像
(1)屬于類別1的藍(lán)線:若樣本正確被劃分為類別1中,代價將趨向于0;被誤分到類別0中,代價將無窮大。
(2)屬于類別0的紅線:若樣本正確被劃分為類別0中,代價將趨向于0;被誤分到類別1中,代價將無窮大。
所以,相對于之前的線性回歸而言,logistic回歸錯誤預(yù)測所帶來的代價要大的多。因為y的標(biāo)簽為1和0,所以上面兩個約束條件可以變成一個約束方程,從而方便我們的計算
四、logistic回歸權(quán)重更新三步走
構(gòu)建了損失函數(shù)(為凸函數(shù))后,我們的優(yōu)化目標(biāo)為:使損失函數(shù) J(w) 達(dá)到最小,從而求出最優(yōu)的w (注意常數(shù)b的權(quán)重作為1,放入w向量里),最終得到分類平面的表達(dá)式。因此,梯度下降法就派上用場了。
下面我將logistc回歸權(quán)重的更新分為簡單的三步走
首先計算sigmoid(z) 函數(shù)的偏導(dǎo):
然后計算對數(shù)似然函數(shù)對第j個權(quán)重的偏導(dǎo):
求得偏導(dǎo)后,最終通過梯度下降公式我們就可以不斷更新w
公式參考邏輯斯諦回歸(logistic regression)
五、邏輯斯蒂回歸模型的決策邊界
在邏輯斯蒂模型中,預(yù)測變量越復(fù)雜,即當(dāng)模型中包含自變量的2次項、交叉項甚至更高次項時,模型的決策邊界就越復(fù)雜,就越能擬合非線性決策面。所以在LR模型中,自變量x及其多項式的選擇非常重要。而在神經(jīng)網(wǎng)絡(luò)中,一般預(yù)測變量只需要輸入變量x,通過設(shè)置多個隱藏層來自動進(jìn)行特征選擇就能達(dá)到不錯的效果。因此,相比于神經(jīng)網(wǎng)絡(luò)的智能和自動化,LR模型更具有藝術(shù)性和經(jīng)驗性。通過圖形我們來直觀地了解下:
(1)欠擬合
當(dāng)邏輯斯蒂回歸模型只包含兩個預(yù)測變量,而不包含其高次項或者交叉項時,模型的決策面是一條直線,顯得有點欠擬合(偏差大)
(2)合適擬合:
當(dāng)模型包含兩個預(yù)測變量,并且同時包含其二次項和交叉項時,模型的決策面是一條曲線。雖然有兩個樣本被分類錯誤,但看起來剛好擬合
(3)過擬合:
當(dāng)模型包含兩個預(yù)測變量,并且同時包含二次項甚至更高項以及交叉項時,模型的決策面是一條非常復(fù)雜的曲線。雖然樣本全部被分類正確,但顯示出過擬合的問題(方差大)
六、LR回歸的R語言實現(xiàn)
1)加載包
rm(list=ls()) #清理內(nèi)存空間 setwd("E:/R語言模型代碼清單1111/離不開的R代碼") #設(shè)置工作空間 library(ggplot2) library(pROC)2)數(shù)據(jù)預(yù)處理
data(iris) #使用R自帶的iris鳶尾花數(shù)據(jù)集 table(iris$Species) #查看分類變量的類別個數(shù)可以看到總共150個數(shù)據(jù),3種花分別為50個
iris1=iris[(which(iris$Species!="versicolor")), ] #提取除去versicolor的另外兩個類別,做2分類 table(iris1$Species)雖然沒有選擇versicolor花,但它仍然存在因子中,所以接下想辦法剔除這個因子水平
iris1$Species=as.factor(as.character(iris1$Species)) table(iris1$Species)這樣因子就只剩下兩個了
sub<-sample(1:nrow(iris1),round(nrow(iris1)*2/3)) #選取下標(biāo),選2/3的數(shù)據(jù)作為訓(xùn)練集 iris.learn<-iris1[sub,] #取2/3的數(shù)據(jù)作為訓(xùn)練集 iris.valid<-iris1[-sub,] #取1/3的數(shù)據(jù)作為測試集 table(iris.valid$Species)測試數(shù)據(jù)總共還剩33個
3)調(diào)用glm函數(shù)訓(xùn)練邏輯斯蒂二元模型
logit.fit <- glm(Species~Petal.Width+Petal.Length,family = binomial(link = 'logit'),data = iris.learn) #logistic回歸使用的是二項分布族binomial。Binomial族默認(rèn)連接函數(shù)為logit,可設(shè)置為probit summary(logit.fit)結(jié)果展示了call(調(diào)用),Residuals(殘差), Coifficients(系數(shù)),結(jié)果類似于線性回歸
4)性能評估
prdict_res <- predict(logit.fit, type="response", newdata=iris.valid[,-5]) #測試數(shù)據(jù)產(chǎn)生概率 relationship=data.frame(predict=prdict_res, real=iris.valid$Species) head(relationship) #查看數(shù)據(jù)產(chǎn)生概率和實際分類的關(guān)系可以看到setosa的預(yù)測概率趨向于0,也說明概率大于0.5的花就預(yù)測為virginica
soft_hard=data.frame(predict=ifelse(prdict_res>0.5,"virginica", "setosa"), real=iris.valid$Species); head(soft_hard)前6個數(shù)據(jù)全部預(yù)測正確了,感覺模型還行
table(data.frame(predict=ifelse(prdict_res>0.5, "virginica", "setosa"), real=iris.valid$Species)) #混淆矩陣LR模型成功地擬合了鳶尾花數(shù)據(jù)集,不過說實在的,這個數(shù)據(jù)集非常容易劃分,所以準(zhǔn)確率達(dá)到了100%
接下來畫ROC曲線
pred=ifelse(prdict_res>0.5, "virginica", "setosa") pred2=as.numeric(as.factor(pred))-1 #預(yù)測值必須轉(zhuǎn)化為數(shù)字 modelroc <- roc(iris.valid$Species,pred2) #前面為真實值,后面為預(yù)測值 plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=F,legacy.axes=TRUE, auc.polygon.col="skyblue", print.thres=F,col="red") #作圖AUC已經(jīng)達(dá)到了1,可怕不,社會社會。
?
5)可視化
為了更好地展示決策邊界,在這里以花萼長度和花萼寬度為自變量,iris1為數(shù)據(jù)集,重新訓(xùn)練一個模型
new_fit <- glm(Species~Sepal.Length+Sepal.Width,family = binomial(link = 'logit'),data = iris1) w <- new_fit$coef #模型系數(shù) inter <- -w[1]/w[3] #分類線的截距 slope <- -w[2]/w[3] #分類線的斜率最后用ggplot函數(shù)作圖
ggplot(data=iris1,aes(x=Sepal.Length,y=Sepal.Width,col=Species,shape=Species))+geom_point(size=3)+geom_abline(intercept = inter,slope = slope,size=1.2,colour="red")+scale_color_brewer(palette = 'Accent')+scale_shape_manual(values = c(17,16))+theme_bw()+theme(panel.border = element_blank(),panel.grid.major = element_blank(),panel.grid.minor = element_blank(),axis.line = element_line(colour = "black"))上圖展示了模型對于setosa和virginica這兩種花共100個數(shù)據(jù)樣本的劃分情況,橫坐標(biāo)為花萼長度,縱坐標(biāo)為花萼寬度。圖中并沒有出現(xiàn)被劃分錯誤的樣本,可知準(zhǔn)確率達(dá)到了100%。但是,分類線的位置暗示著模型過擬合的極大可能性。
七、總結(jié)
LR回歸與多重線性回歸實際上有很多相同和相異之處,最大的區(qū)別就在于他們的因變量不同,其他的基本都差不多,正是因為如此,這兩種回歸可以歸于同一個家族,即廣義線性模型。這一家族中的模型形式基本上都差不多,不同的就是因變量不同,如果是連續(xù)的,就是多重線性回歸,如果是二項分布,就是logistic回歸,如果是poisson分布,就是poisson回歸,如果是負(fù)二項分布,就是負(fù)二項回歸,等等。只要注意區(qū)分它們的因變量就可以了。logistic回歸的因變量可以是二分類的,也可以是多分類的,但是二分類的更為常用,也更加容易解釋。所以實際中最為常用的就是二分類的logistic回歸。可參考徹底搞懂邏輯斯蒂回歸 - CSDN博客。
總結(jié)
以上是生活随笔為你收集整理的一文“妙”解逻辑斯蒂回归(LR)算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow和ML前5名的课程
- 下一篇: 如何用java语言调用tensorflo