【scikit-learn基础】--『监督学习』之 K-近邻分类
KNN(K-近邻),全称K-Nearest Neighbors,是一种常用的分类算法。KNN算法的历史可以追溯到1957年,当时Cover和Hart提出了“最近邻分类”的概念。
但是,这个算法真正得到广泛认知和应用是在1992年,由Altman发表的一篇名为“K-Nearest Neighbors”的文章。
近年来,随着大数据和机器学习的快速发展,KNN算法因其简单且表现优秀,被广泛应用于各种数据分类问题中。
1. 算法概述
KNN算法的基本原理是:在特征空间中,如果一个样本的最接近的k个邻居中大多数属于某一个类别,则该样本也属于这个类别。
换句话说,KNN算法假设类别是由其邻居决定的。
那么,KNN算法判断数据是否相似是关键,也就是数据之间的距离是如何计算的呢?
最常用的距离计算公式有:
- 曼哈顿距离:\(L_1(x_i,x_j)= \sum_{l=1}^{n} |x_i^{(l)}-x_j^{(l)}|\)
- 欧氏距离:\(L_2(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{2}}\)
- 闵可夫斯基距离:\(L_p(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{p}}\)
- 等等
使用不同的距离,就会得到不同的分类效果。
2. 创建样本数据
这次用scikit-learn中的样本生成器make_classification来生成分类用的样本数据。
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 分类数据的样本生成器
X, y = make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
plt.show()

