再探决策树算法之利用sklearn进行决策树实战

sklearn模块提供了决策树的解决方案,不用自己去造轮子了(不会造,感觉略复杂):

下面是笔记:

Sklearn.tree参数介绍及使用建议 参数介绍及使用建议
官网: http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html class sklearn.tree.DecisionTreeClassifier(criterion=‘gini‘, splitter=‘best‘, max_depth=None, min_samples_split=2,min_samples_leaf=1, max_features=None, random_state=None, min_density=None, compute_importances=None,max_leaf_nodes=None)
比较重要的参数:
criterion :规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”。
max_depth :限定了决策树的最大深度,对于防止过拟合非常有用。
min_samples_leaf :限定了叶子节点包含的最小样本数,这个属性对于防止上文讲到的数据碎片问题很有作用
模块中一些重要的属性方法:
n_classes_ :决策树中的类数量。
classes_ :返回决策树中的所有种类标签。
feature_importances_ :feature的重要性,值越大那么越重要。
fit(X, y, sample_mask=None, X_argsorted=None, check_input=True, sample_weight=None) 将数据集x,和标签集y送入分类器进行训练,这里要注意一个参数是:sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。
get_params(deep=True) 得到决策树的各个参数。
set_params(**params) 调整决策树的各个参数。
predict(X) 送入样本X,得到决策树的预测。可以同时送入多个样本。
transform(X, threshold=None) 返回X的较重要的一些feature,相当于裁剪数据。
score(X, y, sample_weight=None) 返回在数据集X,y上的测试分数,正确率。
使用建议
1. 当我们数据中的feature较多时,一定要有足够的数据量来支撑我们的算法,不然的话很容易overfitting
2. PCA是一种避免高维数据overfitting的办法。
3. 从一棵较小的树开始探索,用export方法打印出来看看。
4. 善用max_depth参数,缓慢的增加并测试模型,找出最好的那个depth。
5. 善用min_samples_split和min_samples_leaf参数来控制叶子节点的样本数量,防止overfitting。
6. 平衡训练数据中的各个种类的数据,防止一个种类的数据dominate。

后面开始实战:

#-*-coding:utf-8 -*-
from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split
import numpy as np

#读取数据
data=[]
labels=[]
#根据text里的数据格式将数据写到list里
with open(‘C:\Users\cchen\Desktop\sample.txt‘,‘r‘) as f:
    for line in f:
        linelist=line.split(‘ ‘)
        data.append([float(el) for el in linelist[:-1]])
        labels.append(linelist[-1].strip())
# print data
# [[1.5, 50.0], [1.5, 60.0], [1.6, 40.0], [1.6, 60.0], [1.7, 60.0], [1.7, 80.0], [1.8, 60.0], [1.8, 90.0], [1.9, 70.0], [1.9, 80.0]]
# print labels
x=np.array(data)
labels=np.array(labels)
# print labels
# [‘thin‘ ‘fat‘ ‘thin‘ ‘fat‘ ‘thin‘ ‘fat‘ ‘thin‘ ‘fat‘ ‘thin‘ ‘fat‘]
y=np.zeros(labels.shape)
# print y
# [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
# print labels==‘fat‘
# [False  True False  True False  True False  True False  True]
# 这个替换的方法很巧妙,可以一学,利用布尔值来给list赋值。要是我的话就要写个循环了。
y[labels==‘fat‘]=1
# print y
# [ 0.  1.  0.  1.  0.  1.  0.  1.  0.  1.]
#拆分训练数据和测试数据,把20%的当做测试数据,其实我感觉直接分片就可以的,不过这样比较高大上一点
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
#使用信息熵作为划分标准,对决策树进行训练
clf=tree.DecisionTreeClassifier(criterion=‘entropy‘)
# print clf
# DecisionTreeClassifier(class_weight=None, criterion=‘entropy‘, max_depth=None,
#             max_features=None, max_leaf_nodes=None,
#             min_impurity_split=1e-07, min_samples_leaf=1,
#             min_samples_split=2, min_weight_fraction_leaf=0.0,
#             presort=False, random_state=None, splitter=‘best‘)
clf.fit(x_train,y_train)
#把决策树写入文件
with open(r‘C:\Users\cchen\Desktop\tree.dot‘,‘w+‘) as f:
    f=tree.export_graphviz(clf,out_file=f)
