作者|Dehao Zhang
编译|VK
起源|Towards Data Science

临时,设想一下你不是一个花卉专家(如果你是专家,那对你很好!)。你能辨别三种不同的鸢尾属动物吗?刚毛鸢尾属,花色鸢尾属和维吉尼亚鸢尾属(setosa, versicolor, virginica)?

我晓得我不能…

然而,如果咱们有一个蕴含这些物种实例的数据集,以及它们的萼片和花瓣的测量后果呢?

换言之,咱们能从这个数据集中学到什么来帮忙咱们辨别这三个物种吗?


目录

  1. 咱们为什么抉择这个数据集?
  2. 咱们想答复什么问题?
  3. 在这个数据集中咱们能找到什么?
  4. 咱们正在构建哪些分类器?
  5. 下一步该怎么办?

数据集

在这篇博文中,我将摸索UCI机器学习库中的Iris数据集。它摘自其网站,据说这可能是模式识别文献中最驰名的数据库。此外,Jason Brownlee,机器学习社区创建者,他称该数据集为机器学习的“Hello World”。

我将把这个数据集举荐给那些对数据迷信感兴趣并渴望构建第一个ML模型的人。它的一些低劣个性见下文:

  • 150个具备4个属性的实例(雷同的单位,全副为数字)
  • 平衡的阶层散布
  • 无缺失数据

如你所见,这些个性有助于将你在数据筹备过程中破费的工夫减至起码,这样你就能够专一于构建你的第一个ML模型。

并不是说筹备阶段不重要。相同,这个过程是如此的重要,以至于对于一些初学者来说,这可能是十分耗时的,而且他们在开始模型开发之前可能会把本人压得喘不过气来。

例如,来自Kaggle的风行数据集House Prices:Advanced returnation Techniques有大概80个特色,其中超过20%蕴含某种程度的缺失数据。在这种状况下,你可能须要破费一些工夫来了解属性并填充缺失的值。


指标

在钻研了这个数据集之后,咱们心愿可能答复两个问题,这在分类问题中十分典型:

  1. 预测-给定新的数据点,模型预测其类(物种)的准确度如何?
  2. 推断-哪些预测因素能够无效地帮忙预测?

分类

分类是一类有监督的机器学习问题,其中指标(响应)变量是离散的。给定蕴含已知标签的训练数据,分类器从输出变量(X)到输入变量(Y)近似一个映射函数(f)。

当初是时候写一些代码了!请参阅我的Github页面以获取残缺的Python代码(在Jupyter Notebook中编写)。

链接:https://github.com/terryz1/ex...


导入库并加载数据集

首先,咱们须要导入库:pandas(加载数据集)、numpy(矩阵操作)、matplotlib和seaborn(可视化)以及sklearn(构建分类器)。在导入它们之前,请确保它们曾经装置(请参阅此处的安装程序包指南)。

import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom pandas.plotting import parallel_coordinatesfrom sklearn.tree import DecisionTreeClassifier, plot_treefrom sklearn import metricsfrom sklearn.naive_bayes import GaussianNBfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysisfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.svm import SVCfrom sklearn.linear_model import LogisticRegression

要加载数据集(也能够在我的Github页面中找到),咱们能够应用pandas的read_csv函数(我的代码还包含通过url加载的选项)。

data = pd.read_csv('data.csv')

加载数据后,咱们能够通过head查看前几行:

data.head(5)

注:所有四个测量单位均为厘米。

数值摘要

首先,让咱们通过“describe”来查看每个属性的数值摘要:

data.describe()

咱们还能够应用groupby和size查看类散布:

data.groupby('species').size()

咱们能够看到每个类都有雷同数量的实例。

训练集测试集拆分

当初,咱们能够将数据集分成训练集和测试集。通常,咱们还应该有一个验证集,用来评估每个分类器的性能,进行微调,并确定最佳模型。测试集次要用于报告。然而,因为这个数据集的规模很小,咱们能够通过应用测试集来满足验证集的目标来简化它。

此外,我还应用了分层放弃办法来预计模型精度。我会在当前的博客中探讨缩小偏差的办法。

train, test = train_test_split(data, test_size = 0.4, stratify = data[‘species’], random_state = 42)

留神:我设置了40%的数据作为测试集,以确保有足够的数据点来测试模型。

探索性数据分析

在咱们宰割数据集之后,咱们能够持续摸索训练数据。matplotlib和seaborn都有很好的绘图工具,咱们能够用来可视化。

让咱们首先创立一些单变量图。为每个特色创立直方图:

