Python机器学习:分步教程
(从此处开始)
在本节中,我们将端到端完成一个小型机器学习项目。
以下是我们要介绍的内容的概述:
- 安装Python和SciPy平台。
- 加载数据集。
- 汇总数据集。
- 可视化数据集。
- 评估一些算法。
- 做一些预测。
慢慢来。完成每个步骤。
1.下载,安装和启动Python SciPy
如果尚未安装Python和SciPy平台,请在系统上安装它。
我不想详细介绍这一点,因为其他人已经知道了。这已经非常简单了,特别是如果您是开发人员。如果您确实需要帮助,请在评论中提出问题。
1.1安装SciPy库
本教程假定使用Python 2.7或3.6+版本。
您将需要安装5个密钥库。以下是本教程所需的Python SciPy库的列表:
- 科学的
- 麻木
- matplotlib
- 大熊猫
- 斯克莱恩
有许多安装这些库的方法。我最好的建议是选择一种方法,然后在安装每个库时保持一致。
该SciPy的安装页面提供了多个不同的平台,如Linux,Mac OS X和Windows上安装上述库极好的说明。如果您有任何疑问或疑问,请参阅本指南,成千上万的人关注着它。
- 在Mac OS X上,可以使用macports安装Python 3.6和这些库。有关macports的更多信息,请参见主页。
- 在Linux上,您可以使用软件包管理器(例如Fedora上的yum)来安装RPM。
如果您使用Windows或不确定,我建议安装免费版本的Anaconda,其中包括您需要的所有内容。
注意:本教程假定您已安装scikit-learn 0.20或更高版本。
需要更多帮助吗?请参阅以下教程之一:
- 如何使用Anaconda设置Python环境进行机器学习
- 如何使用Python 3创建用于机器学习的Linux虚拟机
1.2启动Python并检查版本
确保您的Python环境已成功安装并且可以正常工作是一个好主意。
下面的脚本将帮助您测试环境。它将导入本教程所需的每个库并打印版本。
打开命令行并启动python解释器:
python
我建议直接在解释器中工作或编写脚本并在命令行(而不是大型编辑器和IDE)上运行它们。保持简单,专注于机器学习而不是工具链。
输入或复制并粘贴以下脚本:
# Check the versions of libraries# Python versionimport sysprint('Python: {}'.format(sys.version))# scipyimport scipyprint('scipy: {}'.format(scipy.__version__))# numpyimport numpyprint('numpy: {}'.format(numpy.__version__))# matplotlibimport matplotlibprint('matplotlib: {}'.format(matplotlib.__version__))# pandasimport pandasprint('pandas: {}'.format(pandas.__version__))# scikit-learnimport sklearnprint('sklearn: {}'.format(sklearn.__version__))1# Check the versions of libraries # Python versionimport sysprint('Python: {}'.format(sys.version))# scipyimport scipyprint('scipy: {}'.format(scipy.__version__))# numpyimport numpyprint('numpy: {}'.format(numpy.__version__))# matplotlibimport matplotlibprint('matplotlib: {}'.format(matplotlib.__version__))# pandasimport pandasprint('pandas: {}'.format(pandas.__version__))# scikit-learnimport sklearnprint('sklearn: {}'.format(sklearn.__version__))
OS X工作站上获得的输出:
Python: 3.6.9 (default, Oct 19 2019, 05:21:45) [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]scipy: 1.3.1numpy: 1.17.3matplotlib: 3.1.1pandas: 0.25.1sklearn: 0.21.3
理想情况下,您的版本应该匹配或较新。API不会快速更改,因此如果您落后几个版本,也不必太担心,本教程中的所有内容很可能仍然对您有用。
如果出现错误,请停止。现在该修复它了。
如果您不能干净地运行上述脚本,则将无法完成本教程。
2.加载数据
我们将使用鸢尾花数据集。该数据集之所以出名,是因为几乎所有人都将其用作机器学习和统计中的“ hello world”数据集。
数据集包含150个鸢尾花的观测值。花的测量单位有四列,以厘米为单位。第五列是观察到的花的种类。所有观察到的花均属于三种。。
在此步骤中,我们将从CSV文件URL加载虹膜数据。
2.1导入库
首先,让我们导入将在本教程中使用的所有模块,函数和对象
# Load librariesfrom pandas import read_csvfrom pandas.plotting import scatter_matrixfrom matplotlib import pyplotfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import StratifiedKFoldfrom sklearn.metrics import classification_reportfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import accuracy_scorefrom sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVC
一切都应该正确加载。如果有错误,请停止。在继续之前,您需要一个工作正常的SciPy环境。请参阅上面有关设置环境的建议。
2.2加载数据集
我们可以直接从UCI机器学习存储库中加载数据。
我们正在使用熊猫来加载数据。接下来,我们还将使用熊猫通过描述性统计信息和数据可视化来探索数据。
请注意,我们在加载数据时指定每列的名称。这将在以后探索数据时提供帮助。
# Load dataseturl = "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更改为本地文件名来加载它。
3.汇总数据集
现在该看一下数据了。
在这一步中,我们将以几种不同的方式看一下数据:
- 数据集的尺寸。
- 窥视数据本身。
- 所有属性的统计摘要。
- 通过类变量对数据进行分类。
不用担心,每次查看数据都是一个命令。这些有用的命令可以在以后的项目中反复使用。
3.1数据集维度
我们可以通过shape属性快速了解数据包含多
少个实例(行)和多少个属性(列)。
# shapeprint(dataset.shape)
您应该看到150个实例和5个属性
(150, 5)
3.2查看数据
实际关注数据也是一个好主意。
# headprint(dataset.head(20))
sepal-length sepal-width petal-length petal-width class0 5.1 3.5 1.4 0.2 Iris-setosa1 4.9 3.0 1.4 0.2 Iris-setosa2 4.7 3.2 1.3 0.2 Iris-setosa3 4.6 3.1 1.5 0.2 Iris-setosa4 5.0 3.6 1.4 0.2 Iris-setosa5 5.4 3.9 1.7 0.4 Iris-setosa6 4.6 3.4 1.4 0.3 Iris-setosa7 5.0 3.4 1.5 0.2 Iris-setosa8 4.4 2.9 1.4 0.2 Iris-setosa9 4.9 3.1 1.5 0.1 Iris-setosa10 5.4 3.7 1.5 0.2 Iris-setosa11 4.8 3.4 1.6 0.2 Iris-setosa12 4.8 3.0 1.4 0.1 Iris-setosa13 4.3 3.0 1.1 0.1 Iris-setosa14 5.8 4.0 1.2 0.2 Iris-setosa15 5.7 4.4 1.5 0.4 Iris-setosa16 5.4 3.9 1.3 0.4 Iris-setosa17 5.1 3.5 1.4 0.3 Iris-setosa18 5.7 3.8 1.7 0.3 Iris-setosa19 5.1 3.8 1.5 0.3 Iris-setosa
3.3统计摘要
现在我们来看看每个属性的摘要。
这包括计数,平均值,最小值和最大值以及一些百分位数。
# descriptionsprint(dataset.describe())
我们可以看到,所有数值都具有相同的标度(厘米),相似的范围介于0到8厘米之间。
sepal-length sepal-width petal-length petal-widthcount 150.000000 150.000000 150.000000 150.000000mean 5.843333 3.054000 3.758667 1.198667std 0.828066 0.433594 1.764420 0.763161min 4.300000 2.000000 1.000000 0.10000025% 5.100000 2.800000 1.600000 0.30000050% 5.800000 3.000000 4.350000 1.30000075% 6.400000 3.300000 5.100000 1.800000max 7.900000 4.400000 6.900000 2.500000
3.4班级分布
现在让我们看一下属于每个类的实例(行)的数量。我们可以将其视为绝对计数。
# class distributionprint(dataset.groupby('class').size())
我们可以看到每个类具有相同数量的实例(数据集的50或33%)
classIris-setosa 50Iris-versicolor 50Iris-virginica 50
3.5完整范例
作为参考,我们可以将所有先前的元素绑定到一个脚本中。
下面列出了完整的示例。
# summarize the datafrom pandas import read_csv# Load dataseturl = "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)# shapeprint(dataset.shape)# headprint(dataset.head(20))# descriptionsprint(dataset.describe())# class distributionprint(dataset.groupby('class').size())
4.数据可视化
现在,我们对数据有了基本的了解。我们需要通过一些可视化来扩展它。
我们将研究两种类型的图:
- 单变量图可以更好地理解每个属性。
- 多变量图可更好地了解属性之间的关系。
4.1单变量图
我们从一些单变量图开始,即每个单独变量的图。
假设输入变量是数字变量,我们可以为每个变量创建箱形图和晶须图。
# box and whisker plotsdataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)pyplot.show()
这使我们对输入属性的分布有了更清晰的认识:
我们还可以为每个输入变量创建一个直方图,以了解分布情况。
# histogramsdataset.hist()pyplot.show()
看起来其中两个输入变量具有高斯分布。注意这一点很有用,因为我们可以使用可以利用此假设的算法。
4.2多元图
现在我们来看一下变量之间的相互作用。
首先,让我们看看所有属性对的散点图。这有助于发现输入变量之间的结构化关系。
# scatter plot matrixscatter_matrix(dataset)pyplot.show()
注意一些属性对的对角线分组。这表明高度相关和可预测的关系。
4.3完整范例
作为参考,我们可以将所有先前的元素绑定到一个脚本中。
下面列出了完整的示例。
# visualize the datafrom pandas import read_csvfrom pandas.plotting import scatter_matrixfrom matplotlib import pyplot# Load dataseturl = "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 plotsdataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)pyplot.show()# histogramsdataset.hist()pyplot.show()# scatter plot matrixscatter_matrix(dataset)pyplot.show()
5.评估一些算法
现在是时候创建一些数据模型并评估它们在看不见数据上的准确性了。
这是我们将在此步骤中介绍的内容:
- 分离出验证数据集。
- 设置测试工具以使用10倍交叉验证。
- 建立多个不同的模型以根据花的测量预测物种
- 选择最佳型号。
5.1创建验证数据集
我们需要知道我们创建的模型是好的。
稍后,我们将使用统计方法来估计我们在看不见的数据上创建的模型的准确性。我们还希望通过对实际看不见的数据进行评估,从而对看不见的最佳模型的准确性进行更具体的估计。
也就是说,我们将保留一些算法不会看到的数据,并将使用这些数据来获得第二个独立的想法,即最佳模型实际上可能有多精确。
我们将加载的数据集分为两个部分,其中80%将用于训练,评估和选择模型,另外20%将作为验证数据集。
# Split-out validation datasetarray = dataset.valuesX = 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 slice来选择NumPy数组中的列。
5.2测试线束
我们将使用分层的10倍交叉验证来估计模型的准确性。
这会将我们的数据集分成10个部分,在9上训练,在1上测试,然后对训练测试拆分的所有组合重复。
分层是指数据集的每个折叠或拆分都将旨在使示例分布与整个训练数据集中相同。
我们通过random_state参数将随机种子设置为固定数字,以确保每种算法都在训练数据集的相同分割上进行评估。
特定的随机种子无关紧要,
我们使用“ 准确性 ” 指标来评估模型。
这是正确预测的实例数除以数据集中的实例总数乘以100得到的百分比(例如,准确度为95%)的比率。 当我们运行构建并接下来评估每个模型时,我们将使用评分变量。
5.3建立模型
我们不知道哪种算法可以解决此问题或使用哪种配置。
从图中可以看出,某些类别在某些维度上是部分线性可分离的,因此我们期望总体上取得良好的结果。
让我们测试6种不同的算法:
- 逻辑回归(LR)
- 线性判别分析(LDA)
- K最近邻居(KNN)。
- 分类和回归树(CART)。
- 高斯朴素贝叶斯(NB)。
- 支持向量机(SVM)。
这是简单的线性算法(LR和LDA),非线性算法(KNN,CART,NB和SVM)的很好的结合。
让我们构建和评估我们的模型:
# Spot Check Algorithmsmodels = []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 turnresults = []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()))
5.4选择最佳模型
现在,我们有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 Algorithmspyplot.boxplot(results, labels=names)pyplot.title('Algorithm Comparison')pyplot.show()
我们可以看到,箱形图和晶须图在范围的顶部被压缩,许多评估达到了100%的准确度,而有些评估则降低到了80%的高准确度。
5.5完整范例
作为参考,我们可以将所有先前的元素绑定到一个脚本中。
下面列出了完整的示例。
# compare algorithmsfrom pandas import read_csvfrom matplotlib import pyplotfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import StratifiedKFoldfrom sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVC# Load dataseturl = "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 datasetarray = dataset.valuesX = 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 Algorithmsmodels = []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 turnresults = []names = []for name, model in models:kfold = StratifiedKFold(n_splits=10, random_state=1)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 Algorithmspyplot.boxplot(results, labels=names)pyplot.title('Algorithm Comparison')pyplot.show()
6.做出预测
我们必须选择一种算法来进行预测。
上一节中的结果表明,SVM可能是最准确的模型。我们将使用此模型作为最终模型。
现在,我们要对验证集中的模型的准确性有所了解。
这将使我们对最佳模型的准确性进行独立的最终检查。保留验证集非常重要,以防万一您在训练过程中滑倒,例如过度适合训练集或数据泄漏。这两个问题都将导致过于乐观的结果。
6.1做出预测
我们可以在整个训练数据集上拟合模型,并在验证数据集上进行预测。
# Make predictions on validation datasetmodel = SVC(gamma='auto')model.fit(X_train, Y_train)predictions = model.predict(X_validation)
6.2评估预测
我们可以通过将预测结果与验证集中的预期结果进行比较来评估预测结果,然后计算分类准确性,以及混淆矩阵和分类报告。
# Evaluate predictionsprint(accuracy_score(Y_validation, predictions))print(confusion_matrix(Y_validation, predictions))print(classification_report(Y_validation, predictions))
我们可以看到,在保留数据集上,准确性为0.966或大约96%。
混淆矩阵提供了三个错误的指示。
最后,分类报告按精度,召回率,f1得分和支持分类显示了每个分类,并显示了出色的结果(允许的验证数据集很小)。
0.9666666666666667[[11 0 0] [ 0 12 1] [ 0 0 6]] precision recall f1-score support Iris-setosa 1.00 1.00 1.00 11Iris-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
6.3完整范例
作为参考,我们可以将所有先前的元素绑定到一个脚本中。
下面列出了完整的示例。
# make predictionsfrom pandas import read_csvfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import accuracy_scorefrom sklearn.svm import SVC# Load dataseturl = "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 datasetarray = dataset.valuesX = 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 datasetmodel = SVC(gamma='auto')model.fit(X_train, Y_train)predictions = model.predict(X_validation)# Evaluate predictionsprint(accuracy_score(Y_validation, predictions))print(confusion_matrix(Y_validation, predictions))print(classification_report(Y_validation, predictions))
此教程作者 Jason Brownlee