機(jī)器學(xué)習(xí)算法介紹(附上R和python程序)-第二期

翻譯/編輯/原創(chuàng)Vivian Ouyang

這個(gè)介紹主要是方便剛?cè)胄械臄?shù)據(jù)科學(xué)家。通過這個(gè)指導(dǎo),使你直接解決機(jī)器學(xué)習(xí)的問題以及從中獲得經(jīng)驗(yàn)。而且我會(huì)盡量用簡(jiǎn)單易懂的方式來介紹每一個(gè)算法,不會(huì)涉及很多數(shù)學(xué),而是幫助你從原理上理解每個(gè)算法,每一個(gè)算法都附上R和Python的程序來幫助你直接去應(yīng)用程序解決問題。一般經(jīng)常使用的機(jī)器學(xué)習(xí)算法有以下11種

1.線性回歸Linear Regression

2.邏輯回歸Logistic Regression

3. 決策樹Decision Tree

4.隨機(jī)森林Random Forest

5.支持向量機(jī)SVM

6.樸素貝葉斯Naive Bayes

7.最近鄰居法KNN

8.K平均算法K-Means

9.神經(jīng)網(wǎng)絡(luò)Neural Networks

10.降維算法Dimensionality Reduction? ? Algorithms

11.梯度提升Gradient Boost & Adaboost

第二期我們介紹邏輯回歸(2)。邏輯回歸和線性回歸其實(shí)都屬于廣義線性模型的一種,而在決策制定等領(lǐng)域,邏輯回歸的應(yīng)用更加廣泛。所以在第一期學(xué)習(xí)了線性回歸之后很自然的就是學(xué)習(xí)邏輯回歸了。?


什么是邏輯回歸?

邏輯回歸是一種分類的算法,它用給定的輸入變量(X)來預(yù)測(cè)二元的結(jié)果(Y)(1/0,是/不是,真/假)。我們一般用虛擬變量來表示二元/類別結(jié)果。你可以把邏輯回歸看成一種特殊的線性回歸,只是因?yàn)樽詈蟮慕Y(jié)果是類別變量,所以我們需要用勝算比取對(duì)數(shù)來作為因變量(Dependent Variable)。簡(jiǎn)單來說,邏輯回歸是利用logit 函數(shù)擬合數(shù)據(jù)來預(yù)測(cè)某一個(gè)事件發(fā)生的概率的。

邏輯回歸的起源

邏輯回歸其實(shí)是屬于廣義線性模型(Generalized Linear Model)的一部分。1972年 Nelder和Wedderburn發(fā)明了這種方法來處理那些用線性回歸沒法處理的問題。因?yàn)槿绻阌镁€性回歸去處理邏輯回歸的二元或類別輸出變量時(shí)候,最后的結(jié)果就是你會(huì)得到極低的校正R平方。當(dāng)然廣義線性模型是一個(gè)統(tǒng)計(jì)上用的非常廣的模型,它包含了不止線性回歸,邏輯回歸,還有泊松回歸,ANOVA等等,感興趣的可以繼續(xù)進(jìn)行這方面的閱讀。

廣義線性回歸的基本公式是

g(E(y)) = α + βx1 + γx2

這里,g()是聯(lián)系函數(shù)(link function),E(y) 是目標(biāo)輸出變量Y的期望值,而α + βx1 + γx2 是輸入變量的線性組合(α,β,γ 都是需要用數(shù)據(jù)估計(jì)的參數(shù))。聯(lián)系函數(shù)的作用是將輸出變量Y的期望值和輸入變量X的線性組合可以連接起來,起到一個(gè)橋的作用。

主要備注:

I.廣義線性模型(簡(jiǎn)稱GLM)因?yàn)橛新?lián)系函數(shù)的存在,所以不需要輸出變量和輸入變量一定有線性關(guān)系。但是它假設(shè)輸出變量Y的期望值算出來的聯(lián)系函數(shù)的值必須和輸入變量有線性關(guān)系。

II. GLM并不使用回歸分析中經(jīng)常使用的最小二乘法來估計(jì)模型參數(shù)的值,而是使用最大似然法則來估計(jì)參數(shù)的值(Maximum Likelihood Estimation,簡(jiǎn)稱MLE)。MLE是統(tǒng)計(jì)學(xué)中只要涉及到參數(shù)模型一定都要搞清楚的重要基礎(chǔ)概念。大部分的參數(shù)模型都會(huì)假設(shè)隨機(jī)變量的分布,有了分布之后能寫出模型的似然函數(shù),而模型中的參數(shù)就可以用最大似然函數(shù)來估計(jì)。

