kNN算法-直接调用sklearn库函数

sklearn库中kNN调用

上一节讲解了手写kNN算法实现手写数字识别系统,但是在实际应用中并不需要自己手写kNN,可以直接调用sklearn库中封装好的方法,这一节通过数据库中鸢尾花的数据集来练习手写kNN算法以及调用sklearn库中的kNN算法。

话不多说,直接上代码


数据集

首先讲解一下鸢尾花数据集,以后会经常用到。

鸢尾花有四个特征:sepal length、sepal width、petal length、petal width

分为三类:0 表示iris setosa、1 表示 iris versicolor、2 表示 iris virginica

# 导包
from sklearn import datasets
import matplotlib.pyplot as plt

# 加载数据集
iris = datasets.load_iris()

x = iris.data # 数据
y = iris.target # 标签

#画图,选择特征3、特征4分别作为x轴和y轴,也可以选择其他特征
x_axis = x[:,2]
y_axis = x[:,3]
 
#c指定点的颜色,c根据标签的不同自动着色
plt.scatter(x_axis, y_axis, c=iris.target)
plt.show()

数据在当前特征下分布如下图所示


手写kNN算法

# 导包
import operator
from numpy import *
import numpy as np
from sklearn import datasets # 数据集
from sklearn.model_selection import train_test_split

# 加载数据
iris = datasets.load_iris()

x = iris.data
y = iris.target

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=2000)

#f 手写kNN算法
def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]#查看矩阵的维度
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    #tile(数组,(在行上重复次数,在列上重复次数))
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    #sum默认axis=0,是普通的相加,axis=1是将一个矩阵的每一行向量相加
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    #sort函数按照数组值从小到大排序
    #argsort函数返回的是数组值从小到大的索引值
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        #get(key,k),当字典dic中不存在key时,返回默认值k;存在时返回key对应的值
    sortedClassCount = sorted(classCount.items(),
           key=operator.itemgetter(1),reverse=True)
    #python2中用iteritems,python3中用items代替;operator.itemgetter(k),返回第k个域的值
    return sortedClassCount[0][0]

# 测试
pre_test = [classify0(data,x_train,y_train,3) for data in x_test]
correct = np.count_nonzero((pre_test==y_test)==True)
print('准确率%.3f'%(correct/(len(y_test))))

# 准确率0.921
# 可以通过修改random_state,提高准确率


调用sklearn包中的kNN算法

# 导包
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 加载数据
iris = datasets.load_iris()

x = iris.data
y = iris.target

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)

# 调用sklearn库函数
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(x_train,y_train)
pre_test = clf.predict(x_test)
correct = np.count_nonzero((pre_test==y_test)==True)
print('准确率%.3f'%(correct/(len(y_test))))

# 准确率1.000
# 这里并不是库函数比手写kNN效果要好,而是数据集划分不同,这里random_state=42

accuracy_score()函数:

在上面两部分代码中,计算准确率都是通过我们自己手写判断预测正确的个数/预测的总数,sklearn库中集成的有正确率计算的函数。

# 直接引用sklearn库进行准确率的计算

from sklearn.metrics import accuracy_score

pre_test=clf.predict(x_test)
acc=accuracy_score(y_test,pre_test)
print('准确率',acc)

# 准确率0.921
# 准确率1.000
# 准确率 1.0


总结

可以看出直接调用库函数着实减少了很多代码,但是对手写kNN代码的练习可以加强对kNN的理解和应用,基础还是比较重要的!

欢迎交流~

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值