作者|Rashida Nasrin Sucky
编译|VK
起源|Towards Data Science

KNN分类器是一种十分风行的监督机器学习技术。本文将用一个例子来解释KNN分类器

什么是监督学习?

以下是百度百科:

监督学习是指:利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程,也称为监督训练或有老师学习。

监督学习是从标记的训练数据来推断一个性能的机器学习工作。训练数据包含一套训练示例。在监督学习中,每个实例都是由一个输出对象(通常为向量)和一个冀望的输入值(也称为监督信号)组成。监督学习算法是剖析该训练数据,并产生一个推断的性能,其能够用于映射出新的实例。一个最佳的计划将容许该算法来正确地决定那些看不见的实例的类标签。

举个例子会更分明

这是一个数据集,蕴含一些水果样本的品质、宽度、高度和色彩分数。

目标是训练一个模型,如果咱们在模型中输出品质、宽度、高度和色彩分数,模型就能够让咱们晓得水果的名称。例如,如果咱们输出一个水果的品质、宽度、高度和色彩分数别离设置为175、7.3、7.2、0.61,模型应该将水果的名称输入为苹果。

在这里,品质、宽度、高度和色彩分数是输出特色(X)。水果的名称是输入变量或标签(y)。

这个例子对你来说可能听起来很傻。但这是在监督机器学习模型中应用的机制。

稍后我将用一个实在的数据集展现一个理论的例子。

KNN分类器

KNN分类器是基于记忆的机器学习模型的一个例子。

这意味着这个模型会记住训练示例,而后他们用它来分类以前从未见过的对象。

KNN分类器的k是为了预测一个新的测试实例而检索的训练样本数。

KNN分类器分三步工作

  1. 当给它一个新的实例或实例进行分类时,它将检索之前记忆的训练样本,并从中找出最近的样本的k个数。
  2. 而后分类器查找最近的例子的k个数字的标签(下面例子中水果的名称)。
  3. 最初,该模型联合这些标签进行预测。通常,它会预测标签最多的那个。例如,如果咱们抉择k为5,在最近的5个例子中,如果咱们有3个橘子和2个苹果,那么新实例的预测值将是橘子。

材料筹备

在开始之前,我倡议你查看计算机中是否有以下可用资源:

  1. Numpy 库
  2. Pandas 库
  3. Matplotlib 库
  4. Scikit-Learn 库
  5. Jupyter Notebook

如果你没有装置Jupyter Notebook,你能够抉择其余笔记本。我倡议你能够应用谷歌公司的Colab。按此链接开始:https://colab.research.google...

谷歌Colab Notebook不是公有的。所以,不要在那里做任何业余或敏感的工作。但对练习来说很棒。因为很多罕用的软件包曾经装置在外面了。

我倡议下载数据集。我在页面底部提供了链接。你能够本人运行每一行代码。

首先,导入必要的库:

%matplotlib notebookimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn.model_selection import train_test_split

在本教程中,我将应用来自Kaggle的泰坦尼克号数据集。我已将此数据集上传到与我的笔记本雷同的文件夹中。

上面是如何应用pandas导入数据集。

titanic = pd.read_csv('titanic_data.csv')titanic.head()  #titaninc.head() 给出数据集的前五行。咱们只打印前五行以检查数据集。

看第二列。它蕴含的信息,如果人活了下来。0示意该人幸存,1示意该人没有存活。

在本教程中,咱们的指标是预测“幸存”特色。

为了简略起见,我将保留一些对算法更重要的要害特色,并去掉其余的。

这个数据集非常简单。仅仅凭直觉,咱们能够看到有些列对于预测“幸存”特色并不重要。

例如,“PassengerId”、“Name”、“Ticket”和“Cabin”仿佛对预测乘客是否存活没有帮忙。

我将制作一个具备一些要害特色的新数据帧,并将其命名为titanic1。

titanic1 = titanic[['Pclass', 'Sex', 'Fare', 'Survived']]

“Sex”列具备字符串值,须要更改该值。因为计算机不懂单词。它只懂数字。我将把“男”改为0,“女”改为1。

titanic1['Sex'] = titanic1.Sex.replace({'male':0, 'female':1})

以下是titanic1数据帧的外观:

咱们的指标是依据泰坦尼克1号数据帧中的其余信息预测“幸存”参数。因而,输入变量或标签(y)是“幸存”。输出特色(X)是'P-class'、'Sex'和'Fare'。

X = titanic1[['Pclass', 'Sex', 'Fare']]y = titanic1['Survived']

开发KNN分类器

首先,咱们须要将数据集分成两个集:训练集和测试集。

咱们将应用训练集来训练模型,其中模型将同时记忆输出特色和输入变量。

而后,咱们将应用测试集来测验模型是否可能应用“P-class”、“Sex”和“Fare”来预测乘客是否幸存。

“train_test_split”办法将有助于宰割数据。默认状况下,此函数应用75%的数据失去训练集,应用25%的数据失去测试集。你能够扭转它,你能够指定“train_size”或“test_size ”。

如果将train_size设置为0.8,则拆分为80%的训练数据和20%的测试数据。但对我来说,默认值75%是好的。所以,我没有应用train_size或test_size 参数。

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