n_bins = 10fig, axs = plt.subplots(2, 2)axs[0,0].hist(train['sepal_length'], bins = n_bins);axs[0,0].set_title('Sepal Length');axs[0,1].hist(train['sepal_width'], bins = n_bins);axs[0,1].set_title('Sepal Width');axs[1,0].hist(train['petal_length'], bins = n_bins);axs[1,0].set_title('Petal Length');axs[1,1].hist(train['petal_width'], bins = n_bins);axs[1,1].set_title('Petal Width');# 增加一些间距fig.tight_layout(pad=1.0);

请留神,对于花瓣长度和花瓣宽度,仿佛有一组数据点的值比其余数据点小,这表明此数据中可能存在不同的组。

接下来,让咱们尝试一些箱线图:

fig, axs = plt.subplots(2, 2)fn = ["sepal_length", "sepal_width", "petal_length", "petal_width"]cn = ['setosa', 'versicolor', 'virginica']sns.boxplot(x = 'species', y = 'sepal_length', data = train, order = cn, ax = axs[0,0]);sns.boxplot(x = 'species', y = 'sepal_width', data = train, order = cn, ax = axs[0,1]);sns.boxplot(x = 'species', y = 'petal_length', data = train, order = cn, ax = axs[1,0]);sns.boxplot(x = 'species', y = 'petal_width', data = train,  order = cn, ax = axs[1,1]);# 增加一些间距fig.tight_layout(pad=1.0);

底部的两个图表明咱们后面看到的那组数据点是setosas。它们的花瓣尺寸比其余两个物种更小,散布也更少。与其余两个物种相比,versicolor的平均值比virginica 低。

小提琴图是另一种可视化形式,它联合了直方图和方框图的长处:

sns.violinplot(x="species", y="petal_length", data=train, size=5, order = cn, palette = 'colorblind');

当初咱们能够应用seaborn的pairplot函数绘制所有成对属性的散点图:

sns.pairplot(train, hue="species", height = 2, palette = 'colorblind');

请留神,有些变量仿佛高度相干,例如花瓣长度和花瓣宽度。另外,花瓣的测量比萼片的拆散更好。

接下来,咱们制作一个相关矩阵来定量查看变量之间的关系:

corrmat = train.corr()sns.heatmap(corrmat, annot = True, square = True);

次要的论断是花瓣的大小有高度的正相干,而萼片的测量是不相干的。留神花瓣特色与萼片长度也有较高的相关性,但与萼片宽度无关。

另一个很酷的可视化工具是 parallel coordinate plot,它将每一行示意为一条直线。

parallel_coordinates(train, "species", color = ['blue', 'red', 'green']);

正如咱们之前所见,花瓣的测量比萼片的能更好地区分物种。


构建分类器

当初咱们筹备建设一些分类器

为了让咱们的生存更轻松,让咱们把类标签和特色离开:

X_train = train[['sepal_length','sepal_width','petal_length','petal_width']]y_train = train.speciesX_test = test[['sepal_length','sepal_width','petal_length','petal_width']]y_test = test.species

决策树

我想到的第一个分类器是一个称为决策树。起因是咱们能够看到分类规定,而且很容易解释。

让咱们应用sklearn(文档)构建一个,最大深度为3,咱们能够在测试数据上查看它的准确性:

mod_dt = DecisionTreeClassifier(max_depth = 3, random_state = 1)mod_dt.fit(X_train,y_train)prediction=mod_dt.predict(X_test)print(‘The accuracy of the Decision Tree is’,”{:.3f}”.format(metrics.accuracy_score(prediction,y_test)))--------------------------------------------------------------------The accuracy of the Decision Tree is 0.983.

决策树正确预测了98.3%的测试数据。该模型的一个长处是,你能够通过每个因子的feature-importances属性来查看其特色重要性:

mod_dt.feature_importances_--------------------------------------------------------------------array([0.        , 0.        , 0.42430866, 0.57569134])

从输入后果和基于四个特色的索引,咱们晓得前两个特色(萼片度量)并不重要,只有花瓣特色被用来构建这棵树。

决策树的另一个长处是咱们能够通过plot_tree可视化分类规定:

plt.figure(figsize = (10,8))plot_tree(mod_dt, feature_names = fn, class_names = cn, filled = True);

此树中的分类规定(对于每个拆分,左->是,右->否)

除了每个规定(例如,第一个规范是花瓣宽度≤0.7),咱们还能够看到每个拆分、指定类别等的基尼指数。请留神,除了底部的两个“浅紫色”框外,所有终端节点都是纯的。对于这两类状况,示意没有信念。

