Python之scikit-learn01--决策树

来源:互联网 发布:java运行命令行参数 编辑:程序博客网 时间:2024/05/20 16:33

1.CART决策树

在Python之机器学习01--决策树中介绍了通过ID3算法生成决策树,它使用熵来度量样本集的不确定性。本文将介绍另一种决策树,CART决策树,并使用scikit-learn来
实现算法。分类与回归树(Classfification And Regression TreeCART)模型也是一种决策树模型,它既可用于分类,也可用于回归。分类与回归树模型采用不同的最优化策略,CART回归生成树采用平方误差最小化策略,CART分类生成树则采用基尼指数最小化策略。

1.1 CART回归树

给定训练数据集 。设已经将输入空间划分为 M个单元 ,且在单元Rm上输出值为cm,m=1,2...,M。则回归树模型为:

 

其中,I()为示性函数。

如果给定输入空间的一个划分,回归树在训练数据集上的误差(平方误差)为 。

最佳划分即使得该划分对应的回归树的平方误差在所有划分中最小。

CART回归树算法实现步骤如下。

(1)选择数据集D的最优切分维度j和切分点s。

(2)用选定的(j,s)划分区域并决定相应的输出值。

(3)对子区域R1,R2递归地调用上面两步,直到满足停止条件为止。

(4)将输入空间划分为M个区域R1,R2,...,RM,生成决策树:

通常停止条件为:节点中样本个数小于预定值、样本集的平方误差小于预定值或没有更多的特征。

1.2 CART分类树

假设有K个分类,样本点属于第k类的概率为 。定义概率分布的基尼指数为:

  


对于给定的样本集合D,设属于类 ck的样本子集为Ck ,则基尼指数为:

给定特征A,根据其是否取某一个可能值a,样本集D被分为两个子集:D1和D2,定义


它表示在特征A的条件下,集合D的基尼指数。基尼系数与熵一样,也是用于度量不确定性的。对于样本集D,Gini(D)越小说明样本越属于同一类。

CART分类树算法实现步骤如下。

(1)对每个特征A,以及它可能的每个值a,计算Gini(D,A).

(2)选取最优特征和最优切分点:在所有特征A以及所有的切分点a中,基尼系数最小的A和a就是最优特征和最优切分点。根据最优特征和最优切分点将训练集D切分成两个子节点。

(3)对两个子节点递归调用上面两步,直到满足停止条件为止,

(4)最终生成决策树。

通常停止条件为:节点中样本个数小于预定值、样本集的基尼系数小于预定值或没有更多的特征。

1.3 CART回归树scikit-learn实现

#-*-coding:utf-8-*-import numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.model_selection import train_test_split'''    产生用于回归问题的数据集    :param n: 数据集容量    :return: 返回一个元组,元素依次为:训练样本集、测试样本集、训练样本集对应的值、测试样本集对应的值'''def create_data(n):    np.random.seed(0)    X = 5 * np.random.rand(n, 1)    y = np.sin(X).ravel()    noise_num = (int)(n/5)    y[::5] += 3 * (0.5-np.random.rand(noise_num)) #以5为间隔添加噪音    return train_test_split(X,y,test_size=0.25,random_state=1)'''    测试DecisionTreeRegressor的用法    :param data: 可变参数。它是一个元组,这里要求其元素依次为:训练样本集、测试样本集、训练样本的值、测试样本的值    :return: None'''def tDecisionTreeRegressor(*data):     X_train,X_test,y_train,y_test = data     regr = DecisionTreeRegressor()     regr.fit(X_train,y_train)     print("Training score:%f"%(regr.score(X_train,y_train)))     print("Testing score:%f"%(regr.score(X_test,y_test)))     ##绘图     fig = plt.figure()     ax = fig.add_subplot(1,1,1)     X = np.arange(0.0,5.0,0.01)[:, np.newaxis]     Y = regr.predict(X)     ax.scatter(X_train,y_train,label="train sample",c='g')     ax.scatter(X_test, y_test, label="test sample", c='r')     ax.plot(X,Y,label="predict_value",linewidth=2,alpha=0.5)     ax.set_xlabel("data")     ax.set_xlabel("target")     ax.set_title(" Decision Tree Regressor")     ax.legend(framealpha=0.5)     plt.show()if __name__ == '__main__':    X_train,X_test,y_train,y_test = create_data(100)    tDecisionTreeRegressor(X_train,X_test,y_train,y_test)



参考:Python大战机器学习





原创粉丝点击