III.因?yàn)橛新?lián)系函數(shù)的存在,所以輸出變量Y也不需要一定是正態(tài)分布的。

IV.模型中的誤差項(xiàng)必須要是獨(dú)立分布的但是也不需要假設(shè)正態(tài)分布。而在線性回歸中,誤差項(xiàng)是要假設(shè)獨(dú)立分布加正態(tài)分布的。

邏輯回歸的定義與表示

為了便于沒有太多統(tǒng)計(jì)背景的朋友們理解,下面會(huì)用一個(gè)簡(jiǎn)單的例子來說明。我們提供一個(gè)1000個(gè)顧客的樣本。我們需要預(yù)測(cè)是否一個(gè)顧客會(huì)買雜志,這個(gè)是我們的類別結(jié)果(買/不買)。對(duì)于這個(gè)問題,我們會(huì)使用邏輯回歸如下

g(y) = βo + β(Age)? ? ? ? ---- (a)

這里的輸入變量是年齡(Age)。g()是聯(lián)系函數(shù)。這個(gè)函數(shù)包含兩個(gè)東西,買雜志的概率(p)和不買雜志的概率(1-p)。概率p需要滿足下列標(biāo)準(zhǔn):

1.概率p大于0

2.概率p小于等于1

有了概率的這兩個(gè)條件,下面我們來寫出概率p的函數(shù)。首先因?yàn)楦怕适强偸谴笥?的,邏輯回歸里面使用一個(gè)指數(shù)函數(shù)的形式表示概率p,因?yàn)閷?duì)于任何輸入變量,它的指數(shù)函數(shù)形式永遠(yuǎn)不會(huì)是負(fù)值。這個(gè)就滿足了條件1

p = exp(βo + β(Age)) = e^(βo + β(Age))? ? ------- (b)

由條件2,概率p不能大于1,所以我們需要對(duì)p做下面的變換

p? =? exp(βo + β(Age)) / exp(βo + β(Age)) + 1??

? ?=? e^(βo + β(Age)) / e^(βo + β(Age)) + 1? ? ----- (c)

由(a),(b),(c)可以得到,概率p可以寫成

p = e^y/ 1 + e^y --- (d)

而(d)就是我們常說的logit函數(shù)。然后我們繼續(xù)做以下變換

我們對(duì)這個(gè)等式兩邊同時(shí)去對(duì)數(shù)的話,可以得到

log(p/(1-p))就是所謂的聯(lián)系函數(shù)(link function),對(duì)于輸出變量取對(duì)數(shù)的變換有利于我們對(duì)于非線性的關(guān)聯(lián)性用線性模型去擬合。所以我們新的輸出變量是Y而不是原來的p。Y可以寫成

上面這個(gè)式子就是邏輯回歸使用的方程式。這里(p/1-p)是所謂的比值比,或者叫機(jī)會(huì)比(odds ratio),當(dāng)比值比取對(duì)數(shù)之后是正值的話,那么意味著(p/1-p)>1,那么事件發(fā)生的概率p是大于50%的。我用一個(gè)用的很多邏輯回歸的概率圖來說明邏輯回歸的函數(shù)永遠(yuǎn)是在0和1 之間(因?yàn)槭菫榱藬M合概率)


怎么評(píng)估邏輯回歸模型的的表現(xiàn)

在你建立好邏輯回歸模型之后,很自然的我們需要去評(píng)估這個(gè)模型的表現(xiàn)好不好,不管你用的是什么軟件(SAS,R,Python),你總是需要看

1.AIC (Akaike Information Criteria) AIC準(zhǔn)則

AIC其實(shí)是和校準(zhǔn)R平方很類似的一個(gè)測(cè)量量,校正R平方可以理解為,給進(jìn)入模型的輸入變量一個(gè)懲罰機(jī)制,你加入的輸入變量X越多,我的懲罰越大。因此校正R平方可以理解為計(jì)算真正和Y有關(guān)的輸入變量X可以解釋的Y的百分比。AIC同樣會(huì)給出這樣的一個(gè)懲罰機(jī)制,你加入的輸入變量個(gè)數(shù)越多,懲罰越大。AIC可以簡(jiǎn)單表示為

