天天看点

sklearn实现决策树决策树

决策树

         决策树是一种用于分类和回归的非参数监督学习方法。目标是通过学习从数据特征推断出的简单决策规则,创建一个预测目标变量值的模型。

    决策树的优点:

         1)易于理解和解释。树木可以被可视化;

         2)只需要很少的数据准备,数据可以不规范化,但是需要注意的是,决策树不能有丢失的值;

         3)使用该树的花费是用于训练树的数据点个数的对数。

         4)能够处理多输出问题。

         5)使用白盒模型。如果给定的情况在模型中是可观察到的,那么对这种情况的解释很容易用布尔逻辑来解释。相比之下,在黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。

         6)可以使用统计测试来验证模型。

   决策树的缺点:

         1)容易过拟合。为了避免这个问题,可以进行树的剪枝、或在叶节点上设置所需的最小样本数量或设置树的最大深度。

         2)决策树是不稳定的,数据中的微小变化可能会导致生成完全不同的树。在集成中使用决策树可以缓解这个问题。

         3)有些概念很难学,因为决策树不容易表达它们,例如异或奇偶性或多路复用问题。

         4)如果某些类别占主导地位,决策树学习器就会创建有偏见的树。因此,建议在与决策树匹配之前平衡数据集。

使用sklearn实现决策树

sklearn实现决策树的核心代码:

#1)sklearn实现二分类
from sklearn import tree
X=[[0,0],[1,1]]
Y=[0,1]
clf=tree.DecisionTreeClassifier()
clf=clf.fit(X,Y)
print(clf.predict([[2,2]]))#预测属于哪个类
print(clf.predict_proba([[2,2]]))#预测属于每个类的概率

#2)sklearn实现多分类
from sklearn.datasets import load_iris
from sklearn import tree

iris=load_iris()
clf=tree.DecisionTreeClassifier()
clf=clf.fit(iris.data,iris.target)

#3)sklearn实现树回归
#注意:回归的时候y的值应该是浮点数,而不是整数值
from sklearn import tree
X=[[0,0],[2,2]]
y=[0.5,0.5]
clf=tree.DecisionTreeRegressor()
clf=clf.fit(X,y)
print(clf.predict([[1,1]]))
           

Sklearn实现决策树详解

Sklearn实现了以下四种类型的树

     1)tree.DecisionTreeClassifier([criterion, …])      决策树分类器.

     2)tree.DecisionTreeRegressor([criterion, …])     回归树.

     3)tree.ExtraTreeClassifier([criterion, …])           一种非常随机的树分类器.

     4)tree.ExtraTreeRegressor([criterion, …])         一种非常随机的树回归器.

     tree.export_graphviz(decision_tree[, …])             以点的格式导出树

--------------------1) sklearn.tree.DecisionTreeClassifier----------------------------------

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’,  splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

参数:

    criterion:字符型,可选,规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”,默认为'gini',

    splitter:  字符型,可选(默认="best")用于在每个节点选择分割的策略,可填‘best'或'random',前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random"

    max_depth: int型或None,可选(默认=None)树的最大深度,对于防止过拟合非常有用。如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

    min_samples_split: int型float型,可选(默认值=2)分割内部节点所需的最小样本数量;如果是int型,则min_samples_split为最小样本数量。如果是float型,则min_samples_split是分数,ceil(min_samples_split * n_samples)是每个分割的最小样本数。

    min_samples_leaf:  int型float型,可选(默认值=1)叶节点上所需的最小样本数。如果是int类型,则将min_samples_leaf作为最小值。若是float,那么min_samples_leaf是分数,ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。

    min_weight_fraction_leaf:浮点型,可选(默认=0)。叶节点上(所有输入样本的)权值之和的最小加权分数。当没有提供     sample_weight时,样品的重量相等。

    max_features: int, float, string or None, 可选(默认=None),在寻找最佳分割时需要考虑的特性数量;如果是int类型,则考虑每个分割处的max_features特性。如果是float,那么max_features是一个分数,并且在每个分割中都考虑int(max_features * n_features)特性。如果“auto”,则max_features=sqrt(n_features)。如果“sqrt”,则max_features=sqrt(n_features)。如果“log2”,则max_features=log2(n_features)。如果没有,则max_features=n_features。

   class_weight:  指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None"

    random_state: int型RandomState实例或None,可选(默认=None)如果是int, random_state是随机数生成器使用的种子;如果是RandomState实例,random_state是随机数生成器;如果没有,随机数生成器是np.random使用的RandomState实例。

方法:

         apply(X[, check_input])   

         decision_path(X[, check_input])   

         fit(X, y[, sample_weight, check_input, …])

         get_params([deep])

         predict(X[, check_input]) 

         predict_log_proba(X)  

         predict_proba(X[, check_input])   

         score(X, y[, sample_weight])  

         set_params(**params)  

使用建议:

    1. 当我们数据中的feature较多时,一定要有足够的数据量来支撑我们的算法,不然的话很容易overfitting

    2. 如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。

   3. 推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合    情况,然后再决定是否要增加深度。

   4  在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。

 5  决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。

    6  如果输入的样本矩阵是稀疏的,推荐在拟合前调用

csc_matrix

稀疏化,在预测前调用

csr_matrix稀疏化。

举例:

from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.cross_validation import train_test_split
import numpy as np

#读取数据
data=[]
labels=[]
with open('')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)
print(labels)

x=np.array(data)
y=np.array(labels)

#分割训练样本
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
clf=tree.DecisionTreeClassifier(criterion='entropy',splitter='best',max_depth=None,min_samples_split=2,
                                min_samples_leaf=1,min_weight_fraction_leaf=0.0,random_state=None)
clf.fit(x_train,y_train)

#把决策树写入文件
with open(r' ','w+')as f:
    f=tree.export_graphviz(clf,out_file=f)

#系数反映每个特征值的影响力:
print(clf.feature_importances_)

#测试结果打印
anwser=clf.predict(x_test)
print(anwser)

#打印准确率,召回率和阈值
precision,recall,thresholds=precision_recall_curve(y_train,clf.predict(x_train))
print(precision,recall,thresholds)
           

--------------------------sklearn.tree.DecisionTreeRegressor----------------------

参数:

             criterion:可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。

            class_weight:回归树没有该变量

            其它参数和分类树一样

继续阅读