此项目针对鸢尾花进行分类,项目中的数据集是含鸢尾花的三个亚属的分类信息,通过机器学习算法生成一个模型,自动分类新数据到这三个亚属的某一个中。
一、数据集特点分析
此项目中使用的鸢尾花数据集是一个非常容易理解的数据集,这个数据集具有以下特点:
·所有的特征数据都是数字,不需要考虑如何导入和处理数据。
·这是一个分类问题,可以很方便地通过有监督学习算法来解决问题。
·这是一个多分类问题,也许需要一些特殊的处理。
·所有的特征的数值采用相同的单位,不需要进行尺度的转换。
二、导入数据
导入项目所需的类库和鸢尾花(Iris Flower)数据集
2.1 导入类库
导入在项目中将要使用的类库和方法。代码如下:
#导入类库from pandas import read_csvfrom pandas.plotting import scatter_matrixfrom matplotlib import pyplotfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom 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.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVCimport warningswarnings.filterwarnings('ignore')
所有类库的导入确保无误方可进行下一步操作,若有错误提示,先纠错或检查编程环境配置以及类库安装是否有问题。
2.2 导入数据集
首先在UCI机器学习仓库下载鸢尾花(Iris Flower)数据集,下载完成后,更改文件为.csv格式,再保存在项目的统计目录中。
之后,我们将使用Pandas来导入数据和对数据进行描述性统计分析,并利用Matplotlib来实现数据可视化。
需要注意的是,在导入数据时,为每个数据特征设定了名称,这有助于后面对数据的展示工作,尤其是通过图表展示数据。导入数据的代码如下:
#导入数据filename = 'iris.data.csv'names=['separ_length','separ_width', 'petal_length', 'petal_width', 'class']dataset = read_csv(filename, names = names)
三、概述数据
我们需要先看一下数据,增加对数据的理解,以便选择合适的算法。我们将从以下几个角度来审查数据:
·数据的维度。
·查看数据自身。
·统计描述所有的数据特征
·数据分类的分布情况
3.1 数据维度
通过查看数据维度,对数据有个大致了解。代码如下:
# 显示数据维度print('数据维度:行 %s, 列 %s' % dataset.shape)------------------------------answer: 数据维度:行 150, 列 5
3.2 查看数据自身
通过查看数据自身可以直观地看到数据的特征、数据的类型,以及大概的数据分布范围。代码如下:
# 查看数据的前10行print(dataset.head(10))
answer:
3.3 统计描述数据
数据特征的统计描述信息包括数据的行数、中位值、最大值、最小值、均值、四分位值等统计数据信息。代码如下:
# 统计描述数据信息print(dataset.describe())
answer:
3.4 数据分类分布
接下来看一下数据在不同分类的分布情况,执行程序后得到的将是每个分类数据量的绝对的数值,看一下各个分类的数据分布是否均衡。代码如下:
# 分类分布情况print(dataset.groupby('class').size())
answer:
我们可以看到鸢尾花的三个亚属的数据各50条,分布非常平衡。如果数据的分布不平衡时,可能会影响到模型的准确度。
因此,当数据分布不平衡时,需要对数据进行处理,调整数据到相对平衡的状态。调整数据平衡时有以下几种方法。
·扩大数据样本。
·数据的重新抽样。
·尝试生成人工样本。
·异常检测和变化检测。
四、数据可视化
通过对数据的审查,对数据有了一个基本的了解,接下来将通过图表来进一步查看数据特征的分布情况和数据不同特征之间的相互关系。
·使用单变量图表可以更好地理解每一个特征属性。
·多变量图表用于理解不同特征属性之间的关系。
4.1 单变量图表
单变量图表可以显示每一个单独的特征属性,因为每个特征属性都是数字,因此我们可以通过线箱图来展示属性与中位值的离散速度。代码如下:
# 箱线图dataset.plot(kind='box',subplots=True,layout=(2,2), sharex=False, sharey=False)pyplot.show()
answer:
还可以通过直方图来显示每个特征属性的分布状况。代码如下:
# 直方图dataset.hist()pyplot.show()
answer:
4.2 多变量图表
通过多变量图表可以查看不同特征属性之间的关系。我们通过散点矩阵图来查看每个属性之间的影响关系。代码如下:
# 散点矩阵图scatter_matrix(dataset)pyplot.show()
answer:
五、评估算法
通过不同的算法来创建模型,并评估它们的准确度,以便找到最合适的算法。我们将按照下面的步骤进行操作:
(1)分离出评估数据集。(2)采用10折交叉验证来评估算法模型。(3)生成6个不同的模型来预测新数据。(4)选择最优模型。
5.1 分离出评估数据集
模型被创建后需要知道创建的模型是否足够好。在选择算法的过程中会采用统计学方法来评估算法模型。但是,我们更想知道算法模型对真实数据的准确度如何,这就是保留一部分数据来评估算法的主要原因。
下面将按照80%的训练数据集,20%的评估数据集来分离数据。代码如下:
# 分离数据集array = dataset.values # 将dataset里的数值转化成arrayX = array[:, 0:4]Y = array[:, 4]validation_size = 0.2 # 留下20%的数据作为测试数据seed = 7 # 随机种子X_train, X_validation, Y_train, Y_validation = \train_test_split(X, Y, test_size=validation_size, random_state=seed)
现在就分离出了X_train和Y_train用来训练算法创建模型,X_validation和Y_validation在后面会用来验证评估模型。
5.2 评估模式
在这里将采用10折交叉验证来评估算法模型的准确度。10折交叉验证是随机地将数据分成10份:9份用来训练模型,1份用来评估算法。后面我们会使用相同的数据对每一种算法进行训练和评估,并从中选择最好的模型。
5.3 创建模型
对任何问题来说,不能仅通过对数据进行审查,就判断出哪个算法最有效。通过前面的图表,发现有些数据特征符合线性分布,所以可以期待算法会得到比较好的结果。接下来评估六种不同的算法:
·线性回归(LR)。
·线性判别分析(LDA)。
·K近邻(KNN).
·分类与回归树(CART)。
·贝叶斯分类器(NB)。
·支持向量机(SVM)。
这个算法列表中包含了线性算法(LR和LDA)和非线性算法(KNN、CART、NB和SVM)。在每次对算法进行评估前都会重新设置随机数的种子,以确保每次对算法的评估都使用相同的数据集,保证算法评估的准确性。
接下来就创建并评估这六种算法模型。代码如下:
# 算法审查models = {}models['LR'] = LogisticRegression()models['LDA'] = LinearDiscriminantAnalysis()models['KNN'] = KNeighborsClassifier()models['CART'] = DecisionTreeClassifier()models['NB'] = GaussianNB()models['SVM'] = SVC()#评估算法results = []for key in models: kfold = KFold(n_splits=10, random_state=seed) cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) print('%s: %f (%f)' % (key, cv_results.mean(), cv_results.std()))
5.4 选择最优模型
现在已经有了六种模型,并且评估了它们的精确度。接下来就需要比较这六种模型,并选出准确度最高的算法。执行上面的代码,结果如下:
通过上面的结果,很容易看出SVM算法具有最高的准确度得分。
接下来创建一个箱线图,通过图表来比较算法的评估结果。代码如下:
# 箱线图比较算法fig = pyplot.figure()fig.suptitle('Algorithm Comparison')ax = fig.add_subplot(111)pyplot.boxplot(results)ax.set_xticklabels(models.keys())pyplot.show()
answer:
六、实施预测
评估的结果显示,支持向量机(SVM)是准确度最高的算法。现在使用预留的评估数据集来验证这个算法模型。这将会对生成的算法模型的准确度有一个更加直观的认识。
现在使用全部训练集的数据生成支持向量机(SVM)的算法模型,并用预留的评估数据集给出一个算法模型的报告。代码如下:
# 使用评估数据集评估算法svm = SVC()svm.fit(X=X_train,y=Y_train)predictions = svm.predict(X_validation)print(accuracy_score(Y_validation, predictions))print(confusion_matrix(Y_validation, predictions))print(classification_report(Y_validation, predictions))
answer:
由结果可知:SVM的算法模型准确度为0.93。通过冲突矩阵看到只有两个数据预测错误。最后还提供了一个包含准确率(precision)、召回率(recall)、F1值(F1-score)等数据的报告。
七、总结
到这里我们已经完成了这个关于鸢尾花分类的机器学习项目,包含从数据导入到生成模型,以及通过模型对数据进行分类的全部过程。