[sklearn] 1 分类决策树

1.Classification

1.1 决策树用于多分类问题:from sklearn.tree import DecisionTreeClasssifier

DecisionTreeClasssifier接收两个参数,分别是训练样本矩阵X(可以是稀疏矩阵或者稠密矩阵),和标签集Y;
训练样本集:

clf=tree.DecisionTreeClasssifier()
# 训练
clf=clf.fit(X,Y)
# 预测
clf.predict([[2.0,2.0]])
1.2 predict_proba方法

注意:还有一个predict_proba方法
----> 该方法可以得到每个样本属于不同类别的概率。
https://blog.csdn.net/xiongchengluo1129/article/details/80227724
该链接上出现的问题是,预测样本属于不同类别的概率是0或者1,没有别的情况,按照正常情况看,应该会出现0.2,0.3等不同的概率值。
导致出现这种问题的原因是:过拟合,应该是在按照数据集训练决策树时并没有做限制,(如min_samples_leaf,max_depth等),导致这棵树是“完全生长”的,到最后每个叶子节点上所有样本是属于同一类别的,基尼系数为0。
所以,测试样本分到每个叶子节点上,只会属于某个确定的类别,对应类别的概率就是1,别的概率都是0。
解决办法:设置 min_samples_leaf为10时,如果子数据集中样本数小于这个值10,那么该叶节点和其他兄弟节点都会被剪枝。

image.png

会发现最后的叶子节点,例如第二个叶子节点,14个样本,有10个属于第二类,有4个属于第三类,那么落在该叶子节点的测试样本的predict_proba的值为[0.0,5/7,2/7]。

1.3 画出具体的决策树

from sklearn import tree
tree.plot_tree( clf.fit(X,Y) )
我们还可以以Graphviz的方式导出决策树图,如

    model = Pipeline(
        [
            ('ss', StandardScaler()),  # 标转化操作,将数据标准化到0附近,每一列数据的均值为0 且方差为1
            ('DTC', DecisionTreeClassifier(criterion='entropy', max_depth=3))  # DecisionTreeClassifier  决策树分类
        ]
    )
    model = model.fit(x_train, y_train)  # 训练数据
    y_test_hat = model.predict(x_test)  # 测试数据
    dot_data = tree.export_graphviz(model.get_params('DTC')['DTC'], out_file=None)  
    # tree.export_graphviz????  model.get_params("DTC")得到二元Tuple,
    # 当out_file的值为None时,可以利用pydotplus进行可视化
    graph = pydotplus.graph_from_dot_data(dot_data)
    graph.write_pdf("iris.pdf")

官网示例:


image.png

示例代码:

import graphviz 
dot_data = tree.export_graphviz(clf, out_file=None) 
graph = graphviz.Source(dot_data) 
graph.render("iris")
1.4 DecisionTreeClassifier的参数

<1> criterion:特征选择的标准,有信息增益和基尼系数两种,使用信息增益的是ID3和C4.5算法(使用信息增益比),使用基尼系数的CART算法,默认是gini系数。对应值为"gini"和"entropy"
<2> splitter:特征切分点选择标准,决策树是递归地选择最优切分点(从特征集合中挨个计算选择最优),splitter是用来指明在哪个集合上来递归,有“best”和“random”两种参数可以选择,best表示在所有特征上递归,适用于数据集较小的时候,random表示随机选择一部分特征进行递归,适用于数据集较大的时候。
<3> max_depth:决策树的最大深度,决策树模型先对所有数据集进行切分,再在子数据集上继续循环这个切分过程,max_depth可以理解成用来限制这个循环次数。
<4> min_samples_split:子数据集再切分需要的最小样本量,默认是2,如果子数据样本量小于2时,则不再进行下一步切分。如果数据量较小,使用默认值就可,如果数据量较大,为降低计算量,应该把这个值增大,即限制子数据集的切分次数。
<5> min_samples_leaf:叶节点(子数据集)最小样本数,如果子数据集中的样本数小于这个值,那么该叶节点和其兄弟节点都会被剪枝(去掉),该值默认为1
<6> min_weight_fraction_leaf:在叶节点处的所有输入样本权重总和的最小加权分数,如果不输入则表示所有的叶节点的权重是一致的。
<7> max_features:特征切分时考虑的最大特征数量,默认是对所有特征进行切分,也可以传入int类型的值,表示具体的特征个数;也可以是浮点数,则表示特征个数的百分比;还可以是sqrt,表示总特征数的平方根;也可以是log2,表示总特征数的log个特征
<8> max_leaf_nodes:最大叶节点个数,即数据集切分成子数据集的最大个数。
<9> min_impurity_decrease:切分点不纯度最小减少程度,如果某个结点的不纯度减少小于这个值,那么该切分点就会被移除。
<10> min_impurity_split:切分点最小不纯度,用来限制数据集的继续切分(决策树的生成),如果某个节点的不纯度(可以理解为分类错误率)小于这个阈值,那么该点的数据将不再进行切分。
<11> class_weight:权重设置,主要是用于处理不平衡样本,与LR模型中的参数一致,可以自定义类别权重,也可以直接使用balanced参数值进行不平衡样本处理
<12> presort:是否进行预排序,默认是False,所谓预排序就是提前对特征进行排序,我们知道,决策树分割数据集的依据是,优先按照信息增益/基尼系数大的特征来进行分割的,涉及的大小就需要比较,如果不进行预排序,则会在每次分割的时候需要重新把所有特征进行计算比较一次,如果进行了预排序以后,则每次分割的时候,只需要拿排名靠前的特征就可以了。

1.5 DecisionTreeClassifier的对象/属性

<1> clf.classes_:分类模型的类别
array([0, 1, 2]) #表示0,1,2类别
<2> feature_importances_:特征重要性,以列表的形式输出每个特征的重要性
<3> max_features_:最大特征数
<4> n_classes_:类别数,与classes_对应,classes_输出具体的类别
<5> n_features_:特征数,当数据量小时,一般max_features和n_features_相等
<6> n_outputs_:输出结果数
<7> tree_:输出整个决策树,用于生成决策树的可视化

1.6 DecisionTreeClassifier的方法

<1> decision_path(X):返回X的决策路径
<2> fit(X, y):在数据集(X,y)上使用决策树模型
<3> get_params([deep]):获取模型的参数
<4> predict(X):预测数据值X的标签
<5> predict_log_proba(X):返回每个类别的概率值的对数
<6> predict_proba(X):返回每个类别的概率值(有几类就返回几列值)
<7> score(X,y):返回给定测试集和对应标签的平均准确率

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • sklearn、XGBoost、LightGBM的文档阅读小记 文章导航 目录 1.sklearn集成方法 1.1...
    nightwish夜愿阅读 12,589评论 1 49
  • 决策树理论在决策树理论中,有这样一句话,“用较少的东西,照样可以做很好的事情。越是小的决策树,越优于大的决策树”。...
    制杖灶灶阅读 5,829评论 0 25
  • 概念 决策树(Decision Tree)分为两大类,回归树(Regression Decision Tree)和...
    HRain阅读 5,459评论 1 30
  • 一. 决策树(decision tree):是一种基本的分类与回归方法,此处主要讨论分类的决策树。在分类问题中,表...
    YCzhao阅读 2,121评论 0 2
  • 清晨伴着微风 天上点点乌云 阳光打在身上留给大地一个没有五官的影子 像L一样 看着不痛不痒疑似端庄 实则痛心断肠...
    宵夜窝窝头阅读 281评论 0 1