机器学习实战之knn算法pandas

  • Post category:Python

机器学习实战之knn算法pandas

介绍

在本文中,我们将介绍如何使用knn(k-nearest neighbours)算法来完成分类任务,并且使用pandas来进行数据处理。knn算法是一种简单有效的机器学习算法,常用于分类和回归任务。我们将使用一个示例数据集来说明这个算法的用法,并且介绍如何使用pandas来对数据进行预处理。

数据集介绍

我们将使用一个名为iris的经典数据集。该数据集包含150个样本,每个样本代表一种花,其中包括三种不同的花:setosa,versicolor和virginica。每个样本具有四个属性:花瓣长度,花瓣宽度,花萼长度和花萼宽度。

数据处理

在使用knn算法之前,我们需要对数据进行预处理。在本示例中,我们将使用pandas来对数据进行处理。首先,我们需要导入pandas:

import pandas as pd

接下来,我们需要将数据加载到一个pandas的DataFrame对象中:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
df = pd.read_csv(url, header=None)

这里我们从UCI机器学习库中获取数据集,并使用read_csv函数将其转换为pandas的DataFrame对象。

我们可以使用head方法来查看前五个样本:

print(df.head())

输出结果为:

     0    1    2    3               4
0  5.1  3.5  1.4  0.2     Iris-setosa
1  4.9  3.0  1.4  0.2     Iris-setosa
2  4.7  3.2  1.3  0.2     Iris-setosa
3  4.6  3.1  1.5  0.2     Iris-setosa
4  5.0  3.6  1.4  0.2     Iris-setosa

目前数据看起来比较混乱,因为它们没有列名。所以我们为列添加有意义的名称。数据的前四列用于表示样本的属性,最后一列用于表示样本所属的类别。我们将它们分别命名为“sepal length”,“sepal width”,“petal length”,“petal width”,以及“class”:

df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']

此时,我们可以使用describe方法来查看关于数据的一些统计信息:

print(df.describe())

输出结果为:

       sepal length  sepal width  petal length  petal width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.054000      3.758667     1.198667
std        0.828066     0.433594      1.764420     0.763161
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000

KNN算法

接下来,我们将介绍如何使用knn算法来分类iris数据集。

首先,我们需要准备训练数据和测试数据。我们将把数据集的70%用于训练,30%用于测试。我们可以使用train_test_split方法从样本中随机选择70个,剩下的30个作为测试样本。

from sklearn.model_selection import train_test_split

X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)

这里,我们使用random_state参数来设置随机数种子,以确保每次运行程序时,我们都得到相同的结果。因为我们一共有三个类别,所以我们需要设置stratify参数以确保训练数据和测试数据中有相同数量的每个类别。

接下来,我们需要定义knn模型:

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')

在这里,我们选择使用minkowski度量来计算距离,它是欧几里得度量(p = 2)和曼哈顿度量(p = 1)的一般化。n_neighbors参数指定用于确定分类的最近邻居的数量。

现在,我们可以将训练数据输入到模型中以进行训练:

knn.fit(X_train, y_train)

之后,我们可以使用测试数据来测试模型:

y_pred = knn.predict(X_test)

我们可以通过比较预测结果和实际结果来评估模型:

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)

print('Accuracy: {:.2f}'.format(accuracy))

输出结果为:

Accuracy: 0.96

这意味着我们的模型能够正确识别96%的测试样本。

示例1:分类手写数字

下面,让我们使用knn算法来分类手写数字数据集。

首先,我们需要加载手写数字数据集:

from sklearn.datasets import load_digits

digits = load_digits()
X = digits.data
y = digits.target

然后,我们将数据集分成训练数据和测试数据:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)

接下来,我们可以定义knn模型并进行训练:

knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(X_train, y_train)

最后,我们可以使用测试数据来测试模型并评估其准确性:

y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: {:.2f}'.format(accuracy))

输出结果为:

Accuracy: 0.99

这意味着我们的模型能够正确识别99%的测试样本。

示例2:分类鸢尾花数据集

下面,我们将使用knn算法来分类鸢尾花数据集。

首先,我们需要将鸢尾花数据集加载到pandas中:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
df = pd.read_csv(url, header=None)
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']

然后,我们可以将数据集分成训练数据和测试数据:

X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)

接下来,我们可以定义knn模型并进行训练:

knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(X_train, y_train)

最后,我们可以使用测试数据来测试模型并评估其准确性:

y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: {:.2f}'.format(accuracy))

输出结果为:

Accuracy: 0.96

这意味着我们的模型能够正确识别96%的测试样本。

总结

在本文中,我们介绍了如何使用knn算法来分类和预测数据。我们还使用pandas来进行数据预处理。我们通过两个示例说明了该算法及其应用,一个是手写数字的分类,另外一个是鸢尾花数据集的分类。这些示例代码可以作为你学习机器学习算法和pandas数据处理的入门。