决策树的使用

2 篇文章 0 订阅
1 篇文章 0 订阅

决策树的使用

决策树是一种基于数据训练的机器学习方法,根据训练数据和训练特征集,找到特征集与数据类别的关联,生成if-else型的判断条件树。决策树具有训练简单、结果易于解读的优点,是一种非常常见的机器学习训练方法。以下应该用python中的机器学习库scikit-learn使用决策树的基本方法。

决策树基本用法

决策树创建
from sklearn.tree import DecisionTreeClassifier

# 决策树中可以传入三个预剪枝策略参数,防止过拟合
# max_depth 树的最大深度
# max_leaf_nodes 树的最大节点数
# max_min_samples_leaf 树的节点最小样本数量
tree = DescisionTreeClassifier(random_state=0)
# 输入数据进行训练
tree = tree.fit(x_train, y_train)

# 验证模型准确度
print "score: %s" % str(tree.score(x_test, y_test))
决策树相关参数查询
from sklearn.tree import export_graphviz
import graphviz

# 将树保存为.dot形式的文本文件
# impurity参数表示显示节点的纯净程度
# filled参数表示图形是否需要填色
# node_ids参数表示是否显示节点编号(在调查case路径时非常有用)
export_graphviz(tree, out_file="tree.dot", class_name=["class1", "class2"], feature_names=feature_names, impurity=True, filled=True, node_ids=True)

# 以图片形式显示决策树
with open("tree.dot") as f:
    dot_graph = f.read()
pic = graphviz.Source(dot_graph)
pic.view()

# 输出特征重要性
# sum(tree.feature_importances) == 1
print tree.feature_importances_

对决策树的结果绘制图形时,也可以直接使用graphviz包的工具进行,命令行输入下述命令:

$ dot -Tpng sample.dot -o sample.png
$ dot -Tpdf sample.dot -o sample.pdf
决策树模型的保存、加载和使用
from sklearn.externals import joblib

# 模型保存
joblib.dump(tree, "tree_model.m")

# 模型加载
tree = joblib.load("tree_model.m")

# 模型使用
y_list = tree.predict(x_list)

决策树参数调优

计算模型的精确度、召回率

使用下述函数可以直接计算模型的准召率

>>> from sklearn.metrics import classification_report
>>> print classification_report(y_ture, y_pred)
              precision    recall  f1-score   support

           0       0.98      1.00      0.99     40807
           1       0.98      0.77      0.86      3606

   micro avg       0.98      0.98      0.98     44413
   macro avg       0.98      0.88      0.92     44413
weighted avg       0.98      0.98      0.98     44413
决策树提高精确度

在某些时候,我们需要保证决策树对某一类别的数据的查准率,可以使用剪枝、并且提高查找到该值的阈值的方法来提升。
(以二分类问题提高正样本的查准率为例)

# 假设这棵树已经是充分剪枝的
tree = joblib.load("tree_model.m")
y_proba_list = tree.predict_proba(X)
y_pred = [1 if y_proba[1] > threshold else 0 for y_proba in y_proba_list]
case调查方法

在进行决策树模型参数调整时,我们有时候需要调查一些bad case为什么会被判别错误,这时我们需要知道这个bad case最终是由哪个叶子节点判断错误的,以及这个叶子节点中包含哪些训练样本。sklearn提供了一个查询样本经过的叶子路径的函数,可以帮助我们完成这个功能。

>>> from sklearn.externals import joblib

# 加载决策树模型
>>> tree = joblib.load("tree.m")
# 加载数据
>>> X, y = load_X_y()
# 获得路径矩阵
>>> data_path_matrix = tree.decision_path(X)
>>> print data_path
(0, 1) 1
(0, 3) 1
...
# 上述矩阵是一个系数矩阵,矩阵的行表示第几个数据,矩阵的列表示第几个叶子节点,1表示数据经过该叶子节点,0表示数据不经过该叶子节点。

随机森林

决策树存在一个容易过拟合的缺点,尽管可以使用预剪枝的方法提高模型的泛化性能,但是这种方法需要比较多的调参技巧。在对模型的白盒程度没有那么高要求的前提下,可以使用随机森林来提高泛化性能。

>>> from sklearn.ensemble import RandomForestClassifer

# 随机森林模型不需要像决策树一样设置剪枝参数,它需要设置如下两个参数
# n_estimator 参数表示使用的树的个数
# max_features 参数表示每次分裂所使用的特征个数,该参数越大,森林中的树越相似,否则越不相似
>>> forest = RandomForestClassifier(n_estimator=5, max_features=5, random_state=42)
>>> forest.fix(X, y)
>>> y_pre = forest.predict(X_test)

梯度提升回归树

另一种提高模型泛化性能的方法是使用梯度提升回归树,通过纠正前一颗树的错误来提高树的泛化程度。

>>> from sklearn.ensemble import GradientBoostingClassifier
# 梯度提升回归树除了需要像决策树模型一样设置剪枝参数以外(一般讲树的深度设置的很小),还需要设置两个参数
# e_estimators 与上述一致
# learn_rate 参数表示树的学习速率
>>> gbrt = GrandientBoostingClassifier(e_estimators=100, learn_rate=0.1, random_state=0) 
>>> gbrt.fix(X, y)
>>> y_pre = gbrt.predict(X_test)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值