决策树算法及应用
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)
结果:
上一篇: 决策树系列2:决策树是何许人也
下一篇: 【机器学习】决策树