首页 > 编程知识 正文

决策树如何实现多分类任务,决策树多分类算法

时间:2023-05-04 02:00:09 阅读:59252 作者:4983

另外在网上搜索了很长时间,收集了几个决策树的例子。 原理部分大致可分为几种算法。 首先,ID3算法根据信息熵原理,如果能够根据某个属性对所有样本进行最快的分类,则该属性成为决策树的优先节点,然后继续根据熵值选择其他属性作为分类节点。 但是,ID3算法有明显的缺点。 如果一个属性的值很多,则表示选择该属性的概率最高。 也就是说,你喜欢有更多值的属性。 很明显,这种属性在某些情况下是鸡肋属性,如生日、身份证号码等,生日因人而异。 根据生日可以很快对样品进行分类,但是这个生日对我们判断和分类没有什么意义。 为了避免这种尴尬,产生了C4.5。 不是按熵值选择,而是按信息增益(即比率)选择。 在CART树中,用Gini系数进行计算判断,同时可以避免ID3、C4.5无法处理连续值的尴尬。 为了提高分类精度,建立了随机森林算法。 简言之,如果一棵树不准确(采样样本时一定会出现偏差),就做几棵树,做几个样本,做几片森林处理。 当然,这是我自己的小理解,如果错了,可以用信息讨论。

这篇文章的目的不是建立那么高级的理论,只是让大家都能参与决策树的实现,所以不要罗嗦。 直接上盒开始动手。 第一个情况我会详细说明,但后面的两个不会纠缠不清。 过程是一样的。 贴上结果图进行计算。案例1:挑瓜

大家会选择西瓜吧。 (我还不太会,但是根据数据变得很软。 西瓜具有色泽、根、敲击声、纹理、脐部、触感等特征,根据这些特征可以判断甜瓜是否是好甜瓜。 数据链接到此处(三个案例数据)。

首先导入数据,确认以下内容:

dt=PD.read_excel(r '决策树数据. xlsx ',sheet_name='选择甜瓜') dt.head(2)2) ) ) ) ) )

很明显,号码这个属性在我们判断时是不需要的。 色调、根茎……触感是所谓的特征数据,甜瓜是类别数据。 在需要将这两个部分分开的同时,还需要解决另一个问题。 这些数据都是中文的,不能直接拿去计算,需要一些转换。

#如果去掉号码列,同时将好瓜这一列名改为否,则dt.rename(columns=)“好瓜”: (否)、inplace=True ) dt1=dt.iloc (3360 )、 13336660 )更容易理解中文数据:数值defconvert(dt ) : if dt in [ )、“青绿”、“卷曲”、“混浊回响”、“清晰”、“凹陷”、 “黑漆漆”' no']:return2elifdtin[“浅白”,“硬”,“脆”,“模糊”,“平坦”] : return 3d t1=dt1.apply map (转换图)

接着,将数据分为特征数据和类别数据两部分。

根据importnumpyasnplabels=NP.array (dt1 [ '否' ] )特征数据data=NP.array (dt1.iloc [ :-1 ] )类别数据构建决策树

fromsklearnimporttreeclf=tree.decisiontreeclassifier (criterion='entropy ' )参数criterion=' entropy '基于信息熵

withopen(tree.dot ),w ) ) as f:# )将构建的决策树保存到tree.dot文件中的f=tree.export_graphviz ) CLF,feature_names=NP

dot -Tpng tree.dot -o tree.png确实得到了一棵树,但看起来很奇怪,完全不知道属性是什么

因此,我要改变第二种方法。 (必须首先安装graphviz )

importgraphvizdot _ data=tree.export _ graphviz (clf,out_file=None,feature _ names=dt1.columns ) (3360-coumns

下次会更漂亮。

听说有个叫dtreeviz的更牛x的包。 (也需要先安装。 )试了一下,抱着不花钱的态度,又试了一次,但似乎很难解决中文表达不好的问题

示的问题(其实是我懒得去折腾,不是传统的那种显示不了中文的问题,英文则一点问题没有),代码先放在这里,有兴趣的可以试试:

from dtreeviz.trees import dtreevizviz = dtreeviz(clf,x_data=data,y_data=labels, target_name='class',feature_names=dt1.columns[:-1].values, class_names=list(dt1.columns[-1]), title="Decision Tree-挑瓜") viz

决策树的用途就是用于进行分类,既然有了决策树,我们随便构建一个样本,预测一下看看它会被分到哪个类别里去吧?

t=['乌黑','蜷缩','清脆','模糊','平坦','硬滑']t=pd.DataFrame(t).T.applymap(convert)clf.predict(t)

结果为:
array([2], dtype=int64),按我这里的话,就是否的这一类了。
如果把纹理改为清晰呢?

t=['乌黑','蜷缩','清脆','清晰','平坦','硬滑']t=pd.DataFrame(t).T.applymap(convert)clf.predict(t)

结果成了:array([1], dtype=int64),就是个好瓜了。

案例2:网上写烂了的打网球的案例。
这个案例主要是根据天气、温度、湿度等因素判断是否该去打网球,过程基本和前面的一样,我就不再赘述了,直接给个结果图吧,主要是前面的第2、3种方法画的。


其实看看这俩图,可能本人审美不足,也没感觉出后面这个图帅在哪里。

案例3:销售决策
这个例子呢,我就不知道具体是什么产品了,反正先当成衣服吧,主要有性别、类型和尺码三个特征属性,然后是一个产品类型的类别属性。主要是判断当给定特征属性时的某个用户,应该给他(她)推荐哪类产品。
过程也不赘述了,直接上棵树,看看能不能做出和我一样的效果?

这个地方偷了个懒,没有将类别属性的名称修改一下,所以如果是‘产’,就认为是C0,如果是‘品’就认为是C1吧。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。