作者|Rashida Nasrin Sucky
編譯|VK
來源|Towards Data Science
KNN分類器是一種非常流行的監督機器學習技術,本文將用一個例子來解釋KNN分類器
什么是監督學習?
以下是百度百科:
監督學習是指:利用一組已知類別的樣本調整分類器的引數,使其達到所要求性能的程序,也稱為監督訓練或有教師學習,
監督學習是從標記的訓練資料來推斷一個功能的機器學習任務,訓練資料包括一套訓練示例,在監督學習中,每個實體都是由一個輸入物件(通常為向量)和一個期望的輸出值(也稱為監督信號)組成,監督學習演算法是分析該訓練資料,并產生一個推斷的功能,其可以用于映射出新的實體,一個最佳的方案將允許該演算法來正確地決定那些看不見的實體的類標簽,
舉個例子會更清楚
這是一個資料集,包含一些水果樣本的質量、寬度、高度和顏色分數,

目的是訓練一個模型,如果我們在模型中輸入質量、寬度、高度和顏色分數,模型就可以讓我們知道水果的名稱,例如,如果我們輸入一個水果的質量、寬度、高度和顏色分數分別設定為175、7.3、7.2、0.61,模型應該將水果的名稱輸出為蘋果,
在這里,質量、寬度、高度和顏色分數是輸入特征(X),水果的名稱是輸出變數或標簽(y),
這個例子對你來說可能聽起來很傻,但這是在監督機器學習模型中使用的機制,
稍后我將用一個真實的資料集展示一個實際的例子,
KNN分類器
KNN分類器是基于記憶的機器學習模型的一個例子,
這意味著這個模型會記住訓練示例,然后他們用它來分類以前從未見過的物件,
KNN分類器的k是為了預測一個新的測驗實體而檢索的訓練樣本數,
KNN分類器分三步作業:
-
當給它一個新的實體或實體進行分類時,它將檢索之前記憶的訓練樣本,并從中找出最近的樣本的k個數,
-
然后分類器查找最近的例子的k個數字的標簽(上面例子中水果的名稱),
-
最后,該模型結合這些標簽進行預測,通常,它會預測標簽最多的那個,例如,如果我們選擇k為5,在最近的5個例子中,如果我們有3個橘子和2個蘋果,那么新實體的預測值將是橘子,
資料準備
在開始之前,我建議你檢查計算機中是否有以下可用資源:
- Numpy 庫
- Pandas 庫
- Matplotlib 庫
- Scikit-Learn 庫
- Jupyter Notebook
如果你沒有安裝Jupyter Notebook,你可以選擇其他筆記本,我建議你可以使用谷歌公司的Colab,按此鏈接開始:https://colab.research.google.com/notebooks/intro.ipynb#recent=true
谷歌Colab Notebook不是私有的,所以,不要在那里做任何專業或敏感的作業,但對練習來說很棒,因為很多常用的軟體包已經安裝在里面了,
我建議下載資料集,我在頁面底部提供了鏈接,你可以自己運行每一行代碼,
首先,匯入必要的庫:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
在本教程中,我將使用來自Kaggle的泰坦尼克號資料集,我已將此資料集上傳到與我的筆記本相同的檔案夾中,
下面是如何使用pandas匯入資料集,
titanic = pd.read_csv('titanic_data.csv')
titanic.head()
#titaninc.head() 給出資料集的前五行,我們只列印前五行以檢查資料集,

