决策树(Decision Tree)算法是是最经常使用的数据挖掘算法之一。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
一个例子,一个叫做 "二十个问题" 的游戏,游戏的规则很简单:参与游戏的一方在脑海中想某个事物,其他参与者向他提问,只允许提 20 个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围,最后得到游戏的答案 ,就是一个典型的决策树。
在实际中,决策树有很多典型应用,例如用户流失预测、 精确营销、 客户获取、个性偏好、 信用分析、 欺诈预警 智能预警、问题分类预测、可靠性与安全预测、故障诊断、故障预测、网上质量预测……
作为一个码农经常会不停的敲if, else if, else,其实就已经在用到决策树的思想了。只是你有没有想过,有这么多条件,用哪个条件特征先做if,哪个条件特征后做if比较优呢?怎么准确的定量选择这个标准就是决策树机器学习算法的关键了。1970年代,一个叫昆兰的大牛找到了用信息论中的熵来度量决策树的决策选择过程,方法一出,它的简洁和高效就引起了轰动,昆兰把这个算法叫做ID3,ID3后来进一步发展为C4.5、CART等算法。
难以避免,算法要讲几个概念:
信息量:跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大; 如上海发生地震了,(上海多低的概率发生地震啊,信息量巨大)。 信息量应当是非负的,必然发生的信息量为0; 如太阳从东方升起,(肯定发生嘛,没什么信息量)。
香农熵: 是一种信息的度量方式,表示信息的混乱程度,也就是说:信息越有序,信息熵越低。例如:火柴有序放在火柴盒里,熵值很低,相反,熵值很高。
信息增益(information gain): 在划分数据集前后信息发生的变化称为信息增益。
基尼指数(Gini index) 一种数据的不纯度的度量方法,和信息熵相似,同样可以用来度量数据的不确定性
决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪。` 信息增益比: 如果简单的以g(y, A) 作为标准的话,会存在偏向于选择取值多的特征的问题。 最终得到的决策树将会是一颗很胖很矮的决策树,并不是我们想要的。 信息增益比可以解决这个问题,就是在信息增益的基础上除以信息熵。
下面以决策树,对股票市场进行一下应用,选取2017年5月的A股市场数据,把几个财务指标当做特征,依据涨跌划分为4类
xdf.loc[(xdf['changeration']>=10),'Result']=0 xdf.loc[((xdf['changeration']<10) & (xdf['changeration']> 0)),'Result']=1 xdf.loc[((xdf['changeration']<0) & (xdf['changeration']>-10)),'Result']=2 xdf.loc[(xdf['changeration']<-10),'Result']=3
超过10%涨幅的为第一类,跌幅超过10%的为第四类。
选取'pe','outstanding','rev','profit','eps','roe'作为训练特征。
train_data=train[['pe','outstanding','rev','profit','eps','roe']] train_label=train['Result'] test_data=test[['pe','outstanding','rev','profit','eps','roe']] test_label=test['Result'] dctree=tree.DecisionTreeClassifier() dctree.fit(train_data,train_label) predict=dctree.predict(test_data) print(predict) print(confusion_matrix(test_label,predict)) print(classification_report(predict,test_label)) print(dctree.feature_importances_) feature_importances = pd.Series(dctree.feature_importances_, index=train_data.columns)
各个财务指标的重要程度排名如下: