决策树决策树是当今可用的最强大的监督学习方法的组成部分。决策树基本上是二叉树的流程图,其中每个节点根据某些特征变量拆分一组观察值。决策树的目标是将数据分组,使组中的每个元素都属于同一类别。决策树也可以用来近似连续的目标变量。在这种情况下,树将被拆分,以使每组的均方误差最小化。决策树的一个重要特性是它们易于解释。您根本不需要熟悉机器学习技术就可以了解决策树的作用。决策树图易于理解。优点和缺点决策树方法的优点是:决策树能够生成可理解的规则。决策树无需大量计算即可执行分类。决策树能够处理连续变量和分类变量。决策树清楚地表明哪些字段最重要。决策树方法的缺点是:决策树不太适合目标是预测连续属性值的估计任务。决策树在类多、训练样本少的分类问题中容易出错。决策树的训练在计算上可能很昂贵。生成决策树的过程在计算上是昂贵的。在每个节点,必须对每个候选拆分字段进行排序以找到其最佳拆分。在一些算法中,使用字段组合,需要搜索最佳的权重组合。修剪算法也可能很昂贵,因为必须形成并比较许多候选子树。Python决策树Python是一种通用编程语言,可为数据科学家提供强大的机器学习包和工具。在本文中,我们将使用scikit-learn这个最著名的python机器学习包来构建决策树模型。我们将使用scikit-learn提供的“DecisionTreeClassifier”算法来创建模型,然后使用“plot_tree”函数来可视化模型。第1步:导入包我们用来构建模型的主要包是pandas、scikitlearn和NumPy。按照代码在python中导入所需的包。importpandasaspd#数据处理importnumpyasnp#使用数组importmatplotlib.pyplotasplt#可视化frommatplotlibimportrcParams#图大小fromtermcolorimportcoloredascl#文本自定义fromsklearn.treeimportDecisionTreeClassifierasdtc#树算法fromsklearn.model_selectionimporttrain_test_split#拆分数据fromsklearn.metricsimportaccuracy_score#模型准确度fromsklearn.treeimportplot_tree#树图rcParams['figure.figsize']=(25,20)导入构建模型所需的所有包后,是时候导入数据并对其进行一些EDA。第2步:导入数据和EDA在这一步中,我们将使用python中可用的“Pandas”包导入并对其进行一些EDA。我们将构建我们的决策树模型,数据集是根据特定标准为患者开处方的药物数据集。让我们用python导入数据!Python实施:df=pd.read_csv('drug.csv')df.drop('Unnamed:0',axis=1,inplace=True)print(cl(df.head(),attrs=['bold']))输出:AgeSexBPCholesterolNa_to_KDrug023FHIGHHIGH25.355drugY147MLOWHIGH13.093drugC247MLOWHIGH10.114drugC328FNORMALHIGH7.798drugX461FLOWHIGH18.043drugY现在我们对数据集有了清晰的认识,导入数据后,我们使用“info”函数获取数据的一些基本信息,该函数提供的信息包括条目数,索引数字、列名、非空值的计数、属性类型等。Python实现:df.info()输出:RangeIndex:200entries,0to199Datacolumns(total6columns):#ColumnNon-NullCountDtype------------------------------0Age200non-nullint641Sex200non-nullobject2BP200non-nullobject3Cholesterol200non-nullobject4Na_to_K200non-nullfloat645Drug200non-nullobjectdtypes:float64(1),int64(1),object(4)内存使用:3。处理我们可以看到像性别、血压和胆固醇这样的属性本质上是分类的和对象类型的。问题是,scikit-learn中的决策树算法本身并不支持“对象”类型的X变量(特征)。因此,需要将这些“对象”值转换为“二进制”值。让我们使用python实现Python:foriindf.Sex.values:ifi=='M':df.Sex.replace(i,0,inplace=True)else:df.Sex.replace(i,1,inplace=True)对于iindf.BP.values:ifi=='LOW':df.BP.replace(i,0,inplace=True)elifi=='NORMAL':df.BP.replace(i,1,inplace=True)elifi=='HIGH':df.BP.replace(i,2,inplace=True)foriindf.Cholesterol.values:ifi=='LOW':df.Cholesterol.replace(i,0,inplace=True)else:df.Cholesterol.replace(i,1,inplace=True)print(cl(df,attrs=['bold']))输出:AgeSexBPCholesterolNa_to_KDrug02312125.355drugY14710113.093drugC24710110.114drugC3281117.798drugX480.rug...103.............1955610111.567drugC1961610112.006drugC197521119.894drugX1982311114.020drugX1994010111.349drugX[200rowsx6columns]我们可以观察到所有“对象”值都被处理成“二进制”值来表示分类数据。例如,在胆固醇属性中,显示“低”的值被视为0,“高”被视为1。现在我们准备好根据数据创建因变量和自变量。第4步:拆分数据在我们将数据处理成正确的结构后,我们现在设置“X”变量(自变量)、“Y”变量(因变量)。下面用python实现Python实现:X_var=df[['Sex','BP','Age','Cholesterol','Na_to_K']].values#argumentvariabley_var=df['Drug'].values#因变量print(cl('Xvariablesamples:{}'.format(X_var[:5]),attrs=['bold']))print(cl('Yvariablesamples:{}'.format(y_var[:5]),attrs=['bold']))输出:X变量样本:[[1.2.23.1.25.355][1.0.47.1.13.093][1.0.47.1.10.114][1.1.28.1.7.798][1.0.61.1.18.043]]Yvariablesamples:['drugY''drugC''drugC''drugX''drugY']我们现在可以使用scikit-learn中的'train_test_split'算法将数据拆分为训练集和测试集,其中包含我们的X和Y定义的变量。按照代码在python中拆分数据。Python实现:X_train,X_test,y_train,y_test=train_test_split(X_var,y_var,test_size=0.2,random_state=0)print(cl('X_trainshape:{}'.format(X_train.shape),attrs=['bold'],color='black'))print(cl('X_testshape:{}'.format(X_test.shape),attrs=['bold'],color='black'))print(cl('y_trainshape:{}'.format(y_train.shape),attrs=['bold'],color='black'))print(cl('y_testshape:{}'.format(y_test.shape),attrs=['bold'],color='black'))输出:X_trainshape:(160,5)X_testshape:(40,5)y_trainshape:(160,)y_testshape:(40,)现在我们拥有构建决策树模型的所有组件。那么,让我们继续在python中构建我们的模型。第5步:构建模型和预测借助scikit-learn包提供的“DecisionTreeClassifier”算法,构建决策树是可行的。之后,我们可以使用训练有素的模型对数据进行预测。最后,我们的预测结果的精度可以使用“准确性”评估指标来计算。让我们在python中执行此操作!Python实现:model=dtc(criterion='entropy',max_depth=4)model.fit(X_train,y_train)pred_model=model.predict(X_test)print(cl('Accuracyofthemodelis{:.0%}'.format(accuracy_score(y_test,pred_model)),attrs=['bold']))输出:模型准确率为88%在代码的第一步中,我们定义了一个名为“model”的变量,在其中我们存储了DecisionTreeClassifier模型.接下来,我们将使用我们的训练集来拟合和训练模型。之后,我们定义一个名为“pred_model”变量的变量,我们在其中存储模型对数据预测的所有值。最后,我们计算了预测与实际值的准确性,准确率为88%。第6步:可视化模型现在我们有了一个决策树模型,让我们使用python中的scikit-learn包提供的“plot_tree”函数来可视化它。按照代码从python中的决策树模型生成漂亮的树状图。Python实现:feature_names=df.columns[:5]target_names=df['Drug'].unique().tolist()plot_tree(model,feature_names=feature_names,class_names=target_names,filled=True,rounded=True)plt.savefig('tree_visualization.png')output:Conclusion有许多技术和其他算法可以优化决策树并避免过度拟合,例如剪枝。虽然决策树通常是不稳定的,这意味着数据的微小变化可能导致最优树结构发生巨大变化,但它们的简单性使其成为广泛应用的有力候选者。在神经网络流行之前,决策树是机器学习中最先进的算法。其他一些集成模型,例如随机森林模型,比普通的决策树模型更强大。决策树因其简单性和可解释性而非常强大。决策树和随机森林广泛应用于用户注册建模、信用评分、故障预测、医疗诊断等。我提供了本文的完整代码。完整代码:importpandasaspd#数据处理importnumpyasnp#使用数组importmatplotlib.pyplotasplt#可视化frommatplotlibimportrcParams#图大小fromtermcolorimportcoloredascl#文本自定义fromsklearn.treeimportDecisionTreeClassifierasdtc#树算法fromsklearn.model_selectionimporttrain_test_split#拆分数据fromsklearn.metricsimportaccuracy_score#模型准确度fromsklearn.treeimportplot_tree#树FigurercParams['figure.figsize']=(25,20)df=pd.read_csv('drug.csv')df.drop('Unnamed:0',axis=1,inplace=True)print(cl(df.head(),attrs=['bold']))df.info()foriindf.Sex.values:ifi=='M':df.Sex.replace(i,0,inplace=True)else:df.Sex.replace(i,1,inplace=True)foriindf.BP.values:ifi=='LOW':df.BP.replace(i,0,inplace=True)elifi=='NORMAL':df.BP.replace(i,1,inplace=True)elifi=='HIGH':df.BP.replace(i,2,inplace=True)foriindf.Cholesterol.values:ifi=='LOW':df.Cholesterol.replace(i,0,inplace=True)else:df.Cholesterol.replace(i,1,inplace=True)print(cl(df,attrs=['bold']))X_var=df[['Sex','BP','Age','Cholesterol','Na_to_K']].values#independentvariabley_var=df['Drug'].values#因变量print(cl('Xvariablesamples:{}'.format(X_var[:5]),attrs=['bold']))print(cl('Yvariablesamples:{}'.format(y_var[:5]),attrs=['bold']))X_train,X_test,y_train,y_test=train_test_split(X_var,y_var,test_size=0.2,random_state=0)print(cl('X_trainshape:{}'.format(X_train.shape),attrs=['bold'],color='red'))print(cl('X_testshape:{}'.format(X_test.shape),attrs=['bold'],color='red'))print(cl('y_trainshape:{}'.format(y_train.shape),attrs=['bold'],color='green'))print(cl('y_testshape:{}'.format(y_test.shape),attrs=['bold'],color='green'))model=dtc(criterion='entropy',max_depth=4)model.fit(X_train,y_train)pred_model=model.predict(X_test)print(cl('Accuracyofthemodelis{:.0%}'.format(accuracy_score(y_test,pred_model)),attrs=['bold']))feature_names=df.columns[:5]target_names=df['Drug'].unique().tolist()plot_tree(model,feature_names=feature_names,class_names=target_names,filled=True,rounded=True)plt.savefig('tree_visualization.png')