2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

首页 > 科技 > 正文 2021-06-04

发表自话题:k曲线怎么看

机器学习

1 K-近邻算法介绍

1.1 分类问题

分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别。
与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别。

1.2 K近邻算法

1.2.1 简介

K近邻(k-Nearest Neighbor,KNN)算法,是处理分类问题的基本算法之一。
KNN算法可以理解为:如果在未知类别样本附近的k个最近的样本中,大多数都属于某个类别,则这个未知样本也可以视为属于这个类别,即物以类聚,人以群分。

1.2.2 工作原理 给定一个训练数据集,训练数据集中的所有样本数据的类别都已知,即训练数据集中的每个数据与其所属类别的对应关系已知;输入一个未知类别的实例,将输入的实例与训练数据集中的实例在特征方面进行比较;根据设定的k值,取出与输入实例的特征最为相似的k个训练数据,即在特征空间中距离输入实例最近的k个训练数据;对这k个训练数据进行分类统计,获取k个训练数据中出现次数最多的类别,并将这个类别视为输入实例的类别。

训练数据集是已经被正确分类的样本数据集合,每个样本数据都有表示类别的标签,因此K近邻算法属于监督学习。

1.2.3 近邻 - 欧氏距离

K近邻算法中的近邻是通过不同特征值之间的距离进行判断的,一般采用欧氏距离。

二维空间,即只考虑2个特征时
d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 d(x, y)=\sqrt{(x_1-y_1)^2+(x_2-y_2)^2} d(x,y)=(x1y1)2+(x2y2)2
n维空间,即考虑n个特征时
d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + . . . + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 d(x, y)=\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}=\sqrt{\sum_{i=1}^n (x_i-y_i)^2} d(x,y)=(x1y1)2+(x2y2)2+...+(xnyn)2 =i=1n(xiyi)2

1.2.4 k值

k值用于指定KNN算法中距离输入实例最近的实例数量。
k值的大小会影响KNN算法的输出结果。

超参数
如果模型中的某些参数发生变化时,会对分类或回归的结果产生影响,则这些参数就称为模型的超参数。
k值是KNN算法模型中是超参数。

以上图为例,输入的待分类数据用绿色圆表示,已正确分类的样本数据分别用蓝色方块和红色三角表示,目标是判断绿色圆是属于蓝色方块类别还是属于红色三角类别。

若k=3,取距离绿色圆最近的3个样本数据,分别是2个红色三角和1个蓝色方块,因此判断绿色圆属于红色三角类别;若k=5,取距离绿色圆最近的5个样本数据,分别是2个红色三角和3个蓝色方块,因此判断绿色圆属于蓝色方块类别。

2 案例

2.1 案例1 电影类型分类

数据集包含2个特征:影片出现的打斗场景次数与接吻场景次数。
目标值为电影的分类:动作片、爱情片、喜剧片等。

import pandas as pd df = pd.read_excel('./datasets/my_films.xlsx') df.head() ''' 名字 Action Lens Love Lens target 0 前任3 4 10 Love 1 西游记 16 2 Action 2 战狼2 18 3 Action 3 失恋33天 2 13 Love 4 宝贝计划 4 2 Comedy '''

基于KNN算法,使用电影数据集对模型进行训练。

from sklearn.neighbors import KNeighborsClassifier feature = df[['Action Lens', 'Love Lens']] target = df['target'] # 实例化分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练模型 knn.fit(feature, target)

输入未知类型的电影数据,使用模型对其进行分类。

knn.predict([[30, 55]]) ''' array(['Love'], dtype=object) '''

模型做出判断,一个打斗场景出现30次,接吻场景出现55次的电影属于爱情片。

2.2 案例2 鸢尾花分类

数据集使用sklearn提供的的IRIS(鸢尾花)数据集。
IRIS数据集包含4个特征:

Sepal.Length - 花萼长度 Sepal.Width - 花萼宽度 Petal.Length - 花瓣长度 Petal.Width - 花瓣宽度

特征值均为正浮点数,单位为厘米。
目标值为鸢尾花的分类,包括

Iris Setosa - 山鸢尾 Iris Versicolour - 杂色鸢尾 Iris Virginica - 维吉尼亚鸢尾

加载鸢尾花数据集。

import pandas as pd from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split iris = load_iris() # 加载鸢尾花数据 feature = iris.data target = iris.target feature.shape # (150, 4)

将数据集拆分成训练集和测试集。

x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2020) x_train.shape # (120, 4) x_test.shape # (30, 4)

观察数据集,判断是否需要进行特征工程处理。
数据中各个特征的量级相差不大,不需要进行特征工程处理。

基于KNN算法,使用训练集对模型进行训练,模型中的k值设为5。

knn = KNeighborsClassifier(n_neighbors=5) knn.fit(x_train, y_train)

使用测试集对模型进行评估。

# 分类的正确率 knn.score(x_test, y_test) # 0.9 # 获取估计器的参数 knn.get_params() ''' {'algorithm': 'auto', 'leaf_size': 30, 'metric': 'minkowski', 'metric_params': None, 'n_jobs': None, 'n_neighbors': 5, 'p': 2, 'weights': 'uniform'} '''

查看模型对测试集的分类结果,并与测试集的实际分类进行比较。

print('模型的分类结果:', knn.predict(x_test)) print('实际的类别标签:', y_test) ''' 模型的分类结果: [2 0 1 1 1 1 2 1 0 0 2 1 0 2 2 0 1 1 2 0 0 2 2 0 2 1 1 1 0 0] 实际的类别标签: [2 0 1 1 1 2 2 1 0 0 2 2 0 2 2 0 1 1 2 0 0 2 1 0 2 1 1 1 0 0] '''

2.3 案例3 预测年收入范围

import pandas as pd df = pd.read_csv('./datasets/adults.txt') df.head() ''' age workclass final_weight education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary 0 39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States

标签组:[机器学习] [交叉验证] [算法] [监督学习] [k近邻算法] [分类数据] [学习曲线] [knn

上一篇贝塞尔曲线(Bezier Curve)

下一篇你知道这11个重要的机器学习模型评估指标吗?

相关阅读

相同话题文章

推荐内容

热门阅读