看第二列,它包含的資訊,如果人活了下來,0表示該人幸存,1表示該人沒有存活,
在本教程中,我們的目標是預測“幸存”特征,
為了簡單起見,我將保留一些對演算法更重要的關鍵特征,并去掉其余的,
這個資料集非常簡單,僅僅憑直覺,我們可以看到有些列對于預測“幸存”特征并不重要,
例如,“PassengerId”、“Name”、“Ticket”和“Cabin”似乎對預測乘客是否存活沒有幫助,
我將制作一個具有一些關鍵特征的新資料幀,并將其命名為titanic1,
titanic1 = titanic[['Pclass', 'Sex', 'Fare', 'Survived']]
“Sex”列具有字串值,需要更改該值,因為計算機不懂單詞,它只懂數字,我將把“男”改為0,“女”改為1,
titanic1['Sex'] = titanic1.Sex.replace({'male':0, 'female':1})
以下是titanic1資料幀的外觀:

我們的目標是根據泰坦尼克1號資料幀中的其他資訊預測“幸存”引數,因此,輸出變數或標簽(y)是“幸存”,輸入特征(X)是'P-class'、'Sex'和'Fare',
X = titanic1[['Pclass', 'Sex', 'Fare']]
y = titanic1['Survived']
開發KNN分類器
首先,我們需要將資料集分成兩個集:訓練集和測驗集,
我們將使用訓練集來訓練模型,其中模型將同時記憶輸入特征和輸出變數,
然后,我們將使用測驗集來檢驗模型是否能夠使用“P-class”、“Sex”和“Fare”來預測乘客是否幸存,
“train_test_split”方法將有助于分割資料,默認情況下,此函式使用75%的資料得到訓練集,使用25%的資料得到測驗集,你可以改變它,你可以指定“train_size”或“test_size ”,
如果將train_size設定為0.8,則拆分為80%的訓練資料和20%的測驗資料,但對我來說,默認值75%是好的,所以,我沒有使用train_size或test_size 引數,
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
記住對“random_state”使用相同的值,這樣,每次進行這種拆分時,訓練集和測驗集的資料都是相同的,
我選擇隨機狀態為0,你可以選擇一個數字,
Python的scikit-learn庫已經有了KNN分類器模型,進行匯入,
from sklearn.neighbors import KNeighborsClassifier
將此分類器保存在變數中,
knn = KNeighborsClassifier(n_neighbors = 5)
在這里,n_neighbors是5,
這意味著,當我們要求我們的訓練模型來預測一個新實體的生存概率時,它需要5個最近的訓練資料,
基于這5個訓練資料的標簽,模型將預測新實體的標簽,
現在,我將把訓練資料擬合到模型中,以便模型能夠記住它們,
knn.fit(X_train, y_train)
你可能會認為,當它記住訓練資料時,它可以100%正確地預測訓練特征的標簽,但不一定,為什么?
每當我們給出輸入并要求它預測標簽時,它都會從5個最近的鄰居那里投票,即使它記憶了完全相同的特征,
讓我們看看它在訓練資料上能給我們多大的準確度
knn.score(X_test, y_test)
訓練資料的準確率為0.83或83%,
記住,我們有一個模型從未見過的測驗資料集,現在檢查一下,它能在多大程度上準確地預測測驗資料集的標簽,
knn.score(X_test, y_test)
準確率為0.78%或78%,
結合以上代碼,下面是4行代碼,它們構成了分類器:
knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(X_train, y_train)
knn.score(X_train, y_train)
knn.score(X_test, y_test)
恭喜!你學習了KNN分類器!
注意,訓練集的準確度比測驗集的準確度高一點,
什么是過擬合?
有時,模型對訓練集的學習非常好,可以很好地預測訓練資料集的標簽,但是,當我們要求模型使用測驗資料集或它以前沒有看到的資料集進行預測時,它的性能如果遠遠不如訓練集,這種現象稱為過擬合,
用一句話來說,當訓練集的準確度遠遠高于測驗集的準確度時,我們稱之為過擬合,
預測
如果要查看測驗資料集的預測輸出,請執行以下操作:
輸入:
y_pred = knn.predict(X_test)
y_pred
輸出:
array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,
1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0,
1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1,
0, 1, 1], dtype=int64)
或者你可以只輸入一個例子,然后找到標簽,
我想知道,當一個人乘坐“P-class”=3旅行時,“Sex”是女性,也就是說Sex=1,而且,付了25英鎊的“車費”,她是否能按照我們的模型生存下來,
輸入:
knn.predict([[3, 1, 25]])
記住使用兩個括號,因為它需要一個二維陣列
輸出:
array([0], dtype=int64)
輸出為零,這意味著按照我們訓練過的模型,這個人無法生存,
請隨時嘗試更多不同的輸入,就像這一個一樣,
如果你想進一步分析KNN分類器
KNN分類器對k和n_neighbors的選擇非常敏感,在上面的例子中,我使用了n_neighbors=5,
對于不同的n_neighbors,分類器的性能會有所不同,
讓我們檢查一下它在訓練資料集和測驗資料集上對不同n_neighbors的執行情況,我選1到20,
現在,我們將計算從1到20的每個n_neighbors的訓練集準確率和測驗集準確率
training_accuracy = []
test_accuracy = []
for i in range(1, 21):
knn = KNeighborsClassifier(n_neighbors = i)
knn.fit(X_train, y_train)
training_accuracy.append(knn.score(X_train, y_train))
test_accuracy.append(knn.score(X_test, y_test))
在運行了這個代碼片段之后,我得到了針對不同n_neighbors的訓練和測驗準確度,
現在,讓我們將訓練和測驗集的精確度在同一圖中進行比較,
plt.figure()
plt.plot(range(1, 21), training_accuracy, label='Training Accuarcy')
plt.plot(range(1, 21), test_accuracy, label='Testing Accuarcy')
plt.title('Training Accuracy vs Test Accuracy')
plt.xlabel('n_neighbors')
plt.ylabel('Accuracy')
plt.ylim([0.7, 0.9])
plt.legend(loc='best')
plt.show()

