首頁>技術>

陳雷慧(豆苗) 淘系技術

簡介

根據機器學習的任務或應用情況的不同,我們通常把機器學習分為三大類:

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 - 化簡可得的文章 - 知乎。下面以一元線性迴歸為例,給出程式碼實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasetsfrom sklearn.model_selection import train_test_split# Linear Regression 一元迴歸from sklearn import linear_modelfrom sklearn.metrics import mean_squared_error# 1. 準備資料lr_X_data, lr_y_data = datasets.make_regression(n_samples=500,n_features=1,n_targets=1,noise=2) # feature為1維度# 2. 構造訓練與測試集lr_X_train, lr_X_test, lr_y_train, lr_y_test = train_test_split(lr_X_data, lr_y_data, test_size=0.3)# 3. 訓練模型lr_model = linear_model.LinearRegression()lr_model.fit(lr_X_train, lr_y_train)# 4. 預測資料lr_y_pred = lr_model.predict(lr_X_test)# 5. 評估模型lr_mse = mean_squared_error(lr_y_test, lr_y_pred)print("mse:", lr_mse)# 6. 視覺化plt.figure('Linear Regression')plt.title('Linear Regression')plt.scatter(lr_X_test, lr_y_test, color='lavender', marker='o')plt.plot(lr_X_test, lr_y_pred, color='pink', linewidth=3)plt.show()# print info mse: 4.131366697554779
▐ Logistic Regression

雖然寫著迴歸,但實際上是一種二分類演算法。它將資料擬合到logit函式中,所以稱為logit迴歸。簡單來說就是基於一組給定的變數,用logistic function來預測這個事件的機率,給出一個介於0和1之間的輸出。具體原理參考:用人話講明白邏輯迴歸Logistic regression - 化簡可得的文章 - 知乎,下面給出程式碼的實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasetsfrom sklearn.model_selection import train_test_split# Logistic Regression 二分類from sklearn import linear_model# 1. 準備資料np.random.seed(123)logit_X_data = np.random.normal(size=1000)logit_y_data = (logit_X_data>0).astype(np.float)logit_X_data[logit_X_data>0]*=5logit_X_data+=.4*np.random.normal(size=1000)logit_X_data=logit_X_data[:,np.newaxis]# 2. 構造訓練與測試集logit_X_train, logit_X_test, logit_y_train, logit_y_test = train_test_split(logit_X_data, logit_y_data, test_size=0.3)# 3. 訓練模型logit_model=linear_model.LogisticRegression(C=1e4) #classifierlogit_model.fit(logit_X_train,logit_y_train)# 4. 預測資料logit_y_pred = logit_model.predict(logit_X_test)# 5. 評估模型logit_acc = logit_model.score(logit_X_test,logit_y_pred)print("accuracy:", logit_acc)# 5. 視覺化logit_X_view=np.linspace(-7,7,277)logit_X_view = logit_X_view[:,np.newaxis]def model(x):    return 1/(1+np.exp(-x))loss=model(logit_X_view*logit_model.coef_+logit_model.intercept_).ravel()plt.figure('Logistic Regression')plt.title('Logistic Regression')plt.scatter(logit_X_train.ravel(), logit_y_train, color='lavender',zorder=17)plt.plot(logit_X_view, loss, color='pink',linewidth=3)lr_model=linear_model.LinearRegression()lr_model.fit(logit_X_train,logit_y_train)plt.plot(logit_X_view, lr_model.predict(logit_X_view), color='blue', linewidth=3)plt.legend(('Logistic Regression','Linear Regression'),loc='lower right',fontsize='small')# print info accuracy: 1.0
▐ Naive Bayes

樸素貝葉斯是一種基於貝葉斯定理的分類方法,它會假設一個類中的某個特徵與其他特徵無關。這個模型不僅非常簡單,而且比許多高度複雜的分類方法表現得更好。具體原理參考:樸素貝葉斯演算法原理小結 - 劉建平Pinard,下面給出程式碼的實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification# Naive Bayes 任務為分類, n_classes=4import sklearn.naive_bayes as nb# 1. 準備資料nb_X_train, nb_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 = nb_X_train[:, 0].min() - 1, nb_X_train[:, 0].max() + 1b, t = nb_X_train[:, 1].min() - 1, nb_X_train[:, 1].max() + 1n = 1000grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))nb_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 訓練模型nb_model = nb.GaussianNB()nb_model.fit(nb_X_train, nb_y_train)# 4. 預測資料nb_y_pred = nb_model.predict(nb_X_test)# 5. 視覺化grid_z = nb_y_pred.reshape(grid_x.shape)plt.figure('Naive Bayes')plt.title('Naive Bayes')plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')plt.scatter(nb_X_train[:, 0], nb_X_train[:, 1], s=30, c=nb_y_train, cmap='pink')plt.show()
▐ K-Nearest Neighbors

