美文网首页
Decision Tree

Decision Tree

作者: echolvan | 来源:发表于2020-02-15 16:43 被阅读0次

    决策树算法最主要要解决的问题:

    • 怎么在数据表中找到最佳分支和最佳的节点
    • 怎么防止过拟合和欠拟

    决策树

    在sklearn中
    sklearn中的决策树都在sklearn.tree中

    from sklearn.tree import DecisionTreeClassifier
    
    clf = DecisionTreeClassifier()
    clf = clf.fit(X_train, y_train)
    result = clf.score(X_test, y_test)
    

    重要参数

    1.criterion

    衡量最佳指标叫不纯度,不纯度越低,决策树对训练数据的拟合效果越好。
    不纯度有两种计算方法:

    • 'entropy', 信息熵
    • 'gini',基尼系数

    在实际使用中这两种计算方式效果差不多。

    因为信息熵对不纯度更加敏 感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易 过拟合。
    基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表 现不太好的时候,使用信息熵。当然,这些不是绝对的。
    当然我们可以两种都试一试。

    2.random_state & splitter

    random_state用于设置分枝的随机模式的参数,就如随机种子一般
    splitter控制决策树中的随机选项,两种输入值
    'best'
    决策树在分支的时候虽然是随机,但是还是会选择更加重要的特征来进行分支
    'random'
    决策树在分支时会更加随机,因此树就会在不必要的信息上分支生长深,并且因为这些不必要的信息反而降低了对训练集的拟合。

    3.剪枝参数

    我们如果不进行任何限制,决策树会生长到不纯度最优,或者用到没有特征可用,这样我们的决策树通常会过拟合。剪枝参数是对决策树过拟合解决的最好调节方法了, 可以说剪枝是决策树的核心

    • max_depth
      限制树的最大深度,超过设定深度的树枝全部剪掉

    • min_samples_leaf & min_samples_split
      min_samples_leaf限制一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分 枝就不会发生或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
      min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。
      这两个参数差不多

    • max_features&min_impurity_decrease
      最大使用的特征数max_features,超过限制个数的特征就会被舍弃
      最小的信息增益min_impurity_decrease

    • class_weight&min_weight_fraction_leaf
      完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要 判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不 做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给 少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给 与数据集中的所有标签相同的权重。

    有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_ weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_ fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使 用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分

    如何确定最优的剪枝参数呢?

    诚然我们可以画超参数的学习曲线。但是我们在实际中是没有什么条件去使用学习曲线的。如果你手中的数据集特别大,那么无论如何是需要剪枝的。

    import graphviz
    from sklearn import tree 
    from sklearn.datasets import load_wine 
    from sklearn.model_selection import train_test_split 
    
    wine = load_wine()
    wine.data.shape
    wine.target
    wine.target_names
    
    # 分割测试集和训练集
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
     
    Xtrain.shape
    Xtest.shape
    
    # 建立模型
    clf = tree.DecisionTreeClassifier(criterion="entropy"
    ,random_state=30
    ,splitter='best'
    ,max_depth=3
    ,min_samples_leaf=10
    ,min_samples_split=10
    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest) #返回预测的准确度
     
    score
    
    # 画一棵树
    dot_data = tree.export_graphviz(clf
    ,out_file = None
    ,feature_names= wine.feature_names
    ,class_names=wine.class_names
    ,filled=True
    ,rounded=True
    )
    graph = graphviz.Source(dot_data)
    graph
    
    # 特征重要性
    clf.feature_importances_
    [*zip(feature_name,clf.feature_importances_)]
    
    

    重要属性和接口

    对决策树来说,最重要的是feature_importances_,能 够查看各个特征对模型的重要性。
    四个接口:fit,score,apply,predict

    相关文章

      网友评论

          本文标题:Decision Tree

          本文链接:https://www.haomeiwen.com/subject/xyaefhtx.html