一个例子:KNN原理
设想一个场景
在一个小镇上有两个小区,一个是高档小区,另一个是贫民区,两个小区中间有一条河流。
某一天,这个小镇上新来了一户人家,在不接触这家人的情况下,你怎么判断新来的这家是不是富人呢?
俗话说“物以类聚,人以群分”,通过他附近的邻居住在哪个小区,几乎就相当于知道了新来的住在哪一个小区了,从而知道这家是不是富人。
这个小栗子,就是KNN算法的作用和原理。
对于一个未知的样本,判断这个样本是哪一个类型,通过他附近最近的几个已知样本的类型,从而预测出未知样本的类型,这就是KNN算法。
又一个例子:使用KNN预测鸢尾花类型
如果你是第一次接触机器学习,一定会觉得,KNN算法用起来一定很难。
如果你真的这样认为的话,那你就真的想错了。
sklearn库是一个机器学习的库,封装好了大量的机器学习算法,包括KNN,用起来非常简单。
现在,我们用KNN做一个小栗子,预测鸢尾花的类型。
鸢尾花的数据是sklearn库自带的,无需下载
先来看一张鸢尾花的图片
鸢尾花分为三种类型:
为了代码的方便起见,我们用 0,1,2分别代表三种类型
0:'setosa'
1:'versicolor'
2:'virginica'
那么,判断一朵花是哪种类型,需要哪些步骤呢?
1、数据加载
sklearn库是自带鸢尾花的数据的
from sklearn import datasets
iris = datasets.load_iris()
datasets 是sklearn库自带的数据集,里面有各种数据
load_iris() 就是取出鸢尾花的所有相关数据
该数据源是一个字典类型的,我们来看一下该数据的 key 都有哪些
iris.keys()
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
data 是鸢尾花的特征数据,例如花萼长度,花瓣宽度等
target 是鸢尾花的类型
target_names 是 target 中类型代表的含义
feature_names 是鸢尾花特征值的含义
DESCR 是该数据源的简单介绍
现在有个问题,这些数据都是已知类型的呀
所以,我们需要手动将这些数据分为训练集和测试集。
训练集:用于训练模型的数据
测试集:让训练好的模型预测数据,将测试结果与真实结果比较,评判模型
提取出鸢尾花的特征数据与类型
X_data = iris.data
y_data = iris.target
2、加载训练数据与测试数据
将数据的前140条数据作为训练数据(特征值数据与类型,其顺序是一一对应的)
X_data_train = X_data[:-10]
y_data_train = y_data[:-10]
将最后10条数据作为测试数据
X_data_test = X_data[-10:]
y_data_test = y_data[-10:]
3、使用sklearn的KNN进行预测
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier(3)
# 训练模型
knn.fit(X_data_train,y_data_train)
# 预测数据
y_predict = knn.predict(X_data_test)
print(f"预测结果为:{y_predict}")
print(f"实际结果为:{y_data_test}")
4、检查一下预测的正确率
print(f"预测的准确率为:{knn.score(X_data_test,y_data_test)}")
至此,我们已经使用sklearn库的KNN完成了对鸢尾花数据的预测。