赵庆尧审稿人|孙淑娟前言在机器学习中,分类有两个阶段,即学习阶段和预测阶段。在学习阶段,根据给定的训练数据建立模型;在预测阶段,模型用于预测给定数据的响应。决策树是最容易理解和解释的分类算法之一。在机器学习中,分类有两个阶段,学习阶段和预测阶段。在学习阶段,根据给定的训练数据建立模型;在预测阶段,模型用于预测给定数据的响应。决策树是最容易理解和解释的分类算法之一。决策树算法决策树算法是监督学习算法之一。与其他监督学习算法不同,决策树算法可用于解决回归和分类问题。使用决策树的目的是创建一个经过训练的模型,该模型通过学习从先前数据(训练数据)推断出的简单决策规则来预测目标变量的类别或值。在决策树中,我们从树的根部开始预测记录的类别标签。我们将根属性的值与记录的属性进行比较,并根据比较结果,沿着该值对应的分支跳转到下一个节点。决策树的类型是根据我们拥有的目标变量的类型,我们可以将树分为两种类型:1.分类变量决策树:具有分类目标变量的决策树称为分类变量决策树。2、连续变量决策树:决策树的目标变量是连续的,所以称为连续变量决策树。示例:假设我们有一个预测客户是否会向保险公司支付续保费的问题。这里客户的收入是一个重要的变量,但是保险公司并没有所有客户的收入明细。既然我们知道这是一个重要的变量,我们就可以构建一个决策树来根据职业、产品和各种其他变量来预测客户的收入。在这种情况下,我们预测目标变量是连续的。与决策树相关的重要术语1.根节点:代表所有成员或样本被进一步划分为两个或多个相同类型的集合。2.分裂):将一个节点分裂成两个或多个子节点的过程。3、决策节点:当一个子节点分裂成更多的子节点时,称为决策节点。4.叶子/终端节点:不能分裂的节点称为叶子或终端节点。5.修剪:我们删除决策节点的子节点的过程称为修剪。构造也可以看作是分离的逆过程。6.分支/子树(Branch/Sub-Tree):整个树的一个子部分称为分支或子树。7.父子节点:可以拆分为子节点的节点称为父节点,子节点是父节点的子节点。决策树按从根到叶/终端节点的降序对样本进行分类,这提供了样本的分类方式。树中的每个节点都充当某个属性的测试用例,从节点开始的每个下降方向对应测试用例的一个可能答案。这个过程在本质上是递归的,并且对以新节点为根的每个子树都进行相同的处理。创建决策树时所做的假设以下是我们在使用决策树时所做的一些假设:首先,将整个训练集作为根。●特征值最好是可分类的。如果值是连续的,可以在建立模型之前将它们离散化。?记录根据属性值递归分布。●通过一些统计方法,将相应的属性依次放置在树的根节点或树的内部节点中。决策树遵循乘积和表示。产品总和(SOP)也称为析取范式。对于一个类,从树的根到具有相同类的叶节点的每个分支都是值的合取,而终止于该类的不同分支构成一个析取。实现决策树过程中的主要挑战是确定根节点和每一级节点的属性。这个问题就是属性选择问题。目前有不同的属性选择方法来为每一级节点选择属性。决策树如何工作?决策的可分离性严重影响树的准确性,分类树和回归树有不同的决策标准。决策树使用各种算法来决定是否将一个节点拆分为两个或多个子节点。子节点的创建增加了子节点的同质性。换句话说,节点的纯度相对于目标变量增加。决策树在所有可用变量上对节点进行分裂,然后选择能够产生很多同构子节点的节点进行分裂。根据目标变量的类型选择算法。接下来看一下决策树中会用到的一些算法:ID3→(D3的扩展)C4.5→(ID3的后继)CART→(分类回归树)CHAID→(卡方自动交互检测(卡方自动交互检测)计算分类树时进行多级分离)MARS→(MultipleAdaptiveRegressionSpline)ID3算法采用自上而下的贪心搜索方法,不进行回溯,通过可能的分支空间构建决策树.贪心算法,顾名思义,总是在某个时刻做出看似最好的选择。ID3算法步骤:1.以原集合S为根节点。2.在算法的每次迭代中,迭代集合S中未使用的属性,计算属性的熵(H)和信息增益(IG)。3.然后选择熵最小或者信息增益最大的属性。4.然后集合S被选定的属性分开以产生数据的子集。5.算法继续迭代每个子集,每次迭代只考虑以前从未选择过的属性。属性选择方法如果数据集包含N个属性,那么决定将哪个属性放在根节点或树的不同级别作为内部节点是一个复杂的步骤。随机选择任意一个节点作为根节点并不能解决问题。如果我们使用随机方法,我们可能会得到更糟糕的结果。为了解决这个属性选择问题,研究人员设计了几种解决方案。他们建议使用像这样的标准:EntropyInformationGainGiniIndexGainRateVarianceCutChiSquare使用这些来计算每个属性的值,然后对值进行排序并将属性按顺序放置在树中,即较高的值属性放在根部。当使用信息增益作为标准时,我们假设属性是分类的,而对于基尼指数,我们假设属性是连续的。1.熵熵是对正在处理的信息的随机性的度量。熵越高,就越难从信息中得出任何结论。抛硬币是提供随机信息的行为的一个例子。从上图可以看出,当概率为0或1时,熵H(X)为零。当概率为0.5时,熵最大,因为它在数据中投射出完全随机性。ID3遵循的规则是:熵为0的分支为叶节点,熵大于0的分支需要进一步分离。单个属性的数学熵表示如下:其中S表示当前状态,Pi表示事件i在状态S中的概率或类别i在状态S节点中的百分比。多个属性的数学熵表示如下:其中T表示当前状态,X表示选择的属性2.InformationGainInformationgain(信息增益)Informationgain(IG)是一种统计属性,衡量给定属性根据目标类别训练得有多好分离。影响。构建决策树是寻找返回最高信息增益和最小熵的属性的过程。信息的增加是熵的减少。它根据给定的属性值计算数据集分离前的熵差和分离后的平均熵差。ID3决策树算法采用了信息增益的方法。IG用数学表示如下:用更简单的方法,我们可以得出结论,before是分裂前的数据集,K是分裂产生的子集的个数,(j,after)是分裂后的子集j。3.基尼指数您可以将基尼指数理解为用于评估数据集中分离度的成本函数。它的计算方法是从1中减去每个类别的概率平方和。它有利于较大分区易于实现的情况,而信息增益有利于较小分区具有不同值的情况。基尼指数离不开分类目标变量“成功”或“失败”。它只执行二元分离。基尼系数越高,不平等程度越高,异质性越强。计算基尼指数分离的步骤如下:计算子节点的基尼系数,用上式(p2+q2)分别为成功(p)和失败(q)。分离的基尼指数是使用分离的每个节点的加权基尼分数计算的。CART(分类和回归树)使用基尼指数方法创建分离点。4.增益率信息增益倾向于选择取值较多的属性作为根节点。这意味着它更喜欢具有大量不同值的属性。C4.5是ID3的改进方法,它使用增益比,它是对信息增益的修改以减少其偏差,通常是最佳选择方法。增益比通过在进行拆分之前考虑分支数来克服信息增益问题。它通过考虑分离的内在信息来纠正信息增益。假设我们有一个包含用户及其基于性别、年龄组、评级等变量的电影类型偏好的数据集。在信息增益的帮助下,您将在“性别”中分离(假设它具有最高的信息增益),现在变量agegroup和rating可能同样重要,借助gainratio,我们可以在下一层选择Attributes进行分离。其中before为分离前的数据集,K为分离后生成的子集个数,(j,after)为分离后的子集j。5.方差缩减方差缩减是一种针对连续目标变量(回归问题)的算法。该算法使用标准方差公式来选择最佳分离。选择方差较低的分离作为分离总体的标准:是均值,X是实际值,n是值的个数。计算方差的步骤:计算每个节点的方差。计算每个分离的方差,并将其作为每个节点方差的加权平均值。6.卡方CHAID是卡方自动交互检测器的缩写。这是一种较旧的树分类方法。查找子节点和父节点之间的统计显着差异。我们通过目标变量的观察频率和预期频率之间的标准化差异的平方和来衡量它。它适用于分类目标变量“成功”或“失败”。它可以进行两次或多次分离。卡方值越高,子节点与父节点之间的差异在统计上越显着。它生成一棵名为CHAID的树。在数学上,卡方表示为:计算卡方的步骤如下:通过计算成功和失败的偏差来计算单个节点的卡方使用所有卡方的总和计算分离的卡方每个分离节点的成功和失败平方如何避免/对抗决策树的过度拟合?决策树的一个常见问题,尤其是对于完整的列树。有时看起来这棵树记住了训练数据集。如果决策树没有约束,它会给你100%的训练数据集准确性,因为在最坏的情况下,它最终会为每个观察结果生成一片叶子。因此,这会影响预测不属于训练集的样本时的准确性。这里我介绍两种消除过拟合的方法,剪枝决策树和随机森林。1.修剪决策树分离过程产生完全生长的树,直到达到停止标准。然而,成熟的树可能会过度拟合数据,从而导致看不见的数据的准确性很差。在修剪中,您切断了树的分支,即从叶节点开始删除决策节点,这样整体精度就不会受到干扰。这是通过将实际训练集分成两组来完成的:训练数据集D和验证数据集V,用分离的训练数据集D准备决策树,然后继续相应地修剪树以优化验证数据集V的准确性。在上图中,树左侧的“年龄”属性已经被修剪,因为它在树的右侧更重要,从而消除了过拟合。2.随机森林随机森林是集成学习的一个例子,我们结合了多种机器学习算法以获得更好的预测性能。因为在建树时训练数据集是随机采样的,而在分离节点时考虑的是随机的特征子集,所以我们称这种方法为random。一种称为装袋的技术用于创建树的集合,其中通过替换生成多个训练集。bagging技术使用随机抽样将数据集分成N个样本。然后,使用单一学习算法在所有样本上建立模型。然后通过并行投票或平均来组合预测。哪个更好,线性模型还是基于树的模型?问题取决于您要解决的问题类型。1.如果因变量和自变量之间的关系可以用线性模型很好地建模,线性回归将优于基于树的模型。2.如果因变量和自变量之间存在高度非线性和复杂的关系,树模型将优于经典回归方法。3.如果你需要建立一个易于理解的模型,决策树模型总是优于线性模型。决策树模型比线性回归更容易理解!使用Scikit-learn构建决策树分类器。我使用的数据是从https://drive.google.com/open?id=1x1KglkvJxNn8C8kzeV96YePFnCUzXhBS下载的超市相关数据。首先使用以下代码加载所有基础库:importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspd之后,我们通过以下方式加载数据集。它包括5个属性,用户id、性别、年龄、预估工资和购买。data=pd.read_csv('/Users/ML/DecisionTree/Social.csv')data.head()图1数据集我们只使用年龄和估计工资作为我们的自变量X,因为性别和用户ID等特征是无关紧要的并且对一个人的购买力没有影响,y是因变量。feature_cols=['Age','EstimatedSalary']X=data.iloc[:,[2,3]].valuesy=data.iloc[:,4].values下一步是将数据集分离成训练和测试集。fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)接下来执行特征缩放#featurescalingfromsklearn.preprocessingimportStandardScalersc_X=Standard_scaler=XX_train)X_test=sc_X.transform(X_test)将模型拟合到决策树分类器中。fromsklearn.treeimportDecisionTreeClassifierclassifier=DecisionTreeClassifier()classifier=classifier.fit(X_train,y_train)进行预测并检查准确性。#predictiony_pred=classifier.predict(X_test)#Accuracyfromsklearnimportmetricsprint('AccuracyScore:',metrics.accuracy_score(y_test,y_pred))决策树分类器准确率达到91%。混淆矩阵fromsklearn.metricsimportconfusion_matrixcm=confusion_matrix(y_test,y_pred)Output:array([[64,4],[2,30]])这意味着有6个观察值被列为错误。首先,让我们可视化模型预测frommatplotlib.colorsimportListedColormapX_set,y_set=X_test,y_testX1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,步骤=0.01))plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),alpha=0.75,cmap=ListedColormap(("red","green")))plt.xlim(X1.min(),X1.max())plt.ylim(X2.min(),X2.max())fori,j在枚举中(np.unique(y_set)):plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],c=ListedColormap(("red","green"))(i),label=j)plt.title("决策树(测试集)")plt.xlabel("年龄")plt.ylabel("预估工资")plt.legend()plt.show()然后下来,将树可视化接下来,您可以使用Scikit-learn的export_graphviz函数在Jupyternotebook中显示树。为了画树,我们需要安装Graphviz和pydotplus,命令如下:condainstallpython-graphvizpipinstallpydotplusexport_graphviz函数将决策树分类器转换成点文件,pydotplus将点文件转换成png或aform在Jupyter上显示,具体实现如下:fromsklearn.treeimportexport_graphvizfromsklearn.externals.siximportStringIOfromIPython.displayimportImageimportpydotplusdot_data=StringIO()export_graphviz(classifier,out_file=dot_data,filled=True,rounded=True,special_characters=True,feature_name=feature_cols,class_names=['0','1'])graph=pydotplus.graph_from_dot_data(dot_data.getvalue())Image(graph.create_png())在决策树图中,每个内部节点都有一个拆分数据决策规则。Gini代表基尼系数,代表节点的纯度。当一个节点的所有记录都属于同一类时,可以说它是一个纯节点,这样的节点称为叶节点。在这里,生成的树是未修剪的。未修剪的树不容易理解。在下一节中,我将通过修剪来优化树。然后优化决策树分类器准则:这个选项默认配置为Gini,我们可以通过这个选项选择合适的属性选择方式,这个参数允许我们使用不同的属性选择方式。支持的标准包括用于基尼指数的“Gini”和用于信息增益的“熵”。splitter:该选项默认配置为“best”,我们可以通过该参数选择合适的分离策略。支持的策略包括“最佳”(最佳分离)和“随机”(最佳随机分离)。max_depth:默认配置为None,我们可以通过这个参数设置树的最大深度。如果设置为None,节点将被扩展,直到所有叶子包含的样本少于min_samples_split。最大深度值越大,过拟合越严重,反之则过拟合不严重。在Scikit-learn中,决策树分类器仅通过预剪枝进行优化。树的最大深度可以作为预剪枝的控制变量。#创建决策树分类器objectclassifier=DecisionTreeClassifier(criterion="entropy",max_depth=3)#TrainDecisionTreeClassifier=classifier.fit(X_train,y_train)#Predicttheresponsefortestdatasetty_pred=classifier.predict(X_test)#ModelAccuracy,分类器正确的频率是多少?print("Accuracy:",metrics.accuracy_score(y_test,y_pred))到目前为止,分类率已经提高到94%,比之前的模型要高。现在让我们再次可视化优化的修剪决策树。dot_data=StringIO()export_graphviz(classifier,out_file=dot_data,filled=True,rounded=True,special_characters=True,feature_names=feature_cols,class_names=['0','1'])graph=pydotplus.graph_from_dot_data(dot_data.getvalue())Image(graph.create_png())上图是剪枝后的模型,比之前的决策树模型图更简单,更容易解释和理解。总结在本文中,我们讨论了很多关于决策树的细节,它是如何工作的,信息增益、增益比和基尼指数等属性选择度量,决策树模型构建、可视化和使用PythonScikit-learn包的评估和优化决策树性能,这就是这篇文章的全部内容,希望大家喜欢。译者介绍赵庆尧,一位从事驱动开发多年的社区编辑。原标题:决策树算法,解释,作者:NageshSinghChauhan
