翻譯/編輯/原創Vivian Ouyang
這個介紹主要是方便剛入行的數據科學家。通過這個指導,使你直接解決機器學習的問題以及從中獲得經驗。而且我會盡量用簡單易懂的方式來介紹每一個算法,不會涉及很多數學,而是幫助你從原理上理解每個算法,每一個算法都附上R和Python的程序來幫助你直接去應用程序解決問題。一般經常使用的機器學習算法有以下11種
1.線性回歸Linear Regression
2.邏輯回歸Logistic Regression
3. 決策樹Decision Tree
4.隨機森林Random Forest
5.支持向量機SVM
6.樸素貝葉斯Naive Bayes
7.最近鄰居法KNN
8.K平均算法K-Means
9.神經網絡Neural Networks
10.降維算法Dimensionality Reduction? ? Algorithms
11.梯度提升Gradient Boost & Adaboost
第二期我們介紹邏輯回歸(2)。邏輯回歸和線性回歸其實都屬于廣義線性模型的一種,而在決策制定等領域,邏輯回歸的應用更加廣泛。所以在第一期學習了線性回歸之后很自然的就是學習邏輯回歸了。?
什么是邏輯回歸?
邏輯回歸是一種分類的算法,它用給定的輸入變量(X)來預測二元的結果(Y)(1/0,是/不是,真/假)。我們一般用虛擬變量來表示二元/類別結果。你可以把邏輯回歸看成一種特殊的線性回歸,只是因為最后的結果是類別變量,所以我們需要用勝算比取對數來作為因變量(Dependent Variable)。簡單來說,邏輯回歸是利用logit 函數擬合數據來預測某一個事件發生的概率的。
邏輯回歸的起源
邏輯回歸其實是屬于廣義線性模型(Generalized Linear Model)的一部分。1972年 Nelder和Wedderburn發明了這種方法來處理那些用線性回歸沒法處理的問題。因為如果你用線性回歸去處理邏輯回歸的二元或類別輸出變量時候,最后的結果就是你會得到極低的校正R平方。當然廣義線性模型是一個統計上用的非常廣的模型,它包含了不止線性回歸,邏輯回歸,還有泊松回歸,ANOVA等等,感興趣的可以繼續進行這方面的閱讀。
廣義線性回歸的基本公式是
g(E(y)) = α + βx1 + γx2
這里,g()是聯系函數(link function),E(y) 是目標輸出變量Y的期望值,而α + βx1 + γx2 是輸入變量的線性組合(α,β,γ 都是需要用數據估計的參數)。聯系函數的作用是將輸出變量Y的期望值和輸入變量X的線性組合可以連接起來,起到一個橋的作用。
主要備注:
I.廣義線性模型(簡稱GLM)因為有聯系函數的存在,所以不需要輸出變量和輸入變量一定有線性關系。但是它假設輸出變量Y的期望值算出來的聯系函數的值必須和輸入變量有線性關系。
II. GLM并不使用回歸分析中經常使用的最小二乘法來估計模型參數的值,而是使用最大似然法則來估計參數的值(Maximum Likelihood Estimation,簡稱MLE)。MLE是統計學中只要涉及到參數模型一定都要搞清楚的重要基礎概念。大部分的參數模型都會假設隨機變量的分布,有了分布之后能寫出模型的似然函數,而模型中的參數就可以用最大似然函數來估計。
III.因為有聯系函數的存在,所以輸出變量Y也不需要一定是正態分布的。
IV.模型中的誤差項必須要是獨立分布的但是也不需要假設正態分布。而在線性回歸中,誤差項是要假設獨立分布加正態分布的。
邏輯回歸的定義與表示
為了便于沒有太多統計背景的朋友們理解,下面會用一個簡單的例子來說明。我們提供一個1000個顧客的樣本。我們需要預測是否一個顧客會買雜志,這個是我們的類別結果(買/不買)。對于這個問題,我們會使用邏輯回歸如下
g(y) = βo + β(Age)? ? ? ? ---- (a)
這里的輸入變量是年齡(Age)。g()是聯系函數。這個函數包含兩個東西,買雜志的概率(p)和不買雜志的概率(1-p)。概率p需要滿足下列標準:
1.概率p大于0
2.概率p小于等于1
有了概率的這兩個條件,下面我們來寫出概率p的函數。首先因為概率是總是大于0的,邏輯回歸里面使用一個指數函數的形式表示概率p,因為對于任何輸入變量,它的指數函數形式永遠不會是負值。這個就滿足了條件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函數。然后我們繼續做以下變換
我們對這個等式兩邊同時去對數的話,可以得到
log(p/(1-p))就是所謂的聯系函數(link function),對于輸出變量取對數的變換有利于我們對于非線性的關聯性用線性模型去擬合。所以我們新的輸出變量是Y而不是原來的p。Y可以寫成
上面這個式子就是邏輯回歸使用的方程式。這里(p/1-p)是所謂的比值比,或者叫機會比(odds ratio),當比值比取對數之后是正值的話,那么意味著(p/1-p)>1,那么事件發生的概率p是大于50%的。我用一個用的很多邏輯回歸的概率圖來說明邏輯回歸的函數永遠是在0和1 之間(因為是為了擬合概率)
怎么評估邏輯回歸模型的的表現
在你建立好邏輯回歸模型之后,很自然的我們需要去評估這個模型的表現好不好,不管你用的是什么軟件(SAS,R,Python),你總是需要看
1.AIC (Akaike Information Criteria) AIC準則
AIC其實是和校準R平方很類似的一個測量量,校正R平方可以理解為,給進入模型的輸入變量一個懲罰機制,你加入的輸入變量X越多,我的懲罰越大。因此校正R平方可以理解為計算真正和Y有關的輸入變量X可以解釋的Y的百分比。AIC同樣會給出這樣的一個懲罰機制,你加入的輸入變量個數越多,懲罰越大。AIC可以簡單表示為
其中k是你模型的參數的個數(可以簡單理解為你的輸入變量X1,X2,。。。Xk的個數),而L是你的似然函數(likelihood),一般似然函數越大說明模型擬合的越好。 AIC越小,說明你的模型越好。
2.只有常數項的模型的偏差值(Null Deviance)/所擬合的模型的偏差值(Residual Deviance)
只有常數項的模型偏差值是指我們只用常數項去擬合輸出變量Y的值與實際輸出變量Y的偏差,這個偏差越小,模型擬合的越小。而所擬合的模型的偏差值是指用含有輸入變量X的模型擬合的輸出變量Y與實際輸出變量Y的偏差,這個值也是越小,模型越好。
3.混淆矩陣 (confusion matrix)
混淆矩陣實際上就是幫助我們判別預測值和實際值相比到底預測對了多少。一個完美的分類模型就是,如果一個樣本實際上(Actual)屬于good,也預測成(Predicted)good,處于類別bad,也就預測成bad。但在實際的應用中,一些實際上是good的,根據我們的模型,卻預測他為bad,對一些原本是bad的,卻預測他為good。我們需要知道,這個模型到底預測對了多少,預測錯了多少,混淆矩陣就是把所有這些信息都歸到一個表里如下
從上表我們可以得出幾個常用的判別量:
準確(分類)率(accuracy)=正確預測的正反例數/總數
=(a+d)/(a+b+c+d)
誤分類率(Error rate)=錯誤預測的正反例數/總數
=(b+c)/(a+b+c+d)
覆蓋率或者靈敏度(Recall, True Positive Rate or Sensitivity)=正確預測到的正例數/實際正例總數
=d/(c+d)
命中率(precision or?Positive Predicted Value or PV+)=正確預測到的正例數/預測正例總數
=d/(b+d)
負例的覆蓋率或特異度(Specificity?or True Negative Rate)=正確預測到的負例個數/實際負例總數
=a/(a+b)
負例的命中率(Negative predicted value?or?PV-)=正確預測到的負例個數/預測負例總數
=a/(a+c)
4. ROC 曲線
接收者操作特征曲線(receiver operating characteristic curve or ROC)是根據一系列不同的二分類方式(分界值或決定閾),以真陽性率(靈敏度)為縱坐標,假陽性率(1-特異度)為橫坐標繪制的曲線。如下是一個ROC曲線
ROC曲線以下的面積大小(Area under curve 或者 AUC)可以表示模型的是否表現好,面積越大說明模型的預測表現越好。最完美的預測模型是覆蓋率或者靈敏度或者真陽性率為1而假的陽性率(1-特異度)為0.那么ROC曲線就會是一條垂直上去的線。當然一般的模型是沒法到達這樣的表現的。
備注:雖然ROC是很好的衡量模型表現的方法,但是它也有自己局限性,尤其是在陽率很稀少的樣本中,如果你畫ROC也可能得到很高的AUC,但是不代表你的模型預測的好。
下面我就介紹怎么用python和R來玩轉線性回歸。
python 程序
#加載需要的包
from sklearn.linear_model import LogisticRegression
#假設在訓練樣本中你有輸入變量X還有輸出變量Y,在檢驗樣本中你有輸入變量x_test
#創建邏輯回歸的目標模型
model=LogisticRegression()
# 用訓練樣本來生成你的模型與相應的參數
model.fit(X,y)
model.score(X,y)
#顯示參數和截距
print('Coefficient:\n',model.coef_)
print('Intercept:\n',model.intercept_)
##用訓練的模型來預測模型中的輸出變量Y#
predicted= model.predict(x_test)
R code
#訓練樣本
x <- cbind(x_train,y_train)
# 用訓練樣本來生成你的模型與相應的參數
logistic<-glm(y_train~.,data= x,family='binomial')
# 顯示邏輯回歸的結果
summary(logistic)
#用訓練的模型來預測模型中的輸出變量Y#
predicted=predict(logistic,x_test)
下面我將使用Kaggle上的很有名的泰坦尼克號數據來演示一個多元邏輯回歸的學習案例。每一行代表一個乘客,我們需要用提供的這些變量來預測最終游客的生還率。這個數據集我會附在文章的最后,可以下載。一些變量的解釋如下
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)
#載入需要的數據集,test是預測數據集,而train是訓練數據集
train<-read.csv("../input/train.csv")
test<-read.csv("../input/test.csv")
#查看訓練數據集
head(train)
#對訓練集和測試集的變量做變換
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)
#把缺失的年齡變為-1##
train$Age[is.na(train$Age)]<--1
#用中位數來補上船票價格的缺失值
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")
#在預測數據集中預測乘客的生還,概率大于0.5,生還,概率小于0.5,不生還
test$Survived <- ifelse(predict(model, test, type="response")>0.5,1,0)
前幾行的結果如下
泰坦尼克的數據可以在本文下載,銜接如下
鏈接: https://pan.baidu.com/s/1hsKex3u 密碼: kewn
下一期內容是決策樹和隨機森林。Continued~
來源:
1.https://www.analyticsvidhya.com/
2.Wiki
3.Kaggle