【sklearn学习】决策树、分类树、剪枝策略

模块sklarn.tree

sklearn中决策树的类都在“tree”这个模块之下,这个模块总共包含五个类:

tree.DecisionTreeClassifier分类树
tree.DecisionTreeRegressor回归树
tree.export_graphviz将生成的决策树导出为DOT格式
tree.ExtraTreeClassifier高随机版本的分类树
tree.ExtraTreeRegressor高随机版本的回归树

分类树对应的代码

from sklearn import tree

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

DecisionTreeClassifier

重要参数

criterion

不纯度越低,决策树对训练集的拟合越好

树中的每个节点都会有一个不纯度,子节点的不纯度一定小于父节点的不纯度

entropy 信息熵

gini 基尼系数

信息熵对不纯度更加敏感,对不纯度的惩罚最强,但在实际应用中,两者效果基本相同。

criterion如何影响模型?

确定不纯度的计算方法,找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好。

决策树的基本流程:

  1. 计算全部特征的不纯度指标
  2. 选取不纯度指标最优的特征来分枝
  3. 在第一个特征的分枝下,计算全部特征的不纯度指标
  4. 选取不纯度指标最优的特征继续分枝

导入需要的算法库和模块

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target),axis=1])
Xtrain, Xtest, ytrain, ytest = train_test_split(wine.data,wine.target,test_size=0.3)

clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=1,splitter="random")
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest, ytest)

import graphviz

dot_data = tree.export_graphviz(clf, out_file=None, 
                     feature_names=wine.feature_names,  
                     class_names=wine.target_names,  
                     filled=True, # 填充颜色,表示特定的某个类别
                     rounded=True,  # 圆角框
                     special_characters=True)  
graph = graphviz.Source(dot_data)  
graph 
clf.feature_importances_
[*zip(wine.feature_name,clf.feature_importances_)]

random:高纬度时随机性会表现更明显,低维度的数据,随机性几乎不会显现

splitter=“random"(默认best):分枝时会更加随机,树会更深,对训练集的拟合将会降低。

为了让决策树有更好的泛化性,需要对决策树进行剪枝。

  • max_depth

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

  • min_sample_leaf

min_samples_leaf限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则,分枝就不会发生,或者按照每个子节点包含min_samples_leaf个样本去分。

  • min_sample_split

min_samples_splits限定一个节点必须包含至少min_samples_splits个训练样本,这个节点才被允许分枝,否则,分枝就不会发生。

  • max_features

限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃

  • min_impurity_decrease

限制信息增益的大小,信息增益小于设定数值的分枝不会发生

确定最优的剪枝参数

import matplotlib.pyplot as plt
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth = i + 1)
    clf = clf.fit(Xtrain, ytrain)
    score = clf.score(Xtest, ytest)
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

目标权重参数

  • class_weight

完成样本标签平衡的参数,给少量的标签更多的权重,模型向偏向少数类的方向建模

  • min_weight_fraction_leaf

基于权重的剪枝参数,用基于权重的预修剪标准优化树结构,确保叶节点至少包含样本权重的总和的一小部分。

重要属性和接口

# apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)

# predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值