Python机器学习实战:使用KNN进行数据分类
随着机器学习的发展,越来越多的企业和机构开始使用机器学习算法来解决各种问题。KNN(K-Nearest Neighbors)是一种基本的机器学习算法之一,它被广泛应用于分类和回归问题。本文将介绍使用Python和KNN算法进行数据分类的过程。
1. 什么是KNN算法?
KNN算法是一种基于实例的学习方法,其基本思想是:如果一个样本在特征空间中的K个最近邻的样本中的大多数属于某个类别,则该样本也属于这个类别。具体实现中,KNN算法计算待分类样本与训练集中每个样本的距离,然后选择最近的K个邻居,并将它们所属的类别作为待分类样本的类别。
2. 使用KNN进行数据分类的步骤
步骤1:准备数据集
在本例中,我们使用一个经典的数据集——鸢尾花数据集,该数据集有150个样本,每个样本包含4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。每个样本还有一个分类标签,指示该样本属于哪个鸢尾花品种。我们可以使用Python中的pandas库来加载并处理数据集。
```
import pandas as pd
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
# 转换为dataframe格式
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['class'] = iris.target
# 分割数据集为训练集和测试集
train_data = iris_df.sample(frac=0.7, random_state=1)
test_data = iris_df.drop(train_data.index)
```
步骤2:计算距离
我们使用欧几里得距离作为KNN算法的距离度量。给定两个向量$u$和$v$,欧几里得距离$d(u,v)$的计算方式是:
$$d(u,v) = \sqrt{\sum_{i=1}^{n}(u_i-v_i)^2}$$
其中,$n$是向量的长度。
在Python中,我们可以使用NumPy库来方便地实现欧几里得距离计算。
```
import numpy as np
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
```
步骤3:选择K值
KNN算法中的K值是一个重要的超参数,它的选择决定了算法的性能。通常情况下,我们可以通过交叉验证来选择K值。在本例中,我们选择K=5。
```
k = 5
```
步骤4:分类
我们使用所有训练集中的数据作为参考集合,对每个测试集中的数据点进行分类。我们可以定义一个函数,使用上面实现的欧几里得距离函数来计算测试集中的每个数据点与参考集合中的每个数据点之间的距离,并选择距离最近的K个数据点。然后,我们可以使用这K个数据点的分类标签的众数作为测试集中的数据点的分类标签。
```
def classify(train_data, test_data, k):
# 存储预测值
predictions = []
# 对测试集中的每个数据点进行分类
for i in range(len(test_data)):
distances = []
for j in range(len(train_data)):
# 计算测试集中的数据点与参考集合中的每个数据点之间的距离
dist = euclidean_distance(test_data.iloc[i][:-1].values, train_data.iloc[j][:-1].values)
distances.append((train_data.iloc[j], dist))
# 选择距离最近的K个数据点
distances.sort(key=lambda x: x[1])
neighbors = [distances[x][0] for x in range(k)]
# 使用这K个数据点的分类标签的众数作为测试集中的数据点的分类标签
class_counts = np.zeros(3)
for neighbor in neighbors:
class_index = int(neighbor[-1])
class_counts[class_index] += 1
predictions.append(np.argmax(class_counts))
return predictions
```
步骤5:评估算法性能
我们可以使用分类准确率来评估算法的性能。分类准确率是指算法正确分类的数据点数占总数据点数的比例。
```
def accuracy(predictions, actual):
correct = 0
for i in range(len(predictions)):
if predictions[i] == actual[i]:
correct += 1
return correct / float(len(predictions))
# 进行预测
predictions = classify(train_data, test_data, k)
# 评估算法性能
acc = accuracy(predictions, test_data['class'].values)
print('Accuracy:', acc)
```
3. 总结
本文介绍了使用Python和KNN算法进行数据分类的过程。KNN算法是一种简单有效的机器学习算法,它可以用于分类和回归问题。本文使用鸢尾花数据集作为示例数据集,并提供了完整的Python代码。读者可以根据自己的实际需求,对代码进行修改和扩展。