翻譯/編輯/原創(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