分析上面的圖表
在一開始,當n_neighbors 為1、2或3時,訓練準確率遠遠高于測驗準確率,所以,這個模型正遭受著過擬合的困擾,
在那之后,訓練和測驗的準確性變得更接近了,這是最佳選擇,我們想要這個,
但當n_neighbors變得更多時,訓練和測驗集的精確度都在下降,我們不需要這個,
從上面的圖中可以看出,這個特定資料集和模型的理想n_neighbors 應該是6或7,
這是一個很好的分類器!
看上面的圖表!當n_neighbors 為7時,訓練和測驗的準確率均在80%以上,
以下是完整代碼的鏈接:
https://github.com/rashida048/Few-Machine-Learning-projects/blob/master/knn_with_titanic_data.ipynb
結論
我希望你學會了構建一個很好的KNN分類器,并將在不同的資料集上進行嘗試,
非常感謝你閱讀這篇文章!以下是我在本教程中使用的泰坦尼克號資料集:
https://github.com/rashida048/Few-Machine-Learning-projects/blob/master/knn_with_titanic_data.ipynb
推薦閱讀
-
https://towardsdatascience.com/basic-linear-regression-algorithm-in-python-for-beginners-c519a808b5f8
-
https://towardsdatascience.com/polynomial-regression-from-scratch-in-python-1f34a3a5f373
-
https://towardsdatascience.com/logistic-regression-in-python-to-detect-heart-disease-2892b138d0c0
-
https://towardsdatascience.com/all-the-datasets-you-need-to-practice-data-science-skills-and-make-a-great-portfolio-857a348883b5
-
https://towardsdatascience.com/sort-and-segment-your-data-into-bins-to-get-sorted-ranges-pandas-cut-and-qcut-7785931bbfde
-
https://towardsdatascience.com/series-of-free-courses-to-become-a-data-scientist-3cb9fd591739
原文鏈接:https://towardsdatascience.com/simple-knn-classifier-with-four-lines-of-code-for-beginners-machine-learning-5344d125360f
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/50516.html
標籤:其他
上一篇:Unity觀戰功能求大佬指教
