做者|Behic Guven
編譯|VK
來源|Towards Data Sciencehtml
在這篇文章中,我將向你介紹一種稱爲監督學習的機器學習方法。我將向你展現如何使用Scikit-learn構建kNN分類器模型。python
這將是一個實踐演練,咱們將可以在實踐知識的同時學習。做爲咱們的分類器模型,咱們將使用k-NN算法模型,這將在引言部分進行更多介紹。做爲編程語言,咱們將使用Python。git
閱讀本教程後,你將更好地瞭解深度學習和監督學習模型的工做原理。算法
監督學習編程
庫bash
瞭解數據dom
kNN分類器模型機器學習
過擬合與欠擬合編程語言
結論ide
深度學習是一門科學,它使計算機可以在沒有明確編程的狀況下從數據中得出結論。好比學會預測電子郵件是不是垃圾郵件。另外一個很好的例子是經過觀察花的圖片將它們分爲不一樣的類別。
在監督學習中,數據分爲兩部分:特徵和目標變量。任務是經過觀察特徵變量來預測目標變量。監督學習可用於兩種不一樣的模型:分類和迴歸
當目標變量是分類數據集時,可使用分類模型。
當目標變量是連續值時,使用迴歸模型。
在這一步中,咱們將安裝本教程所需的庫。正如引言中提到深度學習lib庫的主要知識庫。除此以外,咱們將安裝兩個簡單的庫,它們是NumPy和Matplotlib。使用PIP(python包管理器)能夠很容易地安裝庫。
進入終端窗口,開始安裝過程:
pip install scikit-learn
如今讓咱們安裝其餘兩個庫:
pip install numpy matplotlib
很完美!如今讓咱們將它們導入到咱們的程序中,以便使用它們。我將在本教程中使用Jupyter Notebook。所以,我建立了一個新的Notebook並導入瞭如下庫模塊。
from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import numpy as np
在本練習中,咱們將使用數字數據。它也被稱爲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()
在庫步驟中,咱們已經在庫步驟中導入了k-NN分類器模塊。因此,咱們要作的就是在咱們的數據集中使用它。這一步是在項目中使用sklearn模塊的一個很好的練習。由於咱們正在進行監督學習,因此數據集必須被標記。這意味着在訓練數據時,咱們也傳遞結果。
k-最近鄰算法(k-NN)是一種用於分類和迴歸的非參數方法。在這兩種狀況下,輸入由特徵空間中k個最近的訓練樣本組成。輸出取決於k-NN是用於分類仍是迴歸。」(參考:https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)
咱們從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_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模塊建立了一個監督學習分類器。咱們還學習瞭如何檢查分類器模型的性能。咱們還學習了過擬合和欠擬合,這使咱們可以改進預測。深度學習是如此有趣和神奇。我將分享更多深刻學習的文章。敬請期待!
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/