簡介
根據機器學習的任務或應用情況的不同,我們通常把機器學習分為三大類:
1、監督學習(Supervised Learning,SL),這類算法的工作原理是使用帶标簽的訓練資料來學習輸入變量

轉化為輸出變量
的映射函數,換句話說就是求解方程
。進一步地,監督學習又可細分為如下三類:
- 回歸(Regression):預測一個值,如預測降雨量、房價等,較基礎的算法有:Linear Regression
- 分類(Classification):預測一個标簽,如預測“生病”或“健康”,圖檔上是哪種動物等,較基礎的算法有:Logistic Regression、Naive Bayes、K-Nearest Neighbors(KNN)
【另】:內建(Ensembling)也可以歸類為監督學習的一種,它将多個單獨較弱的機器學習模型的預測結合起來,以産生更準确的預測,較基礎的算法有Bagging with Random Forests、Boosting with XGBoost
2、非監督學習(Unsupervised Learning,UL),這類算法的工作原理是從無标簽的訓練資料中學習資料的底層結構。進一步地,非監督學習又可細分為如下三類:
- 關聯(Association):發現集合中項目同時出現的機率,如通過分析超市購物籃,發現啤酒總是和尿片一起購買(啤酒與尿片的故事),較基礎的算法有:Apriori
- 聚類(Clustering):對資料進行分組,以便組内對象比組間對象更相似,較基礎的算法有:K-Means
- 降維(Dimensionality Reduction):減少資料集的變量數量,同時保證重要的資訊不被丢失。降維可以通過特征提取方法和特征選擇方法來實作,特征提取是執行從高維空間到低維空間的轉換,特征選擇是選擇原始變量的子集,較基礎的算法有:PCA
3、強化學習(Reinforcement Learning,DL),讓agent根據目前環境狀态,通過學習能夠獲得最大回報的行為來決定下一步的最佳行為。
實作
以上列出的算法都是簡單常用的,基于scikit-learn可以僅用幾行代碼就完成模型訓練、預測、評估和可視化。關于算法的原理知乎上有很多精彩的回答,這裡不會贅述,僅給出代碼的實作與可視化。
▐ Linear Regression
它為變量配置設定最佳權重,以建立一條直線或一個平面或更高維的超平面,使得預測值和真實值之間的誤差最小化。具體原理參考:用人話講明白線性回歸LinearRegression - 化簡可得的文章 - 知乎。下面以一進制線性回歸為例,給出代碼實作。
▐ Logistic Regression
雖然寫着回歸,但實際上是一種二分類算法。它将資料拟合到logit函數中,是以稱為logit回歸。簡單來說就是基于一組給定的變量,用logistic function來預測這個事件的機率,給出一個介于0和1之間的輸出。具體原理參考:用人話講明白邏輯回歸Logistic regression - 化簡可得的文章 - 知乎,下面給出代碼的實作。
▐ Naive Bayes
樸素貝葉斯是一種基于貝葉斯定理的分類方法,它會假設一個類中的某個特征與其他特征無關。這個模型不僅非常簡單,而且比許多高度複雜的分類方法表現得更好。具體原理參考:樸素貝葉斯算法原理小結 - 劉建平Pinard,下面給出代碼的實作。
▐ K-Nearest Neighbors
這是用于分類和回歸的機器學習算法(主要用于分類)。它考慮了不同的質心,并使用歐幾裡得函數來比較距離。接着分析結果并将每個點分類到組中,以優化它,使其與所有最接近的點一起放置。它使用k個最近鄰的多數票對資料進行分類預測。具體原來參考:K近鄰法(KNN)原理小結 - 劉建平Pinard,下面給出代碼的實作。
▐ Decision Tree
周遊樹,并将重要特征與确定的條件語句進行比較。它是降到左邊的子分支還是降到右邊的子分支取決于結果。通常,更重要的特性更接近根,它可以處理離散變量和連續變量。具體原理參考:深入淺出了解決策樹算法(一)-核心思想 - 憶臻的文章 - 知乎,下面給出代碼的實作。
▐ Random Forest
随機森林是決策樹的集合。随機采樣資料點構造樹、随機采樣特征子集分割,每棵樹提供一個分類。得票最多的分類在森林中獲勝,為資料點的最終分類。具體原來參考:獨家 | 一文讀懂随機森林的解釋和實作 - 清華大學資料科學研究院的文章 - 知乎,下面給出代碼的實作。
▐ Support Vector Machines
它将資料映射為空間中的點,使得不同類别的點可以被盡可能寬的間隔分隔開,對于待預測類别的資料,先将其映射至同一空間,并根據它落在間隔的哪一側來得到對應的類别。具體原來參考:看了這篇文章你還不懂SVM你就來打我 - SMON的文章 - 知乎,下面給出代碼實作。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification
# SVMfrom sklearn import svm# 1. 準備資料svm_X_train, svm_y_train = make_classification(n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1, n_classes=4)# 2. 構造訓練與測試集l, r = svm_X_train[:, 0].min() - 1, svm_X_train[:, 0].max() + 1b, t = svm_X_train[:, 1].min() - 1,svm_X_train[:, 1].max() + 1n = 1000grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))svm_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 訓練模型# svm_model = RandomForestClassifier(max_depth=4)svm_model = svm.SVC(kernel='rbf', gamma=1, C=0.0001).fit(svm_X_train, svm_y_train)svm_model.fit(svm_X_train, svm_y_train)# 4. 預測資料svm_y_pred = svm_model.predict(svm_X_test)# 5. 可視化grid_z = svm_y_pred.reshape(grid_x.shape)plt.figure('SVM')plt.title('SVM')plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')plt.scatter(svm_X_train[:, 0], svm_X_train[:, 1], s=30, c=svm_y_train, cmap='pink')plt.show()
▐ K-Means
将資料劃分到K個聚類簇中,使得每個資料點都屬于離它最近的均值(即聚類中心,centroid)對應的集聚類簇。最終,具有較高相似度的資料對象劃分至同一類簇,将具有較高相異度的資料對象劃分至不同類簇。具體原理參考:用人話講明白快速聚類kmeans - 化簡可得的文章 - 知乎,下面給出代碼的實作。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets.samples_generator import make_blobs
# K-means 任務為聚類 n_classes=5from sklearn.cluster import KMeans
# 1. 準備資料kmeans_X_data, kmeans_y_data = make_blobs(n_samples=500, centers=5, cluster_std=0.60, random_state=0)# 2. 訓練模型kmeans_model = KMeans(n_clusters=5)kmeans_model.fit(kmeans_X_data)# 3. 預測模型kmeans_y_pred = kmeans_model.predict(kmeans_X_data)# 4. 可視化plt.figure('K-Means')plt.title('K-Means')plt.scatter(kmeans_X_data[:,0], kmeans_X_data[:, 1], s=50)plt.scatter(kmeans_X_data[:, 0], kmeans_X_data[:, 1], c=kmeans_y_pred, s=50, cmap='viridis')centers = kmeans_model.cluster_centers_plt.scatter(centers[:,0], centers[:, 1], c='red', s=80, marker='x')plt.show()
▐ PCA
一種常用的降維技術,顧名思義,PCA幫助我們找出資料的主要成分,主成分基本上是線性不相關的向量,用選出的k個主成分來表示資料,來達到降維的目的。具體原理參考:如何通俗易懂地講解什麼是 PCA 主成分分析?- 馬同學的回答 - 知乎,下面給出代碼實作。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification
# PCAfrom sklearn.decomposition import PCAfrom sklearn.datasets import load_iris
# 1. 準備資料pca_data=load_iris()pca_X_data=pca_data.datapca_y_data=pca_data.target# 2. 訓練模型, 次元為2pca_model=PCA(n_components=2) # 3. 降維reduced_X=pca_model.fit_transform(pca_X_data)# 4. 可視化red_x,red_y=[],[]blue_x,blue_y=[],[]green_x,green_y=[],[]
for i in range(len(reduced_X)): if pca_y_data[i] ==0: red_x.append(reduced_X[i][0]) red_y.append(reduced_X[i][1]) elif pca_y_data[i]==1: blue_x.append(reduced_X[i][0]) blue_y.append(reduced_X[i][1]) else: green_x.append(reduced_X[i][0]) green_y.append(reduced_X[i][1])
plt.figure('PCA')plt.title('PCA')plt.scatter(red_x,red_y,c='r')plt.scatter(blue_x,blue_y,c='b')plt.scatter(green_x,green_y,c='g')plt.show()
總結
至此,給出了常有的9種機器學習算法的實作,題主可以通過一些實際案例去進一步了解和熟悉算法。國外的Kaggle和阿裡雲天池都是擷取項目經驗的好途徑。
推薦閱讀:
https://zhuanlan.zhihu.com/p/72513104 https://zhuanlan.zhihu.com/p/139122386 https://www.cnblogs.com/pinard/p/6069267.html https://www.cnblogs.com/pinard/p/6061661.html https://zhuanlan.zhihu.com/p/26703300 https://zhuanlan.zhihu.com/p/51165358 https://zhuanlan.zhihu.com/p/49331510 https://zhuanlan.zhihu.com/p/75477709 https://www.zhihu.com/question/41120789/answer/481966094