决策树(DecisionTree)及python实现(sklearn)

决策树(DecisionTree)是一类常见的机器学习方法,监督学习方法,非参数分类器。

决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的分而治之策略。

决策树学习的关键是如何选择最优划分属性。我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度越来越高。

度量样本纯度的指标

(1).信息熵(information entropy)Ent(D)=-\sum_{k=1}^{|y|}p_{k}log_{2}p_{k}  ,Ent(D)的值越小,则D的纯度越高。

(2).基尼指数(Gini index)Gini(D)=\sum_{k=1}^{|y|}\sum_{k'\neq k}p_{k}p_{k'}=1-\sum_{k=1}^{|y|}p_{k}^{2}  ,Gini(D)反映了从数据D中随机抽取两个样本,其类别不一致的概率,Gini(D)越小,数据集D的纯度越高。

 

决策树学习算法的著名代表:ID3、C4.5、CART

 

决策树(DT)python实现举例(sklearn):

sklearn中已经实现了DT算法,其模型函数是DecisionTreeClassifier()

函数及参数说明:

#函数中的参数值皆为默认值
sklearn.tree.DecisionTreeClassifier(*, self, criterion="gini", splitter="best", max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0., max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0., min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)

#参数说明
(1) criterion: ”gini” or “entropy”(default=”gini”)是计算属性的 gini(基尼指数)还是entropy(信息增益), 来选择最合适的节点。
(2) splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。
(3) max_features: 选择最适属性时划分的特征不能超过此值。 当为整数时, 即最大特征数;
当为小数时, 训练集特征数*小数; if “auto”, then max_features=sqrt(n_features).If “sqrt”,
thenmax_features=sqrt(n_features).If “log2”, thenmax_features=log2(n_features).If None, then max_features=n_features.
(4) max_depth: (default=None)设置树的最大深度, 默认为 None, 这样建树时, 会使每一个叶节点只有一个类别, 或是达到 min_samples_split。
(5) min_samples_split:根据属性划分节点时, 每个划分最少的样本数。
(6) min_samples_leaf:叶子节点最少的样本数。
(7) max_leaf_nodes: (default=None)叶子树的最大样本数。
(8) min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值
(9) verbose:(default=0) 是否显示任务进程

代码示例(以criterion,splitter,两个参数为例选取使得结果最好的参数):  

import pandas as pd 
from sklearn.preprocessing import MinMaxScaler
from sklearn import tree

#读取训练集数据并归一化处理,得train_features,train_labels
my_matrix = pd.read_csv('E:/ACourse/MachineLearning/homework/Computer_exercise1/Ex1_20200916/data1/train_hf_data.csv',header=0)
scaler = MinMaxScaler()
scaler.fit(my_matrix)
data = scaler.transform(my_matrix)
train_features = data[0::,1::]

raw_data_labels = pd.read_csv('E:/ACourse/MachineLearning/homework/Computer_exercise1/Ex1_20200916/data1/train_hf_label.csv',header=0)
data_labels = raw_data_labels.values
train_labels = data_labels[0::,1]


##读取测试集并归一化处理,得test_features,data_test_labels
my_matrix_test = pd.read_csv('E:/ACourse/MachineLearning/homework/Computer_exercise1/Ex1_20200916/data1/test_hf_data.csv',header=0)
data_test = scaler.transform(my_matrix_test)
test_features = data_test[0::,1::]   

test_data_labels = pd.read_csv('E:/ACourse/MachineLearning/homework/Computer_exercise1/Ex1_20200916/data1/test_hf_label.csv',header=0)
data_labels = test_data_labels.values
data_test_labels = data_labels[0::,1]


#根据训练集构建决策树,选取最好的criterion,splitter,输出测试集正确率
best_score = 0
best_splitter = ''
best_criterion = ''
for criterion_i in ['entropy','gini']:
    for splitter_i in ['best','random']:
        clf = tree.DecisionTreeClassifier(criterion=criterion_i,splitter=splitter_i)
        clf.fit(train_features, train_labels)
        scores = clf.score(test_features, data_test_labels) #返回预测的准确度
        if scores>best_score:
                best_score=scores
                best_splitter=splitter_i 
                best_criterion=criterion_i
print('最好的得分为:%.4f,最好的criterion为:%s,最好得splitter为:%s'%(best_score,best_criterion,best_splitter))

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值