# digraph Tree {
# node [shape=box] ;
# 0 [label="X[1] <= 70.0\nentropy = 0.9544\nsamples = 8\nvalue = [3, 5]"] ;
# 1 [label="X[0] <= 1.65\nentropy = 0.971\nsamples = 5\nvalue = [3, 2]"] ;
# 0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
# 2 [label="X[1] <= 55.0\nentropy = 0.9183\nsamples = 3\nvalue = [1, 2]"] ;
# 1 -> 2 ;
# 3 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;
# 2 -> 3 ;
# 4 [label="entropy = 0.0\nsamples = 2\nvalue = [0, 2]"] ;
# 2 -> 4 ;
# 5 [label="entropy = 0.0\nsamples = 2\nvalue = [2, 0]"] ;
# 1 -> 5 ;
# 6 [label="entropy = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
# 0 -> 6 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
# }
#系数反应每个特征值的影响力
# print clf.feature_importances_
# [ 0.3608012  0.6391988],可以看到身高系数影响较大
#测试结果打印
anwser=clf.predict(x_train)
# print x_train
print anwser
# [ 1.  0.  1.  0.  1.  0.  1.  0.]
print y_train
# [ 1.  0.  1.  0.  1.  0.  1.  0.]
print np.mean(anwser==y_train)
# 1.0 很准,毕竟用的是训练的数据
#让我们用测试的数据来看看
anwser=clf.predict(x_test)
print anwser
# [ 0.  0.]
print y_test
# [ 0.  0.]
print np.mean(anwser==y_test)
# 1.0 也很准
#这个是教程里的注释,我没碰到
#准确率与召回率 #准确率:某个类别在测试结果中被正确测试的比率 #召回率:某个类别在真实结果中被正确预测的比率 #测试结果:array([ 0., 1., 0., 1., 0., 1., 0., 1., 0., 0.]) #真实结果:array([ 0., 1., 0., 1., 0., 1., 0., 1., 0., 1.]) #分为thin的准确率为0.83。是因为分类器分出了6个thin,其中正确的有5个,因此分为thin的准确率为5/6=0.83。 #分为thin的召回率为1.00。是因为数据集中共有5个thin,而分类器把他们都分对了(虽然把一个fat分成了thin!),召回率5/5=1。 #分为fat的准确率为1.00。不再赘述。 #分为fat的召回率为0.80。是因为数据集中共有5个fat,而分类器只分出了4个(把一个fat分成了thin!),召回率4/5=0.80。 #本例中,目标是尽可能保证找出来的胖子是真胖子(准确率),还是保证尽可能找到更多的胖子(召回率)。
precision,recall,thresholds=precision_recall_curve(y_train,clf.predict(x_train))
print precision,recall,thresholds
# [ 1.  1.] [ 1.  0.] [ 1.]
anwser=clf.predict_proba(x)[:,1]
print classification_report(y,anwser,target_names=[‘thin‘,‘fat‘])
#              precision    recall  f1-score   support

       # thin       1.00      1.00      1.00         5
       #  fat       1.00      1.00      1.00         5
#
#  avg / total       1.00      1.00      1.00        10
时间: 2024-10-19 10:32:55

再探决策树算法之利用sklearn进行决策树实战的相关文章

决策树算法原理及实现

(一)认识决策树 1.决策树分类原理 决策树是通过一系列规则对数据进行分类的过程.它提供一种在什么条件下会得到什么值的类似规则的方法.决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树. 近来的调查表明决策树也是最经常使用的数据挖掘算法,它的概念非常简单.决策树算法之所以如此流行,一个很重要的原因就是使用者基本上不用了解机器学习算法,也不用深究它是如何工作的.直观看上去,决策树分类器就像判断模块和终止块组成的流程图,终止块表示分类结果(也就是树的叶子).判断模块表示

决策树算法原理

