4.3 分类分析
分类算法通过对已知类别训练集的计算和分析,从中发现类别规则并预测新数据的类别。分类算法是解决分类问题的方法,是数据挖掘、机器学习和模式识别中一个重要的研究领域。分类和回归是解决实际运营问题中非常重要的两种分析和挖掘方法。
常用的分类算法包括朴素贝叶斯、逻辑回归、决策树、随机森林、支持向量机等。
分类的主要用途和场景是“预测”,基于已有的样本预测新样本的所属类别。例如信用评级、风险等级、欺诈预测等;同时,它也是模式识别的重要组成部分,广泛应用到机器翻译,人脸识别、医学诊断、手写字符识别、指纹识别的图像识别、语音识别、视频识别的领域;另外,分类算法也可以用于知识抽取,通过模型找到潜在的规律,帮助业务得到可执行的规则。
4.3.1 防止分类模型的过拟合问题
过拟合通俗点讲就是在做分类训练时模型由于过度学习了训练集的特征,使得训练集的准确率非常高,但将模型应用到新的数据集时准确率却很差。因此,避免过拟合是分类模型中的一个重要任务。分类算法尤其是决策树容易出现过拟合的问题,可通过以下途径避免过度拟合。
使用更多的数据:导致过拟合的根本原因是训练集和新数据集的特征存在较大差异,导致原本完美拟合的模型无法对新数据集产生良好效果;通过增加数据集,可能会增加训练集和新数据集的特征相似度,这样会使得分类结果在新数据集上表现更好。
降维:通过维度选择或转换的方式,降低参与分类模型的维度数量,能有效防止原有数据集中的“噪音”对模型的影响,从而达到避免过拟合的目的。
使用正则化方法:正则化会通过定义不同特征的参数来保证每个特征有一定的效用,不会使某一特征特别重要。例如SVM有个L2正则项参数,可以在目标函数中对模型进行限制,通过最优化过程中尽量追求小的L2值就会提高泛化能力,也就抑制了过拟合的问题。
使用组合方法:例如,随机森林、adaboost不容易产生过拟合的问题。
4.3.2 使用关联算法做分类分析
在关联算法中,我们会得到不同的关联规则,或者称为频繁规则,这种模式一般用来做关联模式挖掘。但如果转换思路,其实也可以用来做分类分析。
以商品关联规则为例,我们先拿到一张用户订单记录表,表的内容里面包括用户的属性和特征以及用户购买的商品,得到的关联规则结果类似于:面包、牛奶→冰激凌,这个规则中的面包和牛奶属于前项,冰激凌属于后项,我们会认为买了面包和牛奶的客户,还会一并购买冰激凌。
在这个示例中,我们应用的是商品和商品之间的关联;如果前后项指定的不是一个维度的数据,那么就可以实现分类分析:在前项中可以使用属性类特征,例如用户性别、年龄段、学历等,后项仍然是用户购买的商品,那么得到的结果类似于:女、20~30,大学→冰激凌,以及这个规则的支持度(例如12%)、置信度(例如85%)、提升度(例如1.2)。置信度是后项/前项的值,即买了冰激凌的用户中有多少是满足属性值为女、20~30,大学这些条件;换个表达方式是在属性值为女、20~30,大学的人群中,有85%的人购买了冰激凌。这个规则不正类似于决策树得到的if sex='女'and age='20-30'and education='大学'then冰激凌=True吗?
使用关联逻辑并结合支持度、置信度和提升度可以找到其分类信息,实现思路:
从数据集中选择属性特征+目标(可能是商品、内容、广告等),使用关联规则得到频繁项集,频繁项集的前、后项分别是属性(可以是单个或多个属性)和目标。
从得到的频繁项集中,根据支持度、置信度、提升度定义出具有显著性的规则,例如支持度大于45%、置信度大于75%。提升度大于1。
基于提取出来的前后项规则梳理出可用的分类规则以及对应的目标信息,该目标可以是多分类的。
有关关联分析的更多话题,会在4.4节中谈到。
4.3.3 用分类分析来提炼规则、提取变量、处理缺失值
1.分类分析用于提炼应用规则
预测是分类分析的主要应用方向,但将分类用于提炼应用规则,为数据化运营提供规则支持也是其重点应用之一,这种应用相对于其他算法更加具有落地价值。常见的应用场景包括:
要针对沉默会员做会员重新激活,应该挑选具有什么特征的会员?
商品A库存积压严重,现在要通过促销活动清仓,选择哪些类型的促销活动更容易实现该目标?
网站需要大流量广告位来满足VIP商家的精准广告投放,具有哪些特征的广告位更符合VIP商家的客户需求?
从分类算法中提炼特征规则,利用的是在构建算法过程中的分类规则。以决策树为例,决策树的分裂节点是表示局部最优值的显著特征值,每个节点下的特征变量以及对应的值的组合构成了规则。图4-5是利用Sklearn构建的决策树规则的一部分。其中X[0]~X[3]是决策树模型的特征变量,而类似于X[2]<=21891.5则是该特征变量对应显著性分裂值。
2.分类分析用于提取变量特征
从大量的输入变量中获得变量的重要性特征,然后提取权重较高的几个特征是分类分析的重点应用之一。这一应用是数据归约和数据降维的重要方式。在3.3.2节提到了选择特征的方法之一是基于机器学习算法来选择,而分类算法可以作为典型应用方法。具体实现思路是:获取原始数据集并对数据做预处理,将预处理的数据集放到分类算法中进行训练,然后从算法模型中提取特征权重信息。有关具体的程序部分,会在本章4.3.6节中演示。
图4-5 决策树规则
3.分类分析用于处理缺失值
在3.1.1节中提到了补全缺失值的方法之一是使用模型法,基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。如果缺失值是分类变量,则采用分类模型补全。有关分类预测的具体代码部分,也会在4.3.6节中演示。
4.3.4 类别划分-分类算法和聚类算法都是好手
对于大多数初学者而言,聚类和分类两类算法似乎不容易分清楚。聚类和分类的区别:
学习方式不同:聚类是一种非监督式学习算法,而分类是监督式学习算法。所谓的监督与非监督指的是是否有准确性的指示属性,用来告诉算法模型某种行为是对的还是错的,如果有就是监督式,如果没有就是非监督式。
对源数据集要求不同:聚类不要求源数据集有预先定义的标签,但分类需要标签作为监督学习的“标准”或“参照”用来训练模型。
应用场景不同:聚类一般应用于做数据探索性分析、数据降维、数据压缩等探索性、过程性分析和处理,而分类更多的用于预测性分析和使用。
解读结果不同:聚类算法的结果是将不同的数据集按照各自的典型特征分成不同类别,不同人对聚类的结果解读可能不同;而分类的结果却是一个固定值(例如高、中、低、是、否等),不存在不同解读的情况。
模型评估指标不同:聚类分析没有所谓的“准确”与否,以及如何准确的相关度量,更多的是基于距离的度量,如果是对带有标签的数据集做聚类则可以做相似度、完整度等方面的评估;而分类模型的指标例如准确率、混淆矩阵、提升率等都有明显的好与坏、提升程度等评估指标。
但是,在实际应用中要实现“划分类别”这一目标,无论二者的差异性有多大,聚类和分类确实都能实现。在4.1.6节的示例中,使用K均值方法得到的聚类结果已经显示了即使在没有标签的情况下做非监督式学习,也能获得良好的划分类别的效果。假如原始数据集带有类别标签,那么选择分类或聚类算法都可以(标签列数据并不是一定要使用)。
假如原始数据集不带有类别标签,那么只能选择使用聚类算法。
K均值这种聚类算法的准确率高的前提能正确划分群体类别,K值的确定不仅是一个数据技巧,而且也需要业务经验来辅助判断,因为即使在数据上做到类间距离最大、类内距离最小,得出的不同类别之间的数据是否具有显著特征,类别间的样本量是否属于一个量级且有利于从业务性的角度进行分析都不是纯数据能“证明”的事情。
有关分类和聚类的应用示例,假如现在公司要对某新会员做促销活动,例如推荐商品、提供个性化信息、推荐最感兴趣的热榜等,并尽量提供该用户感兴趣的内容。如何实现这一需求?
分类:基于现有的会员及其特定类别标签(可选择有代表性或跟实际运营场景最相关的类别标签)做分类模型训练,将该新用户的数据作为新的样本输入模型预测得到该用户所属的目标类别,接着计算该类别下用户最经常购买的商品、经常浏览的信息等并给出推荐内容。
聚类:将新的会员和现有的会员作为一个整体做聚类分析,然后获得该会员所属的聚类类别,进而提取其所在类别下其他会员的经常购买商品、经常浏览信息等并给出推荐内容。
当然,我们还有更多方法给出推荐内容,例如基于协同过滤的方法(用户相似度、查看内容的相似度)、基于关联算法的方法、基于冷启动的方法等。在此不一一进行列举。
4.3.5 如何选择分类分析算法
分类算法作为非常实用且有效的数据化运营支持方法,几乎在所有公司中都能派上用场,如何根据不同场景选择最合适的算法?
文本分类时,用到的最多的是朴素贝叶斯,例如电子邮件的垃圾邮件识别。
如果训练集比较小,那么选择高偏差且低方差的分类算法则效果更好,例如朴素贝叶斯、支持向量机,因为这类算法不容易过拟合。
如果训练集比较大,那么不管选择哪种方法,都不会显著影响分类准确度。
如果关注的是算法模型的计算时间和模型易用性,那么选择支持向量机、人工神经网络不是好的选择。
如果重视算法的准确率,那么应选择算法精度较高的方法,例如支持向量机、随机森林。
如果想得到有关预测结果的概率信息,然后基于预测概率做进一步应用,使用逻辑回归是比较好的选择。
如果担心离群点或数据不可分,并且需要清晰的决策规则,那么选择决策树。
4.3.6 代码实操:Python分类分析
Sklearn中没有一个专门的分类算法库,分类算法分散在不同的方法库中,例如ensemble、svm、tree等,在使用时需要分别导入不同的库来使用其中的分类算法。
示例模拟的是针对一批带有标签的数据集做分类模型训练,然后使用该模型对新数据集做分类预测;主要使用Sklearn做分类、用Matplotlib做图形展示,数据源文件classi-fication.csv位于“附件-chapter4”中,默认工作目录为“附件-chapter4”(如果不是,请cd切换到该目录下,否则会报“IOError:File classification.csv does not exist”)。
另外,本节会用到两个新的图形和表格展示库:prettytable和pydotplus,以及配合pydotplus的GraphViz程序。
prettytable是用来做表格格式化输出展示的,它的好处是可以非常容易的对行、列进行控制,并且输出带有分割线的可视化table。第一次使用该库需要先通过系统终端命令行窗口(或PyCharm中底部的Terminal窗口)使用pip install prettytable在线安装,安装成功后在Python命令行窗口输入import prettytable,无报错信息则该库已经正确安装。
pydotplus是在决策树规则输出时用到的库,其输出的dot数据可以供GraphViz绘图使用。要能完整使用该库需要先安装GraphViz程序,然后再安装pydotplus。
第一步 安装GraphViz程序。这是一个额外的应用程序,而不是一个Python附属包或程序。读者可登录http://www.graphviz.org/Download.php下载,第一次登录该网站时需要阅读一堆内容须知,阅读完之后可直接点击底部的Agree,然后到达下载程序窗口,在该窗口中按照不同的操作环境选择下载或安装方式。笔者的电脑操作系统环境是Windows,选择的是“graphviz-2.38.msi”。下载完成之后的安装过程没有任何难点。
第二步 安装pydotplus。这是一个从dot数据读取数据格式并保存为可视化图形的库,在系统中打开系统终端命令行窗口(或PyCharm中底部的Terminal窗口)输入pip install pydotplus,几秒钟之内就能完成自动下载安装过程。
完整代码如下:
# 导入库 import numpy as np # 导入numpy库 from sklearn.model_selection import train_test_split # 数据分区库 from sklearn import tree # 导入决策树库 from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, precision_score, recall_score, roc_curve # 导入指标库 import prettytable # 导入表格库 import pydotplus # 导入dot插件库 import matplotlib.pyplot as plt # 导入图形展示库 # 数据准备 raw_data = np.loadtxt('classification.csv', delimiter=',', skiprows=1, ) # 读取数据文件 X = raw_data[:, :-1] # 分割X y = raw_data[:, -1] # 分割y X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3, random_state=0) # 将数据分为训练集和测试集 # 训练分类模型 model_tree = tree.DecisionTreeClassifier(random_state=0) # 建立决策树模型对象 model_tree.fit(X_train, y_train) # 训练决策树模型 pre_y = model_tree.predict(X_test) # 使用测试集做模型效果检验 # 输出模型概况 n_samples, n_features = X.shape # 总样本量,总特征数 print ('samples: %d \t features: %d' % (n_samples, n_features)) # 打印输出样本量和特征数量 print (70 * '-') # 打印分隔线 # 混淆矩阵 confusion_m = confusion_matrix(y_test, pre_y) # 获得混淆矩阵 confusion_matrix_table = prettytable.PrettyTable() # 创建表格实例 confusion_matrix_table.add_row(confusion_m[0, :]) # 增加第一行数据 confusion_matrix_table.add_row(confusion_m[1, :]) # 增加第二行数据 print ('confusion matrix') print (confusion_matrix_table) # 打印输出混淆矩阵 # 核心评估指标 y_score = model_tree.predict_proba(X_test) # 获得决策树的预测概率 fpr, tpr, thresholds = roc_curve(y_test, y_score[:, 1]) # ROC auc_s = auc(fpr, tpr) # AUC accuracy_s = accuracy_score(y_test, pre_y) # 准确率 precision_s = precision_score(y_test, pre_y) # 精确度 recall_s = recall_score(y_test, pre_y) # 召回率 f1_s = f1_score(y_test, pre_y) # F1得分 core_metrics = prettytable.PrettyTable() # 创建表格实例 core_metrics.field_names = ['auc', 'accuracy', 'precision', 'recall', 'f1'] # 定义表格列名 core_metrics.add_row([auc_s, accuracy_s, precision_s, recall_s, f1_s]) # 增加数据 print ('core metrics') print (core_metrics) # 打印输出核心评估指标 # 模型效果可视化 names_list = ['age', 'gender', 'income', 'rfm_score'] # 分类模型维度列表 color_list = ['r', 'c', 'b', 'g'] # 颜色列表 plt.figure() # 创建画布 # 子网格1:ROC曲线 plt.subplot(1, 2, 1) # 第一个子网格 plt.plot(fpr, tpr, label='ROC') # 画出ROC曲线 plt.plot([0, 1], [0, 1], linestyle='--', color='k', label='random chance') # 画出随机状态下的准确率线 plt.title('ROC') # 子网格标题 plt.xlabel('false positive rate') # X轴标题 plt.ylabel('true positive rate') # y轴标题 plt.legend(loc=0) # 子网格2:指标重要性 feature_importance = model_tree.feature_importances_ # 获得指标重要性 plt.subplot(1, 2, 2) # 第二个子网格 plt.bar(np.arange(feature_importance.shape[0]), feature_importance, tick_label=names_list, color=color_list) # 画出条形图 plt.title('feature importance') # 子网格标题 plt.xlabel('features') # x轴标题 plt.ylabel('importance') # y轴标题 plt.suptitle('classification result') # 图形总标题 plt.show() # 展示图形 # 保存决策树规则图为PDF文件 dot_data = tree.export_graphviz(model_tree, out_file=None, max_depth=5, feature_names=names_list, filled=True, rounded=True) # 将决策树规则生成dot对象 graph = pydotplus.graph_from_dot_data(dot_data) # 通过pydotplus将决策树规则解析为图形 graph.write_pdf("tree.pdf") # 将决策树规则保存为PDF文件 # 模型应用 X_new = [[40, 0, 55616, 0], [17, 0, 55568, 0], [55, 1, 55932, 1]] print ('classification prediction') for i, data in enumerate(X_new): y_pre_new = model_tree.predict(data) print ('classification for %d record is: %d' % (i + 1, y_pre_new))
上述代码以空行分为9个部分。
第一部分导入库。本示例中使用了Sklearn的tree库和metrics库,分别用来做分类预测分类指标评估、model_selection库做数据分区,使用Numpy辅助于数据读取和处理,使用prettytable库做展示表格的格式化输出,使用pydotplus来生成决策树规则树形图,使用Matplotlib的pyplot库做图形展示。
第二部分数据准备。使用Numpy的loadtxt方法读取数据文件,指定分隔符以及跳过第一行标题名;然后使用矩阵索引将数据分割为X和y,最后使用sklearn.model_selection的train_test_split方法将数据分割为训练集和测试集,训练集数量占总样本量的70%。
相关知识点:将数据集划分为训练集、测试集和验证集
第二部分中将数据集划分为训练集和测试集两部分,在很多场景中需要将数据集分为训练集、测试集和验证集三部分。Sklearn没有提供直接将数据集分为3种(含3种)以上的方法,我们可以使用Numpy的split方法划分数据集。split参数如下:
split(ary, indices_or_sections, axis=0)
ary:要划分的原始数据集。
indices_or_sections:要划分的数据集数量或自定义索引分区。如果直接使用整数型数值设置分区数量,则按照设置的值做等比例划分;如果设置一个一维的数组,那么将按照设置的数组的索引值做区分划分边界。
axis:要划分数据集的坐标轴,默认为0。
数据集分割示例:将创建的新数据集通过平均等分和指定分割索引值的方式分为3份。
import numpy as np # 导入库 x = np.arange(72).reshape((24,3)) # 创建一个24行3列的新数组 train_set1, test_sets1, val_sets1 = np.split(x, 3) # 将数组平均分为3份 train_set2, test_sets2, val_sets2 = np.split(x, [int(0.6*x.shape[0]), int(0.9*x.shape[0])]) # 60%训练集,30%测试集,10%验证集 print ('record of each set - equal arrays: ') print ('train_set1: %d, test_sets1: %d, val_sets1: %d'%(train_set1.shape[0], test_sets1.shape[0], val_sets1.shape[0])) print (40*'-') print ('record of each set - % arrays: ') print ('train_set2: %d, test_sets2: %d, val_sets2: %d'%(train_set2.shape[0], test_sets2.shape[0], val_sets2.shape[0]))
上述代码执行后,返回如下结果:
record of each set - equal arrays: train_set1: 8, test_sets1: 8, val_sets1: 8 ---------------------------------------- record of each set - % arrays: train_set2: 14, test_sets2: 7, val_sets2: 3
第三部分训练分类模型。使用sklearn.tree中的DecisionTreeClassifier方法建立分类模型并训练,然后基于测试集做数据验证。DecisionTreeClassifier为CART(分类回归树),除了可用于分类,还可以用于回归分析。
相关知识点:tree算法对象中的决策树规则
在决策树算法对象的tree_属性中,存储了所有有关决策树规则的信息(示例中的决策树规则存储在model_tree.tree_中)。最主要的几个属性:
children_left:子级左侧分类节点。
children_right:子级右侧分类节点。
feature:子节点上用来做分裂的特征。
threshold:子节点上对应特征的分裂阈值。
values:子节点中包含正例和负例的样本数量。
上述属性配合节点ID、节点层级迭代便能得到如下的规则信息:
1 [label="rfm_score <= 7.8375\ngini = 0.1135\nsamples = 14581\nvalue = [13700, 881]", fillcolor="#e58139ef"] ;
其中规则开始的1代表节点ID,rfm_score是变量名称,rfm_score<=7.8375是分裂阈值,gini=0.1135是在当前规则下的基尼指数,nsamples是当前节点下的总样本量,nvalue为正例和负例的样本数量。
第四部分输出模型概况。由于分类算法评估内容较多,因此从这里开始将分模块输出内容以便于区分。本部分内容中,通过X的形状获得数据的样本量和特征数量,打印输出结果如下:
samples: 21927 features: 4 ----------------------------------------------------------------------
第五部分输出混淆矩阵。使用sklearn.metrics中的confusion_matrix方法,通过将测试集的训练结果与真实结果的比较得到混淆矩阵。接下来通过prettytable展示混淆矩阵并输出表格,该库会自动对表格进行样式排版,并通过多种方法指定列表、样式等输出样式:先建立PrettyTable方法表格对象,然后使用add_row方法追加两行数据,打印输出结果如下:
confusion matrix +---------+---------+ | Field 1 | Field 2 | +---------+---------+ | 5615 | 284 | | 321 | 359 | +---------+---------+
相关知识点:混淆矩阵(confusion matrix)
混淆矩阵是做分类算法效果评估的基本方法,它是监督式学习中的一种可视化工具,主要用于比较分类结果和实例的真实信息。矩阵中的四个区域,分别代表了TP、FP、FN、TN四个值。如图4-6所示。
图4-6 混淆矩阵
表示分类正确:
真正(True Positive,TP):本来是正例,分类成正例。
假正(True Negative,TN):本来是负例,分类成负例。
表示分类错误:
假负(False Positive,FP):本来是负例,分类成正例。
真负(False Negative,FN):本来是正例,分类成负例。
第六部分输出分类模型核心评估指标。
先通过决策树模型对象的predict_proba方法获得决策树对每个样本点的预测概率,该数据在下面的ROC中用到;输出的概率信息可作为基于阈值调整分类结果输出的关键,例如可自定义阈值来做进一步精细化分类类别控制。
接着通过sklearn.metrics的roc_curve、auc、accuracy_score、precision_score、recall_score、f1_score分别得到AUC、准确率、精确度、召回率、F1得分值。
auc_s:AUC(Area Under Curve),ROC曲线下的面积。ROC曲线一般位于y=x上方,因此AUC的取值范围一般在0.5和1之间。AUC越大,分类效果越好。
accuracy_s:准确率(Accuracy),分类模型的预测结果中将正例预测为正例、将负例预测为负例的比例,公式为:A=(TP+TN)/(TP+FN+FP+TN),取值范围[0,1],值越大说明分类结果越准确。
precision_s:精确度(Precision),分类模型的预测结果中将正例预测为正例的比例,公式为:P=TP/(TP+FP),取值范围[0,1],值越大说明分类结果越准确。
recall_s:召回率(Recall),分类模型的预测结果被正确预测为正例占总的正例的比例,公式为:R=TP/(TP+FN),取值范围[0,1],值越大说明分类结果越准确。
f1_s:F1得分(F-score),准确度和召回率的调和均值,公式为:F1=2*(P*R)/(P+R),取值范围[0,1],值越大说明分类结果越准确。
上述指标计算完成后仍然通过prettytable的PrettyTable方法创建表格对象,然后使用field_names定义表格的列名,通过add_row方法追加数据,打印输出结果如下:
core metrics +----------------+----------------+---------------+----------------+------ | auc | accuracy | precision | recall | f1 | +----------------+----------------+---------------+----------------+------ | 0.749870117567 | 0.908040735674 | 0.55832037325 | 0.527941176471 |0.542705971277 | +---------------+---------------+--------------+---------------+------
从上述指标可以看出整个模型效果一般,一方面,在建立模型时,我们没有对决策树剪枝,这会导致决策树的过拟合问题;另一方面,原始数据中,存在明显的样本类别不均衡问题,也没有做任何预处理工作。由于这里仅做算法流程演示,关于调优的部分不展开讲解。
第七部分模型效果可视化,目标是输出变量的重要性以及ROC曲线。建立分类模型维度列表和颜色列表,用于图形展示;然后通过figure方法创建画布。
子网格1:ROC曲线。使用subplot方法定义第一个子网格,其中“1,2,1”表示1行2列的第一个子网格,使用plot方法分别画出模型训练得到的ROC曲线和随机状态下的准确率线,使用title、xlabel、ylabel分别设置子网格标题、X轴和Y轴标题。在使用legend方法设置图例时,使用loc=0来让图表选择最佳位置放置图例。
子网格2:指标重要性。该子网格的位置是1行2列的第二个区域,其设置与子网格1基本相同,差异点在于这里使用了bar方法创建条形图。上述代码返回如4-7所示的图形结果。
图4-7 分类结果展示
从上述结果可以看出,ROC曲线的面积大于0.5,模型的算法结果比随机抽取的准确率要高,但综合前面我们得到的准确率指标,结果也不是特别理想。在特征重要性中,income变量具有非常高的特征权重,是这几个变量中最重要的变量,其次是rfm_score和age。
第八部分保存决策树规则图为PDF文件。先通过tree库下的export_graphviz方法,将决策树规则生成dot对象,各参数作用如下:
out_file=None:控制不生成dot文件,否则对象dot_data会为空;
max_depth:控制导出分类规则的最大深度,防止规则过多导致信息碎片化;
feature_names:指定决策树规则的每个变量的名称,方便在决策树规则中识别特征名称;
filled:控制填充,让图形效果更佳美化;
rounded:控制字体样式。
上述代码执行后,会在python工作目录产生一个新的名为“tree.pdf”的文件,打开PDF文件,部分内容如图4-8所示。
在sklearn的tree库中,有一个特殊的方法tree.export_graphviz,可用来讲树形规则结构转化为DOT格式的数据对象,该方法只存在于tree库中。在dot_data变量的代码中,可去掉out_file=None参数,默认会生成一个名为tree.dot的数据文件,该文件就是上述树形图输出的源数据。
图4-8 决策树规则输出树形图
上述决策树规则显示了当income<=55654时,总样本量为15348,其中负例样本和正例样本分别为13700、1648。当income<=55654且rfm_score<=7.8375时,总样本量有13581,其中负例样本和正例样本分别为13700、881。以此类推可以读出其他的规则。
第九部分模型应用。通过将新的数据集放入模型做分类预测,得到每个数据集的预测类别指标,结果如下:
classification prediction classification for 1 record is: 0 classification for 2 record is: 0 classification for 3 record is: 1
上述过程中,主要需要考虑的关键点:
如何根据不同的应用需求和限制选择最适合的分类算法。
如何优化算法来提高准确率并降低模型的过拟合程度。
代码实操小结:在本节的代码中,主要用了以下几个知识点:
通过Numpy的loadtxt读取数据文件。
对矩阵做切片操作。
使用sklearn.tree中的DecisionTreeClassifier方法实现分类分析。
使用sklearn.metrics中的confusion_matrix方法输出混淆矩阵。
通过prettytable打印输出的表格,自动会对表格进行样式排版,并通过多种方法指定列表、样式等输出样式。
通过sklearn.metrics的roc_curve、auc、accuracy_score、precision_score、recall_score、f1_score分别得到AUC、准确率、精确度、召回率、F1得分值。sklearn的metrics库中还提供了更多的分类评估指标,感兴趣的读者可自行查阅更多信息。
通过matplotlib.pyplot展示多网格的图形,使用plot方法展示线图、bar方法展示条形图。
使用pydotplus配合GraphViz绘制决策树规则树并保存为文件。
使用模型对象的fit方法训练模型,predict方法做预测,并可以将fit和predict一起使用;通过列表将模型对象本身做集合以便于迭代循环处理。
通过矩阵的shape方法获得矩阵形状。
通过enumerate方法结合for循环,读出目标可迭代对象的索引和迭代值,enume-rate方法在需要使用对象索引时非常有效。
使用Numpy的arange方法创建一个可迭代的连续区间。
使用matplotlib.pyplot的plot方法展示图形,并设置不同的展示样式,包括颜色、样式、图例等,针对展示图像设置标题、图例位置、y轴标题等。
使用print方法结合占位符输出特定字符串或变量,使用不同的占位符类型(d/f等)并指定宽度(使用\t做tab分隔)做打印数据格式化。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论