一、作业题目:
原生Python实现KNN分类算法,用鸢尾花数据集。
二、算法原理:
KNN算法是选择与输入样本在特征空间内最近邻的k个训练样本并根据一定的决策规则,给出输出结果 。
决策规则:
分类任务:输出结果为k个训练样本中占大多数的类 。
回归任务:输出结果为k个训练样本值的平均值 。
三、算法设计:
(1).数据准备
选择鸢尾花数据集(lris)每个样本x包含花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)四个特征。样本标签y共有三类,分别是Setosa,Versicolor和Virginica。Iris数据集总共包含150个样本,每个类别由50个样本。
数据data应用网上下载数据集。
data = pd.read_csv('iris.data', header=None)
data.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'species']
将三个类别的数据分别提取出来,setosa、versicolor、virginica分别用0、1、2来表示。将每个类别的所有样本分成训练样本(training set)、验证集(validation set)和测试样本(test set),各占所有样本的比例分别为60%,20%,20%。
表示两种类别不同特征的空间分布。选择sepal length和petal length两个特征,在二维平面上作图。
(2) kNN训练函数和预测函数
kNN的训练过程实际上是一种数据标类、数据存储的过程,不包含机器学习算法。首先我们需要定义一个类(class)来实现KNN算法模块。
kNN距离衡量一般有两种方式:L1距离和L2距离。
K值的选择:k值太小会使模型过于复杂,造成过拟合(overfitting);k值太大会使模型分类模糊,造成欠拟合(underfitting)。在KNearestNeighbor类中定义预测函数通过验证集来验证从而决定K值大小。
(3)训练和预测
创建KNearestNeighbor实例对象通过测试发现K=3时,验证集准确率最高。最后,把预测结果绘图表示。依然选择sepal length和petal length两个特征,在二维平面上作图。
四、源代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('iris.data', header=None) data.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'species'] # 特征及类别名称 X = data.iloc[0:150, 0:4].values y = data.iloc[0:150, 4].values y[y == 'Iris-setosa'] = 0 # Iris-setosa 输出label用0表示