python实现K最近邻算法

下面我将为您详细讲解如何使用Python实现K最近邻算法的完整攻略。

K最近邻算法简介

K最近邻算法(K-Nearest Neighbor,简称KNN算法)是一种基于样本特征向量空间中距离度量来分类的方法。该算法的基本思路是,对于一个新的样本实例,在特征向量空间中寻找与其距离最近的K个已知类别的样本实例,然后根据这K个最邻近样本的类别,使用少数服从多数的投票法来决定该样本实例属于哪个类别。

实现过程

1. 导入数据集

首先,我们需要导入数据集,数据集可以是一个csv文件、文本文件或者数据库查询结果等。这里以csv文件为例,使用 pandas 库中的 read_csv 函数将数据读入到 DataFrame 中,如下所示:

import pandas as pd

data = pd.read_csv('data.csv')

2. 数据预处理

接下来需要对数据进行预处理,比如数据清洗、标准化、缺失值处理等。在KNN算法中,最关键的一步就是计算样本之间的距离,如果特征值之间的量纲(单位)不同,那么计算结果可能会因为特征值大小差异度量失真。因此,我们需要将特征值进行标准化处理,使得它们具有相同的量纲。下面是一个标准化的示例:

from sklearn.preprocessing import StandardScaler

# 选择需要标准化的特征列进行标准化
features = ['feature1', 'feature2', 'feature3']
scaler = StandardScaler()
data[features] = scaler.fit_transform(data[features])

3. 划分数据集

将数据集分为训练集和测试集,常用的方式是将数据集中的80%用于训练,20%用于测试。下面是一个示例:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data[features], data['label'], test_size=0.2, random_state=42)

4. 训练模型

使用 sklearn 库中的 KNeighborsClassifier 类来训练模型。该类实现了KNN算法,并提供了一些常用的参数,如K值、距离度量等。下面是一个训练模型的示例:

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train, y_train)

5. 测试模型

使用测试集来测试模型的性能,评价指标可以选择准确率、召回率、F1值等。下面是一个示例:

from sklearn.metrics import accuracy_score

y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

6. 模型优化

KNN算法的性能很大程度上取决于K值的选择,一般来说,K值的大小应该是一个奇数,并且根据具体的数据集来选择合适的K值。此外,距离度量方式也会影响算法的性能。在sklearn库中,KNeighborsClassifier类的metric参数控制了距离的度量方式,默认是欧式距离。我们可以根据需要选择其他的距离度量方式。

7. 预测数据

使用训练好的模型对新的数据进行分类预测,下面是一个预测新数据的示例:

new_data = [[1.2, 2.3, 0.9],
            [3.4, 1.9, 2.5]]
new_data = scaler.transform(new_data)
knn.predict(new_data)

示例说明

下面我们以一个鸢尾花数据集为例,来说明KNN算法的应用。该数据集包含了150个样本,其中每个样本包含了4个特征值和1个标签值。我们需要根据这四个特征值来预测每个样本所属的鸢尾花品种。

示例1:基本应用

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 导入数据集,该数据集包含了150个样本,每个样本包含了4个特征值和1个标签值
data = pd.read_csv('iris.csv')

# 数据预处理,包括标准化和划分数据集
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
scaler = StandardScaler()
data[features] = scaler.fit_transform(data[features])
X_train, X_test, y_train, y_test = train_test_split(data[features], data['species'], test_size=0.2, random_state=42)

# 训练模型并测试模型性能
knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

该代码运行结果为:

Accuracy: 1.0

示例2:优化K值

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 导入数据集,该数据集包含了150个样本,每个样本包含了4个特征值和1个标签值
data = pd.read_csv('iris.csv')

# 数据预处理,包括标准化和划分数据集
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
scaler = StandardScaler()
data[features] = scaler.fit_transform(data[features])
X_train, X_test, y_train, y_test = train_test_split(data[features], data['species'], test_size=0.2, random_state=42)

# 优化K值并测试模型性能
k_values = list(range(1, 21, 2))
best_accuracy = 0
for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k, metric='euclidean')
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    if accuracy > best_accuracy:
        best_knn = knn
        best_accuracy = accuracy
    print('K:', k, 'Accuracy:', accuracy)
print('Best K:', best_knn.n_neighbors, 'Best Accuracy:', best_accuracy)

该代码运行结果为:

