其实学习机器学习的最好方法是设计和完成小项目。
Python 是一种流行且功能强大的解释型语言。与 R 不同,Python 是一种完整的语言和平台,可用于研究和开发以及开发生产系统。
还有很多模块和库可供选择,提供多种方式来完成每项任务。
开始使用 Python 进行机器学习的最佳方式是完成一个项目。
大家可以参考一下基础步骤:
真正适应新平台或工具的最佳方法是端到端地完成机器学习项目并涵盖关键步骤。就是从加载数据、汇总数据、评估算法和做出一些预测。
做完这些之后,你就有了一个模板,你可以在其他数据集上使用,之后再进一步的数据准备和改进结果任务。
在本节中,我们将端到端地完成一个小型机器学习项目。
以下是我们将要介绍的内容的概述:
完成每一步,尝试自己输入命令或复制并粘贴命令。
系统上安装 Python 和 SciPy 平台,
本教程假设 Python 版本为 2.7 或 3.6+。
您需要安装 5 个关键库。以下是本教程所需的 Python SciPy 库列表:
有很多方法可以安装这些库。我最好的建议是选择一种方法。
该SciPy的安装页面提供了多个不同的平台,如Linux,Mac OS X和Windows上安装上述库极好的说明。(觉得使用记得给小普一个点赞,编辑不易~)
如果您使用的是 Windows ,我建议安装Anaconda的免费版本。
注意:本教程假设您安装了 scikit-learn 0.20 或更高版本。
需要的话,小普会出一些教程:
如何使用Anaconda为机器学习设置Python环境
如何使用Python3创建用于机器学习的Linux虚拟机
确保您的 Python 环境已成功安装并按预期工作是一个好主意。
下面的脚本将帮助您测试您的环境。它导入本教程中所需的每个库并打印版本。
打开命令行并启动python解释器:
python
我建议直接在解释器中工作或编写脚本而不是大型编辑器和 IDE 上运行它们,专注于机器学习而不是工具链。
键入或复制并粘贴以下脚本:
# Check the versions of libraries
# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
这是我在 OS X 工作站上得到的输出:
Python: 3.6.11 (default, Jun 29 2020, 13:22:26)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
scipy: 1.5.2
numpy: 1.19.1
matplotlib: 3.3.0
pandas: 1.1.0
sklearn: 0.23.2
将上述输出与您的版本进行比较。
理想情况下,你的版本应该匹配或更新。API 不会快速更改,因此如果你落后几个版本,这个教程也适用。
我们将使用鸢尾花数据集。这个数据集很出名,因为它被几乎所有人用作机器学习和统计中的“hello world”数据集。
该数据集包含 150 个鸢尾花的观察结果。花有四列以厘米为单位的测量值。第五列是观察到的花的种类。所有观察到的花都属于三个物种之一。
你可以网商搜索相关数据集
在这一步中,我们将从 CSV 文件 URL 加载。
首先,让我们导入我们将在本教程中使用的所有模块、函数和对象。
# Load libraries
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
...
如果有错误,可能需要一个有效的 SciPy 环境。请参阅上面有关设置环境的建议。
我们可以直接从 UCI 机器学习存储库加载数据。
我们正在使用Pandas 加载数据。接下来,我们还将使用 Pandas 通过描述性统计和数据可视化来探索数据。
请注意,我们在加载数据时指定了每列的名称。这将有助于稍后我们探索数据。
# Load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(url, names=names)
数据集应该正常加载。
如果您确实有网络问题,您可以将iris.csv文件下载到您的工作目录并使用相同的方法加载它,将 URL 更改为本地文件名。
现在是查看数据的时候了。
在这一步中,我们将通过几种不同的方式查看数据:
别着急,每看一次数据就是一个命令。这些是有用的命令,您可以在未来的项目中反复使用。
我们可以通过 shape 属性快速了解数据包含多少个实例(行)和多少个属性(列)。
...
# shape
print(dataset.shape)
应该看到 150 个实例和 5 个属性:
(150, 5)
实际观察您的数据也总是一个好主意。
...
# head
print(dataset.head(20))
您应该看到数据的前 20 行:
sepal-length sepal-width petal-length petal-width class
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
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa
10 5.4 3.7 1.5 0.2 Iris-setosa
11 4.8 3.4 1.6 0.2 Iris-setosa
12 4.8 3.0 1.4 0.1 Iris-setosa
13 4.3 3.0 1.1 0.1 Iris-setosa
14 5.8 4.0 1.2 0.2 Iris-setosa
15 5.7 4.4 1.5 0.4 Iris-setosa
16 5.4 3.9 1.3 0.4 Iris-setosa
17 5.1 3.5 1.4 0.3 Iris-setosa
18 5.7 3.8 1.7 0.3 Iris-setosa
19 5.1 3.8 1.5 0.3 Iris-setosa
现在我们可以看一下每个属性的摘要。
这包括计数、平均值、最小值和最大值以及一些百分位数。
...
# descriptions
print(dataset.describe())
我们可以看到,所有的数值都具有相同的刻度(厘米),并且在 0 到 8 厘米之间具有相似的范围。
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
现在让我们看看属于每个类的实例(行)数。我们可以将其视为绝对计数。
...
# class distribution
print(dataset.groupby('class').size())
我们可以看到每个类都有相同数量的实例(数据集的 50 或 33%)。
class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
作为参考,我们可以将之前的所有元素组合到一个脚本中。
下面列出了完整的示例。
我们现在对数据有了一个基本的了解。我们需要通过一些可视化来扩展它。
我们将看两种类型的图:
我们从一些单变量图开始,即每个单独变量的图。
鉴于输入变量是数字变量,我们可以创建每个变量的箱线图。
...
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
这让我们对输入属性的分布有了更清晰的了解:
我们还可以创建每个输入变量的直方图以了解分布情况。
...
# histograms
dataset.hist()
pyplot.show()
看起来可能有两个输入变量具有高斯分布。这很有用,因为我们可以使用可以利用这个假设的算法。
现在我们可以看看变量之间的相互作用。
首先,让我们看一下所有属性对的散点图。这有助于发现输入变量之间的结构化关系。
...
# scatter plot matrix
scatter_matrix(dataset)
pyplot.show()
注意一些属性对的对角线分组。这表明高度相关性和可预测的关系。
作为参考,我们可以将之前的所有元素组合到一个脚本中。
下面列出了完整的示例。
# visualize the data
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
# Load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(url, names=names)
# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
# histograms
dataset.hist()
pyplot.show()
# scatter plot matrix
scatter_matrix(dataset)
pyplot.show()
现在是时候创建一些数据模型并估计它们对看不见的数据的准确性了。
这是我们将在此步骤中介绍的内容:
我们需要知道我们创建的模型是好的。
稍后,我们将使用统计方法来估计我们在看不见的数据上创建的模型的准确性。我们还希望通过在实际未见数据上评估最佳模型对未见数据的准确性进行更具体的估计。
也就是说,我们将保留一些算法不会看到的数据,我们将使用这些数据来获得关于最佳模型实际上可能有多准确的第二个独立想法。
我们将加载的数据集分成两部分,其中 80% 将用于训练、评估和在模型中选择,20% 将作为验证数据集保留。
...
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
y = array[:,4]
X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1)
您现在在X_train和Y_train 中拥有用于准备模型的训练数据以及我们稍后可以使用的X_validation和Y_validation集。
请注意,我们使用 Python 切片来选择 NumPy 数组中的列。
我们将使用分层 10 折交叉验证来估计模型准确性。
这会将我们的数据集分成 10 个部分,对 9 部分进行训练,对 1 部分进行测试,并对所有训练-测试分割组合重复。
分层意味着数据集的每次折叠或拆分都旨在使示例在整个训练数据集中的分布相同。
我们通过random_state参数将随机种子设置为固定数字,以确保在训练数据集的相同分割上评估每个算法。
我们正在使用“准确度”指标来评估模型。
这是正确预测的实例数除以数据集中的实例总数再乘以 100 的比率(例如,准确率为 95%)。我们将在 接下来运行构建和评估每个模型时使用评分变量。
我们不知道哪种算法可以很好地解决这个问题或使用什么配置。
我们从图中得到一个想法,即某些类在某些维度上是部分线性可分的,因此我们期望得到总体上良好的结果。
让我们测试 6 种不同的算法:
这是简单线性(LR 和 LDA)、非线性(KNN、CART、NB 和 SVM)算法的良好混合。
让我们构建和评估我们的模型:
...
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma='auto')))
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
names.append(name)
print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))
我们现在有 6 个模型和每个模型的准确度估计。我们需要将模型相互比较并选择最准确的。
运行上面的例子,我们得到以下原始结果:
LR: 0.960897 (0.052113)
LDA: 0.973974 (0.040110)
KNN: 0.957191 (0.043263)
CART: 0.957191 (0.043263)
NB: 0.948858 (0.056322)
SVM: 0.983974 (0.032083)
注意:您的结果可能会因为算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
你得了多少分?
在下面的评论中发布您的结果。
在这种情况下,我们可以看到支持向量机 (SVM) 的估计准确度得分最高,约为 0.98 或 98%。
我们还可以创建模型评估结果图,并比较每个模型的传播和平均准确度。每个算法都有一组准确度度量,因为每个算法都被评估了 10 次(通过 10 倍交叉验证)。
比较每个算法的结果样本的一种有用方法是为每个分布创建一个箱线图并比较这些分布。
...
# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()
我们可以看到盒须图在范围的顶部被压扁,许多评估达到了 100% 的准确度,有些则推到了 80% 的高准确度。
作为参考,我们可以将之前的所有元素组合到一个脚本中。
下面列出了完整的示例。
# compare algorithms
from pandas import read_csv
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
# Load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(url, names=names)
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
y = array[:,4]
X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma='auto')))
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
names.append(name)
print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))
# Compare Algorithms
pyplot.boxplot(results, labels=names)
pyplot.title('Algorithm Comparison')
pyplot.show()
我们必须选择一种算法来进行预测。
上一节的结果表明 SVM 可能是最准确的模型。我们将使用这个模型作为我们的最终模型。
现在我们想了解模型在验证集上的准确性。
这将使我们对最佳模型的准确性进行独立的最终检查。保留验证集很重要,以防万一您在训练过程中出现失误,例如过度拟合训练集或数据泄漏。这两个问题都会导致过于乐观的结果。
我们可以在整个训练数据集上拟合模型并对验证数据集进行预测。
...
# Make predictions on validation dataset
model = SVC(gamma='auto')
model.fit(X_train, Y_train)
predictions = model.predict(X_validation)
我们可以通过将预测与验证集中的预期结果进行比较来评估预测,然后计算分类准确率,以及混淆矩阵和分类报告。
....
# Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
我们可以看到,在保留数据集上的准确率为 0.966 或约 96%。
混淆矩阵提供了所犯错误的指示。
最后,分类报告按精度、召回率、f1-score 和显示出色结果的支持(假设验证数据集很小)提供了每个类别的细分。
0.9666666666666667
[[11 0 0]
[ 0 12 1]
[ 0 0 6]]
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 11
Iris-versicolor 1.00 0.92 0.96 13
Iris-virginica 0.86 1.00 0.92 6
accuracy 0.97 30
macro avg 0.95 0.97 0.96 30
weighted avg 0.97 0.97 0.97 30
作为参考,我们可以将之前的所有元素组合到一个脚本中。
下面列出了完整的示例。
# make predictions
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
# Load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(url, names=names)
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
y = array[:,4]
X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1)
# Make predictions on validation dataset
model = SVC(gamma='auto')
model.fit(X_train, Y_train)
predictions = model.predict(X_validation)
# Evaluate predictions
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
完成上面的教程。最多需要 5 到 10 分钟!
无需了解所有内容。你的目标是端到端地完成教程并获得结果。您不需要在第一遍就了解所有内容。一边走一边列出你的问题。大量使用Python中的help(“FunctionName”)帮助语法来了解您正在使用的所有函数。
不需要知道算法是如何工作的。了解限制以及如何配置机器学习算法很重要。但是可以稍后学习算法。你需要在很长一段时间内慢慢积累这些算法知识。今天,首先要熟悉这个平台。
无需成为 Python 程序员。如果您不熟悉 Python 语言,它的语法可能很直观。就像其他语言一样,关注函数调用(例如function())和赋值(例如a = “b”)。这将使您大获全胜。您是一名开发人员,您知道如何快速掌握一门语言的基础知识。刚开始,稍后再深入了解细节。
无需成为机器学习专家。您可以稍后了解各种算法的优点和局限性,并且您可以稍后阅读大量帖子,以了解机器学习项目的步骤以及使用交叉验证评估准确性的重要性。
机器学习项目中的其他步骤呢?我们没有涵盖机器学习项目中的所有步骤,因为这是您的第一个项目,我们需要关注关键步骤。即加载数据,查看数据,评估一些算法并进行一些预测。在后面的教程中,我们可以查看其他数据准备和结果改进任务。
在本文中,您逐步了解了如何使用 Python 完成您的第一个机器学习项目。
您发现完成从加载数据到进行预测的小型端到端项目是熟悉新平台的最佳方式。
你完成了教程吗?
你有问题吗?
请写在下方的评论区,一起讨论。