鄰近算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。判斷鄰居就是用向量距離大小來刻畫。
算法流程
缺點
import numpy as np import matplotlib.pyplot as plt #繪圖 import pandas as pd
再導入數據集
以excel格式為例,我的iris目標文件存儲在
"D://test_knn"中
url = "D://test_knn./iris.csv" #url path # Assign column names to the dataset names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class'] # Read dataset to pandas dataframe dataset = pd.read_csv(url, names=names)
可以用下面函數檢驗導入是否成功
dataset.head() #默認讀取前五行
輸出結果如下:
sepal-length sepal-width petal-length petal-width Class 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosa
2.Preprocessing the dataset 數據預處理
x= dataset.iloc[:, :-1].values #x 屬性 #第一個冒號是所有列,第二個是所有行,除了最后一個(Purchased) y = dataset.iloc[:, 4].values #y 標簽 # 只取最后一個作為依賴變量。
3.Train Test Split
把數據划分成訓練集和測試集
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
80%的數據划分到訓練集,20%的數據划分到測試集
4.Feature scaling
from sklearn.preprocessing import StandardScaler #導入庫 這個不知道可以去查查用法 scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test)
5.Training and Predictions 訓練預測
from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors=5) # k=5 classifier.fit(X_train, y_train)
y_pred=classifier.predict(X_test)
6.Evaluating the algorithm
from sklearn.metrics import classification_report, confusion_matrix print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))
預期輸出結果如下:
The output of the above script looks like this: [[11 0 0] 0 13 0] 0 1 6]] precision recall f1-score support Iris-setosa 1.00 1.00 1.00 11 Iris-versicolor 1.00 1.00 1.00 13 Iris-virginica 1.00 1.00 1.00 6
avg/total 1.00 1.00 1.00 30
7.Comparing Error Rate with the K Value
把各種可能的k的取值,及其對應的分類誤差率(error rate)繪制在一張圖上。
error = [] # Calculating error for K values between 1 and 40 for i in range(1, 40): knn = KNeighborsClassifier(n_neighbors=i) knn.fit(X_train, y_train) pred_i = knn.predict(X_test) error.append(np.mean(pred_i != y_test))
plt.figure(figsize=(12, 6)) plt.plot(range(1, 40), error, color='red', linestyle='dashed', marker='o', markerfacecolor='blue', markersize=10) plt.title('Error Rate K Value') plt.xlabel('K Value') plt.ylabel('Mean Error')
輸出結果預期如下:
至此, 這套knn算法就實現了,現在體會到python工具包的強大了,好多底層的算法都不需要自己寫函數實現。
搜了一下用C實現knn,代碼很繁瑣,但是很直觀,每一步干什么很清楚。python寫的話呢,如果對這些庫不熟悉,那就很頭禿了,需要一個一個函數查它的用法,不過,如果真的掌握了可以更快更輕松地實現。就是這樣子了!
剛開始做的時候看到一堆代碼,一臉懵逼,感覺在看文言文一樣。其實只要耐心看,真的只是了解一點庫函數用法,算法本身思想很簡單!
第一個機器學習算法筆記,開心!