转载于:http://www.cnblogs.com/pinard/p/6050306.html (楼主总结的很好,就拿来主义了,不顾以后还是多像楼主学习) 决策树算法在机器学习中算是很经典的一个算法系列了.它既可以作为分类算法,也可以作为回归算法,同时也特别适合集成学习比如随机森林.本文就对决策树算法原理做一个总结,上篇对ID3, C4.5的算法思想做了总结,下篇重点对CART算法做一个详细的介绍.选择CART做重点介绍的原因是scikit-learn使用了优化版的CART算法作为其决策树算法

决策树算法(一)——一些重要的数学概念

写在前面的话 趁着现在我还是高中数理化老师,偶尔兼职英语老师的时候赶紧抓紧时间写点有关计算机科学技术的东西.一来是表示我对计算机的热爱,二来,当然是最重要的咯,满足一下我强大的虚荣心.哈哈哈哈!想想高中数学物理化学老师在折腾计算机,是不是有种瞬间吊炸天的感觉. 这个系列我写了一个月了,之后会陆陆续续的放出来的.希望对大家有一点点帮助.如果您没有看懂我在写啥,那一定是我错了,讲的不够清楚.世界上没有什么知识点是难的,只是看你知识储备和理解力达到了相应的水平没有.至少我是这么认为的. 当然,您要是觉

决策树算法(二)

在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归等.对于这些问题, CART算法大部分做了改进.CART算法也就是我们下面的重点了.由于CART算法可以做回归,也可以做分类,我们分别加以介绍,先从CART分类树算法开始,重点比较和C4.5算法的不同点.接着介绍CART回归树算法,重点介绍和CART分类树的不同点.然后我们讨论CA

决策树算法原理(下)

1. CART分类树算法的最优特征选择方法 2. CART分类树算法对于连续特征和离散特征处理的改进 3. CART分类树建立算法的具体流程 4. CART回归树建立算法 5. CART树算法的剪枝 6. CART算法小结 7. 决策树算法小结 在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归等.对于这些问题, CART算法大部

机器学习回顾篇(8):CART决策树算法

注:本系列所有博客将持续更新并发布在github和gitee上,您可以通过github.gitee下载本系列所有文章笔记文件. 1 引言 上一篇博客中介绍了ID3和C4.5两种决策树算法,这两种决策树都只能用于分类问题,而本文要说的CART(classification and regression tree)决策树不仅能用于分类问题,也能用于回归问题. 与ID3算法和C4.5算法相比,CART 还有个特性就是其所有非叶子结点都只有两个子树,也就是说在根据特征属性分裂数据集时,无论该特征属性有多

sklearn实现决策树算法

1.决策树算法是一种非参数的决策算法,它根据数据的不同特征进行多层次的分类和判断,最终决策出所需要预测的结果.它既可以解决分类算法,也可以解决回归问题,具有很好的解释能力.另外,对于决策树的构建方法具有多种出发点,它具有多种构建方式,如何构建决策树的出发点主要在于决策树每一个决策点上需要在哪些维度上进行划分以及在这些维度的哪些阈值节点做划分等细节问题. 具体在sklearn中调用决策树算法解决分类问题和回归问题的程序代码如下所示: #1-1导入基础训练数据集import numpy as npi

【sklearn决策树算法】DecisionTreeClassifier(API)的使用以及决策树代码实例 - 莺尾花分类

决策树算法 决策树算法主要有ID3, C4.5, CART这三种.(在西瓜书中有详细介绍) \(scikit-learn\)提供的\(DecisionTreeClassifier\)类可以做多分类任务. 和其他分类器一样,\(DecisionTreeClassifier\)需要两个数组作为输入: X: 训练数据,稀疏或稠密矩阵,大小为\([n_samples, n_features]\) Y: 类别标签,整型数组,大小为\([n_samples]\) 参考文档 scikit-learn 1.10

scikit-learn决策树算法类库使用小结

参考:http://www.cnblogs.com/pinard/p/6056319.html 之前对决策树的算法原理做了总结,包括决策树算法原理(上)和决策树算法原理(下).今天就从实践的角度来介绍决策树算法,主要是讲解使用scikit-learn来跑决策树算法,结果的可视化以及一些参数调参的关键点. 1. scikit-learn决策树算法类库介绍 scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归.分类决策树的类对应的是Decision