下面我将为您详细讲解如何使用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技术站