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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灯抛,隨后出現(xiàn)的幾起案子金赦,更是在濱河造成了極大的恐慌,老刑警劉巖对嚼,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夹抗,死亡現(xiàn)場離奇詭異,居然都是意外死亡纵竖,警方通過查閱死者的電腦和手機(jī)漠烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靡砌,“玉大人已脓,你說我怎么就攤上這事⊥ㄑ辏” “怎么了度液?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長画舌。 經(jīng)常有香客問我堕担,道長,這世上最難降的妖魔是什么骗炉? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任照宝,我火速辦了婚禮蛇受,結(jié)果婚禮上句葵,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好乍丈,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布剂碴。 她就那樣靜靜地躺著,像睡著了一般轻专。 火紅的嫁衣襯著肌膚如雪忆矛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天请垛,我揣著相機(jī)與錄音催训,去河邊找鬼。 笑死宗收,一個胖子當(dāng)著我的面吹牛漫拭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播混稽,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼采驻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匈勋?” 一聲冷哼從身側(cè)響起礼旅,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洽洁,沒想到半個月后痘系,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡诡挂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年碎浇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璃俗。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡奴璃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出城豁,到底是詐尸還是另有隱情苟穆,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布唱星,位于F島的核電站雳旅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏间聊。R本人自食惡果不足惜攒盈,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哎榴。 院中可真熱鬧型豁,春花似錦僵蛛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衣形,卻和暖如春驼侠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谆吴。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工倒源, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句狼。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓相速,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲜锚。 傳聞我的和親對象是個殘疾皇子突诬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容