其中k是你模型的參數(shù)的個(gè)數(shù)(可以簡(jiǎn)單理解為你的輸入變量X1,X2,。。。Xk的個(gè)數(shù)),而L是你的似然函數(shù)(likelihood),一般似然函數(shù)越大說明模型擬合的越好。 AIC越小,說明你的模型越好。

2.只有常數(shù)項(xiàng)的模型的偏差值(Null Deviance)/所擬合的模型的偏差值(Residual Deviance)

只有常數(shù)項(xiàng)的模型偏差值是指我們只用常數(shù)項(xiàng)去擬合輸出變量Y的值與實(shí)際輸出變量Y的偏差,這個(gè)偏差越小,模型擬合的越小。而所擬合的模型的偏差值是指用含有輸入變量X的模型擬合的輸出變量Y與實(shí)際輸出變量Y的偏差,這個(gè)值也是越小,模型越好。

3.混淆矩陣 (confusion matrix)

混淆矩陣實(shí)際上就是幫助我們判別預(yù)測(cè)值和實(shí)際值相比到底預(yù)測(cè)對(duì)了多少。一個(gè)完美的分類模型就是,如果一個(gè)樣本實(shí)際上(Actual)屬于good,也預(yù)測(cè)成(Predicted)good,處于類別bad,也就預(yù)測(cè)成bad。但在實(shí)際的應(yīng)用中,一些實(shí)際上是good的,根據(jù)我們的模型,卻預(yù)測(cè)他為bad,對(duì)一些原本是bad的,卻預(yù)測(cè)他為good。我們需要知道,這個(gè)模型到底預(yù)測(cè)對(duì)了多少,預(yù)測(cè)錯(cuò)了多少,混淆矩陣就是把所有這些信息都?xì)w到一個(gè)表里如下

從上表我們可以得出幾個(gè)常用的判別量:

準(zhǔn)確(分類)率(accuracy)=正確預(yù)測(cè)的正反例數(shù)/總數(shù)

=(a+d)/(a+b+c+d)

誤分類率(Error rate)=錯(cuò)誤預(yù)測(cè)的正反例數(shù)/總數(shù)

=(b+c)/(a+b+c+d)

覆蓋率或者靈敏度(Recall, True Positive Rate or Sensitivity)=正確預(yù)測(cè)到的正例數(shù)/實(shí)際正例總數(shù)

=d/(c+d)

命中率(precision or?Positive Predicted Value or PV+)=正確預(yù)測(cè)到的正例數(shù)/預(yù)測(cè)正例總數(shù)

=d/(b+d)

負(fù)例的覆蓋率或特異度(Specificity?or True Negative Rate)=正確預(yù)測(cè)到的負(fù)例個(gè)數(shù)/實(shí)際負(fù)例總數(shù)

=a/(a+b)

負(fù)例的命中率(Negative predicted value?or?PV-)=正確預(yù)測(cè)到的負(fù)例個(gè)數(shù)/預(yù)測(cè)負(fù)例總數(shù)

=a/(a+c)

4. ROC 曲線

接收者操作特征曲線(receiver operating characteristic curve or ROC)是根據(jù)一系列不同的二分類方式(分界值或決定閾),以真陽性率(靈敏度)為縱坐標(biāo),假陽性率(1-特異度)為橫坐標(biāo)繪制的曲線。如下是一個(gè)ROC曲線

ROC曲線以下的面積大小(Area under curve 或者 AUC)可以表示模型的是否表現(xiàn)好,面積越大說明模型的預(yù)測(cè)表現(xiàn)越好。最完美的預(yù)測(cè)模型是覆蓋率或者靈敏度或者真陽性率為1而假的陽性率(1-特異度)為0.那么ROC曲線就會(huì)是一條垂直上去的線。當(dāng)然一般的模型是沒法到達(dá)這樣的表現(xiàn)的。

備注:雖然ROC是很好的衡量模型表現(xiàn)的方法,但是它也有自己局限性,尤其是在陽率很稀少的樣本中,如果你畫ROC也可能得到很高的AUC,但是不代表你的模型預(yù)測(cè)的好。

