k邻近算法python代码_Python实现K近邻算法

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()

数据展示.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

# 创建接收交叉检验结果均值列表

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)

准确率.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

你可能感兴趣的:(k邻近算法python代码)