




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
機器學習算法一覽(附python和R代碼)2016-04-19大數據文摘大數據文摘作品,轉載需授權
編譯:@酒酒
校正:寒小陽
&&
龍心塵摘自:
大數據文摘“機器學習”專欄成立啦!歡迎大家留言提出寶貴意見,歡迎投稿給我們。如何加入我們?文章末尾有說明:)
◆
◆
◆“谷歌的無人車和機器人得到了很多關注,但我們真正的未來卻在于能夠使電腦變得更聰明,更人性化的技術,機器學習?!?/p>
——
埃里克施密特(谷歌首席執(zhí)行官)◆
◆
◆當計算從大型計算機轉移至個人電腦再轉移到云的今天,我們可能正處于人類歷史上最關鍵的時期。之所以關鍵,并不是因為已經取得的成就,而是未來幾年里我們即將要獲得的進步和成就。對我來說,如今最令我激動的就是計算技術和工具的普及,從而帶來了計算的春天。作為一名數據科學家,我可以建造一個數據處理系統(tǒng)來進行復雜的算法運算,這樣每小時能賺幾美金??墒菍W習這些算法卻花了我無數個日日夜夜。
那么誰能從這篇文章里收益最多呢?這篇文章有可能是我寫的所有文章里最有價值的一篇。
寫這篇文章的目的,就是希望它可以讓有志于從事數據科學和機器學習的諸位在學習算法的路上少走些路。我會在文章中舉例一些機器學習的問題,你們也可以在思考解決這些問題的過程中得到啟發(fā)。我也會寫下對于各種機器學習算法的一些個人理解,并且提供R和Python的執(zhí)行代碼。讀完這篇文章,讀者們至少可以行動起來親手試試寫一個機器學習的程序。
不過,這篇文章并沒有闡述這些算法背后的統(tǒng)計學原理,有時候從實踐入手也是很好的學習路徑。如果你希望了解的是這些統(tǒng)計學原理,那么這篇文章的內容可能并不適合你。
一般說來,機器學習有三種算法:1.監(jiān)督式學習監(jiān)督式學習算法包括一個目標變量(因變量)和用來預測目標變量的預測變量(自變量)。通過這些變量我們可以搭建一個模型,從而對于一個已知的預測變量值,我們可以得到對應的目標變量值。重復訓練這個模型,直到它能在訓練數據集上達到預定的準確度。
屬于監(jiān)督式學習的算法有:回歸模型,決策樹,隨機森林,K鄰近算法,邏輯回歸等。
2.無監(jiān)督式學習與監(jiān)督式學習不同的是,無監(jiān)督學習中我們沒有需要預測或估計的目標變量。無監(jiān)督式學習是用來對總體對象進行分類的。它在根據某一指標將客戶分類上有廣泛應用。
屬于無監(jiān)督式學習的算法有:關聯(lián)規(guī)則,K-means聚類算法等。
3.強化學習這個算法可以訓練程序做出某一決定。程序在某一情況下嘗試所有的可能行動,記錄不同行動的結果并試著找出最好的一次嘗試來做決定。
屬于這一類算法的有馬爾可夫決策過程。
常見的機器學習算法以下是最常用的機器學習算法,大部分數據問題都可以通過它們解決:1.線性回歸(LinearRegression)2.邏輯回歸(LogisticRegression)3.決策樹(DecisionTree)4.支持向量機(SVM)5.樸素貝葉斯(NaiveBayes)6.K鄰近算法(KNN)7.K-均值算法(K-means)8.隨機森林(RandomForest)9.降低維度算法(DimensionalityReductionAlgorithms)10.GradientBoost和Adaboost算法1.線性回歸(LinearRegression)線性回歸是利用連續(xù)性變量來估計實際數值(例如房價,呼叫次數和總銷售額等)。我們通過線性回歸算法找出自變量和因變量間的最佳線性關系,圖形上可以確定一條最佳直線。這條最佳直線就是回歸線。這個回歸關系可以用Y=aX+b表示。
我們可以假想一個場景來理解線性回歸。比如你讓一個五年級的孩子在不問同學具體體重多少的情況下,把班上的同學按照體重從輕到重排隊。這個孩子會怎么做呢?他有可能會通過觀察大家的身高和體格來排隊。這就是線性回歸!這個孩子其實是認為身高和體格與人的體重有某種相關。而這個關系就像是前一段的Y和X的關系。
在Y=aX+b這個公式里:Y-因變量a-斜率X-自變量b-截距
a和b可以通過最小化因變量誤差的平方和得到(最小二乘法)。
下圖中我們得到的線性回歸方程是y=0.2811X+13.9。通過這個方程,我們可以根據一個人的身高得到他的體重信息。
線性回歸主要有兩種:一元線性回歸和多元線性回歸。一元線性回歸只有一個自變量,而多元線性回歸有多個自變量。擬合多元線性回歸的時候,可以利用多項式回歸(PolynomialRegression)或曲線回歸(CurvilinearRegression)。Python代碼#ImportLibrary#Importothernecessarylibrarieslikepandas,numpy...fromsklearnimportlinear_model#LoadTrainandTestdatasets#Identifyfeatureandresponsevariable(s)andvaluesmustbenumericandnumpyarraysx_train=input_variables_values_training_datasetsy_train=target_variables_values_training_datasetsx_test=input_variables_values_test_datasets#Createlinearregressionobjectlinear=linear_model.LinearRegression()#Trainthemodelusingthetrainingsetsandcheckscorelinear.fit(x_train,y_train)linear.score(x_train,y_train)#EquationcoefficientandInterceptprint('Coefficient:\n',linear.coef_)print('Intercept:\n',ercept_)#PredictOutputpredicted=linear.predict(x_test)R代碼#LoadTrainandTestdatasets#Identifyfeatureandresponsevariable(s)andvaluesmustbenumericandnumpyarraysx_train<-input_variables_values_training_datasetsy_train<-target_variables_values_training_datasetsx_test<-input_variables_values_test_datasetsx<-cbind(x_train,y_train)#Trainthemodelusingthetrainingsetsandcheckscorelinear<-lm(y_train~.,data=x)summary(linear)#PredictOutputpredicted=predict(linear,x_test)
2.邏輯回歸別被它的名字迷惑了,邏輯回歸其實是一個分類算法而不是回歸算法。通常是利用已知的自變量來預測一個離散型因變量的值(像二進制值0/1,是/否,真/假)。簡單來說,它就是通過擬合一個邏輯函數(logitfuction)來預測一個事件發(fā)生的概率。所以它預測的是一個概率值,自然,它的輸出值應該在0到1之間。
同樣,我們可以用一個例子來理解這個算法。
假設你的一個朋友讓你回答一道題。可能的結果只有兩種:你答對了或沒有答對。為了研究你最擅長的題目領域,你做了各種領域的題目。那么這個研究的結果可能是這樣的:如果是一道十年級的三角函數題,你有70%的可能性能解出它。但如果是一道五年級的歷史題,你會的概率可能只有30%。邏輯回歸就是給你這樣的概率結果。
回到數學上,事件結果的勝算對數(logodds)可以用預測變量的線性組合來描述:odds=p/(1-p)=probabilityofeventoccurrence/probabilityofnoteventoccurrenceln(odds)=ln(p/(1-p))logit(p)=ln(p/(1-p))=b0+b1X1+b2X2+b3X3....+bkXk
在這里,p是我們感興趣的事件出現的概率。它通過篩選出特定參數值使得觀察到的樣本值出現的概率最大化,來估計參數,而不是像普通回歸那樣最小化誤差的平方和。
你可能會問為什么需要做對數呢?簡單來說這是重復階梯函數的最佳方法。因本篇文章旨不在此,這方面就不做詳細介紹了。Python代碼#ImportLibraryfromsklearn.linear_modelimportLogisticRegression#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#Createlogisticregressionobjectmodel=LogisticRegression()#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)model.score(X,y)#EquationcoefficientandInterceptprint('Coefficient:\n',model.coef_)print('Intercept:\n',ercept_)#PredictOutputpredicted=model.predict(x_test)R代碼x<-cbind(x_train,y_train)#Trainthemodelusingthetrainingsetsandcheckscorelogistic<-glm(y_train~.,data=x,family='binomial')summary(logistic)#PredictOutputpredicted=predict(logistic,x_test)
延伸:
以下是一些可以嘗試的優(yōu)化模型的方法:加入交互項(interaction)減少特征變量正則化(regularization)使用非線性模型
3.決策樹這是我最喜歡也是能經常使用到的算法。它屬于監(jiān)督式學習,常用來解決分類問題。令人驚訝的是,它既可以運用于類別變量(categoricalvariables)也可以作用于連續(xù)變量。這個算法可以讓我們把一個總體分為兩個或多個群組。分組根據能夠區(qū)分總體的最重要的特征變量/自變量進行。更詳細的內容可以閱讀這篇文章DecisionTreeSimplified。
從上圖中我們可以看出,總體人群最終在玩與否的事件上被分成了四個群組。而分組是依據一些特征變量實現的。用來分組的具體指標有很多,比如Gini,informationGain,Chi-square,entropy。
理解決策樹原理的最好的辦法就是玩Jezzball游戲。這是微軟的一款經典游戲(見下圖)。這個游戲的最終任務是在一個有移動墻壁的房間里,通過建造墻壁來盡可能地將房間分成盡量大的,沒有小球的空間。
每一次你用建墻來分割房間,其實就是在將一個總體分成兩部分。決策樹也是用類似方法將總體分成盡量多的不同組別。延伸閱讀:SimplifiedVersionofDecisionTreeAlgorithms
Python代碼#ImportLibrary#Importothernecessarylibrarieslikepandas,numpy...fromsklearnimporttree#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#Createtreeobjectmodel=tree.DecisionTreeClassifier(criterion='gini')#forclassification,hereyoucanchangethealgorithmasginiorentropy(informationgain)bydefaultitisgini
#model=tree.DecisionTreeRegressor()forregression#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)model.score(X,y)#PredictOutputpredicted=model.predict(x_test)R代碼library(rpart)x<-cbind(x_train,y_train)#growtreefit<-rpart(y_train~.,data=x,method="class")summary(fit)#PredictOutputpredicted=predict(fit,x_test)
4.支持向量機(SVM)這是一個分類算法。在這個算法中我們將每一個數據作為一個點在一個n維空間上作圖(n是特征數),每一個特征值就代表對應坐標值的大小。比如說我們有兩個特征:一個人的身高和發(fā)長。我們可以將這兩個變量在一個二維空間上作圖,圖上的每個點都有兩個坐標值(這些坐標軸也叫做支持向量)。
現在我們要在圖中找到一條直線能最大程度將不同組的點分開。兩組數據中距離這條線最近的點到這條線的距離都應該是最遠的。
在上圖中,黑色的線就是最佳分割線。因為這條線到兩組中距它最近的點,點A和B的距離都是最遠的。任何其他線必然會使得到其中一個點的距離比這個距離近。這樣根據數據點分布在這條線的哪一邊,我們就可以將數據歸類。更多閱讀:SimplifiedVersionofSupportVectorMachine
我們可以把這個算法想成n維空間里的JezzBall游戲,不過有一些變動:你可以以任何角度畫分割線/分割面(經典游戲中只有垂直和水平方向)?,F在這個游戲的目的是把不同顏色的小球分到不同空間里。小球是不動的。Python代碼#ImportLibraryfromsklearnimportsvm#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#CreateSVMclassificationobjectmodel=svm.svc()#thereisvariousoptionassociatedwithit,thisissimpleforclassification.Youcanreferlink,formo#redetail.#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)model.score(X,y)#PredictOutputpredicted=model.predict(x_test)R代碼library(e1071)x<-cbind(x_train,y_train)#Fittingmodelfit<-svm(y_train~.,data=x)summary(fit)#PredictOutputpredicted=predict(fit,x_test)
5.樸素貝葉斯這個算法是建立在貝葉斯理論上的分類方法。它的假設條件是自變量之間相互獨立。簡言之,樸素貝葉斯假定某一特征的出現與其它特征無關。比如說,如果一個水果它是紅色的,圓狀的,直徑大概7cm左右,我們可能猜測它為蘋果。即使這些特征之間存在一定關系,在樸素貝葉斯算法中我們都認為紅色,圓狀和直徑在判斷一個水果是蘋果的可能性上是相互獨立的。
樸素貝葉斯的模型易于建造,并且在分析大量數據問題時效率很高。雖然模型簡單,但很多情況下工作得比非常復雜的分類方法還要好。
貝葉斯理論告訴我們如何從先驗概率P(c),P(x)和條件概率P(x|c)中計算后驗概率P(c|x)。算法如下:
P(c|x)是已知特征x而分類為c的后驗概率。P(c)是種類c的先驗概率。P(x|c)是種類c具有特征x的可能性。P(x)是特征x的先驗概率。
例子:
以下這組訓練集包括了天氣變量和目標變量“是否出去玩”。我們現在需要根據天氣情況將人們分為兩組:玩或不玩。整個過程按照如下步驟進行:
步驟1:根據已知數據做頻率表步驟2:計算各個情況的概率制作概率表。比如陰天(Overcast)的概率為0.29,此時玩的概率為0.64.
步驟3:用樸素貝葉斯計算每種天氣情況下玩和不玩的后驗概率。概率大的結果為預測值。
提問:
天氣晴朗的情況下(sunny),人們會玩。這句陳述是否正確?我們可以用上述方法回答這個問題。P(Yes|Sunny)=P(Sunny|Yes)*P(Yes)/P(Sunny)。
這里,P(Sunny|Yes)=3/9=0.33,P(Sunny)=5/14=0.36,P(Yes)=9/14=0.64。那么,P(Yes|Sunny)=0.33*0.64/0.36=0.60>0.5,說明這個概率值更大。
當有多種類別和多種特征時,預測的方法相似。樸素貝葉斯通常用于文本分類和多類別分類問題。Python代碼#ImportLibraryfromsklearn.naive_bayesimportGaussianNB#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#CreateSVMclassificationobjectmodel=GaussianNB()#thereisotherdistributionformultinomialclasseslikeBernoulliNaiveBayes,Referlink#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)#PredictOutputpredicted=model.predict(x_test)R代碼library(e1071)x<-cbind(x_train,y_train)#Fittingmodelfit<-naiveBayes(y_train~.,data=x)summary(fit)#PredictOutputpredicted=predict(fit,x_test)
6.KNN(K-鄰近算法)這個算法既可以解決分類問題,也可以用于回歸問題,但工業(yè)上用于分類的情況更多。KNN先記錄所有已知數據,再利用一個距離函數,找出已知數據中距離未知事件最近的K組數據,最后按照這K組數據里最常見的類別預測該事件。
距離函數可以是歐式距離,曼哈頓距離,閔氏距離(MinkowskiDistance),和漢明距離(HammingDistance)。前三種用于連續(xù)變量,漢明距離用于分類變量。如果K=1,那問題就簡化為根據最近的數據分類。K值的選取時常是KNN建模里的關鍵。
KNN在生活中的運用很多。比如,如果你想了解一個不認識的人,你可能就會從這個人的好朋友和圈子中了解他的信息。
在用KNN前你需要考慮到:KNN的計算成本很高所有特征應該標準化數量級,否則數量級大的特征在計算距離上會有偏移。在進行KNN前預處理數據,例如去除異常值,噪音等。Python代碼#ImportLibraryfromsklearn.neighborsimportKNeighborsClassifier#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#CreateKNeighborsclassifierobjectmodelKNeighborsClassifier(n_neighbors=6)#defaultvalueforn_neighborsis5#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)#PredictOutputpredicted=model.predict(x_test)R代碼library(knn)x<-cbind(x_train,y_train)#Fittingmodelfit<-knn(y_train~.,data=x,k=5)summary(fit)#PredictOutputpredicted=predict(fit,x_test)
7.K均值算法(K-Means)這是一種解決聚類問題的非監(jiān)督式學習算法。這個方法簡單地利用了一定數量的集群(假設K個集群)對給定數據進行分類。同一集群內的數據點是同類的,不同集群的數據點不同類。
還記得你是怎樣從墨水漬中辨認形狀的么?K均值算法的過程類似,你也要通過觀察集群形狀和分布來判斷集群數量!
K均值算法如何劃分集群:從每個集群中選取K個數據點作為質心(centroids)。將每一個數據點與距離自己最近的質心劃分在同一集群,即生成K個新集群。找出新集群的質心,這樣就有了新的質心。重復2和3,直到結果收斂,即不再有新的質心出現。
怎樣確定K的值:如果我們在每個集群中計算集群中所有點到質心的距離平方和,再將不同集群的距離平方和相加,我們就得到了這個集群方案的總平方和。
我們知道,隨著集群數量的增加,總平方和會減少。但是如果用總平方和對K作圖,你會發(fā)現在某個K值之前總平方和急速減少,但在這個K值之后減少的幅度大大降低,這個值就是最佳的集群數。Python代碼#ImportLibraryfromsklearn.clusterimportKMeans#Assumedyouhave,X(attributes)fortrainingdatasetandx_test(attributes)oftest_dataset#CreateKNeighborsclassifierobjectmodelk_means=KMeans(n_clusters=3,random_state=0)#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X)#PredictOutputpredicted=model.predict(x_test)R代碼library(cluster)fit<-kmeans(X,3)#5clustersolution
8.隨機森林隨機森林是對決策樹集合的特有名稱。隨機森林里我們有多個決策樹(所以叫“森林”)。為了給一個新的觀察值分類,根據它的特征,每一個決策樹都會給出一個分類。隨機森林算法選出投票最多的分類作為分類結果。
怎樣生成決策樹:如果訓練集中有N種類別,則有重復地隨機選取N個樣本。這些樣本將組成培養(yǎng)決策樹的訓練集。如果有M個特征變量,那么選取數m<<M,從而在每個節(jié)點上隨機選取m個特征變量來分割該節(jié)點。m在整個森林養(yǎng)成中保持不變。每個決策樹都最大程度上進行分割,沒有剪枝。
比較決策樹和調節(jié)模型參數可以獲取更多該算法細節(jié)。我建議讀者閱讀這些文章:IntroductiontoRandomforest–SimplifiedComparingaCARTmodeltoRandomForest(Part1)ComparingaRandomForesttoaCARTmodel(Part2)TuningtheparametersofyourRandomForestmodelPython代碼#ImportLibraryfromsklearn.ensembleimportRandomForestClassifier#Assumedyouhave,X(predictor)andY(target)fortrainingdatasetandx_test(predictor)oftest_dataset#CreateRandomForestobjectmodel=RandomForestClassifier()#Trainthemodelusingthetrainingsetsandcheckscoremodel.fit(X,y)#PredictOutputpredicted=model.predict(x_test)R代碼library(randomForest)x<-cbind(x_train,y_train)#Fittingmodelfit<-randomForest(Species~.,x,ntree=500)summary(fit)#PredictOutputpredicted=predict(fit,x_test)
9.降維算法(DimensionalityReductionAlgorithms)在過去的4-5年里,可獲取的數據幾乎以指數形式增長。公司/政府機構/研究組織不僅有了更多的數據來源,也獲得了更多維度的數據信息。
例如:電子商務公司有了顧客更多的細節(jié)信息,像個人信息,網絡瀏覽歷史,個人喜惡,購買記錄,反饋信息等,他們關注你的私人特征,比你天天去的超市里的店員更了解你。
作為一名數據科學家,我們手上的數據有非常多的特征。雖然這聽起來有利于建立更強大精準的模型,但它們有時候反倒也是建模中的一大難題。怎樣才能從1000或2000個變量里找到最重要的變量呢?這種情況下降維算法及其他算法,如決策樹,隨機森林,PCA,因子分析,相關矩陣,和缺省值比例等,就能幫我們解決難題。
進一步的了解可以閱讀BeginnersGuideToLearnDimensionReductionTechniques。
Python代碼更多信息在這里#ImportLibraryfromsklearnimportdecomposition#Assumedyouhavetrainingandtestdatasetastrainandtest#CreatePCAobejectpca=decomposition.PCA(n_components=k)#defaultvalueofk=min(n_sample,n_features)#ForFactoranalysis#fa=decomposition.FactorAnalysis()#ReducedthedimensionoftrainingdatasetusingPCAtrain_reduced=pca.fit_transform(train)#Reducedthedimensionoftestdatasettest_reduced=pca.transform(test)R代碼library(stat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度拓展訓練場地與高校合作教育項目協(xié)議
- 二零二五年度物流運輸企業(yè)員工入職保密協(xié)議及供應鏈保護
- 2025年度高端定制酒定制生產合同
- 二零二五年度足療中心員工勞動合同范本
- 2025年度終止勞動合同協(xié)議書:SS企業(yè)員工TT合同終止及離職手續(xù)辦理協(xié)議
- 二零二五年度醫(yī)療援助項目醫(yī)生聘用協(xié)議
- 二零二五年度口腔診所負責人侵權責任免除與賠償處理合同
- 二零二五年度上市公司股份回購退股協(xié)議
- 2025年度高科技園區(qū)土地租賃服務協(xié)議
- 二零二五年度房屋租賃合同租賃物能源消耗管理補充協(xié)議
- 大學生安全教育課件(ppt共41張)
- 初中物理人教版八年級下冊 第1節(jié)牛頓第一定律 課件
- 網站培訓內容trswcm65表單選件用戶手冊
- 監(jiān)理大綱(范本)
- 空調系統(tǒng)維保記錄表格模板
- 打印版-圓與二次函數綜合題精練(帶答案)
- 工程結算書標準
- 氧氣管道吹掃方案(共7頁)
- JJG-943-2011-總懸浮顆粒物采樣器
- 2018年湖北省襄陽市中考物理試卷
- 波程差與光程差
評論
0/150
提交評論