下面我就介紹怎么用python和R來玩轉(zhuǎn)線性回歸。

python 程序

#加載需要的包

from sklearn.linear_model import LogisticRegression

#假設(shè)在訓(xùn)練樣本中你有輸入變量X還有輸出變量Y,在檢驗(yàn)樣本中你有輸入變量x_test

#創(chuàng)建邏輯回歸的目標(biāo)模型

model=LogisticRegression()

# 用訓(xùn)練樣本來生成你的模型與相應(yīng)的參數(shù)

model.fit(X,y)

model.score(X,y)

#顯示參數(shù)和截距

print('Coefficient:\n',model.coef_)

print('Intercept:\n',model.intercept_)

##用訓(xùn)練的模型來預(yù)測(cè)模型中的輸出變量Y#

predicted= model.predict(x_test)


R code

#訓(xùn)練樣本

x <- cbind(x_train,y_train)

# 用訓(xùn)練樣本來生成你的模型與相應(yīng)的參數(shù)

logistic<-glm(y_train~.,data= x,family='binomial')

# 顯示邏輯回歸的結(jié)果

summary(logistic)

#用訓(xùn)練的模型來預(yù)測(cè)模型中的輸出變量Y#

predicted=predict(logistic,x_test)

下面我將使用Kaggle上的很有名的泰坦尼克號(hào)數(shù)據(jù)來演示一個(gè)多元邏輯回歸的學(xué)習(xí)案例。每一行代表一個(gè)乘客,我們需要用提供的這些變量來預(yù)測(cè)最終游客的生還率。這個(gè)數(shù)據(jù)集我會(huì)附在文章的最后,可以下載。一些變量的解釋如下

survival:生存 ?0 = 死, 1 = 生

pclass: 幾等倉的票,有1,2,3等倉 ?class1 = 1st, 2 = 2nd, 3 = 3rd

sex:性別

Age:年齡

sibsp:有多少兄弟姐妹/配偶在船上

parch:有多少父母/孩子在船上

ticket: 船票號(hào)碼

fare:乘客票價(jià)

cabin:船號(hào)碼

embarked: 啟航港口 C = Cherbourg, Q = Queenstown, S = Southampton

下面是運(yùn)行的R程序

#加載需要的包

library(glmulti)

#載入需要的數(shù)據(jù)集,test是預(yù)測(cè)數(shù)據(jù)集,而train是訓(xùn)練數(shù)據(jù)集

train<-read.csv("../input/train.csv")

test<-read.csv("../input/test.csv")

#查看訓(xùn)練數(shù)據(jù)集

head(train)

#對(duì)訓(xùn)練集和測(cè)試集的變量做變換

train$Pclass<-factor(train$Pclass)

train$Sex<-factor(train$Sex)

train$Embarked<-factor(train$Embarked)

train$Survived<-factor(train$Survived)

test$Pclass<-factor(test$Pclass)

test$Sex<-factor(test$Sex)

test$Embarked<-factor(test$Embarked)

#把缺失的年齡變?yōu)?1##

train$Age[is.na(train$Age)]<--1

#用中位數(shù)來補(bǔ)上船票價(jià)格的缺失值

train$Fare[is.na(train$Fare)]<-median(train$Fare,na.rm=TRUE)

train$Embarked[train$Embarked==""]="S"

test$Age[is.na(test$Age)]<--1

test$Fare[is.na(test$Fare)]<-median(test$Fare,na.rm=TRUE)

test$Embarked[test$Embarked==""]="S"

#邏輯回歸

model<-glm(Survived ~ Sex + Pclass + Age + SibSp + Parch + Fare + Embarked, data = train, family = "binomial")

#在預(yù)測(cè)數(shù)據(jù)集中預(yù)測(cè)乘客的生還,概率大于0.5,生還,概率小于0.5,不生還

test$Survived <- ifelse(predict(model, test, type="response")>0.5,1,0)

前幾行的結(jié)果如下

泰坦尼克的數(shù)據(jù)可以在本文下載,銜接如下

鏈接: https://pan.baidu.com/s/1hsKex3u 密碼: kewn

下一期內(nèi)容是決策樹和隨機(jī)森林。Continued~

來源:

1.https://www.analyticsvidhya.com/

2.Wiki

3.Kaggle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容