常用机器学习算法
一般說來,機器學習有三種算法:
1. 監督式學習
監督式學習算法包括一個目標變量(因變量)和用來預測目標變量的預測變量(自變量)。通過這些變量我們可以搭建一個模型,從而對于一個已知的預測變量值,我們可以得到對應的目標變量值。重復訓練這個模型,直到它能在訓練數據集上達到預定的準確度。
屬于監督式學習的算法有:回歸模型,決策樹,隨機森林,K鄰近算法,邏輯回歸等。
2. 無監督式學習
與監督式學習不同的是,無監督學習中我們沒有需要預測或估計的目標變量。無監督式學習是用來對總體對象進行分類的。它在根據某一指標將客戶分類上有廣泛應用。
屬于無監督式學習的算法有:關聯規則,K-means聚類算法等。
3. 強化學習
這個算法可以訓練程序做出某一決定。程序在某一情況下嘗試所有的可能行動,記錄不同行動的結果并試著找出最好的一次嘗試來做決定。
屬于這一類算法的有馬爾可夫決策過程。
常見的機器學習算法
以下是最常用的機器學習算法,大部分數據問題都可以通過它們解決:
1.線性回歸 (Linear Regression)
2.邏輯回歸 (Logistic Regression)
3.決策樹 (Decision Tree)
4.支持向量機(SVM)
5.樸素貝葉斯 (Naive Bayes)
6.K鄰近算法(KNN)
7.K-均值算法(K-means)
8.隨機森林 (Random Forest)
9.降低維度算法(Dimensionality Reduction Algorithms)
10.Gradient Boost和Adaboost算法
1.線性回歸 (Linear Regression)
線性回歸是利用連續性變量來估計實際數值(例如房價,呼叫次數和總銷售額等)。我們通過線性回歸算法找出自變量和因變量間的最佳線性關系,圖形上可以確定一條最佳直線。這條最佳直線就是回歸線。這個回歸關系可以用Y=aX+b 表示。
我們可以假想一個場景來理解線性回歸。比如你讓一個五年級的孩子在不問同學具體體重多少的情況下,把班上的同學按照體重從輕到重排隊。這個孩子會怎么做呢?他有可能會通過觀察大家的身高和體格來排隊。這就是線性回歸!這個孩子其實是認為身高和體格與人的體重有某種相關。而這個關系就像是前一段的Y和X的關系。
在Y=aX+b這個公式里:
Y- 因變量
a- 斜率
X- 自變量
b- 截距
a和b可以通過最小化因變量誤差的平方和得到(最小二乘法)。
下圖中我們得到的線性回歸方程是 y=0.2811X+13.9。通過這個方程,我們可以根據一個人的身高得到他的體重信息。
?
線性回歸主要有兩種:一元線性回歸和多元線性回歸。一元線性回歸只有一個自變量,而多元線性回歸有多個自變量。擬合多元線性回歸的時候,可以利用多項式回歸(Polynomial Regression)或曲線回歸 (Curvilinear Regression)。
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)2.邏輯回歸
別被它的名字迷惑了,邏輯回歸其實是一個分類算法而不是回歸算法。通常是利用已知的自變量來預測一個離散型因變量的值(像二進制值0/1,是/否,真/假)。簡單來說,它就是通過擬合一個邏輯函數(logit fuction)來預測一個事件發生的概率。所以它預測的是一個概率值,自然,它的輸出值應該在0到1之間。
同樣,我們可以用一個例子來理解這個算法。
假設你的一個朋友讓你回答一道題。可能的結果只有兩種:你答對了或沒有答對。為了研究你最擅長的題目領域,你做了各種領域的題目。那么這個研究的結果可能是這樣的:如果是一道十年級的三角函數題,你有70%的可能性能解出它。但如果是一道五年級的歷史題,你會的概率可能只有30%。邏輯回歸就是給你這樣的概率結果。
回到數學上,事件結果的勝算對數(log odds)可以用預測變量的線性組合來描述:
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)延伸:
以下是一些可以嘗試的優化模型的方法:
-
加入交互項(interaction)
-
減少特征變量
-
正則化(regularization)
-
使用非線性模型
3.決策樹
這是我最喜歡也是能經常使用到的算法。它屬于監督式學習,常用來解決分類問題。令人驚訝的是,它既可以運用于類別變量(categorical variables)也可以作用于連續變量。這個算法可以讓我們把一個總體分為兩個或多個群組。分組根據能夠區分總體的最重要的特征變量/自變量進行。
Python 代碼
#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)4. 支持向量機(SVM)
這是一個分類算法。在這個算法中我們將每一個數據作為一個點在一個n維空間上作圖(n是特征數),每一個特征值就代表對應坐標值的大小。比如說我們有兩個特征:一個人的身高和發長。我們可以將這兩個變量在一個二維空間上作圖,圖上的每個點都有兩個坐標值(這些坐標軸也叫做支持向量)。
現在我們要在圖中找到一條直線能最大程度將不同組的點分開。兩組數據中距離這條線最近的點到這條線的距離都應該是最遠的。
在上圖中,黑色的線就是最佳分割線。因為這條線到兩組中距它最近的點,點A和B的距離都是最遠的。任何其他線必然會使得到其中一個點的距離比這個距離近。這樣根據數據點分布在這條線的哪一邊,我們就可以將數據歸類。
Python 代碼
#Import Library from sklearn import svm #Assumed you have, X (predictor) 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)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的先驗概率。
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)6.KNN(K-鄰近算法)
這個算法既可以解決分類問題,也可以用于回歸問題,但工業上用于分類的情況更多。 KNN先記錄所有已知數據,再利用一個距離函數,找出已知數據中距離未知事件最近的K組數據,最后按照這K組數據里最常見的類別預測該事件。
距離函數可以是歐式距離,曼哈頓距離,閔氏距離 (Minkowski Distance), 和漢明距離(Hamming Distance)。前三種用于連續變量,漢明距離用于分類變量。如果K=1,那問題就簡化為根據最近的數據分類。K值的選取時常是KNN建模里的關鍵。
KNN在生活中的運用很多。比如,如果你想了解一個不認識的人,你可能就會從這個人的好朋友和圈子中了解他的信息。
在用KNN前你需要考慮到:
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)7. K均值算法(K-Means)
這是一種解決聚類問題的非監督式學習算法。這個方法簡單地利用了一定數量的集群(假設K個集群)對給定數據進行分類。同一集群內的數據點是同類的,不同集群的數據點不同類。
K均值算法如何劃分集群:
從每個集群中選取K個數據點作為質心(centroids)。
將每一個數據點與距離自己最近的質心劃分在同一集群,即生成K個新集群。
找出新集群的質心,這樣就有了新的質心。
重復2和3,直到結果收斂,即不再有新的質心出現。
怎樣確定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)8.隨機森林
隨機森林是對決策樹集合的特有名稱。隨機森林里我們有多個決策樹(所以叫“森林”)。為了給一個新的觀察值分類,根據它的特征,每一個決策樹都會給出一個分類。隨機森林算法選出投票最多的分類作為分類結果。
怎樣生成決策樹:
如果訓練集中有N種類別,則有重復地隨機選取N個樣本。這些樣本將組成培養決策樹的訓練集。
如果有M個特征變量,那么選取數m << M,從而在每個節點上隨機選取m個特征變量來分割該節點。m在整個森林養成中保持不變。
每個決策樹都最大程度上進行分割,沒有剪枝。
比較決策樹和調節模型參數可以獲取更多該算法細節。我建議讀者閱讀這些文章:
Introduction to Random forest – Simplified
Comparing a CART model to Random Forest (Part 1)
Comparing a Random Forest to a CART model (Part 2)
Tuning the parameters of your Random Forest model
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)9.降維算法(Dimensionality Reduction Algorithms)
在過去的4-5年里,可獲取的數據幾乎以指數形式增長。公司/政府機構/研究組織不僅有了更多的數據來源,也獲得了更多維度的數據信息。
例如:電子商務公司有了顧客更多的細節信息,像個人信息,網絡瀏覽歷史,個人喜惡,購買記錄,反饋信息等,他們關注你的私人特征,比你天天去的超市里的店員更了解你。
作為一名數據科學家,我們手上的數據有非常多的特征。雖然這聽起來有利于建立更強大精準的模型,但它們有時候反倒也是建模中的一大難題。怎樣才能從1000或2000個變量里找到最重要的變量呢?這種情況下降維算法及其他算法,如決策樹,隨機森林,PCA,因子分析,相關矩陣,和缺省值比例等,就能幫我們解決難題。
進一步的了解可以閱讀Beginners Guide To Learn Dimension Reduction Techniques。
Python 代碼
#Import Library from sklearn import decomposition #Assumed you have training and test data set as train and test # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) # For Factor analysis #fa= decomposition.FactorAnalysis() # Reduced the dimension of training dataset using PCA train_reduced = pca.fit_transform(train)#Reduced the dimension of test dataset test_reduced = pca.transform(test)0.Gradient Boosing 和 AdaBoost
GBM和AdaBoost都是在有大量數據時提高預測準確度的boosting算法。Boosting是一種集成學習方法。它通過有序結合多個較弱的分類器/估測器的估計結果來提高預測準確度。這些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等數據科學競賽中有出色發揮。
更多閱讀: Know about Gradient and AdaBoost in detail
Python 代碼
#Import Library from sklearn.ensemble import GradientBoostingClassifier #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create Gradient Boosting Classifier object model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)# Train the model using the training sets and check score model.fit(X, y) #Predict Output predicted= model.predict(x_test)?
原文:https://blog.csdn.net/han_xiaoyang/article/details/51191386
轉載于:https://www.cnblogs.com/USTC-ZCC/p/10015382.html
總結
- 上一篇: go语言编程小游戏--贪吃蛇
- 下一篇: Go Web:URLs