本文將介紹一種稱為監督學習的機器學習方法。我將向你展示如何使用Scikit learn構建和最佳化kNN(k Nearest Neightbor)分類器模型。這將是一個實踐演練,我們能夠在學習的同時實踐。
我們將使用k-NN演算法模型作為分類器模型,並使用Python作為程式語言。
透過本教程,我們將更好地瞭解機器學習以及如何實現監督學習分類器模型。
目錄監督學習步驟1-庫步驟2-瞭解資料步驟3-kNN分類器模型如何改善-過擬合和欠擬合結尾監督學習機器學習是一門使計算機能夠在沒有明確程式設計的情況下從資料中得出結論的科學。例如,學習預測電子郵件是否是垃圾郵件。另一個很好的例子是,透過觀察花卉的圖片,將它們分為不同的類別。以下兩張圖表顯示了有監督和無監督學習之間的對比。
在監督學習中,資料分為兩部分:特徵和目標變數。任務是透過觀察特徵變數來預測目標變數。監督學習可用於兩種不同的模型:分類和迴歸:
當目標變數是離散的,可以使用分類模型。當目標變數是連續的,使用迴歸模型。步驟1-庫在這一步中,我們將安裝本教程所需的庫。其中包括引言中提到機器學習庫的主要的庫。除此之外,我們將安裝兩個簡單的庫,它們是NumPy和Matplotlib。
安裝庫我們轉到終端視窗,輸入以下命令開始安裝過程:
pip install scikit-learn
現在安裝另外兩個庫:
pip install numpy matplotlib
匯入庫
完美!現在將它們匯入到我們的程式中,以便使用。
在本教程中,我將使用Jupyter筆記本。因此,我建立了一個新筆記本並匯入了以下庫模組。在接下來的步驟中使用它們時,你將瞭解它們每一個的作用。
from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_splitimport matplotlib.pyplot as plt import numpy as np
步驟2-瞭解資料在本練習中,我們將使用數字資料。它也被稱為MNIST。這是一個著名的資料開始建立監督學習模型。這些資料的好處是我們不需要下載任何東西;它在我們之前安裝的sklearn模組附帶了。下面是載入資料集的方式:
digits = datasets.load_digits()
現在,讓我們試著瞭解一下執行幾行的資料集。
print(digits.keys)
Bunch是一個Python字典,提供屬性樣式訪問。Bunch就像一個物件和一個字典。
print(digits.DESCR)
plt.imshow(digits.images[1010], cmap=plt.cm.gray_r, interpolation='nearest') plt.show()
步驟3-K近鄰分類器
在庫步驟中,我們已經匯入了k-NN分類器模組。所以,我們要做的就是在資料集上使用它。
這一步是在專案中使用現成的sklearn模組的一個很好的練習。因為我們是在進行監督學習,所以必須對資料集進行標記。這意味著在訓練資料的同時,我們也在教授結果。
k近鄰演算法(k-NN)是由thomascover提出的一種用於分類和迴歸的非引數方法。在這兩種情況下,輸入由特徵空間中k個最接近的訓練樣本組成。輸出取決於k-NN是用於分類還是用於迴歸。
特徵和目標變數我們從sklearn資料集中匯入的數字資料有兩個屬性,即data和target。首先將這些部分分配給新變數。我們將特徵(資料)稱為X,標籤(目標)稱為y:
X = digits.data y = digits.target
拆分資料
接下來,我們將使用train_test_split方法來分割資料。與其訓練整個資料,不如將其分成訓練和測試資料,以檢查模型的準確性。
# test_size是將成為測試資料的比率,其餘將是訓練資料X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42, stratify=y)
定義分類器
knn = KNeighborsClassifier(n_neighbors = 7)
模型擬合
knn.fit(X_train, y_train)
準確度得分
print(knn.score(X_test, y_test))
這個分數是怎麼計算的呢?首先,我們利用knn模型對X_test進行預測。然後把它和實際的標籤進行比較,也就是y_test。以下是如何實際計算準確率的程式碼:
y_pred = knn.predict(X_test)number_of_equal_elements = np.sum(y_pred==y_test)number_of_equal_elements/y_pred.shape[0]
如何改善:過擬合和欠擬合
本節的重點是改進你的模型並找到正確的引數來建立完美的監督學習模型。下面是我在Amazon機器學習文件中發現的關於模型過擬合和欠擬合的一個很好的解釋:
當模型在訓練資料上表現不佳時,模型對訓練資料的擬合不足。這是因為模型無法捕獲輸入示例(特徵)和目標值(標籤)之間的關係。
當你看到模型在訓練資料上表現良好,但在評估資料上表現不佳時,該模型過擬合了你的訓練資料。這是因為該模型是在記憶它所看到的資料,無法推廣到看不見的例子。(參考:https://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-underfitting-vs-overfitting.html)
現在編寫一個for迴圈,它將幫助我們瞭解資料在不同鄰居值中的效能。這個函式還將幫助我們分析模型的最佳效能,這意味著更準確的預測。
neighbors = np.arange(1, 9)train_accuracy = np.empty(len(neighbors))test_accuracy = np.empty(len(neighbors))for i, k in enumerate(neighbors): # 定義knn分類器 knn = KNeighborsClassifier(n_neighbors = k) # 擬合 knn.fit(X_train, y_train) # 計算訓練集的精度 train_accuracy[i] = knn.score(X_train, y_train) # 測試集的計算精度 test_accuracy[i] = knn.score(X_test, y_test)
現在我們繪製結果圖:
plt.title('k-NN: Performance by Number of Neighbors') plt.plot(neighbors, test_accuracy, label = 'Testing Accuracy') plt.plot(neighbors, train_accuracy, label = 'Training Accuracy') plt.legend() plt.xlabel('# of Neighbors') plt.ylabel('Accuracy')plt.show()
這個圖證明,鄰居越多並不意味著效能越好。當然,這主要取決於模型和資料。在我們的例子中,可以看到測試精度是最高的1-3鄰居。之前,我們用7個鄰居訓練了knn模型,得到的準確度得分是0.983。
所以,現在我們知道模型在有兩個鄰居的情況下效能更好。重新研究一下模型,看看我們的預測會發生什麼變化。
knn = KNeighborsClassifier(n_neighbors = 2) knn.fit(X_train, y_train)print(knn.score(X_test, y_test))
結尾完美!你已經使用scikit-learn模組建立了一個監督學習分類器。我們還學習瞭如何檢查分類器模型的效能,以及過擬合和欠擬合,這使我們能夠改進預測。