欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

决策树算法及应用

程序员文章站 2022-03-31 22:38:20
...

1、划分选择

1.1信息增益

样本集合D中第k类样本所占的比例为pk(k=1,2,……|y|),则D的信息熵定义为:
决策树算法及应用
Enter(D)越小,D的纯度越高。
离散属性a有V个可能取值:
决策树算法及应用
v个分支节点包含D中所有在a上取值为a^V 的样本,记为D ^V,则信息增益定义为:
决策树算法及应用
信息增益越大,利用属性a进行划分的纯度提升就越大,ID3算法就是根据信息增益为准则来选择划分属性。

1.2增益率

信息增益准则对可能取值数目较多的属性有所偏好,为减少这种偏好带来的不利影响,提出信息增益率的概念,概念如下:
决策树算法及应用
增益率准则对可取数值数目较少的属性有所偏好,故C4.5算法不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

1.3基尼指数

Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。所以基尼指数越小,数据集D的纯度越高。(CART)
决策树算法及应用
属性a的基尼指数定义为:
决策树算法及应用
注:预防过拟合的方法——剪纸处理

2、sklearn.tree.DecisionTreeClassifier参数介绍

相关参数:
criterion:默认是‘gini’系数,也可以选择信息增益的熵‘entropy’;
splitter :分离器,每个节点选择拆分的方法,默认设置为‘best’;
max_depth:树的最大深度:根节点到子节点层数,常用取值10-100之间。
random_state:随机数种子
class_weight:指定样本各类别权重,防止训练集某些类别样本量过多,导致训练集偏向这些类别。可以指定各个样本的权重,或者用"balanced"算法自动计算权重,类别少相应权重高。分布相对均匀,可以忽略该参数。
min_samples_split:限制子树继续划分条件,如果样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。样本量不大的情况下,可以不用管这个值。样本量大,适当增大这个值,防止过拟合。
min_samples_leaf:限制叶子节点最小样本数,如果某叶子节点小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少样本整数,或者样本总数的百分比。

注:
(1)参数解释参考博文链接:https://blog.csdn.net/me_to_007/article/details/90007319;
(2)sklearn决策树官网解释链接:https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

3、决策树实例

Titanic 乘客生存预测
数据集:https://github.com/cystanford/Titanic_Data,其中数据集格式为 csv,一共有两个文件:
train.csv 是训练数据集,包含特征信息和存活与否的标签;
test.csv: 测试数据集,只包含特征信息。
现在我们需要用决策树分类对训练集进行训练,针对测试集中的乘客进行生存预测,并告知分类器的准确率。
在训练集中,包括了以下字段,它们具体为:
决策树算法及应用
注:以上数据集来源博客链接:https://www.cnblogs.com/molieren/articles/10666739.html

Python代码:

######导入数据
import pandas as pd
titannic_train=pd.read_csv('train.csv')
titannic_test=pd.read_csv('test.csv')
titannic_train.head(3)
titannic_test.head(3)
titannic_train.info()
titannic_test.info()

#####s数据清洗
titannic_train['Age'].fillna(titannic_train['Age'].mean(),inplace=True)  ####将Age缺失值赋均值
titannic_test['Age'].fillna(titannic_test['Age'].mean(),inplace=True)  ####将Age缺失值赋均值
titannic_train['Fare'].fillna(titannic_train['Fare'].mean(), inplace=True)
titannic_test['Fare'].fillna(titannic_test['Fare'].mean(),inplace=True)
titannic_train['Embarked'].value_counts()    ####统计登录港口,S港人数最多,将缺失数据补充为s港
titannic_train['Embarked'].fillna('S',inplace=True)
titannic_test['Embarked'].fillna('S',inplace=True)


#####特征选择
features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
train_features=titannic_train[features]
train_labels=titannic_train['Survived']
test_features = titannic_test[features]

####将特征中的字符串变为数值,如将Sex=male 和 Sex=female 两个字段,数值用 0 或 1 来表示
from sklearn.feature_extraction import DictVectorizer   ### sklearn 特征选择中的 DictVectorizer 类,用它将可以处理符号化的对象,将符号转成数字 0/1 进行表示
dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))
dvec.feature_names_    #######查看 dvec 的 feature_names_ 属性值

#####决策树模型
from sklearn.tree import DecisionTreeClassifier
clf=DecisionTreeClassifier(criterion='entropy')   ####ID3决策树
clf.fit(train_features,train_labels)   ######决策树训练

#####模型预测与评估
test_features=dvec.transform(test_features.to_dict(orient='record'))
pred_labels = clf.predict(test_features)
print(pred_labels)   ###打印预测结果

#####求决策树准确率
acc_decision_tree = round(clf.score(train_features, train_labels), 6)
print(u'score准确率为%.5lf'%acc_decision_tree)    #####%.5lf%表示保留5为小数

#########K 折交叉验证
import numpy as np
from sklearn.model_selection import cross_val_score
cross_val_score_acc=np.mean(cross_val_score(clf, train_features, train_labels, cv=10))
print(u'cross_val_score 准确率为 %.5lf' % cross_val_score_acc)

结果:
决策树算法及应用