KNN-K近邻算法

原理#

  • 在训练集中寻找与该样本距离最近的 K 个样本,以其多数分类作为该样本的类别
  • 使用欧氏距离计算两者间距离
    • 也可采用其他距离公式 如明可夫斯基距离或者曼哈顿距离
  • 超参数k:
    • K值过小:容易受到异常数据影响
    • K值过大:受样本不均衡影响

sklearn中的API#

sklearn. neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

  • n_neighbors: int,可选(默认=5),k_neighbors查询默认使用的邻居数
  • algorithm: {'auto','ball_tree',kd_tree','brute'}, 可选用于计算最近邻居的算法:
    • ‘ball_tree'将会使用 BallTree
    • ‘kd_tree'将使用 KDTree
    • 'auto'将尝试根 据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)

例子#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
    """
    用KNN算法对鸢尾花进行分类
    :return:
    """
    # 1)获取数据
    iris = load_iris()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    # 3)特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)

    # 5)模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)

    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None