這是用於分類和迴歸的機器學習演算法(主要用於分類)。它考慮了不同的質心,並使用歐幾里得函式來比較距離。接著分析結果並將每個點分類到組中,以最佳化它,使其與所有最接近的點一起放置。它使用k個最近鄰的多數票對資料進行分類預測。具體原來參考:K近鄰法(KNN)原理小結 - 劉建平Pinard,下面給出程式碼的實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification# Naive Bayes 任務為分類, n_classes=4import sklearn.naive_bayes as nb# 1. 準備資料nb_X_train, nb_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 = nb_X_train[:, 0].min() - 1, nb_X_train[:, 0].max() + 1b, t = nb_X_train[:, 1].min() - 1, nb_X_train[:, 1].max() + 1n = 1000grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))nb_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 訓練模型nb_model = nb.GaussianNB()nb_model.fit(nb_X_train, nb_y_train)# 4. 預測資料nb_y_pred = nb_model.predict(nb_X_test)# 5. 視覺化grid_z = nb_y_pred.reshape(grid_x.shape)plt.figure('Naive Bayes')plt.title('Naive Bayes')plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')plt.scatter(nb_X_train[:, 0], nb_X_train[:, 1], s=30, c=nb_y_train, cmap='pink')plt.show()
▐ Decision Tree

遍歷樹,並將重要特徵與確定的條件語句進行比較。它是降到左邊的子分支還是降到右邊的子分支取決於結果。通常,更重要的特性更接近根,它可以處理離散變數和連續變數。具體原理參考:深入淺出理解決策樹演算法(一)-核心思想 - 憶臻的文章 - 知乎,下面給出程式碼的實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification# K-Nearest Neighbors 任務為分類, n_classes=4from sklearn.neighbors import KNeighborsClassifier# 1. 準備資料knn_X_train, knn_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 = knn_X_train[:, 0].min() - 1, knn_X_train[:, 0].max() + 1b, t = knn_X_train[:, 1].min() - 1, knn_X_train[:, 1].max() + 1n = 1000grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))knn_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 訓練模型knn_model = KNeighborsClassifier(n_neighbors=5)knn_model.fit(knn_X_train, knn_y_train)# 4. 預測資料knn_y_pred = knn_model.predict(knn_X_test)# 5. 視覺化grid_z = knn_y_pred.reshape(grid_x.shape)plt.figure('K-Nearest Neighbors')plt.title('K-Nearest Neighbors')plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')plt.scatter(knn_X_train[:, 0], knn_X_train[:, 1], s=30, c=knn_y_train, cmap='pink')plt.show()
▐ Random Forest

隨機森林是決策樹的集合。隨機取樣資料點構造樹、隨機取樣特徵子集分割,每棵樹提供一個分類。得票最多的分類在森林中獲勝,為資料點的最終分類。具體原來參考:獨家 | 一文讀懂隨機森林的解釋和實現 - 清華大學資料科學研究院的文章 - 知乎,下面給出程式碼的實現。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_classification# Decision Treefrom sklearn.tree import DecisionTreeClassifier# 1. 準備資料dt_X_train, dt_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 = dt_X_train[:, 0].min() - 1, dt_X_train[:, 0].max() + 1b, t = dt_X_train[:, 1].min() - 1, dt_X_train[:, 1].max() + 1n = 1000grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))dt_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 訓練模型dt_model = DecisionTreeClassifier(max_depth=4)dt_model.fit(dt_X_train, dt_y_train)# 4. 預測資料dt_y_pred = dt_model.predict(dt_X_test)# 5. 視覺化grid_z = dt_y_pred.reshape(grid_x.shape)plt.figure('Decision Tree')plt.title('Decision Tree')plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')plt.scatter(dt_X_train[:, 0], dt_X_train[:, 1], s=30, c=dt_y_train, cmap='pink')plt.show()
▐ 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和阿里雲天池都是獲取專案經驗的好途徑。

20
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • ELK 效能最佳化實踐