用Python构建和可视化决策树

决策树的目标是将数据分成多个组,这样一个组中的每个元素都属于同一个类别。决策树也可以用来近似连续的目标变量。在这种情况下,树将进行拆分,使每个组的均方误差最小。

决策树的目标是将数据分成多个组,这样一个组中的每个元素都属于同一个类别。决策树也可以用来近似连续的目标变量。在这种情况下,树将进行拆分,使每个组的均方误差最小。

决策树

决策树是当今最强大的监督学习方法的组成部分。决策树基本上是一个二叉树的流程图,其中每个节点根据某个特征变量将一组观测值拆分。

决策树的目标是将数据分成多个组,这样一个组中的每个元素都属于同一个类别。决策树也可以用来近似连续的目标变量。在这种情况下,树将进行拆分,使每个组的均方误差最小。

决策树的一个重要特性是它们很容易被解释。你根本不需要熟悉机器学习技术就可以理解决策树在做什么。决策树图很容易解释。

利弊

决策树方法的优点是:

  • 决策树能够生成可理解的规则。
  • 决策树在不需要大量计算的情况下进行分类。
  • 决策树能够处理连续变量和分类变量。
  • 决策树提供了一个明确的指示,哪些字段是最重要的。

决策树方法的缺点是:

  • 决策树不太适合于目标是预测连续属性值的估计任务。
  • 决策树在类多、训练样本少的分类问题中容易出错。
  • 决策树的训练在计算上可能很昂贵。生成决策树的过程在计算上非常昂贵。在每个节点上,每个候选拆分字段都必须进行排序,才能找到其最佳拆分。在某些算法中,使用字段组合,必须搜索最佳组合权重。剪枝算法也可能是昂贵的,因为许多候选子树必须形成和比较。

Python决策树

Python是一种通用编程语言,它为数据科学家提供了强大的机器学习包和工具。在本文中,我们将使用python最著名的机器学习包scikit-learn来构建决策树模型。我们将使用scikit learn提供的“DecisionTreeClassifier”算法创建模型,然后使用“plot_tree”函数可视化模型。

步骤1:导入包

我们构建模型的主要软件包是pandas、scikit learn和NumPy。按照代码在python中导入所需的包。

  1. importpandasaspd#数据处理
  2. importnumpyasnp#使用数组
  3. importmatplotlib.pyplotasplt#可视化
  4. frommatplotlibimportrcParams#图大小
  5. fromtermcolorimportcoloredascl#文本自定义
  6. fromsklearn.treeimportDecisionTreeClassifierasdtc#树算法
  7. fromsklearn.model_selectionimporttrain_test_split#拆分数据
  8. fromsklearn.metricsimportaccuracy_score#模型准确度
  9. fromsklearn.treeimportplot_tree#树图
  10. rcParams['figure.figsize']=(25,20)

在导入构建我们的模型所需的所有包之后,是时候导入数据并对其进行一些EDA了。

步骤2:导入数据和EDA

在这一步中,我们将使用python中提供的“Pandas”包来导入并在其上进行一些EDA。我们将建立我们的决策树模型,数据集是一个药物数据集,它是基于特定的标准给病人开的处方。让我们用python导入数据!

Python实现:

  1. df=pd.read_csv('drug.csv')
  2. df.drop('Unnamed:0',axis=1,inplace=True)
  3. print(cl(df.head(),attrs=['bold']))

输出:

  1. AgeSexBPCholesterolNa_to_KDrug
  2. 023FHIGHHIGH25.355drugY
  3. 147MLOWHIGH13.093drugC
  4. 247MLOWHIGH10.114drugC
  5. 328FNORMALHIGH7.798drugX
  6. 461FLOWHIGH18.043drugY

现在我们对数据集有了一个清晰的概念。导入数据后,让我们使用“info”函数获取有关数据的一些基本信息。此函数提供的信息包括条目数、索引号、列名、非空值计数、属性类型等。

Python实现:

  1. df.info()

输出:

  1. <class'pandas.core.frame.DataFrame'>
  2. RangeIndex:200entries,0to199
  3. Datacolumns(total6columns):
  4. #ColumnNon-NullCountDtype
  5. ----------------------------
  6. 0Age200non-nullint64
  7. 1Sex200non-nullobject
  8. 2BP200non-nullobject
  9. 3Cholesterol200non-nullobject
  10. 4Na_to_K200non-nullfloat64
  11. 5Drug200non-nullobject
  12. dtypes:float64(1),int64(1),object(4)
  13. memoryusage:9.5+KB

