《Python 机器学习经典实例.docx》由会员分享,可在线阅读,更多相关《Python 机器学习经典实例.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Python机器学习经典实例2.5将数据集分割成训练集以及测试集本节一起来看看怎样将数据合理地分割成训练数据集以及测试数据集。 (1)增加下面的代码片段到上一节的Python文件中fromsklearnimportcross_validationX_train,X_test,y_train,y_testcross_validation.train_test_split(X,y,test_size0.25,random_state5)classifier_gaussiannb_newGaussianNB()classifier_gaussiannb_new.fit(X_train,y_train
2、)这里我们把参数test_size设置成0.25表示分配了25%的数据给测试数据集。剩下75%的数据将用于训练数据集。 (2)用分类器对测试数据进展测试y_test_predclassifier_gaussiannb_new.predict(X_test)(3)计算分类器的准确性accuracy100.0*(y_testy_test_pred).sum()/X_test.shape0printAccuracyoftheclassifier,round(accuracy,2),%(4)画出测试数据的数据点及其边界plot_classifier(classifier_gaussiannb_new,
3、X_test,y_test)(5)可以看到如图2-7所示的图形。图2-72.6用穿插验证检验模型准确性穿插验证是机器学习的重要概念。在上一节中我们把数据分成了训练数据集以及测试数据集。然而为了可以让模型更加稳定还需要用数据集的不同子集进展反复的验证。假如只是对特定的子集进展微调最终可能会过度拟合overfitting模型。过度拟合是指模型在已知数据集上拟合得超级好但是一遇到未知数据就挂了。我们真正想要的是让机器学习模型可以适用于未知数据。2.6.1准备工作介绍怎样实现穿插验证之前先讨论一下性能指标。当处理机器学习模型时通常关心3个指标精度precision、召回率recall以及F1得分F1s
4、core。可以用参数评分标准parameterscoring获得各项指标的得分。精度是指被分类器正确分类的样本数量占分类器总分类样本数量的百分比分类器分类结果中有一些样本分错了。召回率是指被应正确分类的样本数量占某分类总样本数量的百分比有一些样本属于某分类但分类器却没有分出来。假设数据集有100个样本其中有82个样本是我们感兴趣的如今想用分类器选出这82个样本。最终分类器选出了73个样本它认为都是我们感兴趣的。在这73个样本中其实只有65个样本是我们感兴趣的剩下的8个样本我们不感兴趣是分类器分错了。可以如下方法计算分类器的精度分类正确的样本数量65总分类样本数量73精度65/7389.04%召
5、回率的计算经过如下数据集中我们感兴趣的样本数量82分类正确的样本数量65召回率65/8279.26%一个给力的机器学习模型需要同时具备良好的精度以及召回率。这两个指标是二律背反的一个指标到达100%那么另一个指标就会非常差我们需要保持两个指标可以同时处于合理高度。为了量化两个指标的平衡性引入了F1得分指标是精度以及召回率的合成指标实际上是精度以及召回率的调以及均值harmonicmeanF1得分2精度召回率/(精度召回率)上面例如中F1得分的计算经过如下F1得分20.890.79/(0.890.79)0.83702.6.2详细步骤(1)下面看看怎样实现穿插验证并提取性能指标。首先计算精度num
6、_validations5accuracycross_validation.cross_val_score(classifier_gaussiannb,X,y,scoringaccuracy,cvnum_validations)printAccuracy:str(round(100*accuracy.mean(),2)%(2)用前面的方程分别计算精度、召回率以及F1得分f1cross_validation.cross_val_score(classifier_gaussiannb,X,y,scoringf1_weighted,cvnum_validations)printF1:str(roun
7、d(100*f1.mean(),2)%precisioncross_validation.cross_val_score(classifier_gaussiannb,X,y,scoringprecision_weighted,cvnum_validations)printPrecision:str(round(100*precision.mean(),2)%recallcross_validation.cross_val_score(classifier_gaussiannb,X,y,scoringrecall_weighted,cvnum_validations)printRecall:st
8、r(round(100*recall.mean(),2)%2.7混淆矩阵可视化混淆矩阵confusionmatrix是理解分类模型性能的数据表它有助于我们理解怎样把测试数据分成不同的类。当想对算法进展调优时就需要在对算法做出改变之前解析数据的错误分类情况。有些分类效果比其他分类效果更差混淆矩阵可以帮助我们理解这些问题。先看看如图2-8所示的混淆矩阵。图2-8在图2-8中我们可以看出不同类型的分类数据。理想情况下我们祈望矩阵非对角线元素都是0这是最完美的分类结果。先看看class0一共52个样本属于class0。假如对第一行数据求以及总数就是52。但是如今只有45个样本被正确地预测出来分类器讲另
9、外4个样本属于class1还有3个样本属于class2。用同样的思路分析另外两行数据有意思的是class1里面有11个样本被错误地预测成了class0占到了class1总数的16%。这就是模型需要优化的切入点。 (1)我们用confusion_matrix.py文件作为参考。首先看看怎样从数据中提取混淆矩阵fromsklearn.metricsimportconfusion_matrixy_true1,0,0,2,1,0,3,3,3y_pred1,1,0,2,1,0,1,3,3confusion_matconfusion_matrix(y_true,y_pred)plot_confusion_
10、matrix(confusion_mat)这里用了一些样本数据一共有4种类型取值范围是03也列出了预测的标记类型。用confusion_matrix方法提取混淆矩阵然后把它画出来。 (2)继续定义混淆矩阵的画图函数#显示混淆矩阵defplot_confusion_matrix(confusion_mat):plt.imshow(confusion_mat,interpolationnearest,cmapplt.Paired)plt.title(Confusionmatrix)plt.colorbar()tick_marksnp.arange(4)plt.xticks(tick_marks,t
11、ick_marks)plt.yticks(tick_marks,tick_marks)plt.ylabel(Truelabel)plt.xlabel(Predictedlabel)plt.show()这里用imshow函数画混淆矩阵其他函数都非常简单只使用相关函数设置了图形的标题、颜色栏、刻度以及标签。参数tick_marks的取值范围是03因为数据集中有4个标记类型。np.arange函数会生成一个numpy数组。 (3)运行代码可以看到如图2-9所示的图形。图2-9从图2-9中可以看出对角线的颜色很亮我们祈望它们越亮越好。黑色区域表示0。在非对角线的区域有一些灰色区域表示分类错误的样本量。
12、例如当样本真实标记类型是0而预测标记类型是1时就像在第一行的第二格看到的那样。事实上所有的错误分类都属于class-1因为第二列有3个不为0的格子。这在图2-9中显示得一目了然。2.8提取性能报告可以以直接用scikit-learn打印精度、召回率以及F1得分。接下来看看怎样实现。 (1)在一个新的Python文件中参加下面的代码fromsklearn.metricsimportclassification_reporty_true1,0,0,2,1,0,3,3,3y_pred1,1,0,2,1,0,1,3,3target_namesClass-0,Class-1,Class-2,Class-
13、3print(classification_report(y_true,y_pred,target_namestarget_names)(2)运行代码可以在命令行工具中看到如图2-10所示的结果。图2-10不需要单独计算各个指标可以直接用这个函数从模型中提取所有统计值。2.9根据汽车特征评估质量接下来看看怎样用分类技术解决现实问题。我们将用一个包含汽车多种细节的数据集例如车门数量、后备箱大小、维修本钱等来确定汽车的质量。分类的目的是把车辆的质量分成4种类型不达标、达标、良好、优秀。2.9.1准备工作你可以从下载数据集。你需要把数据集中的每个值看成是字符串。考虑数据集中的6个属性其取值范围是这样
14、的buying取值范围是vhigh、high、med、lowmaint取值范围是vhigh、high、med、lowdoors取值范围是2、3、4、5等persons取值范围是2、4等lug_boot取值范围是small、med、bigsafety取值范围是low、med、high。考虑到每一行都包含字符串属性需要假设所有特征都是字符串并设置分类器。在上一章中我们用随机森林建立过回归器这里再用随机森林建立分类器。2.9.2详细步骤(1)参考car.py文件中的源代码。首先导入两个软件包fromsklearnimportpreprocessingfromsklearn.ensembleimpor
15、tRandomForestClassifier(2)加载数据集input_filepath/to/dataset/car.data.txt#读取数据Xcount0withopen(input_file,r)asf:forlineinf.readlines():dataline:-1.split(,)X.append(data)Xnp.array(X)每一行都包含由逗号分隔的单词列表。因此我们解析输入文件对每一行进展分割然后将该列表附加到主数据。我们忽略每一行最后一个字符因为那是一个换行符。由于Python程序包只能处理数值数据所以需要把这些属性转换成程序包可以理解的形式。 (3)在上一章中我们
16、介绍过标记编码。下面可以用这个技术把字符串转换成数值#将字符串转化为数值label_encoderX_encodednp.empty(X.shape)fori,iteminenumerate(X0):label_encoder.append(preprocessing.LabelEncoder()X_encoded:,ilabel_encoder-1.fit_transform(X:,i)XX_encoded:,:-1.astype(int)yX_encoded:,-1.astype(int)由于每个属性可以取有限数量的数值所以可以用标记编码器将它们转换成数字。我们需要为不同的属性使用不同的标
17、记编码器例如lug_boot属性可以取3个不同的值需要建立一个懂得给这3个属性编码的标记编码器。每一行的最后一个值是类将它赋值给变量y。 (4)接下来训练分类器#建立随机森林分类器paramsn_estimators:200,max_depth:8,random_state:7classifierRandomForestClassifier(*params)classifier.fit(X,y)你可以改变n_estimators以及max_depth参数的值观察它们怎样改变分类器的准确性。我们将用一个标准化的方法处理参数选择问题。 (5)下面进展穿插验证#穿插验证fromsklearnimpo
18、rtcross_validationaccuracycross_validation.cross_val_score(classifier,X,y,scoringaccuracy,cv3)printAccuracyoftheclassifier:str(round(100*accuracy.mean(),2)%一旦训练好分类器我们就需要知道它是怎样执行的。我们用三折穿插验证three-foldcross-validation把数据分3组轮换着用其中两组数据验证分类器来计算分类器的准确性。 (6)建立分类器的主要目的就是要用它对孤立的以及未知的数据进展分类。下面用分类器对一个单一数据点进展分类#
19、对单一数据例如进展编码测试input_datavhigh,vhigh,2,2,small,lowinput_data_encoded-1*len(input_data)fori,iteminenumerate(input_data):input_data_encodediint(label_encoderi.transform(input_datai)input_data_encodednp.array(input_data_encoded)第一步是把数据转换成数值类型。需要使用之前训练分类器时使用的标记编码器因为我们需要保持数据编码规那么的前后一致。假如输入数据点里出现了未知数据标记编码器就
20、会出现异常因为它不知道怎样对这些数据进展编码。例如假如你把列表中的第一个值vhigh改成abcd那么标记编码器就不知道怎样编码了因为它不知道怎么处理这个字符串。这就像是错误检查看看输入数据点是否有效。 (7)如今可以预测出数据点的输出类型了#预测并打印特定数据点的输出output_classclassifier.predict(input_data_encoded)printOutputclass:,label_encoder-1.inverse_transform(output_class)0我们用predict方法估计输出类型。假如输出被编码的输出标记那么它对我们没有任何意义。因此用inverse_transform方法对标记进展解码将它转换成原来的形式然后打印输出类。第02章创立分类器下