K近鄰算法大概是最簡單使用的一種分類算法,本次主要是應用Python的Scikit-learn庫中的KNeigborsClassifier類和Pandas的Dataframe進行快速實現KN近鄰算法。
數據使用的是《Python數據挖掘入門與實踐》一書中用到的電離層(Ionosphere)數據,本次代碼并無創(chuàng)新,只是在相比作者代碼,數據導入部分相對簡單。
數據導入
import pandas as pd
import numpy as np
# 讀取數據,字段名分別用x0-x34代表,且不以第一列為索引
data = pd.read_csv('ionosphere_data.txt',header=None,names=['x'+str(i) for i in range(35)],index_col=False)
# 將最后一列的列名改為‘y’
data = data.rename(columns={'x34':'y'})
data.round(3).head()

數據展示.png
y列數據轉化
因變量y包含兩個值分別為‘b’和‘g’,即bad和good,將其轉化為可用來進行數據分析的數值型變量0和1
y_dict = {
'g':1,
'b':0,
}
data.y = data.y.map(y_dict)

轉化后的數據.png
將自變量數據和因變量數據分割
X_data = data.iloc[:,:-1]
y_data = data.iloc[:,-1]
進行K近鄰算法訓練
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import cross_val_score
# 創(chuàng)建接收交叉檢驗結果均值列表
avg_scores = []
# 創(chuàng)建接收交叉檢驗結果的列表
all_scores = []
# 創(chuàng)建一個1-20的列表
para_values = list(range(1,21))
# 遍歷傳參交叉檢驗
for n_neighbors in para_values:
# 創(chuàng)建K近鄰估計對象
estimator = KNeighborsClassifier(n_neighbors=n_neighbors)
# 采用交叉檢驗進行多次估計,返回準確率列表
scores = cross_val_score(estimator, X_data, y_data, scoring='accuracy')
# 將準確率列表均值存入avg_scores
avg_scores.append(np.mean(scores))
# 將返回準確率存入all_scores
all_scores.append(scores)
# 遍歷展示每次的準確率均值
for i in avg_scores:
print('%.3f' % i)

準確率.png
由此看設置不同的近鄰數量的K近鄰訓練后的交叉檢驗準確率基本在80%左右
圖表展示
%matplotlib inline
from matplotlib import pyplot as plt
plt.plot(para_values,avg_scores,'--o')

線性圖.png
for parameter, scores in zip(para_values, all_scores):
n_scores = len(scores)
# print(parameter,n_scores,scores)
plt.plot([parameter] * 3, scores, '-o')

點線圖.png
plt.plot(para_values, all_scores, 'bx')

散點圖.png