步骤3:数据处理

我们可以看到像Sex, BP和Cholesterol这样的属性在本质上是分类的和对象类型的。问题是,scikit-learn中的决策树算法本质上不支持X变量(特征)是“对象”类型。因此,有必要将这些“object”值转换为“binary”值。让我们用python来实现

Python实现:

  1. foriindf.Sex.values:
  2. ifi=='M':
  3. df.Sex.replace(i,0,inplace=True)
  4. else:
  5. df.Sex.replace(i,1,inplace=True)
  6. foriindf.BP.values:
  7. ifi=='LOW':
  8. df.BP.replace(i,0,inplace=True)
  9. elifi=='NORMAL':
  10. df.BP.replace(i,1,inplace=True)
  11. elifi=='HIGH':
  12. df.BP.replace(i,2,inplace=True)
  13. foriindf.Cholesterol.values:
  14. ifi=='LOW':
  15. df.Cholesterol.replace(i,0,inplace=True)
  16. else:
  17. df.Cholesterol.replace(i,1,inplace=True)
  18. print(cl(df,attrs=['bold']))

输出:

  1. AgeSexBPCholesterolNa_to_KDrug
  2. 02312125.355drugY
  3. 14710113.093drugC
  4. 24710110.114drugC
  5. 3281117.798drugX
  6. 46110118.043drugY
  7. ...................
  8. 1955610111.567drugC
  9. 1961610112.006drugC
  10. 197521119.894drugX
  11. 1982311114.020drugX
  12. 1994010111.349drugX
  13. [200rowsx6columns]

我们可以观察到所有的“object”值都被处理成“binary”值来表示分类数据。例如,在胆固醇属性中,显示“低”的值被处理为0,“高”则被处理为1。现在我们准备好从数据中创建因变量和自变量。

步骤4:拆分数据

在将我们的数据处理为正确的结构之后,我们现在设置“X”变量(自变量),“Y”变量(因变量)。让我们用python来实现

Python实现:

  1. X_var=df[['Sex','BP','Age','Cholesterol','Na_to_K']].values#自变量
  2. y_var=df['Drug'].values#因变量
  3. print(cl('Xvariablesamples:{}'.format(X_var[:5]),attrs=['bold']))
  4. print(cl('Yvariablesamples:{}'.format(y_var[:5]),attrs=['bold']))

输出:

  1. Xvariablesamples:[[1.2.23.1.25.355]
  2. [1.0.47.1.13.093]
  3. [1.0.47.1.10.114]
  4. [1.1.28.1.7.798]
  5. [1.0.61.1.18.043]]
  6. Yvariablesamples:['drugY''drugC''drugC''drugX''drugY']

我们现在可以使用scikit learn中的“train_test_split”算法将数据分成训练集和测试集,其中包含我们定义的X和Y变量。按照代码在python中拆分数据。

Python实现:

  1. X_train,X_test,y_train,y_test=train_test_split(X_var,y_var,test_size=0.2,random_state=0)
  2. print(cl('X_trainshape:{}'.format(X_train.shape),attrs=['bold'],color='black'))
  3. print(cl('X_testshape:{}'.format(X_test.shape),attrs=['bold'],color='black'))
  4. print(cl('y_trainshape:{}'.format(y_train.shape),attrs=['bold'],color='black'))
  5. print(cl('y_testshape:{}'.format(y_test.shape),attrs=['bold'],color='black'))

输出:

  1. X_trainshape:(160,5)
  2. X_testshape:(40,5)
  3. y_trainshape:(160,)
  4. y_testshape:(40,)

现在我们有了构建决策树模型的所有组件。所以,让我们继续用python构建我们的模型。

步骤5:建立模型和预测

在scikit学习包提供的“DecisionTreeClassifier”算法的帮助下,构建决策树是可行的。之后,我们可以使用我们训练过的模型来预测我们的数据。最后,我们的预测结果的精度可以用“准确度”评估指标来计算。让我们用python来完成这个过程!

Python实现:

  1. model=dtc(criterion='entropy',max_depth=4)
  2. model.fit(X_train,y_train)
  3. pred_model=model.predict(X_test)
  4. print(cl('Accuracyofthemodelis{:.0%}'.format(accuracy_score(y_test,pred_model)),attrs=['bold']))

输出:

  1. Accuracyofthemodelis88%

