K近邻算法大概是最简单使用的一种分类算法,本次主要是应用Python的Scikit-learn库中的KNeigborsClassifier类和Pandas的Dataframe进行快速实现KN近邻算法。
数据使用的是《Python数据挖掘入门与实践》一书中用到的电离层(Ionosphere)数据,本次代码并无创新,只是在相比作者代码,数据导入部分相对简单。
数据导入
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()
y列数据转化
因变量y包含两个值分别为‘b’和‘g’,即bad和good,将其转化为可用来进行数据分析的数值型变量0和1
y_dict = {
'g':1,
'b':0,
}
data.y = data.y.map(y_dict)
将自变量数据和因变量数据分割
X_data = data.iloc[:,:-1]
y_data = data.iloc[:,-1]
进行K近邻算法训练
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import cross_val_score
# 创建接收交叉检验结果均值列表
avg_scores = []
# 创建接收交叉检验结果的列表
all_scores = []
# 创建一个1-20的列表
para_values = list(range(1,21))
# 遍历传参交叉检验
for n_neighbors in para_values:
# 创建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)
由此看设置不同的近邻数量的K近邻训练后的交叉检验准确率基本在80%左右
图表展示
%matplotlib inline
from matplotlib import pyplot as plt
plt.plot(para_values,avg_scores,'--o')
for parameter, scores in zip(para_values, all_scores):
n_scores = len(scores)
# print(parameter,n_scores,scores)
plt.plot([parameter] * 3, scores, '-o')
plt.plot(para_values, all_scores, 'bx')