一、算法简介
K 近邻 (KNN,K Nearest Neighbours) 是一种分类算法。
算法的思想为:要判断一个东西属于哪一类,看看跟它特征最近似的 K 个东西都属于什么,如果这 K 个东西属于 A 类的最多,那我们就认为未知的那个东西也是 A 类的。
举个栗子,小明拿到一个水果,皮是黄色的,可以剥开,甜甜的软软的,这时候麻麻买回来了一串香蕉一袋橘子,小明发现香蕉跟你拿的这个东西好像哦,于是他认定自己拿的这个水果也是香蕉。这是不是有点像小朋友认识东西的过程呢?
与之前学习的算法不同的是,KNN 属于“非参数方法”。也就是说,我们没有假设样本符合什么样的分布情况,没有把分类问题转换为求解参数的过程。
如图,假设输入特征是二元的,我们把样本数据的特征 $(x_1,x_2)$ 作为二维平面的点坐标,并用不同形状表示样本的类。那么想要判断点属于哪一类,只要把它也放在平面中,观察离它最近的 K(图中 K = 5)个点,发现三角形最多,于是需要预测的点就可以被认为属于三角形所代表的类。
我们通常使用“欧氏距离”来表示两数据点的相近程度。当输入特征为多元时,假设平面中有两点 $x = (x_1,x_2,...x_n)$ 和 $y = (y_1,y_2,...y_n)$,其距离为
$$distance = sqrt{sum_i^n(x_i - y_i)^2}$$
注意:
使用欧氏距离存在一个问题,如果不同特征的值不在一个数量级上,那么数量级大的特征将会对距离产生决定性影响,所以,我们需要先进行「数据预处理」,对特征进行缩放。
二、Python 代码实现
示例数据地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets
1 数据预处理
# 导入库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 导入数据
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
# 分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
# 特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
2 使用训练集拟合算法
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train)
3 预测与评价
# 使用测试集预测
y_pred = classifier.predict(X_test)
# 生成混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
欢迎关注 Evan 的博客