一、决策树介绍

决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。

从数据产生决策树的机器学习技术叫做决策树学习,通俗说就是决策树。

一个决策树包含三种类型的节点:

  1. 决策节点:通常用矩形框来表示
  2. 机会节点:通常用圆圈来表示
  3. 终结节点:通常用三角形来表示

算法从略:决策树的划分依据是信息增益:ID3(最差的树) CART(以基尼系数替代熵,最小化不纯度,而不是最大化信息增益。)

所谓的信息增益是指特征A对训练数据集D的信息增益g(D,A)定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D A)之差.表示得知特征X的信息而使得类Y的信息的不确定性减少的程度

决策树视图 决策树是一树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程。

五、sklearn决策树的API

sklearn.tree.DecisionTreeClassifier(criterion='gini',max_deepth=None,random_state=None)
  • 在python中决策数中默认的是gini系数,也可以选择信息增益的熵’entropy’
  • max_depth:树的深度大小
  • random_state:随机数种子

如下我们使用泰坦尼克号的数据举例说明:

# 首先导入需要的包
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import pandas as pd

使用决策树进行预测:

def descision():
    """
    决策树对泰坦尼克号进行预测生死
    :return:None
    """
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 处理数据,找出特征值和目标值
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']
    print(x)

    # 缺失值处理
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

    # 进行处理(特征工程)
    dict = DictVectorizer(sparse=False)

    x_train = dict.fit_transform(x_train.to_dict(orient="records"))

    print(dict.get_feature_names())

    x_test = dict.transform(x_test.to_dict(orient="records"))

    print(x_train)

    # 用决策树进行预测
    dec = DecisionTreeClassifier()

    dec.fit(x_train, y_train)

    # 预测准确率
    print("预测的准确率为:", dec.score(x_test, y_test))

    # 导出决策树的结构
    export_graphviz(dec, out_file="./tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'])


if __name__=="__main__":
    descision()

可以看到得出的结果:

六、决策树的优缺点

优点:

  • 简单的理解和解释,树木可以可视化;
  • 需要很少的数据准备,其他技术通常需要归一化。

缺点:

  • 不能很好的推广数据的过于复杂的树,会产生过拟合。 补充:
  • 预剪枝 :其中的核心思想就是,在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分;如果可以就继续递归生成节点。
  • 后剪枝 :后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。 ___

    二、随机森林

    “Bagging”技术,它是一种集成学习(ensemble learning)的方法,其中多个模型被训练并组合以提高预测的准确性和稳定性。
    Bagging代表Bootstrap Aggregation,其中“Bootstrap”是一种随机抽样技术,它可以从原始数据集中创建多个新的训练集。
    每个新的训练集都是通过随机抽取原始数据集中的样本来创建的,这些样本可以在新的训练集中出现多次或不出现。
    这种随机抽样可以减少模型对于特定样本的过拟合,并提高模型的泛化能力。
    在Bagging中,每个新的训练集都用于训练一个单独的模型,然后这些模型被组合以生成最终的预测。
    

    构造随机森林的 4 个步骤

  1. 一个样本容量为N的样本,有放回的抽取N次,每次抽取1个,最终形成了N个样本。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
  2. 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m « M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
  3. 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
  4. 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。

随机森林的优缺点

优点

  1. 它可以出来很高维度(特征很多)的数据,并且不用降维,无需做特征选择
  2. 它可以判断特征的重要程度
  3. 可以判断出不同特征之间的相互影响
  4. 不容易过拟合
  5. 训练速度比较快,容易做成并行方法
  6. 实现起来比较简单
  7. 对于不平衡的数据集来说,它可以平衡误差。
  8. 如果有很大一部分的特征遗失,仍可以维持准确度。

缺点

  1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  2. 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的
from sklearn.ensemble import RandomForestClassifier
# 随机森林
random_forest=RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train,Y_train)
Y_predict=random_forest.predict(X_test)
random_forest.score(X_train,Y_train)
acc_random=round(random_forest.score(X_train,Y_train)*100,2)
acc_random
#由100个决策树(n_estimators=100)来构建随机森林模型。X_train和Y_train是训练数据集,用于训练模型。X_test是测试数据集,用于评估模型的性能。模型的准确率(accuracy)可以通过score()方法来计算。最后,将准确率acc_random以百分比形式保存在变量中,保留两位小数。

分类: ,

更新时序:

笺評 (issue)