翻譯/編輯/原創(chuàng)Vivian Ouyang
這個介紹主要是方便剛?cè)胄械臄?shù)據(jù)科學(xué)家最楷。通過這個指導(dǎo)鸡号,使你直接解決機(jī)器學(xué)習(xí)的問題以及從中獲得經(jīng)驗布卡。而且我會盡量用簡單易懂的方式來介紹每一個算法躯护,不會涉及很多數(shù)學(xué)独撇,而是幫助你從原理上理解每個算法混狠,每一個算法都附上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)。邏輯回歸和線性回歸其實都屬于廣義線性模型的一種将饺,而在決策制定等領(lǐng)域贡避,邏輯回歸的應(yīng)用更加廣泛。所以在第一期學(xué)習(xí)了線性回歸之后很自然的就是學(xué)習(xí)邏輯回歸了予弧。?
什么是邏輯回歸刮吧?
邏輯回歸是一種分類的算法,它用給定的輸入變量(X)來預(yù)測二元的結(jié)果(Y)(1/0,是/不是掖蛤,真/假)杀捻。我們一般用虛擬變量來表示二元/類別結(jié)果。你可以把邏輯回歸看成一種特殊的線性回歸蚓庭,只是因為最后的結(jié)果是類別變量致讥,所以我們需要用勝算比取對數(shù)來作為因變量(Dependent Variable)仅仆。簡單來說,邏輯回歸是利用logit 函數(shù)擬合數(shù)據(jù)來預(yù)測某一個事件發(fā)生的概率的垢袱。
邏輯回歸的起源
邏輯回歸其實是屬于廣義線性模型(Generalized Linear Model)的一部分墓拜。1972年 Nelder和Wedderburn發(fā)明了這種方法來處理那些用線性回歸沒法處理的問題。因為如果你用線性回歸去處理邏輯回歸的二元或類別輸出變量時候请契,最后的結(jié)果就是你會得到極低的校正R平方咳榜。當(dāng)然廣義線性模型是一個統(tǒng)計上用的非常廣的模型,它包含了不止線性回歸姚糊,邏輯回歸贿衍,還有泊松回歸,ANOVA等等救恨,感興趣的可以繼續(xù)進(jìn)行這方面的閱讀贸辈。
廣義線性回歸的基本公式是
g(E(y)) = α + βx1 + γx2
這里,g()是聯(lián)系函數(shù)(link function)肠槽,E(y) 是目標(biāo)輸出變量Y的期望值擎淤,而α + βx1 + γx2 是輸入變量的線性組合(α,β,γ 都是需要用數(shù)據(jù)估計的參數(shù))。聯(lián)系函數(shù)的作用是將輸出變量Y的期望值和輸入變量X的線性組合可以連接起來秸仙,起到一個橋的作用嘴拢。
主要備注:
I.廣義線性模型(簡稱GLM)因為有聯(lián)系函數(shù)的存在,所以不需要輸出變量和輸入變量一定有線性關(guān)系寂纪。但是它假設(shè)輸出變量Y的期望值算出來的聯(lián)系函數(shù)的值必須和輸入變量有線性關(guān)系席吴。
II. GLM并不使用回歸分析中經(jīng)常使用的最小二乘法來估計模型參數(shù)的值,而是使用最大似然法則來估計參數(shù)的值(Maximum Likelihood Estimation,簡稱MLE)捞蛋。MLE是統(tǒng)計學(xué)中只要涉及到參數(shù)模型一定都要搞清楚的重要基礎(chǔ)概念孝冒。大部分的參數(shù)模型都會假設(shè)隨機(jī)變量的分布,有了分布之后能寫出模型的似然函數(shù)拟杉,而模型中的參數(shù)就可以用最大似然函數(shù)來估計庄涡。
III.因為有聯(lián)系函數(shù)的存在,所以輸出變量Y也不需要一定是正態(tài)分布的搬设。
IV.模型中的誤差項必須要是獨立分布的但是也不需要假設(shè)正態(tài)分布穴店。而在線性回歸中,誤差項是要假設(shè)獨立分布加正態(tài)分布的拿穴。
邏輯回歸的定義與表示
為了便于沒有太多統(tǒng)計背景的朋友們理解泣洞,下面會用一個簡單的例子來說明。我們提供一個1000個顧客的樣本默色。我們需要預(yù)測是否一個顧客會買雜志斜棚,這個是我們的類別結(jié)果(買/不買)。對于這個問題,我們會使用邏輯回歸如下
g(y) = βo + β(Age)? ? ? ? ---- (a)
這里的輸入變量是年齡(Age)弟蚀。g()是聯(lián)系函數(shù)蚤霞。這個函數(shù)包含兩個東西,買雜志的概率(p)和不買雜志的概率(1-p)义钉。概率p需要滿足下列標(biāo)準(zhǔn):
1.概率p大于0
2.概率p小于等于1
有了概率的這兩個條件昧绣,下面我們來寫出概率p的函數(shù)。首先因為概率是總是大于0的捶闸,邏輯回歸里面使用一個指數(shù)函數(shù)的形式表示概率p夜畴,因為對于任何輸入變量,它的指數(shù)函數(shù)形式永遠(yuǎn)不會是負(fù)值删壮。這個就滿足了條件1
p = exp(βo + β(Age)) = e^(βo + β(Age))? ? ------- (b)
由條件2贪绘,概率p不能大于1,所以我們需要對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ù)做以下變換
我們對這個等式兩邊同時去對數(shù)的話,可以得到
log(p/(1-p))就是所謂的聯(lián)系函數(shù)(link function)亿虽,對于輸出變量取對數(shù)的變換有利于我們對于非線性的關(guān)聯(lián)性用線性模型去擬合菱涤。所以我們新的輸出變量是Y而不是原來的p。Y可以寫成
上面這個式子就是邏輯回歸使用的方程式洛勉。這里(p/1-p)是所謂的比值比粘秆,或者叫機(jī)會比(odds ratio),當(dāng)比值比取對數(shù)之后是正值的話收毫,那么意味著(p/1-p)>1,那么事件發(fā)生的概率p是大于50%的攻走。我用一個用的很多邏輯回歸的概率圖來說明邏輯回歸的函數(shù)永遠(yuǎn)是在0和1 之間(因為是為了擬合概率)
怎么評估邏輯回歸模型的的表現(xiàn)
在你建立好邏輯回歸模型之后,很自然的我們需要去評估這個模型的表現(xiàn)好不好此再,不管你用的是什么軟件(SAS,R,Python),你總是需要看
1.AIC (Akaike Information Criteria) AIC準(zhǔn)則
AIC其實是和校準(zhǔn)R平方很類似的一個測量量昔搂,校正R平方可以理解為,給進(jìn)入模型的輸入變量一個懲罰機(jī)制引润,你加入的輸入變量X越多,我的懲罰越大痒玩。因此校正R平方可以理解為計算真正和Y有關(guān)的輸入變量X可以解釋的Y的百分比淳附。AIC同樣會給出這樣的一個懲罰機(jī)制,你加入的輸入變量個數(shù)越多蠢古,懲罰越大奴曙。AIC可以簡單表示為
其中k是你模型的參數(shù)的個數(shù)(可以簡單理解為你的輸入變量X1,X2草讶,洽糟。。。Xk的個數(shù))坤溃,而L是你的似然函數(shù)(likelihood)拍霜,一般似然函數(shù)越大說明模型擬合的越好。 AIC越小薪介,說明你的模型越好祠饺。
2.只有常數(shù)項的模型的偏差值(Null Deviance)/所擬合的模型的偏差值(Residual Deviance)
只有常數(shù)項的模型偏差值是指我們只用常數(shù)項去擬合輸出變量Y的值與實際輸出變量Y的偏差,這個偏差越小汁政,模型擬合的越小道偷。而所擬合的模型的偏差值是指用含有輸入變量X的模型擬合的輸出變量Y與實際輸出變量Y的偏差,這個值也是越小记劈,模型越好勺鸦。
3.混淆矩陣 (confusion matrix)
混淆矩陣實際上就是幫助我們判別預(yù)測值和實際值相比到底預(yù)測對了多少。一個完美的分類模型就是目木,如果一個樣本實際上(Actual)屬于good换途,也預(yù)測成(Predicted)good,處于類別bad嘶窄,也就預(yù)測成bad怀跛。但在實際的應(yīng)用中,一些實際上是good的柄冲,根據(jù)我們的模型吻谋,卻預(yù)測他為bad,對一些原本是bad的现横,卻預(yù)測他為good漓拾。我們需要知道,這個模型到底預(yù)測對了多少戒祠,預(yù)測錯了多少骇两,混淆矩陣就是把所有這些信息都?xì)w到一個表里如下
從上表我們可以得出幾個常用的判別量:
準(zhǔn)確(分類)率(accuracy)=正確預(yù)測的正反例數(shù)/總數(shù)
=(a+d)/(a+b+c+d)
誤分類率(Error rate)=錯誤預(yù)測的正反例數(shù)/總數(shù)
=(b+c)/(a+b+c+d)
覆蓋率或者靈敏度(Recall, True Positive Rate or Sensitivity)=正確預(yù)測到的正例數(shù)/實際正例總數(shù)
=d/(c+d)
命中率(precision or?Positive Predicted Value or PV+)=正確預(yù)測到的正例數(shù)/預(yù)測正例總數(shù)
=d/(b+d)
負(fù)例的覆蓋率或特異度(Specificity?or True Negative Rate)=正確預(yù)測到的負(fù)例個數(shù)/實際負(fù)例總數(shù)
=a/(a+b)
負(fù)例的命中率(Negative predicted value?or?PV-)=正確預(yù)測到的負(fù)例個數(shù)/預(yù)測負(fù)例總數(shù)
=a/(a+c)
4. ROC 曲線
接收者操作特征曲線(receiver operating characteristic curve or ROC)是根據(jù)一系列不同的二分類方式(分界值或決定閾),以真陽性率(靈敏度)為縱坐標(biāo)姜盈,假陽性率(1-特異度)為橫坐標(biāo)繪制的曲線低千。如下是一個ROC曲線
ROC曲線以下的面積大小(Area under curve 或者 AUC)可以表示模型的是否表現(xiàn)好馏颂,面積越大說明模型的預(yù)測表現(xiàn)越好示血。最完美的預(yù)測模型是覆蓋率或者靈敏度或者真陽性率為1而假的陽性率(1-特異度)為0.那么ROC曲線就會是一條垂直上去的線。當(dāng)然一般的模型是沒法到達(dá)這樣的表現(xiàn)的救拉。
備注:雖然ROC是很好的衡量模型表現(xiàn)的方法难审,但是它也有自己局限性,尤其是在陽率很稀少的樣本中亿絮,如果你畫ROC也可能得到很高的AUC告喊,但是不代表你的模型預(yù)測的好麸拄。
下面我就介紹怎么用python和R來玩轉(zhuǎn)線性回歸。
python 程序
#加載需要的包
from sklearn.linear_model import LogisticRegression
#假設(shè)在訓(xùn)練樣本中你有輸入變量X還有輸出變量Y黔姜,在檢驗樣本中你有輸入變量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ù)測模型中的輸出變量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ù)測模型中的輸出變量Y#
predicted=predict(logistic,x_test)
下面我將使用Kaggle上的很有名的泰坦尼克號數(shù)據(jù)來演示一個多元邏輯回歸的學(xué)習(xí)案例拢切。每一行代表一個乘客,我們需要用提供的這些變量來預(yù)測最終游客的生還率地淀。這個數(shù)據(jù)集我會附在文章的最后失球,可以下載。一些變量的解釋如下
survival:生存 ?0 = 死, 1 = 生
pclass: 幾等倉的票帮毁,有1,2,3等倉 ?class1 = 1st, 2 = 2nd, 3 = 3rd
sex:性別
Age:年齡
sibsp:有多少兄弟姐妹/配偶在船上
parch:有多少父母/孩子在船上
ticket: 船票號碼
fare:乘客票價
cabin:船號碼
embarked: 啟航港口 C = Cherbourg, Q = Queenstown, S = Southampton
下面是運行的R程序
#加載需要的包
library(glmulti)
#載入需要的數(shù)據(jù)集实苞,test是預(yù)測數(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)
#對訓(xùn)練集和測試集的變量做變換
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ǔ)上船票價格的缺失值
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ù)測數(shù)據(jù)集中預(yù)測乘客的生還烈疚,概率大于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