前言git
谷歌董事長施密特曾說過:雖然谷歌的無人駕駛汽車和機器人受到了許多媒體關注,可是這家公司真正的將來在於機器學習,一種讓計算機更聰明、更個性化的技術。算法
也許咱們生活在人類歷史上最關鍵的時期:從使用大型計算機,到我的電腦,再到如今的雲計算。關鍵的不是過去發生了什麼,而是未來會有什麼發生。網絡
工具和技術的民主化,讓像我這樣的人對這個時期興奮不已。計算的蓬勃發展也是同樣。現在,做爲一名數據科學家,用複雜的算法創建數據處理機器一小時能賺到好幾美金。但能作到這個程度可並不簡單!我也曾有過無數黑暗的日日夜夜。dom
誰能從這篇指南里受益最多?機器學習
這篇指南的目的,是爲那些有追求的數據科學家和機器學習狂熱者們,簡化學習旅途。這篇指南會讓你動手解決機器學習的問題,並從實踐中得到真知。我提供的是幾個機器學習算法的高水平理解,以及運行這些算法的 R 和 Python 代碼。這些應該足以讓你親自試一試了。函數
我特意跳過了這些技術背後的數據,由於一開始你並不須要理解這些。若是你想從數據層面上理解這些算法,你應該去別處找找。但若是你想要在開始一個機器學習項目以前作些準備,你會喜歡這篇文章的。工具
廣義來講,有三種機器學習算法學習
一、 監督式學習測試
工做機制:這個算法由一個目標變量或結果變量(或因變量)組成。這些變量由已知的一系列預示變量(自變量)預測而來。利用這一系列變量,咱們生成一個將輸入值映射到指望輸出值的函數。這個訓練過程會一直持續,直到模型在訓練數據上得到指望的精確度。監督式學習的例子有:迴歸、決策樹、隨機森林、K – 近鄰算法、邏輯迴歸等。優化
二、非監督式學習
工做機制:在這個算法中,沒有任何目標變量或結果變量要預測或估計。這個算法用在不一樣的組內聚類分析。這種分析方式被普遍地用來細分客戶,根據干預的方式分爲不一樣的用戶組。非監督式學習的例子有:關聯算法和 K – 均值算法。
三、強化學習
工做機制:這個算法訓練機器進行決策。它是這樣工做的:機器被放在一個能讓它經過反覆試錯來訓練本身的環境中。機器從過去的經驗中進行學習,而且嘗試利用瞭解最透徹的知識做出精確的商業判斷。 強化學習的例子有馬爾可夫決策過程。
常見機器學習算法名單
這裏是一個經常使用的機器學習算法名單。這些算法幾乎能夠用在全部的數據問題上:
一、線性迴歸
線性迴歸一般用於根據連續變量估計實際數值(房價、呼叫次數、總銷售額等)。咱們經過擬合最佳直線來創建自變量和因變量的關係。這條最佳直線叫作迴歸線,而且用 Y= a *X + b 這條線性等式來表示。
理解線性迴歸的最好辦法是回顧一下童年。假設在不問對方體重的狀況下,讓一個五年級的孩子按體重從輕到重的順序對班上的同窗排序,你以爲這個孩子會怎麼作?他(她)極可能會目測人們的身高和體型,綜合這些可見的參數來排列他們。這是現實生活中使用線性迴歸的例子。實際上,這個孩子發現了身高和體型與體重有必定的關係,這個關係看起來很像上面的等式。
在這個等式中:
係數 a 和 b 能夠經過最小二乘法得到
參見下例。咱們找出最佳擬合直線 y=0.2811x+13.9。已知人的身高,咱們能夠經過這條等式求出體重。
線性迴歸的兩種主要類型是一元線性迴歸和多元線性迴歸。一元線性迴歸的特色是隻有一個自變量。多元線性迴歸的特色正如其名,存在多個自變量。找最佳擬合直線的時候,你能夠擬合到多項或者曲線迴歸。這些就被叫作多項或曲線迴歸。
Python 代碼
#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train=input_variables_values_training_datasets
y_train=target_variables_values_training_datasets
x_test=input_variables_values_test_datasets
# Create linear regression object
linear = linear_model.LinearRegression()
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
#Equation coefficient and Intercept
print('Coefficient: n', linear.coef_)
print('Intercept: n', linear.intercept_)
#Predict Output
predicted= linear.predict(x_test)
R代碼
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train <- input_variables_values_training_datasets
y_train <- target_variables_values_training_datasets
x_test <- input_variables_values_test_datasets
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
linear <- lm(y_train ~ ., data = x)
summary(linear)
#Predict Output
predicted= predict(linear,x_test)
、
二、邏輯迴歸
別被它的名字迷惑了!這是一個分類算法而不是一個迴歸算法。該算法可根據已知的一系列因變量估計離散數值(比方說二進制數值 0 或 1 ,是或否,真或假)。簡單來講,它經過將數據擬合進一個邏輯函數來預估一個事件出現的機率。所以,它也被叫作邏輯迴歸。由於它預估的是機率,因此它的輸出值大小在 0 和 1 之間(正如所預計的同樣)。
讓咱們再次經過一個簡單的例子來理解這個算法。
假設你的朋友讓你解開一個謎題。這隻會有兩個結果:你解開了或是你沒有解開。想象你要解答不少道題來找出你所擅長的主題。這個研究的結果就會像是這樣:假設題目是一道十年級的三角函數題,你有 70%的可能會解開這道題。然而,若題目是個五年級的歷史題,你只有30%的可能性回答正確。這就是邏輯迴歸能提供給你的信息。
從數學上看,在結果中,概率的對數使用的是預測變量的線性組合模型。
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
在上面的式子裏,p 是咱們感興趣的特徵出現的機率。它選用使觀察樣本值的可能性最大化的值做爲參數,而不是經過計算偏差平方和的最小值(就如通常的迴歸分析用到的同樣)。
如今你也許要問了,爲何咱們要求出對數呢?簡而言之,這種方法是複製一個階梯函數的最佳方法之一。我本能夠更詳細地講述,但那就違背本篇指南的主旨了。
Python代碼
#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create logistic regression object
model = LogisticRegression()
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Equation coefficient and Intercept
print('Coefficient: n', model.coef_)
print('Intercept: n', model.intercept_)
#Predict Output
predicted= model.predict(x_test)
R代碼
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
logistic <- glm(y_train ~ ., data = x,family='binomial')
summary(logistic)
#Predict Output
predicted= predict(logistic,x_test)
更進一步:
你能夠嘗試更多的方法來改進這個模型:
三、決策樹
這是我最喜好也是最頻繁使用的算法之一。這個監督式學習算法一般被用於分類問題。使人驚奇的是,它同時適用於分類變量和連續因變量。在這個算法中,咱們將整體分紅兩個或更多的同類羣。這是根據最重要的屬性或者自變量來分紅儘量不一樣的組別。想要知道更多,能夠閱讀:簡化決策樹。
(來源: statsexchange)
在上圖中你能夠看到,根據多種屬性,人羣被分紅了不一樣的四個小組,來判斷 「他們會不會去玩」。爲了把整體分紅不一樣組別,須要用到許多技術,好比說 Gini、Information Gain、Chi-square、entropy。
理解決策樹工做機制的最好方式是玩Jezzball,一個微軟的經典遊戲(見下圖)。這個遊戲的最終目的,是在一個能夠移動牆壁的房間裏,經過造牆來分割出沒有小球的、儘可能大的空間。
所以,每一次你用牆壁來分隔房間時,都是在嘗試着在同一間房裏建立兩個不一樣的整體。類似地,決策樹也在把整體儘可能分割到不一樣的組裏去。
更多信息請見:決策樹算法的簡化(http://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/)
#Import Library #Import other necessary libraries like pandas, numpy... from sklearn import tree #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create tree object model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini # model = tree.DecisionTreeRegressor() for regression # Train the model using the training sets and check score model.fit(X, y) model.score(X, y) #Predict Output predicted= model.predict(x_test)
library(rpart)
x <- cbind(x_train,y_train)
# grow tree
fit <- rpart(y_train ~ ., data = x,method="class")
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
四、支持向量機
這是一種分類方法。在這個算法中,咱們將每一個數據在N維空間中用點標出(N是你全部的特徵總數),每一個特徵的值是一個座標的值。
舉個例子,若是咱們只有身高和頭髮長度兩個特徵,咱們會在二維空間中標出這兩個變量,每一個點有兩個座標(這些座標叫作支持向量)。
如今,咱們會找到將兩組不一樣數據分開的一條直線。兩個分組中距離最近的兩個點到這條線的距離同時最優化。
上面示例中的黑線將數據分類優化成兩個小組,兩組中距離最近的點(圖中A、B點)到達黑線的距離知足最優條件。這條直線就是咱們的分割線。接下來,測試數據落到直線的哪一邊,咱們就將它分到哪一類去。
更多請見:支持向量機的簡化(http://www.analyticsvidhya.com/blog/2014/10/support-vector-machine-simplified/)
將這個算法想做是在一個 N 維空間玩 JezzBall。須要對遊戲作一些小變更:
#Import Library
from sklearn import svm
#Assumed you have, X (predic
tor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)
R代碼
library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-svm(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
五、樸素貝葉斯
在預示變量間相互獨立的前提下,根據貝葉斯定理能夠獲得樸素貝葉斯這個分類方法。用更簡單的話來講,一個樸素貝葉斯分類器假設一個分類的特性與該分類的其它特性不相關。舉個例子,若是一個水果又圓又紅,而且直徑大約是 3 英寸,那麼這個水果可能會是蘋果。即使這些特性互相依賴,或者依賴於別的特性的存在,樸素貝葉斯分類器仍是會假設這些特性分別獨立地暗示這個水果是個蘋果。
樸素貝葉斯模型易於建造,且對於大型數據集很是有用。雖然簡單,可是樸素貝葉斯的表現卻超越了很是複雜的分類方法。
貝葉斯定理提供了一種從P(c)、P(x)和P(x|c) 計算後驗機率 P(c|x) 的方法。請看如下等式:
在這裏,
例子:讓咱們用一個例子來理解這個概念。在下面,我有一個天氣的訓練集和對應的目標變量「Play」。如今,咱們須要根據天氣狀況,將會「玩」和「不玩」的參與者進行分類。讓咱們執行如下步驟。
步驟1:把數據集轉換成頻率表。
步驟2:利用相似「當Overcast可能性爲0.29時,玩耍的可能性爲0.64」這樣的機率,創造 Likelihood 表格。
步驟3:如今,使用樸素貝葉斯等式來計算每一類的後驗機率。後驗機率最大的類就是預測的結果。
問題:若是天氣晴朗,參與者就能玩耍。這個陳述正確嗎?
咱們可使用討論過的方法解決這個問題。因而 P(會玩 | 晴朗)= P(晴朗 | 會玩)* P(會玩)/ P (晴朗)
咱們有 P (晴朗 |會玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(會玩)= 9/14 = 0.64
如今,P(會玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,有更大的機率。
樸素貝葉斯使用了一個類似的方法,經過不一樣屬性來預測不一樣類別的機率。這個算法一般被用於文本分類,以及涉及到多個類的問題。
Python代碼
#Import Library
from sklearn.naive_bayes import GaussianNB
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R代碼
library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-naiveBayes(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
六、KNN(K – 最近鄰算法)
該算法可用於分類問題和迴歸問題。然而,在業界內,K – 最近鄰算法更經常使用於分類問題。K – 最近鄰算法是一個簡單的算法。它儲存全部的案例,經過周圍k個案例中的大多數狀況劃分新的案例。根據一個距離函數,新案例會被分配到它的 K 個近鄰中最廣泛的類別中去。
這些距離函數能夠是歐式距離、曼哈頓距離、明式距離或者是漢明距離。前三個距離函數用於連續函數,第四個函數(漢明函數)則被用於分類變量。若是 K=1,新案例就直接被分到離其最近的案例所屬的類別中。有時候,使用 KNN 建模時,選擇 K 的取值是一個挑戰。
更多信息:K – 最近鄰算法入門(簡化版)
咱們能夠很容易地在現實生活中應用到 KNN。若是想要了解一個徹底陌生的人,你也許想要去找他的好朋友們或者他的圈子來得到他的信息。
在選擇使用 KNN 以前,你須要考慮的事情:
Python代碼
#Import Library
from sklearn.neighbors import KNeighborsClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R代碼
library(knn)
x <- cbind(x_train,y_train)
# Fitting model
fit <-knn(y_train ~ ., data = x,k=5)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
七、K 均值算法
K – 均值算法是一種非監督式學習算法,它能解決聚類問題。使用 K – 均值算法來將一個數據納入必定數量的集羣(假設有 k 個集羣)的過程是簡單的。一個集羣內的數據點是均勻齊次的,而且異於別的集羣。
還記得從墨水漬裏找出形狀的活動嗎?K – 均值算法在某方面相似於這個活動。觀察形狀,並延伸想象來找出到底有多少種集羣或者整體。
K – 均值算法涉及到集羣,每一個集羣有本身的質心。一個集羣內的質心和各數據點之間距離的平方和造成了這個集羣的平方值之和。同時,當全部集羣的平方值之和加起來的時候,就組成了集羣方案的平方值之和。
咱們知道,當集羣的數量增長時,K值會持續降低。可是,若是你將結果用圖表來表示,你會看到距離的平方總和快速減小。到某個值 k 以後,減小的速度就大大降低了。在此,咱們能夠找到集羣數量的最優值。
Python代碼
#Import Library
from sklearn.cluster import KMeans
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
# Create KNeighbors classifier object model
k_means = KMeans(n_clusters=3, random_state=0)
# Train the model using the training sets and check score
model.fit(X)
#Predict Output
predicted= model.predict(x_test)
R代碼
library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution
八、隨機森林
隨機森林是表示決策樹整體的一個專有名詞。在隨機森林算法中,咱們有一系列的決策樹(所以又名「森林」)。爲了根據一個新對象的屬性將其分類,每個決策樹有一個分類,稱之爲這個決策樹「投票」給該分類。這個森林選擇得到森林裏(在全部樹中)得到票數最多的分類。
每棵樹是像這樣種植養成的:
若想了解這個算法的更多細節,比較決策樹以及優化模型參數,我建議你閱讀如下文章:
Python代碼
#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model= RandomForestClassifier()
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
library(randomForest)
x <- cbind(x_train,y_train)
# Fitting model
fit <- randomForest(Species ~ ., x,ntree=500)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
九、降維算法
在過去的 4 到 5 年裏,在每個可能的階段,信息捕捉都呈指數增加。公司、政府機構、研究組織在應對着新資源之外,還捕捉詳盡的信息。
舉個例子:電子商務公司更詳細地捕捉關於顧客的資料:我的信息、網絡瀏覽記錄、他們的喜惡、購買記錄、反饋以及別的許多信息,比你身邊的雜貨店售貨員更加關注你。
做爲一個數據科學家,咱們提供的數據包含許多特色。這聽起來給創建一個經得起考研的模型提供了很好材料,但有一個挑戰:如何從 1000 或者 2000 裏分辨出最重要的變量呢?在這種狀況下,降維算法和別的一些算法(好比決策樹、隨機森林、PCA、因子分析)幫助咱們根據相關矩陣,缺失的值的比例和別的要素來找出這些重要變量。