为了证实对新数据点进行分类是如许容易,假如一个新实例的花瓣长度为4.5cm,花瓣宽度为1.5cm,那么咱们能够依据规定预测它是versicolor。

因为只应用花瓣特色,因而咱们能够可视化决策边界并以二维模式绘制测试数据:

在60个数据点中,59个被正确分类。另一种显示预测后果的办法是通过混同矩阵:

disp = metrics.plot_confusion_matrix(mod_dt, X_test, y_test,                                 display_labels=cn,                                 cmap=plt.cm.Blues,                                 normalize=None)disp.ax_.set_title('Decision Tree Confusion matrix, without normalization');

通过这个矩阵,咱们看到有一种花色,咱们预测是virginica。

构建一棵树的一个毛病是它的不稳定性,这能够通过诸如随机森林、boosting等集成技术来改善。当初,让咱们持续下一个模型。

高斯奢侈贝叶斯分类器

最风行的分类模型之一是奢侈贝叶斯。它蕴含了“Naive”一词,因为它有一个要害的类条件独立性假如,这意味着给定的类,每个特色的值都被假设独立于任何其余特色的值(请参阅此处)。

咱们晓得,这里显然不是这样,花瓣特色之间的高度相关性证实了这一点。让咱们用这个模型来查看测试精度,看看这个假如是否牢靠:

The accuracy of the Guassian Naive Bayes Classifier on test data is 0.933

如果咱们只应用花瓣特色,后果如何:

The accuracy of the Guassian Naive Bayes Classifier with 2 predictors on test data is 0.950

乏味的是,仅应用两个特色会导致更正确的分类点,这表明在应用所有特色时可能会适度拟合。看起来咱们奢侈贝叶斯分类器做得不错。

线性判别分析

如果咱们应用多元高斯分布来计算类条件密度,而不是应用一元高斯分布的乘积(在奢侈贝叶斯中应用),咱们将失去一个LDA模型。LDA的要害假如是类之间的协方差相等。咱们能够应用所有特色和仅花瓣特色查看测试精度:

The accuracy of the LDA Classifier on test data is 0.983The accuracy of the LDA Classifier with two predictors on test data is 0.933

应用所有特色能够进步咱们的LDA模型的测试精度。

为了在二维可视化决策边界,咱们能够仅应用花瓣的LDA模型,并绘制测试数据:

四个测试点被谬误分类-三个virginica和一个versicolor。

当初假如咱们要用这个模型对新的数据点进行分类,咱们只需在图上画出点,而后依据它所属的色彩区域进行预测。

二次判别分析

LDA和QDA的区别在于QDA不假如类间的协方差相等,它被称为“二次型”,因为决策边界是一个二次函数。

The accuracy of the QDA Classifier is 0.983The accuracy of the QDA Classifier with two predictors is 0.967

在所有特色的状况下,它与LDA具备雷同的精度,并且仅应用花瓣时,它的性能稍好一些。

相似地,让咱们绘制QDA(只有花瓣的模型)的决策边界:

KNN分类器

当初,让咱们换个角度,看看一个名为KNN的非参数模型。它是一个非常风行的模型,因为它绝对简略和易于实现。然而,咱们须要意识到当特色的数量变大时咱们会受到维度咒骂。

让咱们用K的不同抉择绘制测试精度:

咱们能够看到,当K为3或在7到10之间时,精确度最高(约为0.965)。与以前的模型相比,分类新的数据点不那么间接,因为咱们须要在四维空间中察看它的K个最近的街坊。

其余模型

我还钻研了其余模型,如logistic回归、反对向量机分类器等。

留神SVC(带线性内核)的测试精度达到了100%!

咱们当初应该很有信念,因为咱们的大多数模型的准确率都超过了95%。


下一步

以下是一些将来钻研的想法:

  • 对这些模型进行穿插验证,并比拟它们之间的均匀精确度。
  • 找到其余数据源,包含其余鸢尾属物种及其萼片/花瓣测量值(如果可能,也包含其余属性),并查看新的分类精度。
  • 制作一个交互式的web应用程序,依据用户输出的测量值来预测物种。

结尾

咱们钻研了Iris数据集,而后应用sklearn构建了一些风行的分类器。咱们发现花瓣的测量值比萼片的测量值更有助于分类实例。此外,大多数模型的测试精度都在95%以上。

参考文献

  • Dua, D. and Graff, C. (2019). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
  • Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani. (2013). An introduction to statistical learning : with applications in R. New York :Springer.

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

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

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

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