Python 中的 k-最近邻算法
简介
k-最近邻是一种强大而直接的技术,可用于解决与分类和回归相关的问题。它对输入样本进行预测,并检查样本之间的相似程度。在本文中,我们将使用两种不同的方法解释 k-NN 技术和 Python 实现。为了确保清楚地理解这种众所周知的技术,我们将提供分步说明,并附上可执行代码和结果。
k-最近邻算法
用于分类和回归问题的监督机器学习 (ML) 技术称为 k-最近邻 (k-NN) 算法。它在相同实例经常产生相似结果的前提下运行。该算法定位 k 个最接近的训练示例,并根据给定新输入的大多数标签或这些样本的平均值确定要预测的类(分类)或值(回归)。
语法
两者的语法相似。这里我们将使用 scikit-learn 库,它可以帮助在 python 中开发 k-NN 方法。根据用户的需求,有两种不同的方法。如果用户想要分类任务,他/她可以使用 KNeighborsClassifier,或者如果用户想要预测数值部分,他/她可以使用 KNeighborsRegressor
1.分类 −
from sklearn.neighbors import KNeighborsClassifier # 创建 k-NN 分类器实例 knn = KNeighborsClassifier(n_neighbors=k) # 使用训练数据训练分类器 knn.fit(X_train, y_train) # 对新数据进行预测 predictions = knn.predict(X_test)
2. 回归 −
from sklearn.neighbors import KNeighborsRegressor # 创建 k-NN 回归器实例 knn = KNeighborsRegressor(n_neighbors=k) # 使用训练数据训练回归器数据 knn.fit(X_train, y_train) # 对新数据进行预测 predictions = knn.predict(X_test)
上述代码使用 k 表示要考虑的邻居数量,X_train 和 y_train 表示训练特征和标签,X_test 表示应进行预测的新数据。
语法说明
相关类从 sklearn.neighbors 包导入。
通过定义 k-NN 分类器或回归器要考虑的邻居数量,我们可以生成它的一个实例。
使用 fit() 函数和训练集,我们训练分类器或回归器。
最后,我们使用 predict() 方法在提供更新的数据的同时生成预测。
算法
步骤 1 − 加载数据:- 将数据集读取或加载到 Python 环境中。
步骤 2 − 拆分数据:- 将数据集分为训练集和测试集,以评估算法的有效性。
步骤 3 − 预处理数据:- 为确保数据表示的一致性,请执行任何必要的准备程序,例如缩放或规范化。
步骤 4 − 训练 k-NN 模型:- 利用训练数据,创建 k-NN 分类器或回归器的实例。
步骤 5 − 评估模型:- 根据测试集进行预测,然后使用合适的指标(如准确率或均方)评估模型的性能错误。
方法
方法 1 - k-NN 分类示例
方法 2 - k-NN 回归示例
方法 1:k-NN 分类示例
让我们看一下 k-NN 分类的实际应用,根据萼片和花瓣的尺寸来识别鸢尾花的种类。在本演示中,我们将使用众所周知的 Iris 数据集。
示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 加载 Iris 数据集
iris = load_iris()
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 创建 k-NN 分类器的实例
knn = KNeighborsClassifier(n_neighbors=3)
# 使用训练集训练分类器数据
knn.fit(X_train, y_train)
# 对测试集进行预测
predictions = knn.predict(X_test)
# 计算并打印模型的准确率
accuracy = accuracy_score(y_test, predictions)
print("Accuracy:", accuracy)
输出
Accuracy: 1.0
在方法 1 中,加载鸢尾花数据集,将其分为训练集和测试集,并创建一个 n_neighbors=3 的 k-NN 分类器实例。
使用训练集数据,我们训练分类器,然后使用测试集进行预测。
为了确定模型的准确性,我们将预测标签与实际标签进行比较。在本例中,结果显示模型的准确性,即 1.0 或 100%。这表明 k-NN 分类器在识别测试集中的鸢尾花种类方面具有 100% 的准确性。
方法 2:k-NN 回归示例
让我们利用波士顿住房数据集来预测自住房屋的中位数价格作为回归的示例。对于这个挑战,我们将使用 k-NN 回归器。
示例
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
# 加载波士顿住房数据集
boston = load_boston()
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)
# 创建 k-NN 回归器的实例
knn = KNeighborsRegressor(n_neighbors=5)
# 使用训练集训练回归器数据
knn.fit(X_train, y_train)
# 对测试集进行预测
predictions = knn.predict(X_test)
# 计算并打印模型的均方误差
mse = mean_squared_error(y_test, predictions)
print("均方误差:", mse)
输出
均方误差:30.137858823529412
在方法 2 中,加载波士顿住房数据集,将其分为训练集和测试集,并创建一个 n_neighbors=5 的 k-NN 回归器实例。
通常,我们使用数据的训练集(也称为训练集)来训练算法,然后我们使用该训练集使用 k-NN 进行预测算法。
最后,我们比较预测值和实际值,得到模型的均方误差。模型的均方误差 (MSE) 在本例中约为 30.1379,显示在输出中。MSE 是测试集中的真实值与自住住宅的预期中值之间的平均平方差。在这种情况下,较低的分数表明回归模型更准确,因为较低的 MSE 表明性能更高。用于构建 KNeighborsRegressor 实例的 n_neighbors 参数数以及用于将数据划分为训练集和测试集的随机状态将决定均方误差的精确量。
结论
k-最近邻 (k-NN) 算法是一种灵活且流行的机器学习方法。对于涉及分类和回归的问题,它特别有用。本文介绍了 k-NN 技术的基本原理、其 Python 语法以及如何实现它的详细描述。除了完整的可执行代码和结果外,我们还研究了两种使用 k-NN 进行分类和回归的方法。通过理解 k-NN 方法及其有用的应用,您可以将 k-NN 方法用作解决一系列机器学习问题的有力工具。
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

