机器学习算法——决策树

  1. 基本概念
  • 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
  • 三种结点:
    • 根结点:没有入边,但有零条或者多条出边
    • 内部结点:恰有一条入边和两条或多条出边
    • 叶结点:恰有一条入边,但没有出边
  • 种类:
    • 分类树:对离散变量做决策树
    • 回归树:对连续变量做决策树
  1. 相关数学知识
  • 信息熵(entropy)

信息熵就是平均而言发生一个事件我们得到的信息量大小。所以数学上,信息熵其实是信息量的期望。(参见知乎:https://www.zhihu.com/question/22178202


理解:

熵:表示随机变量的不确定性。

条件熵:在一个条件下,随机变量的不确定性。

信息增益:熵- 条件熵,在一个条件下,信息不确定性减少的程度。

通俗地讲,X(明天下雨)是一个随机变量,X的熵可以算出来,Y(明天阴天)也是随机变量,在阴天情况下下雨的信息熵我们如果也知道的话(此处需要知道其联合概率分布或是通过数据估计)即是条件熵。两者相减就是信息增益!原来明天下雨例如信息熵是2,条件熵是0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为1.99,在获得阴天这个信息后,下雨信息不确定性减少了1.99,是很多的,所以信息增益大。也就是说,阴天这个信息对下雨来说是很重要的!

所以在特征选择的时候常常用信息增益,如果IG(信息增益大)的话那么这个特征对于分类来说很关键,决策树就是这样来找特征的。

(参见知乎:https://www.zhihu.com/question/22104055

  • 基尼指数:

决策树中,使用基尼指数选择划分属性。直观来说,基尼指数反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,基尼指数越小,则数据集D的纯度越高。于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。




  1. 算法
  1. ID3
  • ID3算法就是对各个feature信息计算信息增益,然后选择信息增益最大的feature作为决策点将数据分成两部分。

机器学习算法——决策树_第1张图片

  • 算法不足:

使用 ID3算法构建决策树时,若出现各属性值取数分布偏差大的情况类精度会打折扣;ID3算法本身并未给出处理连续数据的方;

ID3算法不能处理带有缺失值的数据集,故在挖掘之前需要对中进行预;

ID3算法只有树的生成 ,所以该算法产生的树容易过拟合。

  1. C4.5
  • C4.5与ID3相比其实就是用信息增益比代替信息增益,因为信息增益有一个缺点:信息增益选择属性时偏向选择取值多的属性,算法的整体过程其实与ID3差异不大:
  • 机器学习算法——决策树_第2张图片
  1. CART
  • CART(classification and regression tree)的算法整体过程和上面的差异不大,但是CART的决策是二叉树的,每一个决策只能是“是”和“否”,换句话说,即使一个feature有多个可能取值,也只选择其中一个而把数据分类两部分而不是多个,这里我们主要讲一下分类树,它用到的是基尼指数:

机器学习算法——决策树_第3张图片

  1. python实现
    • class sklearn.tree.DecisionTreeClassifier(criterion='gini'splitter='best'max_depth=Nonemin_samples_split=2,min_samples_leaf=1min_weight_fraction_leaf=0.0max_features=Nonerandom_state=Nonemax_leaf_nodes=None,min_impurity_split=1e-07class_weight=Nonepresort=False)
    • http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
    • 其中比较重要的参数:
      • criterion :规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”
      • max_depth :限定了决策树的最大深度,对于防止过拟合非常有用。
      • min_samples_leaf :限定了叶子节点包含的最小样本数,这个属性对于防止数据碎片问题很有作用。
    • 模块中一些重要的属性方法:
      • n_classes_ :决策树中的类数量。
      • classes_ :返回决策树中的所有种类标签。
      • feature_importances_ feature的重要性,值越大那么越重要。
      • fit(X, y, sample_mask=None, X_argsorted=None, check_input=True, sample_weight=None)

将数据集x,和标签集y送入分类器进行训练,这里要注意一个参数是:sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。

  • get_params(deep=True) :得到决策树的各个参数。
  • set_params(**params) :调整决策树的各个参数。
  • predict(X) :送入样本X,得到决策树的预测。可以同时送入多个样本。
  • transform(X, threshold=None) :返回X的较重要的一些feature,相当于裁剪数据。
  • score(X, y, sample_weight=None) :返回在数据集X,y上的测试分数,正确率。
  • 使用建议:
    • 当我们数据中的feature较多时,一定要有足够的数据量来支撑我们的算法,不然的话很容易overfitting
    • PCA是一种避免高维数据overfitting的办法。
    •  从一棵较小的树开始探索,用export方法打印出来看看。
    • 善用max_depth参数,缓慢的增加并测试模型,找出最好的那个depth
    •  善用min_samples_splitmin_samples_leaf参数来控制叶子节点的样本数量,防止overfitting
    • 平衡训练数据中的各个种类的数据,防止一个种类的数据dominate

 

 

你可能感兴趣的:(机器学习,python)