監督學習和kNN分類初學者教程

2021-02-19 磐創AI

作者 | Behic Guven 

編譯 | VK 

來源 | Towards Data Science

在這篇文章中,我將向你介紹一種稱為監督學習的機器學習方法。我將向你展示如何使用Scikit-learn構建kNN分類器模型。

這將是一個實踐演練,我們將能夠在實踐知識的同時學習。作為我們的分類器模型,我們將使用k-NN算法模型,這將在引言部分進行更多介紹。作為程式語言,我們將使用Python。

閱讀本教程後,你將更好地了解深度學習和監督學習模型的工作原理。

目錄監督學習

深度學習是一門科學,它使計算機能夠在沒有明確編程的情況下從數據中得出結論。比如學會預測電子郵件是否是垃圾郵件。另一個很好的例子是通過觀察花的圖片將它們分為不同的類別。

在監督學習中,數據分為兩部分:特徵和目標變量。任務是通過觀察特徵變量來預測目標變量。監督學習可用於兩種不同的模型:分類和回歸

當目標變量是分類數據集時,可以使用分類模型。

當目標變量是連續值時,使用回歸模型。

在這一步中,我們將安裝本教程所需的庫。正如引言中提到深度學習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近鄰分類器

在庫步驟中,我們已經在庫步驟中導入了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模塊創建了一個監督學習分類器。我們還學習了如何檢查分類器模型的性能。我們還學習了過擬合和欠擬合,這使我們能夠改進預測。深度學習是如此有趣和神奇。我將分享更多深入學習的文章。敬請期待!

掃碼看好書,滿100減50超值優惠活動等你哦

✄---

看到這裡,說明你喜歡這篇文章,請點擊「在看」或順手「轉發」「點讚」。

歡迎微信搜索「panchuangxx」,添加小編磐小小仙微信,每日朋友圈更新一篇高質量推文(無廣告),為您提供更多精彩內容。