在代码的第一步中,我们定义了一个名为“model”变量的变量,我们在其中存储DecisionTreeClassifier模型。接下来,我们将使用我们的训练集对模型进行拟合和训练。之后,我们定义了一个变量,称为“pred_model”变量,其中我们将模型预测的所有值存储在数据上。最后,我们计算了我们的预测值与实际值的精度,其准确率为88%。

步骤6:可视化模型

现在我们有了决策树模型,让我们利用python中scikit learn包提供的“plot_tree”函数来可视化它。按照代码从python中的决策树模型生成一个漂亮的树图。

Python实现:

  1. feature_names=df.columns[:5]
  2. target_names=df['Drug'].unique().tolist()
  3. plot_tree(model,
  4. feature_names=feature_names,
  5. class_names=target_names,
  6. filled=True,
  7. rounded=True)
  8. plt.savefig('tree_visualization.png')

输出:

用Python构建和可视化决策树

结论

有很多技术和其他算法用于优化决策树和避免过拟合,比如剪枝。虽然决策树通常是不稳定的,这意味着数据的微小变化会导致最优树结构的巨大变化,但其简单性使其成为广泛应用的有力候选。在神经网络流行之前,决策树是机器学习中最先进的算法。其他一些集成模型,比如随机森林模型,比普通决策树模型更强大。

决策树由于其简单性和可解释性而非常强大。决策树和随机森林在用户注册建模、信用评分、故障预测、医疗诊断等领域有着广泛的应用。我为本文提供了完整的代码。

完整代码:

  1. importpandasaspd#数据处理
  2. importnumpyasnp#使用数组
  3. importmatplotlib.pyplotasplt#可视化
  4. frommatplotlibimportrcParams#图大小
  5. fromtermcolorimportcoloredascl#文本自定义
  6. fromsklearn.treeimportDecisionTreeClassifierasdtc#树算法
  7. fromsklearn.model_selectionimporttrain_test_split#拆分数据
  8. fromsklearn.metricsimportaccuracy_score#模型准确度
  9. fromsklearn.treeimportplot_tree#树图
  10. rcParams['figure.figsize']=(25,20)
  11. df=pd.read_csv('drug.csv')
  12. df.drop('Unnamed:0',axis=1,inplace=True)
  13. print(cl(df.head(),attrs=['bold']))
  14. df.info()
  15. foriindf.Sex.values:
  16. ifi=='M':
  17. df.Sex.replace(i,0,inplace=True)
  18. else:
  19. df.Sex.replace(i,1,inplace=True)
  20. foriindf.BP.values:
  21. ifi=='LOW':
  22. df.BP.replace(i,0,inplace=True)
  23. elifi=='NORMAL':
  24. df.BP.replace(i,1,inplace=True)
  25. elifi=='HIGH':
  26. df.BP.replace(i,2,inplace=True)
  27. foriindf.Cholesterol.values:
  28. ifi=='LOW':
  29. df.Cholesterol.replace(i,0,inplace=True)
  30. else:
  31. df.Cholesterol.replace(i,1,inplace=True)
  32. print(cl(df,attrs=['bold']))
  33. X_var=df[['Sex','BP','Age','Cholesterol','Na_to_K']].values#自变量
  34. y_var=df['Drug'].values#因变量
  35. print(cl('Xvariablesamples:{}'.format(X_var[:5]),attrs=['bold']))
  36. print(cl('Yvariablesamples:{}'.format(y_var[:5]),attrs=['bold']))
  37. X_train,X_test,y_train,y_test=train_test_split(X_var,y_var,test_size=0.2,random_state=0)
  38. print(cl('X_trainshape:{}'.format(X_train.shape),attrs=['bold'],color='red'))
  39. print(cl('X_testshape:{}'.format(X_test.shape),attrs=['bold'],color='red'))
  40. print(cl('y_trainshape:{}'.format(y_train.shape),attrs=['bold'],color='green'))
  41. print(cl('y_testshape:{}'.format(y_test.shape),attrs=['bold'],color='green'))
  42. model=dtc(criterion='entropy',max_depth=4)
  43. model.fit(X_train,y_train)
  44. pred_model=model.predict(X_test)
  45. print(cl('Accuracyofthemodelis{:.0%}'.format(accuracy_score(y_test,pred_model)),attrs=['bold']))
  46. feature_names=df.columns[:5]
  47. target_names=df['Drug'].unique().tolist()
  48. plot_tree(model,
  49. feature_names=feature_names,
  50. class_names=target_names,
  51. filled=True,
  52. rounded=True)
  53. plt.savefig('tree_visualization.png')

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 14:25
下一篇 2023年5月5日 14:25

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信