【实验目的】
1、理解决策树算法原理,掌握决策树算法框架;
2、理解决策树学习算法的特征选择、树的生成和树的剪枝;
3、能根据不同的数据类型,选择不同的决策树算法;
4、针对特定应用场景及数据,能应用决策树算法解决实际问题。

【实验内容】
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,可以输入最少样本整数,或者样本总数的百分比。

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

机器学习决策树模型实战_决策树

`######导入数据
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)

`

机器学习决策树模型实战_数据集_02