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语言中时间戳转换成时间字符串的方法

    将C语言中的时间戳转换成时间字符串,需要用到几个相关的C库函数。下面是操作步骤和示例代码。 时间戳 首先简单介绍一下时间戳。时间戳是指从1970年1月1日00:00:00到指定时间的总秒数。在C语言中可以用time()函数获取当前时刻的时间戳,返回值是一个time_t类型的整数。 localtime()函数 在将时间戳转换成时间字符串的过程中,需要用到loc…

    C 2023年5月22日
    00
  • C语言动态链表实现学生学籍管理系统

    首先,C语言动态链表实现学生学籍管理系统需要完成以下几个步骤: 定义学生信息结构体:包括学生学号、姓名、性别、年龄等信息; 动态创建链表:动态分配内存空间,创建链表头指针,并将链表头指针设为 NULL; 添加学生信息:包括从键盘输入学生信息、创建新节点、将新节点添加到链表末尾等步骤; 查找学生信息:包括按学号查找、按姓名查找等功能; 修改学生信息:包括按学号…

    C 2023年5月23日
    00
  • C语言 字符串和字符串函数

    C语言字符串和字符串函数 在C语言中,字符串是由一系列字符组成的字符数组。C语言中的字符串是以空字符(‘\0’)结尾的字符数组。字符串常用于存储文本,比如打印、读取和传输文件内容等操作。C语言提供了许多字符串函数以简化字符串的操作和处理。 字符串的基本操作 字符串的定义和赋值 在C语言中,定义字符串有以下两种方式: char str1[6] = {‘h’, …

    C 2023年5月9日
    00
  • Lua教程(二十一):编写C函数的技巧

    Lua教程(二十一):编写C函数的技巧 在Lua的扩展开发中,编写C函数是非常必要的。本篇文章将介绍一些编写C函数时需要掌握的技巧。 捕获Lua栈 当我们需要在C中调用Lua函数并获得Lua栈中的值时,我们需要使用Lua_API中提供的函数来实现这一目标。我们可以通过以下示例实现: int my_function(lua_State* L) { int ar…

    C 2023年5月24日
    00
  • C语言kmp算法简单示例和实现原理探究

    C语言KMP算法简单示例和实现原理探究 概述 KMP算法是一种字符串匹配算法,它能在O(n+m)的时间复杂度内匹配文本串和模式串。与简单的暴力匹配算法相比,它的时间复杂度更低。 实现原理 暴力匹配算法 在了解KMP算法之前,我们先来看一下暴力匹配算法,这是最简单的字符串匹配算法。 暴力匹配算法的实现原理是:假设文本串为T,模式串为P,从T的第一个字符开始,依…

    C 2023年5月22日
    00
  • C++中replace() 函数的基本用法

    当我们在使用C++字符串(string)时,可能会需要对其中的某些字符进行替换操作。C++中的replace()函数可以完成这个任务,它可以在指定的位置上替换指定数量的字符为另外一组字符序列。下面我们就来具体了解一下replace()函数的用法。 函数原型 C++中replace()函数的原型如下: string replace(size_t pos, si…

    C 2023年5月23日
    00
  • Win10安装中提示错误0xC1900101的多种解决方法

    Win10安装中提示错误0xC1900101的多种解决方法 在 Win10 的升级或安装过程中,可能会遇到报错 “0xC1900101”,该错误通常提示安装过程无法完成,这时我们需要采取相应的解决方法。 下面介绍 “Win10安装中提示错误0xC1900101的多种解决方法”: 解决方法1:更新BIOS 更新BIOS是一种可行的解决方法,因为BIOS更新可以…

    C 2023年5月23日
    00
  • JDK1.8、JDK1.7、JDK1.6区别看这里

    JDK1.6、JDK1.7、JDK1.8区别 Java Development Kit(JDK)是Java编程环境的发行版。JDK包含Java运行环境(JRE)和Java开发工具(JDK)。 JDK版本通常以数字表示(例如JDK1.6、JDK1.7、JDK1.8)。下面是这些版本的主要区别。 JDK1.6(Java 6) JDK1.6提供了许多新功能和改进。…

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