- 本文为🔗365天深度学习训练营 中的学习记录博客
- 原作者:K同学啊
任务:
●1. 学习本文的K-邻近算法
●2. 了解 KNeighborsClassifier 函数
一、基本概念
商业哲学家 Jim Rohn 说过一句话,“你,就是你最常接触的五个人的平均。”那么,在分析一个人时,我们不妨观察和他最亲密的几个人。同理的,在判定一个未知事物时,可以观察离它最近的几个样本,这就是KNN(k-近邻)算法。
K-近邻算法是一种基本分类和回归方法。
K-近邻算法,即是给定一个训练数据集,输入一个新的实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例主要是哪一类别,那么就把该实例分类到这个类中。引用维基百科上的一幅图:
蓝色方块与红色三角形为训练集中的实例,绿色小圆是新输入的实例,现在在现有实例中取K个离小绿圆最近实例用于判断其类别。
●当K=3时,所取实例在实线圆内,红三角占比最大,将新输入实例归为红三角一类。
●当K=5时,所取实例在虚线圆内,蓝方块占比最大,将新输入实例归为蓝方块一类。
在KNN中存在两个重要问题,一个是K的取值问题,一个是距离计算问题,这里先不做讨论,仅仅引入KNN这个概念,明白它是一个什么东西,在后面文章中我们再对这两个问题进行深入讨论。下文将通过sklearn包来实现KNN。
二、代码实现
我的环境:
●语言环境:Python3.9
●编译器:Jupyter Lab
1.问题简介
背景: 海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:
●①不喜欢的人;
●②魅力一般的人;
●③极具魅力的人。
她现在总结好的数据中(即训练集)包含三种特征:
●①每年获得的飞行常客里程数。
●②玩视频游戏所耗时间百分比。
●③每周消费的冰淇淋公升数。
她希望根据现有的数据来判断一个陌生男人会被她归到哪一类。
2.导入数据
数据标签详解:
●0:每年获得的飞行常客里程数。
●1:玩视频游戏所耗时间百分比。
●2:每周消费的冰淇淋公升数。
●3:人物类别(不喜欢的人、魅力一般的人、极具魅力的人)。
import pandas as pd
data=pd.read_table('./L4/datingTestSet2.txt',
sep='\t',
header=None)
data
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 40920 | 8.326976 | 0.953952 | 3 |
1 | 14488 | 7.153469 | 1.673904 | 2 |
2 | 26052 | 1.441871 | 0.805124 | 1 |
3 | 75136 | 13.147394 | 0.428964 | 1 |
4 | 38344 | 1.669788 | 0.134296 | 1 |
... | ... | ... | ... | ... |
995 | 11145 | 3.410627 | 0.631838 | 2 |
996 | 68846 | 9.974715 | 0.669787 | 1 |
997 | 26575 | 10.650102 | 0.866627 | 3 |
998 | 48111 | 9.134528 | 0.728045 | 3 |
999 | 43757 | 7.882601 | 1.332446 | 3 |
1000 rows × 4 columns
X = data.iloc[:,:3]
y = data.iloc[:,3]
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)
- 结果预测
data["预测结果"] = knc.predict(data.iloc[:,:3])
data.head(10)
0 | 1 | 2 | 3 | 预测结果 | |
---|---|---|---|---|---|
0 | 40920 | 8.326976 | 0.953952 | 3 | 3 |
1 | 14488 | 7.153469 | 1.673904 | 2 | 2 |
2 | 26052 | 1.441871 | 0.805124 | 1 | 3 |
3 | 75136 | 13.147394 | 0.428964 | 1 | 1 |
4 | 38344 | 1.669788 | 0.134296 | 1 | 3 |
5 | 72993 | 10.141740 | 1.032955 | 1 | 1 |
6 | 35948 | 6.830792 | 1.213192 | 3 | 3 |
7 | 42666 | 13.276369 | 0.543880 | 3 | 3 |
8 | 67497 | 8.631577 | 0.749278 | 1 | 1 |
9 | 35483 | 12.273169 | 1.508053 | 3 | 3 |
- 模型评分
scoreK = knc.score(X_test,y_test)
print(scoreK)
代码输出:
0.796