- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
一、基本概念
K-近邻算法(K-Nearest Neighbors, KNN),即是给定一个训练数据集,输入一个新的实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例主要是哪一类别,那么就把该实例分类到这个类中。引用维基百科上的一幅图:
蓝色方块与红色三角形为训练集中的实例,绿色小圆是新输入的实例,现在在现有实例中取K个离小绿圆最近实例用于判断其类别。
- 当K=3时,所取实例在实线圆内,红三角占比最大,将新输入实例归为红三角一类。
- 当K=5时,所取实例在虚线圆内,绿方块占比最大,将新输入实例归为绿方块一类。
在KNN中存在两个重要问题,一个是K的取值问题,一个是距离计算问题,这里先不做讨论,仅仅引入KNN这个概念,明白它是一个什么东西,在后面文章中我们再对这两个问题进行深入讨论。下文将通过sklearn包来实现KNN。
二、代码实现
我的环境:
- 语言环境:conda环境 Python3.12.3
- 编译器:Jupyter Lab
1. 问题简介
背景: 海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:
- ①不喜欢的人;
- ②魅力一般的人;
- ③极具魅力的人。
她现在总结好的数据中(即训练集)包含三种特征:
- ①每年获得的飞行常客里程数
- ②玩视频游戏所耗时间百分比
- ③每周消费的冰淇淋公升数
她希望根据现有的数据来判断一个陌生男人会被她归到哪一类。
2. 导入数据
数据标签详解(对应表格纵轴):
- 0:每年获得的飞行常客里程数
- 1:玩视频游戏所耗时间百分比
- 2:每周消费的冰淇淋公升数
- 3:人物类别(不喜欢的人、魅力一般的人、极具魅力的人)
数据集:
import pandas as pd
data=pd.read_table('../data/datingTestSet2.txt',sep='\t',header=None)
data.head()
X = data.iloc[:, :3]
y = data.iloc[:,3]
说明: pd.read_table
是 Python 中 pandas 库的一个函数,用于读取文本文件(如 CSV 或 TSV 文件)并将它们转换为 pandas 的 DataFrame 对象。这个函数在 pandas 0.24.0 版本后已经被弃用,建议使用 pd.read_csv
来代替。
补充: pd.read_table
的基本用法:
# 读取 CSV 文件
df = pd.read_table('filename.csv', sep=',', header=0)
# 读取 TSV 文件
df = pd.read_table('filename.tsv', sep='\t', header=0)
参数说明:
'filename.csv' 或 'filename.tsv':文件的路径,可以是本地文件路径或 URL。
sep:字段的分隔符,默认是 '\t',对于 CSV 文件可以设置为 ','
header=0:标题行的索引,默认是 0,表示第一行是列名。
header=None:这个参数表示文件中没有标题行。None意味着pandas不会将文件的第一行作为列名,而是会自动生成数字索引作为列名。如果没有标题行,可以设置为 None。
如果想要使用 pd.read_csv
来实现相同的功能,可以这样做:
# 读取 CSV 文件
df = pd.read_csv('filename.csv')
# 读取 TSV 文件
df = pd.read_csv('filename.tsv', sep='\t')
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.25,
random_state=3)
4. K-邻近算法模型
from sklearn.neighbors import KNeighborsClassifier
knc = KNeighborsClassifier()
knc.fit(X_train, y_train)
5. 结果预测
data["预测结果"] = knc.predict(data.iloc[:,:3])
data.head(10)
data
:这是一个 pandas DataFrame 对象,它存储了你的数据。"预测结果"
:这是 DataFrame 中的一个新列名,用于存储预测结果。knc
:这是一个已经训练好的机器学习模型的实例,它应该有一个predict
方法可以用来进行预测。predict
:这是调用knc
模型的预测方法,它将对数据进行预测。data.iloc[:,:3]
:这是 pandas 的一个索引操作,iloc
是基于位置的索引方法。:
表示选择所有行,:3
表示选择前三列。这部分代码意味着从data
DataFrame 中选择前三列的所有数据作为特征,用于进行预测。data.head(10)
:调用会显示data
DataFrame 的前10行,包括新添加的 "预测结果" 列。
6. 模型评分
scoreK = knc.score(X_test,y_test)
print(scoreK)