目录
1. KNN算法简介
KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。
KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。
KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。
一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。
2. KNN算法流程
注:距离采用欧氏距离计算
3. 鸢尾花数据集
鸢尾花(Iris)数据集是机器学习和统计学领域经常使用的一个经典数据集。这个数据集包含了三类不同的鸢尾花(Iris Setosa、Iris Versicolour、Iris Virginica)的四个特征,通常用于分类任务和多变量分析。数据集中的每个样本都包含以下四个特征:
- 萼片长度(Sepal Length):鸢尾花萼片的长度,单位为厘米。
- 萼片宽度(Sepal Width):鸢尾花萼片的宽度,单位为厘米。
- 花瓣长度(Petal Length):鸢尾花花瓣的长度,单位为厘米。
- 花瓣宽度(Petal Width):鸢尾花花瓣的宽度,单位为厘米。
数据集中总共有150个样本,每类鸢尾花有50个样本。这些样本的特征值都是实数,且都经过了测量和记录。由于这个数据集相对较小、特征数量适中且类别分布均衡,因此它常被用作机器学习入门的示例数据集,特别是在分类算法(如K近邻、决策树、支持向量机等)的教学中。
此外,鸢尾花数据集也经常用于数据可视化和探索性数据分析,因为它允许研究者通过简单的图表(如散点图、箱线图等)来直观地展示不同类别之间的特征差异。
鸢尾花数据集因其简单性、可解释性和适中的大小而成为机器学习和数据分析入门者的理想选择。
3.1 数据预处理
加载鸢尾花数据:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.3)
3.2 KNN方法
调用sklearn库
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
自定义KNN方法
class KNN:
def __init__(self, k):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
k_indices = np.argsort(distances)[:self.k]
k_nearest_labels = [self.y_train[i] for i in k_indices]
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
对KNN类进行调用:
knn = KNN(k=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
3.3 对于预测结果进行准确率评估
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
或者
accuracy_score = np.mean(y_pred == y_test)
print(accuracy_score)