相關焦點

  • 監督學習、非監督學習和強化學習
    一板一眼的大兒子:監督學習他性格單純,做事踏實。但是很多事你必須先要和他解釋很多次,他才有足夠的判斷力作出決定。比如今天你帶他來到公園,為了讓他了解什麼是植物,你指著楊樹、柳樹、灌木叢和草地說:「看,這些都是植物」,然後指著汽車、房子和路燈說這些不是植物。
  • 吳恩達《Machine Learning》精煉筆記 1:監督學習與非監督學習
    課程中沒有複雜的公式推導和理論分析,讓機器學習初學者能夠快速對整個機器學習知識點有比較整體的認識,便於快速入門。今天帶來第一周課程的筆記:監督式學習和非監督式學習。主要內容:監督學習和無監督學習單變量線性回歸問題代價函數梯度下降算法1-1.
  • 從零開始學Python【33】--KNN分類回歸模型(實戰部分)
    Python中的sklearn模塊提供了有關KNN算法實現分類和預測的功能,該功能存在於子模塊neighbors中。為了將KNN算法的理論知識應用到實戰中,接下來將利用這兩個「類」作分類和預測分析。KNN模型的分類功能對於分類問題的解決,將使用Knowledge數據集作為演示,該數據集來自於UCI主頁(http://archive.ics.uci.edu/ml/datasets.html)。
  • KNN算法(三)-sklearn實現
    分類模型,並根據輸入的數據點來預測鳶尾花的類別。2.創建分類器使用KNeighborsClassifier創建分類器,不設置參數n_neighbors:from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier()
  • 機器學習(二)-------KNN算法的sklearn KNN實踐
    一.Skelarn KNN參數概述要使用sklearnKNN算法進行分類,我們需要先了解sklearnKNN算法的一些基本參數,那麼這節就先介紹這些內容吧。= KNeighborsClassifier(n_neighbors=k) #cv參數決定數據集劃分比例,這裡是按照5:1劃分訓練集和測試集 scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy') k_error.append(1 - scores.mean())#畫圖,x
  • 推薦 :R語言中K鄰近算法的初學者指南(從菜鳥到大神-附代碼&連結)
    在機器學習的世界裡,我發現K鄰近算法(KNN)分類器是最直觀、最容易上手的,甚至不需要引入任何數學符號。為了決定觀測樣本的標籤,我們觀察它的鄰近樣本們並把鄰近樣本們的標籤貼給感興趣的觀測樣本。當然,觀察一個鄰近樣本可能會產生偏差和錯誤,KNN方法就制定了一系列的規則和流程來決定最優化的鄰近樣本數量,比如,檢驗k>1的鄰近樣本並且採納取大多數的規則來決定分類。
  • 多標籤分類和多輸出分類
    而在某些情況下,你希望分類器為每個實例產出多個類別。例如,人臉識別的分類器:如果在一張照片裡識別出多個人怎麼辦?當然,應該為識別出來的每個人都附上一個標籤。假設分類器經過訓練,已經可以識別出三張臉——愛麗絲、鮑勃和查理,那麼當看到一張愛麗絲和查理的照片時,它應該輸出[1,0,1](意思是「是愛麗絲,不是鮑勃,是查理」)這種輸出多個二元標籤的分類系統稱為多標籤分類系統。
  • KNN算法的R語言實現
    KNN(K-Nearest Neighbor或者K-最近鄰)算法是回歸和分類問題當中一個非常基本和重要的算法。簡要介紹參見貝葉斯分類器及其若干實現算法的原理。文中使用數據來自UCI機器學習網站https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic),數據為乳腺癌的診斷數據,響應變量為是否患乳腺癌,自變量為乳腺腫塊的數字特徵。原始數據第一列為編號,將其刪除。
  • 深度學習基礎(八):使用scikit-learn進行多類分類
    問題–給定一個包含m個訓練示例的數據集,每個樣本包含各種功能形式的信息和標籤。每個標籤對應於一個訓練示例所屬的類。在多類分類中,我們有一組有限的類。每個訓練示例還具有n個功能。有關如何安裝和使用sci-kit learning的信息,請訪問http://scikit-learn.org/stable/方法從源加載數據集。將數據集分為「訓練」和「測試」數據。訓練數據上的訓練決策樹,SVM和KNN分類器。使用以上分類器來預測測試數據的標籤。
  • KNN:最容易理解的分類算法
    KNN是一種分類算法,其全稱為k-nearest neighbors, 所以也叫作K近鄰算法。
  • R VS Python —— KNN
    本文的主要內容就是針對經典的Breast Cancer Wisconsin (Diagnostic)數據,分別通過R和Python兩種語言去實現KNN分類算法。創建了訓練集、測試集和訓練集標籤、測試集標籤。
  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。這裡我們總結一下,對於一個機器學習一般有如下套路:導包並查看數據形狀以及基本信息,例如樣本個數,欄位,標籤(目標值)等信息使用mold section下的train_test_split方法拆分數據集。
  • KNN算法原理及代碼實現
    如果我們有很多藍色點和紅色點數據,使用不同K值,最終的分類效果大概如下圖。我們發現隨著K值的增大,分界面越來越平滑。一般在機器學習中我們要將數據集分為訓練集和測試集,用訓練集訓練模型,再用測試集評價模型效果。這裡我們繪製了不同k值下模型準確率。從上圖中我們發現當k=1和k=無窮大時,KNN的誤差都很大。
  • TensorFlow入門教程和示例(包括v1和v2)
    學習TensorFlow的同學不要錯過。本教程旨在通過示例輕鬆地深入TensorFlow。
  • HTML5初學者福利!11個在線學習網站推薦
    在這裡,文章作者Abhishek Thakur以自己長時間的實踐經驗,篩選出來11個在線學習HTML5開發的資源網站,讓HTML5的學習可以跟隨自己的節奏進行,不再那麼困難。學習HTML5的網站和博客無論學習什麼語言,最開始的當然是要從基礎學起。如果你是一個對HTML5一無所知的初學者,那麼以下的幾個網站絕對不容錯過。
  • 淺談圖上的自監督學習——對比學習
    ,對其中「Contrastive Learning」的內容進行一些解讀,包括一些自監督學習的思路。個人拙見,原因可能與圖學習的任務有關,圖學習的任務主要集中在分類上(節點分類、圖分類),對比學習天然會比生成學習更適用於分類任務,所以或許當生成滿足某種性質的隨機圖任務成為主流之後,生成式模型就會成為主流。而對抗式(Adversarial)的學習,則會在生成式學習、對比式學習都達到瓶頸時,得到更好的發展。目前,在圖領域,並未看到Adversarial Learning有驚人表現的文章。
  • 機器學習(一)-------KNN算法
    一.KNN算法概述KNN可以說是最簡單的分類算法之一,同時,它也是最常用的分類算法之一,注意KNN算法是有監督學習中的分類算法,它看起來和另一個機器學習算法
  • 半監督深度學習小結:類協同訓練和一致性正則化
    作者丨陳家銘學校丨中山大學碩士生研究方向丨半監督深度圖像分類協同訓練 Co-trainingCo-training 是基於分歧的方法,其假設每個數據可以從不同的角度(view)進行分類,不同角度可以訓練出不同的分類器,然後用這些從不同角度訓練出來的分類器對無標籤樣本進行分類,再選出認為可信的無標籤樣本加入訓練集中。
  • 【無監督學習最新研究】簡單的「圖像旋轉」預測,為圖像特徵學習提供強大監督信號
    例如,在PASCAL VOC 2007檢測任務中,我們的無監督預訓練的AlexNet模型達到了54.4%的 最先進的性能表現(在無監督的方法中),比監督學習的情況下僅少了2.4個百分點。當我們將無監督的學習特徵遷移到其他任務上時,我們得到了同樣的驚人結果,例如ImageNet分類、PASCAL分類、PASCAL分割和CIFAR-10分類。
  • 無監督學習的魅力
    無監督學習是機器學習算法裡非常撲朔迷離的一個類別,負責解決這些「沒有真實值 (no-ground-truth) 」的數據。本文會講到,無監督學習到底是什麼,和機器學習的其他算法有何本質區別,用的時候有哪些難點,以及推薦閱讀的傳送門。最簡單的理解方式,就是把算法想像成考試。