机器学习之决策树

决策树算法的优点:
1:理解和解释起来简单,且决策树模型可以想象
2:需要准备的数据量不大,而其他的技术往往需要很大的数据集,需要创建虚拟变量,去除不完整的数据,但是该算法对于丢失的数据不能进行准确的预测
3:决策树算法的时间复杂度(即预测数据)是用于训练决策树的数据点的对数
4:能够处理数字和数据的类别(需要做相应的转变),而其他算法分析的数据集往往是只有一种类型的变量
5:能够处理多输出的问题
6:使用白盒模型,如果给定的情况是在一个模型中观察到的,该条件的解释很容易解释的布尔逻辑,相比之下,在一个黑盒子模型(例如人工神经网络),结果可能更难以解释
7:可能使用统计检验来验证模型,这是为了验证模型的可靠性
8:从数据结果来看,它执行的效果很好,虽然它的假设有点违反真实模型



决策树算法的缺点:

1:决策树算法学习者可以创建复杂的树,但是没有推广依据,这就是所谓的过拟合,为了避免这种问题,出现了剪枝的概念,即设置一个叶子结点所需要的最小数目或者设置树的最大深度
2:决策树的结果可能是不稳定的,因为在数据中一个很小的变化可能导致生成一个完全不同的树,这个问题可以通过使用集成决策树来解决
3:众所周知,学习一恶搞最优决策树的问题是NP——得到几方面完全的优越性,甚至是一些简单的概念。因此,实际决策树学习算法是基于启发式算法,如贪婪算法,寻求在每个节点上的局部最优决策。这样的算法不能保证返回全局最优决策树。这可以减轻训练多棵树的合奏学习者,在那里的功能和样本随机抽样更换。
4:这里有一些概念是很难的理解的,因为决策树本身并不难很轻易的表达它们,比如说异或校验或复用的问题。
5:决策树学习者很可能在某些类占主导地位时创建有有偏异的树,因此建议用平衡的数据训练决策树



Classification  简单示例

>>> from sklearn import tree
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(X, Y)
>>> clf.predict([[2., 2.]])
array([1])

Regression 简单示例

>>> from sklearn import tree
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = tree.DecisionTreeRegressor()
>>> clf = clf.fit(X, y)
>>> clf.predict([[1, 1]])
array([ 0.5])

决策树算法使用 示例

数据集如下图:


程序如下:
[python]  view plain  copy
  1. <span style="font-size:18px;">#-*- coding: UTF-8 -*-   
  2. ''''' 
  3. Created on 2016/4/23 
  4.  
  5. @author: Administrator 
  6. '''  
  7. from sklearn.feature_extraction import DictVectorizer  
  8. import csv  
  9. from sklearn import preprocessing  
  10. from sklearn import tree  
  11. from sklearn.externals.six import StringIO  
  12.   
  13. #Read in the csv File and put feature in a list of class label  
  14. allElectronicsData = open(r"example.csv","rb")  
  15. reader = csv.reader(allElectronicsData)  
  16. headers = reader.next()  
  17. #print headers  
  18.   
  19. featureList = []    
  20. labelList = []  
  21. #存放在两个元祖中  
  22. for row in reader:  
  23.     labelList.append(row[len(row)-1])  
  24.     rowDic = {}  
  25.     for i in range(1,len(row)-1):  
  26.         rowDic[headers[i]] = row[i]  
  27.     featureList.append(rowDic)  
  28.       
  29. # print featureList  
  30. # print labelList  
  31.   
  32. # Vector Feature  
  33. vec = DictVectorizer()  
  34. dummyX = vec.fit_transform(featureList) .toarray()  
  35. # print "dummyX:",dummyX  
  36. # print vec.get_feature_names()  
  37. # print "labelList:"+str(labelList)  
  38.   
  39. lb = preprocessing.LabelBinarizer()  
  40. dummyY = lb.fit_transform(labelList)  
  41. #print "dummyY:" + str(dummyY)  
  42.   
  43. #using desicionTree for classfication  
  44. clf = tree.DecisionTreeClassifier(criterion="entropy"#创建一个分类器,entropy决定了用ID3算法  
  45. clf = clf.fit(dummyX, dummyY)  
  46. print "clf:"+str(clf)  
  47.   
  48. #Visulize model  
  49. with open("allEallElectronicInfomationGainori.txt","w") as f:  
  50.     f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file = f)  
  51.   
  52. #预测      
  53. oneRowX = dummyX[0,:]  
  54. #print "oneRowX:" +str(oneRowX)  
  55.   
  56. newRowX = oneRowX  
  57. newRowX[0] = 1  
  58. newRowX[2] = 0  
  59. print "newRowX:" +str(newRowX)  
  60.   
  61. predictedY = clf.predict(newRowX)  
  62. print "predictedY:" + str(predictedY)</span>  

使用命令导出图形为pdf:dot -T pdf ex.txt -o output.pdf.txt  (windows cmd的命令)


 
 

使用小贴士

  • 如果数据量大,决策树容易过拟合。样本和特征的比例非常重要。如果决策树样本少,特征多,非常可能过拟合。
  • 可以考虑事先做维度约减(PCA,ICA),以产生一个特征之间区别性大的决策树
  • 通过export将你的训练的决策树可视化,使用max_depth =3作为一个初始的树的深度,有一个数据拟合决策树模型的大概感觉,然后逐渐增加深度
  • 数据的样本量的增加将加深决策树的深度,使用max_depth控制决策树的尺寸以防止过拟合
  • 使用min_samples_split 或者 min_samples_leaf来控制叶节点的样本数量。一个非常小的数量往往意味着过拟合,而一个较大的数可以防止过拟合。可以将min_samples_leaf=5作为一个初始值。如果样本数据变化巨大,可以采用一个浮点数。两者的区别在于min_samples_leaf保证了叶节点最小的数量,min_samples_split能够建立任意数量的叶子节点,在文学上用到也更多
  • 如果样本是有权重的,可以使用min_weight_fraction_leaf来实现基于权重的预修剪规则来优化决策树结构
  • 决策树内部使用np.float32向量,如果样本不是这个形式的,将产生一个数据集的样本
  • 如果数据矩阵X是非常稀疏的,建议在拟合和预测之前转换为稀疏矩阵csc_matrix。稀疏矩阵将比稠密矩阵快数量级的速度

决策树算法:ID3,C4.5,C5.0,CART

ID3是由Ross Quinlan在1985年建立的。这个方法建立多路决策树,并找到最大的信息增益。当树长到最大的尺寸,经常应用剪枝来提高决策树对未知数据的一般化。

C4.5是ID3的进一步延伸,通过将连续属性离散化,去除了特征的限制。C4.5将训练树转换为一系列if-then的语法规则。可确定这些规则的准确性,从而决定哪些应该被采用。如果去掉某项规则,准确性能提高,则应该实行修剪。

C5.0较C4.5使用更小的内存,建立更小的决策规则,更加准确。

CART和C4.5很相似,但是它支持数值的目标变量(回归)且不产生决策规则。CART使用特征和阈值在每个节点获得最大的信息增益来构建决策树。

scikit-learn使用一个最佳的CART算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值