作者 |Behic Guven
编译 |VK
起源 |Towards Data Science
在这篇文章中,我将向你介绍一种称为监督学习的机器学习办法。我将向你展现如何应用 Scikit-learn 构建 kNN 分类器模型。
这将是一个实际演练,咱们将可能在实际常识的同时学习。作为咱们的分类器模型,咱们将应用 k -NN 算法模型,这将在引言局部进行更多介绍。作为编程语言,咱们将应用 Python。
浏览本教程后,你将更好地理解深度学习和监督学习模型的工作原理。
目录
- 监督学习
- 库
- 理解数据
- kNN 分类器模型
- 过拟合与欠拟合
- 论断
监督学习
深度学习是一门迷信,它使计算机可能在没有明确编程的状况下从数据中得出结论。比方学会预测电子邮件是否是垃圾邮件。另一个很好的例子是通过观察花的图片将它们分为不同的类别。
在监督学习中,数据分为两局部:特色和指标变量。工作是通过观察特色变量来预测指标变量。监督学习可用于两种不同的模型:分类和回归
当指标变量是分类数据集时,能够应用分类模型。
当指标变量是间断值时,应用回归模型。
库
在这一步中,咱们将装置本教程所需的库。正如引言中提到深度学习 lib 库的次要知识库。除此之外,咱们将装置两个简略的库,它们是 NumPy 和 Matplotlib。应用 PIP(python 包管理器)能够很容易地装置库。
装置库
进入终端窗口,开始装置过程:
pip install scikit-learn
当初让咱们装置其余两个库:
pip install numpy matplotlib
导入库
很完满!当初让咱们将它们导入到咱们的程序中,以便应用它们。我将在本教程中应用 Jupyter Notebook。因而,我创立了一个新的 Notebook 并导入了以下库模块。
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
理解数据
在本练习中,咱们将应用数字数据。它也被称为 MNIST。这是一个驰名的数据开始建设一个监督学习模型。这个数据的益处是咱们不用下载任何货色;它是随咱们先前装置的 sklearn 模块一起提供的。上面是如何加载数据集:
digits = datasets.load_digits()
当初,让咱们试着对运行几行的数据集有一些理解。
print(digits.keys)
Bunch 是一个提供属性款式拜访的 Python 字典。Bunch 就像字典。
print(digits.DESCR)
plt.imshow(digits.images[1010], cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()
K 近邻分类器
在库步骤中,咱们曾经在库步骤中导入了 k -NN 分类器模块。所以,咱们要做的就是在咱们的数据集中应用它。这一步是在我的项目中应用 sklearn 模块的一个很好的练习。因为咱们正在进行监督学习,所以数据集必须被标记。这意味着在训练数据时,咱们也传递后果。
k- 最近邻算法(k-NN)是一种用于分类和回归的非参数办法。在这两种状况下,输出由特色空间中 k 个最近的训练样本组成。输入取决于 k -NN 是用于分类还是回归。”(参考:https://en.wikipedia.org/wiki…
特色和指标变量
咱们从 sklearn 数据集导入的数字数据有两个属性,即 data 和 target。咱们首先将这些局部调配给咱们的新变量。咱们把特色(数据)称为 X 和标签(指标)称为 y:
X = digits.data
y = digits.target
拆分数据
接下来,咱们将应用 train_test_split 办法来宰割数据局部。与其对整个数据进行训练,不如将其拆分为训练和测试数据,以审查模型的准确性。这将在下一步更有意义,咱们将看到如何应用一些办法改良预测。
#test size 是指将数据集中作为测试数据的比率,其余将是训练数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42, stratify=y)
定义分类器
knn = KNeighborsClassifier(n_neighbors = 7)
拟合模型
knn.fit(X_train, y_train)
准确度得分
print(knn.score(X_test, y_test))
我来给你看看这个分数是怎么计算的。首先,咱们应用 knn 模型对 X_test 特色进行预测。而后与理论标签进行比拟。以下是在后盾理论计算准确度的办法:
y_pred = knn.predict(X_test)
number_of_equal_elements = np.sum(y_pred==y_test)
number_of_equal_elements/y_pred.shape[0]
过拟合与欠拟合
以下是我在 Amazon 机器学习课程文档中发现的模型过拟合和欠拟合的一个很好的解释:
“当模型在训练数据上体现不佳时,模型对训练数据的拟合有余。这是因为模型无奈捕捉输出示例(个性)和目标值(标签)之间的关系。当你看到模型在训练数据上体现良好,但在评估数据上体现不佳时,该模型会过拟合你的训练数据。这是因为模型正在记忆它所看到的数据,并且无奈将其推广到未看到的示例中。”(参考:https://docs.aws.amazon.com/m…
当初,让咱们编写一个 for 循环,它将帮忙咱们理解数据在不同的街坊值中的体现。此函数还将帮忙咱们分析模型的最佳性能,这意味着更精确的预测。
neighbors = np.arange(1, 9)
train_accuracy = np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))
for i, k in enumerate(neighbors):
# 定义 knn 分类器
knn = KNeighborsClassifier(n_neighbors = k)
# 将分类器与训练数据相匹配
knn.fit(X_train, y_train)
# 在训练集上计算准确度
train_accuracy[i] = knn.score(X_train, y_train)
# 在测试集上计算准确度
test_accuracy[i] = knn.score(X_test, y_test)
当初,让咱们用图形示意后果:
plt.title('k-NN: Performance by Number of Neighbors')
plt.plot(neighbors, test_accuracy, label = 'Testing Accuracy')
plt.plot(neighbors, train_accuracy, label = 'Training Accuracy')
plt.legend()
plt.xlabel('# of Neighbors')
plt.ylabel('Accuracy')
plt.show()
这个图证实了更多的街坊并不总是意味着更好的性能。当然,这次要取决于模型和数据。在咱们的例子中,正如咱们所看到的,1- 3 个街坊准确度是最高的。之前,咱们用 7 个街坊训练了 knn 模型,失去了 0.983 的准确度。所以,当初咱们晓得咱们的模型在两个街坊的状况下体现更好。让咱们从新训练咱们的模型,看看咱们的预测将如何扭转。
knn = KNeighborsClassifier(n_neighbors = 2)
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))
论断
很完满!你曾经应用 scikit learn 模块创立了一个监督学习分类器。咱们还学习了如何查看分类器模型的性能。咱们还学习了过拟合和欠拟合,这使咱们可能改良预测。深度学习是如此乏味和神奇。我将分享更多深刻学习的文章。敬请期待!
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/