共计 7247 个字符,预计需要花费 19 分钟才能阅读完成。
作者 |Dehao Zhang
编译 |VK
起源 |Towards Data Science
临时,设想一下你不是一个花卉专家(如果你是专家,那对你很好!)。你能辨别三种不同的鸢尾属动物吗?刚毛鸢尾属,花色鸢尾属和维吉尼亚鸢尾属(setosa, versicolor, virginica)?
我晓得我不能…
然而,如果咱们有一个蕴含这些物种实例的数据集,以及它们的萼片和花瓣的测量后果呢?
换言之,咱们能从这个数据集中学到什么来帮忙咱们辨别这三个物种吗?
目录
- 咱们为什么抉择这个数据集?
- 咱们想答复什么问题?
- 在这个数据集中咱们能找到什么?
- 咱们正在构建哪些分类器?
- 下一步该怎么办?
数据集
在这篇博文中,我将摸索 UCI 机器学习库中的 Iris 数据集。它摘自其网站,据说这可能是模式识别文献中最驰名的数据库。此外,Jason Brownlee,机器学习社区创建者,他称该数据集为机器学习的“Hello World”。
我将把这个数据集举荐给那些对数据迷信感兴趣并渴望构建第一个 ML 模型的人。它的一些低劣个性见下文:
- 150 个具备 4 个属性的实例(雷同的单位,全副为数字)
- 平衡的阶层散布
- 无缺失数据
如你所见,这些个性有助于将你在数据筹备过程中破费的工夫减至起码,这样你就能够专一于构建你的第一个 ML 模型。
并不是说筹备阶段不重要。相同,这个过程是如此的重要,以至于对于一些初学者来说,这可能是十分耗时的,而且他们在开始模型开发之前可能会把本人压得喘不过气来。
例如,来自 Kaggle 的风行数据集 House Prices:Advanced returnation Techniques 有大概 80 个特色,其中超过 20% 蕴含某种程度的缺失数据。在这种状况下,你可能须要破费一些工夫来了解属性并填充缺失的值。
指标
在钻研了这个数据集之后,咱们心愿可能答复两个问题,这在分类问题中十分典型:
- 预测 - 给定新的数据点,模型预测其类(物种)的准确度如何?
- 推断 - 哪些预测因素能够无效地帮忙预测?
分类
分类是一类有监督的机器学习问题,其中指标(响应)变量是离散的。给定蕴含已知标签的训练数据,分类器从输出变量(X)到输入变量(Y)近似一个映射函数(f)。
当初是时候写一些代码了!请参阅我的 Github 页面以获取残缺的 Python 代码(在 Jupyter Notebook 中编写)。
链接:https://github.com/terryz1/ex…
导入库并加载数据集
首先,咱们须要导入库:pandas(加载数据集)、numpy(矩阵操作)、matplotlib 和 seaborn(可视化)以及 sklearn(构建分类器)。在导入它们之前,请确保它们曾经装置(请参阅此处的安装程序包指南)。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from pandas.plotting import parallel_coordinates
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from 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 = 10
fig, 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.species
X_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.983
The 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.983
The 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/