十大机器学习算法-CART

CART(Classification and Regression Tree)是一种用于决策树的机器学习算法,采用基尼指数作为划分标准。CART生成过程包括递归地构建二叉决策树,分为回归树和分类树的生成,以及后期的剪枝优化。在回归问题中,CART基于平方误差最小化准则;在分类问题中,它通过最小化基尼指数来选择特征。剪枝过程使用验证数据集来选择最优子树。
摘要由CSDN通过智能技术生成

简介

CART(分类与回归树)是决策树算法的一种。此外,常见的决策树算法还有ID3,C4.5,这三者的不同之处在于特征的划分:

  • ID3:特征划分基于信息增益
  • C4.5:特征划分基于信息增益比
  • CART:特征划分基于基尼指数

基本思想

CART假设决策树是二叉树,内部结点特征的取值为“”和“”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布

CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
  2. 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。

CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。对回归树平方误差最小化准则;对分类树而言,CART用Gini指数最小化准则来进行特征选择,生成二叉树。

回归树的生成

最小二乘回归树生成算法:

输入:训练数据集D

输出:回归树 f ( x ) f(x) f(x)

在训练数据集所在的输入空间中,递归地将每个区域区分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。

(1)选择最优切分变量j(第j个变量 x ( j ) x^{(j)} x(j))与切分点s( x ( j ) x^{(j)} x(j)的取值),求解
m i n j , s ⟮ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 1 ( j , s ) ( y i − c 2 ) 2 ⟯ \mathop{\rm min}\limits_{j,s} \lgroup \mathop{\rm min}\limits_{c_1} \sum\limits_{x_i \in R_1(j,s)} (y_i - c_1)^2 + \mathop{\rm min}\limits_{c_2} \sum\limits_{x_i \in R_1(j,s)} (y_i - c_2)^2 \rgroup j,sminc1minxiR1(j,s)(yic1)2+c2minxiR1(j,s)(yic2)2
遍历变量j,对固定的切分变量j扫描切分点s(如等间隔扫描),选择使上式达到最小值的对(j,s)。

(2)用选定的对(j,s)划分区域并决定相应的输出值 c ^ m \hat{c}_m c^m(落在该区域的实例对应的输出 y i y_i yi 的均值)
R 1 ( j , s ) = { x ∣ x j ≤ s } ,   R 2 ( j , s ) = { x ∣ x j > s } c ^ m = 1 N m ∑ x i ∈ R m ( j , s ) y i ,    x ∈ R m , m = 1 , 2 R_1(j,s) = \{x|x^{j} \le s\}, \ R_2(j,s) = \{x|x^{j} > s\} \\ \hat{c}_m = \frac{1}{N_m} \sum\limits_{x_i \in R_m(j,s)} y_i, \ \ x \in R_m, m=1,2 R1(j,s)={xxjs}, R2(j,s)={xxj>s}c^m=Nm1xiRmj,s)yi,  xRm,m=1,2
(3)继续对两个子区域调用步骤(1)(2),直到满足停止条件

(4)将输入空间划分为M个区域 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,生成决策树

分类树的生成

分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。

基尼指数Gini Index

基尼指数表示集合的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。

分类问题中,假设有K个类,样本点属于第k类的概率为 p k p_k pk,则概率分布的基尼指数定义为
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 {\rm Gini}(p) = \sum_{k=1}^{K} p_k(1-p_k) = 1-\sum_{k=1}^{K} p_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
所以对于给定样本集合D,基尼指数为
G i n i ( D ) = 1 − ∑ k = 1 K ⟮ ∣ C k ∣ ∣ D ∣ ⟯ 2 {\rm Gini}(D) = 1-\sum_{k=1}^{K} \lgroup \frac{|C_k|}{|D|} \rgroup ^2 Gini(D)=1k=1KDCk2
如果按集合D根据特征A的某一可能值a被分割成D1和D2两部分,则在特征A的条件下,集合D的基尼指数定义为
G i n i ( D ∣ A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) {\rm Gini}(D|A) = \frac{|D_1|}{|D|}{\rm Gini(D_1)} + \frac{|D_2|}{|D|}{\rm Gini(D_2)} Gini(DA)=DD1Gini(D1)+DD2Gini(D2)

CART分类树生成算法如下:

输入:训练数据集D,停止计算的条件:
输出:CART决策树。

根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:

(1)设结点的训练数据集为D,计算现有特征对该数据集的Gini系数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或 “否”将D分割成D1和D2两部分,计算A=a时的Gini系数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择Gini系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用步骤(1)~(2),直至满足停止条件。

(4)生成CART决策树

算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。

CART剪枝

CART剪枝算法从“完全生长”的决策树底端剪去一些子树,简化模型,分为两个步骤:

(1)从生成算法产生的决策树T0底端开始不断剪枝,知道T0的根节点,形成一个子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn

(2)通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。

代码

这里使用sklearn的实现方法

# encoding=utf-8

import pandas as pd
import time

from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score

from sklearn.tree import DecisionTreeClassifier



if __name__ == '__main__':

    print("Start read data...")
    time_1 = time.time()

    raw_data = pd.read_csv('../data/train.csv', header=0) 
    data = raw_data.values

    features = data[::, 1::]
    labels = data[::, 0]

    # 随机选取33%数据作为测试集,剩余为训练集
    train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)

    time_2 = time.time()
    print('read data cost %f seconds' % (time_2 - time_1))


    print('Start training...') 
    # criterion可选‘gini’, ‘entropy’,默认为gini(对应CART算法),entropy为信息增益(对应ID3算法)
    clf = DecisionTreeClassifier(criterion='gini') 
    clf.fit(train_features,train_labels)
    time_3 = time.time()
    print('training cost %f seconds' % (time_3 - time_2))


    print('Start predicting...')
    test_predict = clf.predict(test_features)
    time_4 = time.time()
    print('predicting cost %f seconds' % (time_4 - time_3))


    score = accuracy_score(test_labels, test_predict)
	print("The accruacy score is %f" % score)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值