KNN算法的运用案例

KNN算法简单介绍

KNN(K-Nearest Neighbors,K最近邻)算法是一种基本的分类与回归方法。尽管它理论上可以应用于回归问题,但在实践中更常用于分类任务。KNN算法的核心思想是:给定一个测试样本,基于某种距离度量找出训练集中与其最靠近的K个样本,然后基于这K个“邻居”的信息来进行预测。对于分类任务,通常选择这K个样本中出现最多的类别作为预测结果;对于回归任务,则可以将这K个样本的实值输出做平均来作为预测值。

KNN算法的主要步骤

1.计算距离:选择一种距离度量(如欧氏距离、曼哈顿距离等)来计算测试样本与每个训练样本之间的距离。

2.找到K个近邻:按照距离递增排序,选取与测试样本距离最近的K个点作为近邻。

3.做决策:

  • 分类任务:根据这K个近邻的类别,通过多数投票等方式进行预测。
  • 回归任务:对这K个近邻的实值输出进行平均,得到预测值。

KNN算法的特点

  • 简单:算法易于理解,实现简单。
  • 惰性学习:KNN算法没有显式的训练过程,而是将训练集完全保存下来,待测试样本到来时,再进行处理。
  • 无参数:除了K值之外,KNN算法不需要额外的参数。
  • 需要存储所有训练数据:这使得KNN算法在训练样本量很大时,对存储空间和计算资源的需求很高。
  • 对距离度量敏感:不同的距离度量可能会对结果产生显著影响。
  • 对K值的选择敏感:K值的选择会直接影响算法的准确率和效率。

KNN算法的应用场景

KNN算法适用于样本量较小且类别较少的分类问题,以及样本量较大的回归问题(尽管在实际应用中较少)。它也可以用于文本分类、图像识别、推荐系统等领域。然而,由于其较高的计算成本和对内存的需求,KNN算法在处理大规模数据集时可能会遇到性能瓶颈。

KNN算法示例详解

为了让大家更快掌握KNN算法的运用,这里为大家准备了一个鸢尾花训练与测试案例,以帮助大家了解KNN,其中训练数据集一共1000组数据,测试数据一共9组。

1.Sklearn安装

在进行训练测试之前,我们应该先准备好所需要的库,SKlearn建立在 NumPy, SciPy, Pandas 和 Matplotlib库 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。安装方法:在命令提示符中输入:pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
在这里插入图片描述

2.读取数据

因为鸢尾花数据是存储在 Excel 文件中,属于表格类型数据,所以我们需要导入pandas,通过read_excsl来读取数据。

import pandas as pd
#读取数据
train_data = pd.read_excel("鸢尾花训练数据.xlsx")
test_data = pd.read_excel("鸢尾花测试数据.xlsx")

3.处理训练集数据

上面我们读取了鸢尾花训练与测试所需要的数据,这里我们从 train_data DataFrame 中提取特征(萼片长、萼片宽、花瓣长、花瓣宽)和标签(类型_num)来准备鸢尾花数据集的训练集。并通过train_X 包含用于模型训练的特征,train_y 包含与这些特征相对应的标签(或目标变量)。

train_X = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
train_y = train_data['类型_num']

4.标准化语法

从sklearn.preprocessing 模块中导入scale,对 train_X DataFrame 中的各个特征列进行标准化(也称为 Z-score 标准化),将特征值缩放到以 0 为均值、1 为标准差的范围,确保每个特征在训练过程中都具有相似的尺度。

from sklearn.preprocessing import scale

data = pd.DataFrame()
data['萼片长标准化'] = scale(train_X['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_X['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_X['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_X['花瓣宽(cm)'])

5.使用sklearn库中KNN模块

使用sklearn.neighbors 模块中的 KNeighborsClassifier 类来创建一个 KNN,并对数据进行训练和预测, n_neighbors=9 表示在进行分类时,将考虑最近的 9 个邻居,计算分类器在 data(训练集)上的准确率,即正确预测的样本数与总样本数的比例。

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=9)
knn.fit(data, train_y)

train_predicted = knn.predict(data)
train_score = knn.score(data, train_y)

6.处理训练测试集

对测试集同样进行以上操作,处理测试集,进行标准化并对其训练预测然后计算准确率。

test_X = test_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
test_y = test_data['类型_num']

from sklearn.preprocessing import scale

data_test = pd.DataFrame()
data_test['萼片长标准化'] = scale(test_X['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_X['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_X['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_X['花瓣宽(cm)'])

test_preticted = knn.predict(data_test)
test_score=knn.score(data_test,test_y)
print(score)

7.代码与注释

import pandas as pd

"""
train_data:训练集
test_data:测试集
"""
train_data = pd.read_excel("鸢尾花训练数据.xlsx")
test_data = pd.read_excel("鸢尾花测试数据.xlsx")
"""
处理训练集数据;
数据重排;变量与标签分离.
"""
train_X = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
train_y = train_data['类型_num']
"""
标准语法化
归一化0~1:对每一个列(特征)进行归一化
Z-Score标准化   -1~1

"""
from sklearn.preprocessing import scale

data = pd.DataFrame()  # 空表格数据对象
data['萼片长标准化'] = scale(train_X['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_X['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_X['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_X['花瓣宽(cm)'])
# 对数据进行一次预处理,让每个特征数据都在一定范围
"""
使用sklearn的KNN模块
"""
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=9)
knn.fit(data, train_y)

train_predicted = knn.predict(data)  # 预测
train_score = knn.score(data, train_y)  # 计算准确率
"""
使用测试集数据测试
"""
test_X = test_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
test_y = test_data['类型_num']
"""
标准化语法
Z-Score标准化
"""
from sklearn.preprocessing import scale

data_test = pd.DataFrame()
data_test['萼片长标准化'] = scale(test_X['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_X['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_X['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_X['花瓣宽(cm)'])
# 预测结果
test_preticted = knn.predict(data_test)
test_score = knn.score(data_test, test_y)
print(test_score)

本次训练测试是为了让大家更快更好的了解KNN算法以及里面的基础知识,比如sklearn的使用与标准化方法等。

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值