Python 中的 K 近鄰演算法


介紹

K 近鄰是一種強大且簡單的技術,用於解決與分類和迴歸相關的問題。它根據輸入樣本進行預測,並檢查樣本之間的相似度。在本篇文章中,我們將解釋 k-NN 技術以及 Python 的實現,並介紹兩種不同的方法。為了確保對這種著名技術的清晰理解,我們將提供逐步說明,並附帶可執行程式碼和結果。

K 近鄰演算法

K 近鄰 (k-NN) 演算法是一種監督機器學習 (ML) 技術,用於解決分類和迴歸問題。它的基本原理是,相似的例項通常會產生相似的結果。給定一個新的輸入,該演算法會找到 k 個最接近的訓練示例,並根據這些樣本的標籤(分類)或平均值(迴歸)來確定要預測的類別或值。

語法

兩種方法的語法相似。這裡我們將使用 scikit-learn 庫,它可以幫助在 Python 中開發 k-NN 方法。根據使用者的需求,有兩種不同的方法。如果使用者想要執行分類任務,他/她可以使用 KNeighborsClassifier;如果使用者想要預測數值部分,他/她可以使用 KNeighborsRegressor。

1. 分類 -

from sklearn.neighbors import KNeighborsClassifier

# Create an instance of the k-NN classifier
knn = KNeighborsClassifier(n_neighbors=k)

# Train the classifier using the training data
knn.fit(X_train, y_train)

# Make predictions on new data
predictions = knn.predict(X_test)

2. 迴歸 -

from sklearn.neighbors import KNeighborsRegressor

# Create an instance of the k-NN regressor
knn = KNeighborsRegressor(n_neighbors=k)

# Train the regressor using the training data
knn.fit(X_train, y_train)

# Make predictions on new data
predictions = knn.predict(X_test)

上面的程式碼使用 k 表示要考慮的鄰居數量,X_train 和 y_train 表示訓練特徵和標籤,X_test 表示要進行預測的新資料。

語法說明

  • 從 sklearn.neighbors 包中匯入相關的類。

  • 透過定義 k-NN 分類器或迴歸器的要考慮的鄰居數量,可以建立一個例項。

  • 使用 fit() 函式和訓練集來訓練分類器或迴歸器。

  • 最後,使用 predict() 方法生成預測,並提供更新的資料。

演算法

  • 步驟 1 - 載入資料:- 將資料集讀取或載入到 Python 環境中。

  • 步驟 2 - 拆分資料:- 將資料集劃分為訓練集和測試集,以評估演算法的有效性。

  • 步驟 3 - 預處理資料:- 執行任何必要的預處理步驟,例如縮放或標準化,以確保資料表示的一致性。

  • 步驟 4 - 訓練 k-NN 模型:- 使用訓練資料建立 k-NN 分類器或迴歸器的例項。

  • 步驟 5 - 評估模型:- 根據測試集進行預測,然後使用適當的指標(如準確率或均方誤差)來評估模型的效能。

方法

  • 方法 1 - k-NN 分類示例

  • 方法 2 - k-NN 迴歸示例

方法 1:k-NN 分類示例

讓我們看一下 k-NN 分類在現實世界中的應用,根據鳶尾花的花萼和花瓣的尺寸來識別鳶尾花的種類。在本演示中,我們將使用著名的鳶尾花資料集。

示例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# Create an instance of the k-NN classifier
knn = KNeighborsClassifier(n_neighbors=3)

# Train the classifier using the training data
knn.fit(X_train, y_train)

# Make predictions on the testing set
predictions = knn.predict(X_test)

# Calculate and print the accuracy of the model
accuracy = accuracy_score(y_test, predictions)
print("Accuracy:", accuracy)

輸出

Accuracy: 1.0

在方法 1 中,載入鳶尾花資料集,將其劃分為訓練集和測試集,並建立具有 n_neighbors=3 的 k-NN 分類器例項。

使用訓練資料集來訓練分類器,然後使用測試集進行預測。

為了確定模型的準確性,我們將預測的標籤與實際標籤進行比較。在本例中,輸出顯示模型的準確率為 1.0 或 100%。這意味著 k-NN 分類器在識別測試集中鳶尾花種類的準確率為 100%。

方法 2:k-NN 迴歸示例

讓我們使用波士頓房價資料集作為迴歸示例,來預測自住房的中位數價格。對於此任務,我們將使用 k-NN 迴歸器。

示例

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error

# Load the Boston Housing dataset
boston = load_boston()

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)

# Create an instance of the k-NN regressor
knn = KNeighborsRegressor(n_neighbors=5)

# Train the regressor using the training data
knn.fit(X_train, y_train)

# Make predictions on the testing set
predictions = knn.predict(X_test)

# Calculate and print the mean squared error of the model
mse = mean_squared_error(y_test, predictions)
print("Mean Squared Error:", mse)

輸出

Mean Squared Error: 30.137858823529412

在方法 2 中,載入波士頓房價資料集,將其劃分為訓練集和測試集,並建立具有 n_neighbors=5 的 k-NN 迴歸器例項。

通常,我們使用訓練資料集(也稱為訓練集)來訓練演算法,然後使用此訓練集透過 k-NN 演算法進行預測。

最後,我們比較預測值和實際值以獲得模型的均方誤差。輸出顯示模型的均方誤差 (MSE),在本例中約為 30.1379。MSE 是測試集中真實值與預測的自住房中位數之間的平均平方差。在本例中,較低的得分表示更準確的迴歸模型,因為較低的 MSE 表示更好的效能。建立 KNeighborsRegressor 例項時使用的 n_neighbors 引數值以及用於將資料劃分為訓練集和測試集的隨機狀態將決定均方誤差的確切值。

結論

K 近鄰 (k-NN) 演算法是一種靈活且流行的機器學習方法。它對於涉及分類和迴歸的問題特別有用。本文介紹了 k-NN 技術的基礎知識、它在 Python 中的語法以及有關如何實現它的詳細說明。我們還研究了兩種使用 k-NN 進行分類和迴歸的方法,並附帶完整的可執行程式碼和結果。通過了解它及其有益的應用,您可以將 k-NN 演算法用作解決各種機器學習問題的強大工具。

更新於: 2023年10月13日

183 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.