记住对“random_state”应用雷同的值。这样,每次进行这种拆分时,训练集和测试集的数据都是雷同的。

我抉择随机状态为0。你能够抉择一个数字。

Python的scikit-learn库曾经有了KNN分类器模型。进行导入。

from sklearn.neighbors import KNeighborsClassifier

将此分类器保留在变量中。

knn = KNeighborsClassifier(n_neighbors = 5)

在这里,n_neighbors是5。

这意味着,当咱们要求咱们的训练模型来预测一个新实例的生存概率时,它须要5个最近的训练数据。

基于这5个训练数据的标签,模型将预测新实例的标签。

当初,我将把训练数据拟合到模型中,以便模型可能记住它们。

knn.fit(X_train, y_train)

你可能会认为,当它记住训练数据时,它能够100%正确地预测训练特色的标签。但不肯定,为什么?

每当咱们给出输出并要求它预测标签时,它都会从5个最近的街坊那里投票,即便它记忆了完全相同的特色。

让咱们看看它在训练数据上能给咱们多大的准确度

knn.score(X_test, y_test)

训练数据的准确率为0.83或83%。

记住,咱们有一个模型从未见过的测试数据集。当初检查一下,它能在多大程度上精确地预测测试数据集的标签。

knn.score(X_test, y_test)

准确率为0.78%或78%。

联合以上代码,上面是4行代码,它们形成了分类器:

knn = KNeighborsClassifier(n_neighbors = 5)knn.fit(X_train, y_train)knn.score(X_train, y_train)knn.score(X_test, y_test)

祝贺!你学习了KNN分类器!

留神,训练集的准确度比测试集的准确度高一点。

什么是过拟合?

有时,模型对训练集的学习十分好,能够很好地预测训练数据集的标签。然而,当咱们要求模型应用测试数据集或它以前没有看到的数据集进行预测时,它的性能如果远远不如训练集,这种景象称为过拟合。

用一句话来说,当训练集的准确度远远高于测试集的准确度时,咱们称之为过拟合。

预测

如果要查看测试数据集的预测输入,请执行以下操作:

输出:

y_pred = knn.predict(X_test)y_pred

输入:

array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0,       0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,       1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,       1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,       0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,       0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0,       1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,       1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1,       1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1,       0, 1, 1], dtype=int64)

或者你能够只输出一个例子,而后找到标签。

我想晓得,当一个人乘坐“P-class”=3旅行时,“Sex”是女性,也就是说Sex=1,而且,付了25英镑的“车费”,她是否能依照咱们的模型生存下来。

输出:

knn.predict([[3, 1, 25]])

记住应用两个括号,因为它须要一个二维数组

输入:

array([0], dtype=int64)

输入为零。这意味着依照咱们训练过的模型,这个人无奈生存。

请随时尝试更多不同的输出,就像这一个一样。

如果你想进一步剖析KNN分类器

KNN分类器对k和n_neighbors的抉择十分敏感。在下面的例子中,我应用了n_neighbors=5。

对于不同的n_neighbors,分类器的性能会有所不同。

让咱们检查一下它在训练数据集和测试数据集上对不同n_neighbors的执行状况。我选1到20。

当初,咱们将计算从1到20的每个n_neighbors的训练集准确率和测试集准确率

training_accuracy  = []  test_accuracy = []for i in range(1, 21):    knn = KNeighborsClassifier(n_neighbors = i)    knn.fit(X_train, y_train)    training_accuracy.append(knn.score(X_train, y_train))    test_accuracy.append(knn.score(X_test, y_test))

在运行了这个代码片段之后,我失去了针对不同n_neighbors的训练和测试准确度。

当初,让咱们将训练和测试集的精确度在同一图中进行比拟。

plt.figure()plt.plot(range(1, 21), training_accuracy, label='Training Accuarcy')plt.plot(range(1, 21), test_accuracy, label='Testing Accuarcy')plt.title('Training Accuracy vs Test Accuracy')plt.xlabel('n_neighbors')plt.ylabel('Accuracy')plt.ylim([0.7, 0.9])plt.legend(loc='best')plt.show()

剖析下面的图表

在一开始,当n_neighbors 为1、2或3时,训练准确率远远高于测试准确率。所以,这个模型正蒙受着过拟合的困扰。

在那之后,训练和测试的准确性变得更靠近了。这是最佳抉择。咱们想要这个。

但当n_neighbors变得更多时,训练和测试集的精确度都在降落。咱们不须要这个。

从下面的图中能够看出,这个特定数据集和模型的现实n_neighbors 应该是6或7。

这是一个很好的分类器!

看下面的图表!当n_neighbors 为7时,训练和测试的准确率均在80%以上。

以下是残缺代码的链接:

https://github.com/rashida048...

论断

我心愿你学会了构建一个很好的KNN分类器,并将在不同的数据集上进行尝试。

非常感谢你浏览这篇文章!以下是我在本教程中应用的泰坦尼克号数据集:

https://github.com/rashida048...

举荐浏览

  • https://towardsdatascience.co...
  • https://towardsdatascience.co...
  • https://towardsdatascience.co...
  • https://towardsdatascience.co...
  • https://towardsdatascience.co...
  • https://towardsdatascience.co...

原文链接:https://towardsdatascience.co...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/