机器学习实战之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数据处理的入门。