K: 1 Accuracy: 1.0
K: 3 Accuracy: 1.0
K: 5 Accuracy: 1.0
K: 7 Accuracy: 1.0
K: 9 Accuracy: 1.0
K: 11 Accuracy: 1.0
K: 13 Accuracy: 1.0
K: 15 Accuracy: 0.9666666666666667
K: 17 Accuracy: 0.9666666666666667
K: 19 Accuracy: 0.9666666666666667
Best K: 1 Best Accuracy: 1.0

可以看到,当K=1时,模型的准确率达到了100%,可以认为是最优K值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现K最近邻算法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C#连接Oracle数据库的多种方法总结

    C#连接Oracle数据库的多种方法总结 在C#开发过程中,连接Oracle数据库是一个经常需要面对的问题。本文总结了多种连接Oracle数据库的方法,以供大家参考。 方法一:使用Oracle客户端 这是最经典的连接Oracle数据库的方法。在此之前需要安装Oracle的客户端,下载地址可以在Oracle官网上找到。 使用步骤如下: 在Visual Stud…

    C 2023年5月22日
    00
  • Python中Random和Math模块学习笔记

    当谈到随机数生成,Python自带的random模块和math模块是帮助我们处理这些任务的重要组件。这两个库都允许我们使用Python进行随机数生成操作,它们之间也存在着一些区别,下面我来详细讲解一下这两个模块的使用。 Random模块 Random模块是Python自带的标准库之一,可以用于生成随机数和从序列中作出随机选择。下面是一个简单的示例,展示了如何…

    C 2023年5月22日
    00
  • golang分层测试之http接口测试入门教程

    我来详细讲解“golang分层测试之http接口测试入门教程”的完整攻略。该攻略包括以下几个部分: 1.前置知识 在学习golang分层测试之http接口测试之前,需要掌握一些基础知识,包括但不限于: Golang基础语法 RESTful API基本概念 Http协议 JSON数据格式 2.环境搭建 在进行http接口测试之前,需要搭建一套测试环境。可以从以…

    C 2023年5月23日
    00
  • asp.net(C#)解析Json的类代码

    下面我将详细讲解“asp.net(C#)解析Json的类代码”的完整攻略。 1. 什么是Json? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于服务器端和Web应用程序之间的数据传输。它基于JavaScript语言的一个子集,易于人们阅读和编写。JSON采用完全独立于编程语言的文本格式来描述数据。 JSO…

    C 2023年5月23日
    00
  • C语言统计字符个数代码分享

    C语言统计字符个数代码分享 概述 统计字符个数是C语言编程中的一项基础操作,本文将分享一份C语言代码,实现统计文件中字符个数的功能。 实现过程 读取文件 首先需要打开文件,并读取其中的内容。在C语言中,可以使用stdlib库函数fopen和fclose分别打开和关闭文件,使用stdio库函数fread读取文件中的内容。 FILE *fp; // 文件指针 f…

    C 2023年5月24日
    00
  • 强大的JSON.stringify如何使用

    JSON.stringify是一种将JavaScript对象转换为JSON字符串的方法。它可以将对象、数组、数值、字符串、布尔、null、undefined转换为对应的JSON字符串表示形式。下面是JSON.stringify方法的详细使用攻略。 方法语法 JSON.stringify(value[, replacer[, space]]) 参数解释 val…

    C 2023年5月23日
    00
  • 布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法

    布隆过滤器及实现方法攻略 什么是布隆过滤器? 布隆过滤器是一种非常实用的数据结构,它可以用于快速判断一个元素是否在一个集合中。布隆过滤器可以有效地降低查询一个元素是否在集合中的时间复杂度,但是会带来一定的误判率。它由早在1970年提出,以其高效的查询速度和内存占用率低的特点而广受欢迎,被广泛应用于网络爬虫等场景中。 布隆过滤器的实现原理 布隆过滤器采用的是概…

    C 2023年5月22日
    00
  • C语言实现简单的停车场管理系统

    C语言实现简单的停车场管理系统 概述 本文介绍如何使用C语言实现简单的停车场管理系统。该系统支持车辆的进入、离开以及查询停车场内的车辆信息等基本功能。 实现步骤 1. 设计数据结构 首先需要设计一个数据结构来表示车辆的信息,包括车牌号、入场时间等。我们可以定义一个结构体来表示车辆信息,如下所示: typedef struct Car { char licen…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部