1 .决策树算法概要决策树算法可以同时解决分类问题(相应目标值为类别型数据)和回归问题)输出结果可以是连续的数值)。 与其他算法相比,决策树具有非常明显的优点:直观可视化,分类规则容易理解,非专业人士也容易理解。
例如某个周末,根据天气等情况决定是否出门。 下雨的话就不出门了。 不然我看有没有雾。 ……这个决定的过程可以画成这样的树形图。
以sklearn的葡萄酒数据集为例,给出酒精度等数据指标,采用决策树算法判断葡萄酒类别。
2 .为了加载数据,便于图形可视化演示,只选取第一个特征(酒精度)和第七个特征(黄酮量)两个特征,绘制了三种葡萄酒对应的散点图。
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportdatasets #负载酒数据集wine=datasets.load_wine(2 (两个特征x 6 ]仅选择6]y=wine.target#创建散点图PLT.scatter (x [ y==0,0 ],x [ y==0,1 ] ) PLT
3 .调用算法的方法与调用其他算法的方法一样,是将数据集分为训练集和测试集,然后指定相关参数。 在此将决策树的最大深度指定为2,对算法进行评价
froms klearn.model _ selectionimporttrain _ test _ splitfromsklearnimporttree #是训练集和测试集X_train,X_test 分割为y _ train (random _ state=0) #决策树分类算法DTC=tree.decisiontreeclassifier (max _ depth=2) DTC.fit ) y _ traraiee y_train ) )调用算法的y_train () ) print ('测试得分:DTC.score(x_test,y_test ) ) ) )获得训练
如果设置max_depth=1,则算法得分较低,会出现拟合不足的问题。
如果max_depth=10,则算法的分数会较高,但决策树会变得过于复杂,导致拟合问题。
4 .为了更直观地看到决策边界算法的分类效果,定义了绘制决策边界的函数,并绘制了分类的边界线。
frommatplotlib.colorsimportlistedcolormap #绘制决策边界的函数def plot _ decision _ boundary (model,axis ) : x0,x1=NP.mesis int ((axis [1]-axis [0] [ 100 ] ) ) )、reshape(-1 )、NP.Linspace ) axis[2]、axis[3]、int 1) x _ x1.ravel ) ]y_predict=model.predict ) x_new ) ZZ=y _ predict .“# fff 59 d”,“# 90ca F9” cmap=custom_cmap ) )决策边界plot_decision_boundary ) dtt x [ y==0,1 ] (x [ y==1,0 ],x [ y=
从图中也可以看出,大部分得分据点的分类基本准确,说明决策树算法效果较好。
5 .树视图可以在树视图中显示算法的结果,以便更直观地理解决策树算法。
#要导入相关库,请先安装graphviz和pydotplus,然后在计算机上输入graphviz软件importpydotplusfromsklearn.treeimportexport _ gratplus
ingIO # 将对象写入内存中dot_data = StringIO() # 生成决策树结构tree.export_graphviz(dtc, class_names=wine.target_names, feature_names=[wine.feature_names[0], wine.feature_names[6]], rounded=True, filled=True, out_file = dot_data) # 生成树形图并展示出来graph = pydotplus.graph_from_dot_data(dot_data.getvalue())Image(graph.create_png()) 6. 结果解读从上面的树形图来看,在葡萄酒数据的训练集中,有 133 个数据,划分为 3 个类别,数量分别是 43、50、40 个,对应的标签分别是 class_0、class_1、class_2,其中 class_1 的数量最多,所以最上面的根节点认为,类别为 class_1 的可能性最大,Gini 系数为 0.664,它是利用下面的公式计算出来的:
1 - (43/133)**2 - (50/133)**2 - (40/133)**2
在决策树算法中,Gini 系数代表样本的不确定性。当每个类别的数量越趋近于平均值,Gini 系数就越大,也就越不确定。
比如扔硬币的游戏,在一般情况下,正反两面的概率都是 50%,此时 Gini 系数等于 0.5,你猜中的概率也是 50%;假如你对硬币做了手脚,把两面都变成正面图案,此时Gini 系数等于 0, 也就是说,不确定性为 0,你能明确地知道肯定是正面。
在上面葡萄酒的例子中,当黄酮量 <= 1.575 时,有 49 个样本,3 个类别的数量分别是 0、9、40 个,其中 class_2 的数量最多,Gini 系数为 0.3,比上面的节点要低,说明分类结果变得更加确定。当酒精量 > 12.41 时,有 39 个样本,3 个类别的数量分别是 0、2、37个,Gini 系数为 0.097,此时分类结果变得更加确定为 class_2。
树形图中其他节点的结果含义类似,在此不再赘述。
小结本文介绍了决策树算法的应用,以葡萄酒数据集为例,演示了决策树算法的实现过程,绘制了直观易懂的决策边界和树形图,并对决策结果做了详细解读。
虽然决策树算法有很多优点,比如高效、易懂,但是也有它的不足之处,比如当参数设置不当时,很容易出现过拟合的问题。
为了避免决策树算法出现过拟合的问题,可以使用「集成学习」的方法,融合多种不同的算法,也就是俗话讲的「三个臭皮匠,赛过开朗的跳跳糖」。