关于样本生成器的详细内容,请参考:TODO
3. 模型训练
首先,分割训练集和测试集。
from sklearn.model_selection import train_test_split
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
这次按照8:2的比例来划分训练集和测试集。
然后用scikit-learn中的KNeighborsClassifier模型来训练:
from sklearn.neighbors import KNeighborsClassifier
# 定义KNN模型(设置4个分类,因为样本数据是4个分类)
reg = KNeighborsClassifier(n_neighbors=4)
# 训练模型
reg.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = reg.predict(X_test)
KNeighborsClassifier的主要参数包括:
- n_neighbors:这是
kNN算法中的k值,即选择最近的k个点。默认值为5。 - weights:此参数默认为'
uniform',也可以设置为'distance',或者用户自定义的函数。其中,'uniform'表示所有的邻近点的权重都是相等的,'distance'表示距离近的点比距离远的点的影响大。 - algorithm:此参数默认为'
auto',也可以设置为'auto','ball_tree','kd_tree',或'brute'。这决定了在计算最近邻时使用的算法。 - leaf_size:此参数默认为30,也可以设置为一个整数,用于指定传递给构建叶子节点时使用的最小样本数。
- p:此参数默认为2,也可以设置为一个值<=1。这决定了在计算
Minkowski距离度量时使用的p值。 - metric:此参数默认为'
minkowski',也可以设置为'euclidean','manhattan'等。这决定了距离度量方法。 - metric_params:此参数默认为None,也可以是一个字典,包含了额外的关键字参数传递给距离度量函数。
- n_jobs:此参数默认为None,也可以是一个大于等于1的整数,表示可用于执行并行计算的CPU数量。
最后验证模型的训练效果:
# 比较测试集中有多少个分类预测正确
correct_pred = np.sum(y_pred == y_test)
print("预测正确率:{}%".format(correct_pred/len(y_pred)*100))
# 运行结果
预测正确率:68.5%
模型使用了默认的参数,可以看出,模型正确率不高。
感兴趣的同学可以试试调整KNeighborsClassifier的参数,看看是否可以提高模型的预测正确率。
4. 总结
KNN算法被广泛应用于各种不同的应用场景,如图像识别、文本分类、垃圾邮件识别、客户流失预测等。
这些场景的一个共同特点是,需要对一个未知的样本进行快速的分类或预测。
KNN算法主要优势在于:
- 简单直观:
KNN算法的概念简单直观,容易理解和实现。 - 适用于小样本数据:
KNN算法在小样本数据上的表现往往优于其他机器学习算法。 - 对数据预处理要求较低:
KNN算法不需要对数据进行复杂的预处理,例如标准化、归一化等。
不过,KNN算法也有不足之处:
- 计算量大:对于大型数据集,
KNN算法可能需要大量的存储空间和计算时间,因为需要计算每个样本与所有已知样本的距离。 - 选择合适的K值困难:K值的选择对结果影响很大,选择不当可能会导致结果的不稳定。
- 对噪声数据敏感:如果数据集中存在噪声数据,
KNN算法可能会受到较大影响。
【scikit-learn基础】--『监督学习』之 K-近邻分类的更多相关文章
- K近邻分类算法实现 in Python
K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...
- 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响
代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...
- 每日一个机器学习算法——k近邻分类
K近邻很简单. 简而言之,对于未知类的样本,按照某种计算距离找出它在训练集中的k个最近邻,如果k个近邻中多数样本属于哪个类别,就将它判决为那一个类别. 由于采用k投票机制,所以能够减小噪声的影响. 由 ...
- Python基础『一』
内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...
- Python基础『二』
目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...
- Python机器学习基础教程-第2章-监督学习之K近邻
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- 『Kaggle』Sklearn中几种分类器的调用&词袋建立
几种分类器的基本调用方法 本节的目的是基本的使用这些工具,达到熟悉sklearn的流程而已,既不会设计超参数的选择原理(后面会进行介绍),也不会介绍数学原理(应该不会涉及了,打公式超麻烦,而且近期也没 ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- 1.K近邻算法
(一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...
- 机器学习PR:k近邻法分类
k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...
随机推荐
- 搭一下 Stable Diffusion WebUI
Preface 前不久看到好多朋友用上Stable Diffusion来做原画,然后又配合上了Chatgpt. 一直以来都想尝试一下,奈何2014款的双核mac跑个idea都发出了拖拉机的轰鸣声. 所 ...
- Springboot简单功能示例-4 自定义加密进行登录验证
springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...
- CF1526C2
与简单版的思路完全一致,只需要改一下范围. 可以去看我简单版本的博客. 题目简化和分析: 给您一个数组,在其中选择若干个数使得: 任意前缀和 \(\ge 0\) 数量尽可能的大 我们可以使用贪心策略, ...
- Linux 本地部署私有Stackedit Markdown编辑器远程访问
StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保存到多个仓库,包括Gitee.GitHub和Gitea.此在线笔记工具 ...
- CF1877 Div2 A-E 题解
A 显然 \(n\) 个队的得分之和为 \(0\),因此答案为这 \(n-1\) 个数的和的相反数. 赛时代码 B 小贪心. 将所有人按 \(b\) 升序排序,\(b\) 相同时按 \(a\) 降序, ...
- 语雀崩了,免费送VIP6个月,赶紧薅!!
一.前言 在一个无聊的周一,下午浑浑噩噩的时候,一条公众号信息引起我的关注. 什么东西?语雀这种量级的产品也能崩? 看了一下还真是官方公众号发的!! 心里不由得出现,完蛋整个团队要打包遣散了. 其实小 ...
- Python 继承和子类示例:从 Person 到 Student 的演示
继承允许我们定义一个类,该类继承另一个类的所有方法和属性.父类是被继承的类,也叫做基类.子类是从另一个类继承的类,也叫做派生类. 创建一个父类 任何类都可以成为父类,因此语法与创建任何其他类相同: 示 ...
- acwing第75场周赛
这次题比较水,但是还是没能ak,自己小结一下吧 第一道题就是自己枚举相加就行 第二道题是一个多关键字排序,wa了几次,是因为优先级有两个是相同的需要特判一下,然后可以把字符转化为数字的优先级,我用了一 ...
- mysql 代码适配 postgresql 适配改写,优化案例(行转列 + 标量子查询改写)
最近在适配个MySQL应用的项目,各种SQL改成PG兼容的语法真的是脑壳痛,今天遇到个有意思的案例. 原 MySQL SQL语句: SELECT DISTINCT l.MALL_NAME '项目', ...
- 2022.7.13 tongyf 讲课纪要
前言 这个笔记记晚了,主要是都在跟 \(LCT\) 进行殊死搏斗,所以博客这方面就挂了很久. tongyf 学长当年是拿到省一之后省选炸了,之后暴切高考.ORZ%%% 这节课讲的是线性dp和背包dp, ...