91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用python實現KNN分類器

發布時間:2021-12-27 13:57:58 來源:億速云 閱讀:218 作者:iii 欄目:大數據

這篇文章主要介紹“怎么用python實現KNN分類器”,在日常操作中,相信很多人在怎么用python實現KNN分類器問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用python實現KNN分類器”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

什么是監督學習?

監督學習是指:利用一組已知類別的樣本調整分類器的參數,使其達到所要求性能的過程,也稱為監督訓練或有教師學習。

監督學習是從標記的訓練數據來推斷一個功能的機器學習任務。訓練數據包括一套訓練示例。在監督學習中,每個實例都是由一個輸入對象(通常為向量)和一個期望的輸出值(也稱為監督信號)組成。監督學習算法是分析該訓練數據,并產生一個推斷的功能,其可以用于映射出新的實例。一個最佳的方案將允許該算法來正確地決定那些看不見的實例的類標簽。

舉個例子會更清楚

這是一個數據集,包含一些水果樣本的質量、寬度、高度和顏色分數。

怎么用python實現KNN分類器

目的是訓練一個模型,如果我們在模型中輸入質量、寬度、高度和顏色分數,模型就可以讓我們知道水果的名稱。例如,如果我們輸入一個水果的質量、寬度、高度和顏色分數分別設置為175、7.3、7.2、0.61,模型應該將水果的名稱輸出為蘋果。

在這里,質量、寬度、高度和顏色分數是輸入特征(X)。水果的名稱是輸出變量或標簽(y)。

這個例子對你來說可能聽起來很傻。但這是在監督機器學習模型中使用的機制。

稍后我將用一個真實的數據集展示一個實際的例子。

KNN分類器

KNN分類器是基于記憶的機器學習模型的一個例子。

這意味著這個模型會記住訓練示例,然后他們用它來分類以前從未見過的對象。

KNN分類器的k是為了預測一個新的測試實例而檢索的訓練樣本數。

KNN分類器分三步工作

  1. 當給它一個新的實例或實例進行分類時,它將檢索之前記憶的訓練樣本,并從中找出最近的樣本的k個數。

  2. 然后分類器查找最近的例子的k個數字的標簽(上面例子中水果的名稱)。

  3. 最后,該模型結合這些標簽進行預測。通常,它會預測標簽最多的那個。例如,如果我們選擇k為5,在最近的5個例子中,如果我們有3個橘子和2個蘋果,那么新實例的預測值將是橘子。

資料準備

在開始之前,我建議你檢查計算機中是否有以下可用資源:

  1. Numpy 庫

  2. Pandas 庫

  3. Matplotlib 庫

  4. Scikit-Learn 庫

  5. Jupyter Notebook

如果你沒有安裝Jupyter Notebook,你可以選擇其他筆記本。我建議你可以使用谷歌公司的Colab。

谷歌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() 給出數據集的前五行。我們只打印前五行以檢查數據集。

怎么用python實現KNN分類器

看第二列。它包含的信息,如果人活了下來。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數據幀的外觀:

怎么用python實現KNN分類器

我們的目標是根據泰坦尼克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()

怎么用python實現KNN分類器

分析上面的圖表

在一開始,當n_neighbors 為1、2或3時,訓練準確率遠遠高于測試準確率。所以,這個模型正遭受著過擬合的困擾。

在那之后,訓練和測試的準確性變得更接近了。這是最佳選擇。我們想要這個。

但當n_neighbors變得更多時,訓練和測試集的精確度都在下降。我們不需要這個。

從上面的圖中可以看出,這個特定數據集和模型的理想n_neighbors 應該是6或7。

這是一個很好的分類器!

看上面的圖表!當n_neighbors 為7時,訓練和測試的準確率均在80%以上。

到此,關于“怎么用python實現KNN分類器”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

濮阳市| 宜州市| 玉环县| 和平区| 唐海县| 赣州市| 扬州市| 逊克县| 屏东县| 南开区| 湛江市| 宝应县| 弥渡县| 来安县| 沙田区| 休宁县| 盐亭县| 辛集市| 烟台市| 曲沃县| 奉新县| 富顺县| 嘉义市| 阿荣旗| 东阿县| 巫溪县| 昂仁县| 大埔区| 泾川县| 同心县| 宜川县| 白朗县| 康定县| 祁阳县| 舞阳县| 勃利县| 土默特右旗| 重庆市| 隆昌县| 柳河县| 祁连县|