Liz's Blog

Python學習筆記#14:機器學習之KNN實作篇

| Comments

這篇KNN學習,上課教授邏輯和之前學R KNN篇差不多,加上是個很單純的演算法,稍微複習一下邏輯迴歸篇就可以很快上手了。

Udemy
課程名稱:Python for Data Science and Machine Learning Bootcamp
講師:Jose Portilla

KNN(K Nearest Neighbors)屬於分類演算法的一種,處理原則也非常單純。一開始先儲存所有的變數資料,預測的作法為:計算所有資料點到x的距離,隨著遠離x的距離開始分類資料,最後再預測k值範圍內最主要的標籤。優點在於非常簡單,適用於任何類別,需要的參數少。缺點在於高預測費、不適用多維度資料及類別變數。

1.載入套件

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

2.匯入資料(但所有變數名稱皆是隱藏,但需要預測最後TARGET CLASS是哪個)

#index_col=0設定第一行為index
df = pd.read_csv('Classified Data',index_col=0)
df.head()

3.由於KNN分類法是藉由確認最近的觀察值來預測分類,因此變數的比例就會影響很大。

#載入標準化比例尺(StandardScaler)套件
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(df.drop('TARGET CLASS',axis=1))
scaled_features = scaler.transform(df.drop('TARGET CLASS',axis=1))
df_feat = pd.DataFrame(scaled_features,columns=df.columns[:-1])
df_feat.head()

4.將資料分成訓練組及測試組

from sklearn.model_selection import train_test_split

X = df_feat
y = df['TARGET CLASS']
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.30,random_state=101)

5.使用KNN演算法

from sklearn.neighbors import KNeighborsClassifier

#從k值=1開始測試
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
pred = knn.predict(X_test)

6.測試KNN演算法的好壞

from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(y_test,pred))
print(classification_report(y_test,pred))

7.剛剛只先用了k=1來建立模型,現在利用for loop來建立迴圈,選擇k值

error_rate = []

for i in range(1,60):
    
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)
    pred_i = knn.predict(X_test)
    error_rate.append(np.mean(pred_i != y_test))


#將k=1~60的錯誤率製圖畫出。k=23之後,錯誤率就在5%-6%之間震盪,
plt.figure(figsize=(10,6))
plt.plot(range(1,60),error_rate,color='blue', linestyle='dashed', marker='o',
         markerfacecolor='red', markersize=10)
plt.title('Error Rate vs. K Value')
plt.xlabel('K')
plt.ylabel('Error Rate')

8.跟一開始k=1做比較

knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(X_train,y_train)
pred = knn.predict(X_test)

print('WITH K=1')
print('\n')
print(confusion_matrix(y_test,pred))
print('\n')
print(classification_report(y_test,pred))

9.擇錯誤率最低的K=40來看precision、recall、f1-score、support表現

knn = KNeighborsClassifier(n_neighbors=40)

knn.fit(X_train,y_train)
pred = knn.predict(X_test)

print('WITH K=40')
print('\n')
print(confusion_matrix(y_test,pred))
print('\n')
print(classification_report(y_test,pred))

Comments

comments powered by Disqus