决策树的原理即利用不同的最优特征选择方法,优先选择样本纯度最高的特征来进行样本分类。其中:
  使用信息增益的决策树算法为 ID3
  使用信息增益率的决策树算法为 C4.5
  使用Gini指数的决策树算法为 CART算法。

 ID3算法中,信息增益(Information gain)越大,数据越纯净,越有序,自然地我们优先选取信息增益最大的特征来分类样本。样本集的信息熵(Entorpy)的值越小,其数据越纯,混乱程度越低。

熵增原理:孤立热力系统学系统的熵不减少,总是增大或者不变。一个孤立系统不可能朝低熵的状态发展,即不会变得有序。
in:

#实现jupyter一次多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

 本文利用DecisionTreeClassifier决策树分类模型,预测泰坦尼克号的哪些乘客可能成为幸存者。数据集来自:https://www.kaggle.com/c/titanic

sklearn.tree.DecisionTreeClassifier 决策树分类算法类# 参数解释
criterion: 特征选择算法,一种是基于信息熵,一种是基于基尼指数。 两者对于模型准确性差异不大,相对来讲因为对数运算,信息熵运算效率较低。
splitter: 创建决策树分支,一种是选择最优的分支创建原则,一种是从排名靠前的特征中随机选择一个特征来创建,第二种效果类似于正则化,可避免过拟合。
max_depth: 决策树最大深度。用来解决过拟合问题。
min_samples_split: 指定能创建分支的数据集大小,默认为2. 也是一种前剪枝的方法。
min_samples_leaf: 创建分支后的节点样本数量需大于该值,否则不再创建分支,也是一中前剪枝的方法。
max_leaf_nodes: 限制最大样本节点个数。
min_impurity_split: 指定信息增益阈值。信息增益需大于该值,否则不创建分支。

一、数据清洗与特征选择(预处理)

 文件中的csv格式数据中,train.csv是训练集,test.csv为预测集。
train.csv为892行、12列的数据表格,意味着我们有891个训练样本,12个样本特征。在训练模型前,需对12个特征及数据进行预处理

  1. 丢弃不需要的特征及对应数据;
  2. 提取标记列数据;
  3. 将非数值型数据转换为数值型数据;
  4. 处理缺失数据、异常数据。

那么先对特征进行逐个分析:

  • Passenger:乘客ID,且为顺序编号。此特征用于标识不同样本,在训练中不使用。
  • Survived:1幸存,0遇难。此列作为样本标记。
  • Pclass:舱位等级。不同舱位等级的人登上甲板的优先程度不同,因此该特征较重要。
  • Name:乘客姓名,此特征可丢弃。
  • Sex:乘客性别。此特征与登上救生艇的优先程度有关,该特征较重要。需将其转换为数值型数据。
  • Age:乘客年龄。儿童优先,因此该特征较重要。
  • SibSp:兄弟姐妹在船上的数量。
  • Parch:同船的父辈人员数量。
  • Ticket:乘客票号,此特征可丢弃。
  • Fare:乘客的体热指标。
  • Cabin:乘客所在舱船号。舱船号与在船中位置有关,因此有关系。但该特征出现大量缺失数据,因此丢弃该特征。
  • Embarked:乘客登船的港口。需将其转换为数值型数据。
    in:
#数据预处理import numpy as np
import pandas as pd
def read_dataset(fname):# 指定第一列为行索引data = pd.read_csv(fname, index_col=0)# 丢弃无用数据data.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)# 处理非数值型数据data['Sex'] = (data['Sex'] == 'male').astype('int')  #男性为1,女性为0labels = data['Embarked'].unique().tolist()     #tolist()将数组转换为列表,unique()返回数组中不同的值,从小到大排data['Embarked'] = data['Embarked'].apply(lambda n: labels.index(n))   #lambda匿名函数# 处理缺失数据data = data.fillna(0)return data# 疑问:年龄数据缺失数也较多,且存在异常数据,该处理方式合适吗?是否应计算异常数据及缺失数据占总数据的比例,若较少则丢弃?

导入训练集。
in:

train = read_dataset('C:/Users/dell/Desktop/titanic/train.csv')
train.head()

out:

Survived Pclass Sex Age SibSp Parch Fare Embarked
PassengerId
1 0 3 1 22.0 1 0 7.2500 0
2 1 1 0 38.0 1 0 71.2833 1
3 1 3 0 26.0 0 0 7.9250 0
4 1 1 0 35.0 1 0 53.1000 0
5 0 3 1 35.0 0 0 8.0500 0

train_test_split用来将数据集分为训练集和交叉验证集。
in:

from sklearn.model_selection import train_test_splitY = train['Survived'].values    # 标签
X = train.drop(['Survived'], axis=1).values    # 特征值# 将数据集分成训练集和交叉验证集,其中20%作为交叉验证集X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)print('train dataset: {0}; test dataset: {1}'.format(X_train.shape, X_test.shape))

out:

train dataset: (712, 7); test dataset: (179, 7)

二、模型选择、训练和测试

in:

# 使用决策树模型对数据拟合from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier()
clf.fit(X_train, Y_train)train_score = clf.score(X_train, Y_train)
test_score = clf.score(X_test, Y_test)
print('train score:{0}; test score:{1}'.format(train_score, test_score))

其中,score返回决定系数R^2,越接近1越准确。
可参考:https://blog.csdn.net/rex_wust/article/details/82621952
out:

DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,max_features=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, presort=False, random_state=None,splitter='best')train score:0.9845505617977528; test score:0.776536312849162

从score返回结果可看到,训练集准确度较高,但交叉验证集准确度低很多,由此可判断出现了数据过拟合。决策树解决数据过拟合的方法有前剪枝和后剪枝,但scikit-learn不支持后剪枝,可通过一系列模型参数的调整达到前剪枝的目的。

三、优化模型参数

3.1、max_depth限定决策树深度阈值

我们可以max_depth参数来限定决策树深度,当决策树达到阈值深度时,将不再进行分裂,从而一定程度上达到防止过拟合的目的。
DecisionTreeClassifier(max_depth=d)
in:

# 创建函数,用不同的模型深度max_depth训练模型,并计算评分数据def cv_score_depth(d):clf = DecisionTreeClassifier(max_depth=d)clf.fit(X_train, Y_train)tr_score = clf.score(X_train, Y_train)cv_score = clf.score(X_test, Y_test)return(tr_score, cv_score)  #tuple元组类型,使用()声明

in:

# 构造参数范围,分别计算模型评分
depths = range(2, 15)
scores = [cv_score_depth(d) for d in depths]
tr_scores = [s[0] for s in scores]
cv_scores = [s[1] for s in scores]# 找出交叉验证数据集评分最高的索引
best_score_index = np.argmax(cv_scores)   #np.argmax(a) 返回a中最大元素的索引
best_score = cv_scores[best_score_index]
best_param = depths[best_score_index]
print('best param:{0}; best score:{1}'.format(best_param, best_score))

out:

best param:4; best score:0.8491620111731844

in:

# 画出模型参数和模型评分,更直观观察其变化规律from matplotlib import pyplot as pltplt.figure(figsize=(6, 4), dpi=144)
plt.grid()
plt.xlabel('max depth of decision tree')
plt.ylabel('score')
plt.plot(depths, cv_scores, '.g-', label='cross-validation score')  #cross-validation 交叉验证
plt.plot(depths, tr_scores, '.r--', label='training score')
plt.legend()

从图中可更直观地看到,当深度大于4时,交叉验证集的准确度随着深度增加而整体下降,表现为过拟合。

3.2、min_impurity_decrease限定决策树信息熵阈值

min_impurity_decrease用来指定信息熵或Gini指数的阈值,当决策树分裂后,其信息增益低于该阈值,则不再分裂。
DecisionTreeClassifier(criterion=‘gini’, min_impurity_decrease=val)
指定为Gini指数阈值。
用与1同样的方法,我们对不同的Gini指数阈值来构造模型拟合数据。
in:

# 创建函数,用不同的min_impurity_decrease训练模型。def cv_score_impurity(val):clf = DecisionTreeClassifier(criterion='gini', min_impurity_decrease=val)clf.fit(X_train, Y_train)tr_score = clf.score(X_train, Y_train)cv_score = clf.score(X_test, Y_test)return(tr_score, cv_score)

in:

values = np.linspace(0, 0.005, 50)
scores_im = [cv_score_impurity(v) for v in values]
tr_scores_im = [s[0] for s in scores_im]
cv_scores_im = [s[1] for s in scores_im]best_score_index_im = np.argmax(cv_scores_im)
best_score_im = cv_scores_im[best_score_index_im]
best_param_im = values[best_score_index_im]
print('best param:{0}; best score:{1}'.format(best_param_im, best_score_im))

在这个过程中,values = np.linspace(0, 0.005, 50) 的上限0.005可先设定为较大值(例如:0.5)来构造模型拟合数据,再根据结果更改上限。

out:

best param:0.0015306122448979593; best score:0.8659217877094972

画图:
in:

plt.figure(figsize=(6, 4), dpi=144)
plt.grid()
plt.xlabel('threshold of entropy')
plt.ylabel('score')
plt.plot(values, cv_scores_im, '.g-', label='cross-validation score')  #cross-validation 交叉验证
plt.plot(values, tr_scores_im, '.r--', label='training score')
plt.legend()

out:

3.3、多参数优化

在上述方法中,我们通过对单个参数的不同值进行模型拟合来找到最佳参数,但这种方法有很大局限性。
问题一:数据不稳定。由于划分随机,每次重新划分训练集和交叉验证集时,其数据集有不同,所得到的最优模型参数不同,训练出的模型有差异。
解决方法:多次计算,取平均值。针对模型某个特定参数,多次划分数据集,多次训练模型,计算出该参数的最低评分、最高评分、平均评分。

问题二:不能一次选择多个参数。 无法平衡两个参数甚至多个参数的最优选择。
解决方法:优化代码使得能处理多个参数,或者,使用GridSearchCV类来实现多个参数同时处理。

3.3.1、利用GridSearchCV类来选择一个参数的最优值

in:

# 利用GridSearchCV类来选择一个参数的最优值from sklearn.model_selection import GridSearchCV# 设置参数矩阵
thresholds = np.linspace(0, 0.5, 50)param_grid = {'min_impurity_decrease': thresholds}clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5, return_train_score=True)clf.fit(X, Y)
print("best param: {0}\nbest score: {1}".format(clf.best_params_, clf.best_score_))

在这里,param_grid是一个字典,对应的值为列表,GridSearchCV会枚举列表里所有的值来构建模型,多次计算模型,并计算模型评分,最终得出指定参数值的平均评分及标准差。
cv参数用来指定交叉验证集的生成规则,代码中的cv=5表示每次计算都把数据集分成5份,取其中一份作为交叉验证数据集,其他的作为训练集。
最终得出的最优参数及最优评分会保存在
clf.best_params_ (最优参数)
clf.best_score_ (最优评分)

out:

GridSearchCV(cv=5, error_score='raise-deprecating',estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,max_features=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, presort=False, random_state=None,splitter='best'),fit_params=None, iid='warn', n_jobs=None,param_grid={'min_impurity_decrease': array([0.     , 0.0102 , 0.02041, 0.03061, 0.04082, 0.05102, 0.06122,0.07143, 0.08163, 0.09184, 0.10204, 0.11224, 0.12245, 0.13265,0.14286, 0.15306, 0.16327, 0.17347, 0.18367, 0.19388, 0.20408,0.21429, 0.22449, 0.23469, 0.2449 , 0.2551 , 0...16, 0.41837,0.42857, 0.43878, 0.44898, 0.45918, 0.46939, 0.47959, 0.4898 ,0.5    ])},pre_dispatch='2*n_jobs', refit=True, return_train_score=True,scoring=None, verbose=0)best param: {'min_impurity_decrease': 0.01020408163265306}
best score: 0.7946127946127947

in:

clf.cv_results_

其中,clf.cv_results_ 保存了计算过程的所有中间结果。
‘mean_fit_time’、‘std_fit_time’、‘mean_score_time’、 ‘std_score_time’、 ‘param_min_impurity_decrease’、‘params’、 ‘split0_test_score’、 ‘split1_test_score’、 ‘split2_test_score’、 ‘split3_test_score’、 ‘split4_test_score’、 ‘mean_test_score’、 ‘std_test_score’、 ‘rank_test_score’、 ‘split0_train_score’、 ‘split1_train_score’、 ‘split2_train_score’、 ‘split3_train_score’、 ‘split4_train_score’、‘mean_train_score’、 ‘std_train_score

mean_test_score :长度50的一维array数组。指在一个参数值下,5次交叉验证集的随机划分所生成的5组(训练集,交叉验证集)的交叉验证集,在该参数下模型拟合得到的score值的均值。因有50个参数,故有50个均值。
std_test_score:50个标准差。

将计算结果用图像形式显现出来。
in:

#定义绘图函数
def plot_curve(train_sizes, cv_results, xlabel):train_scores_mean = cv_results['mean_train_score']train_scores_std = cv_results['std_train_score']test_scores_mean = cv_results['mean_test_score']test_scores_std = cv_results['std_test_score']plt.figure(figsize=(10, 6), dpi=144)plt.title('parameters turning')plt.grid()plt.xlabel(xlabel)plt.ylabel('score')# 填充数据波动范围(均值-标准差,均值+标准差) plt.fill_between(train_sizes, train_scores_mean - train_scores_std,train_scores_mean + train_scores_std, alpha=0.1, color="r")plt.fill_between(train_sizes, test_scores_mean - test_scores_std,test_scores_mean + test_scores_std, alpha=0.1, color="g")plt.plot(train_sizes, train_scores_mean, '.--', color="r",label="Training score")plt.plot(train_sizes, test_scores_mean, '.-', color="g",label="Cross-validation score")plt.legend(loc="best")
plot_curve(thresholds, clf.cv_results_, xlabel='gini thresholds')

3.3.2、利用GridSearchCV类来选择多个参数的最优值

这里,我们选择min_impurity_decrease的信息熵和Gini指数、max_depthmin_samples_split这四个参数来利用GridSearchCV计算四个参数的最优值。

in:

# 利用GridSearchCV类来选择多个参数的最优值entropy_thresholds = np.linspace(0, 0.01, 50)
gini_thresholds = np.linspace(0, 0.05, 50)# 设定参数字典序列
param_grid = [{'criterion': ['entropy'], 'min_impurity_decrease': entropy_thresholds},{'criterion': ['gini'], 'min_impurity_decrease': gini_thresholds},{'max_depth': range(2, 10)},{'min_samples_split': range(2, 30, 2)}]clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5, return_train_score=True)
clf.fit(X, Y)
print("best param: {0}\nbest score: {1}".format(clf.best_params_,clf.best_score_))

out:

GridSearchCV(cv=5, error_score='raise-deprecating',estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,max_features=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, presort=False, random_state=None,splitter='best'),fit_params=None, iid='warn', n_jobs=None,param_grid=[{'criterion': ['entropy'], 'min_impurity_decrease': array([0.     , 0.0002 , 0.00041, 0.00061, 0.00082, 0.00102, 0.00122,0.00143, 0.00163, 0.00184, 0.00204, 0.00224, 0.00245, 0.00265,0.00286, 0.00306, 0.00327, 0.00347, 0.00367, 0.00388, 0.00408,0.00429, 0.00449, 0...96, 0.04898,0.05   ])}, {'max_depth': range(2, 10)}, {'min_samples_split': range(2, 30, 2)}],pre_dispatch='2*n_jobs', refit=True, return_train_score=True,scoring=None, verbose=0)best param: {'criterion': 'entropy', 'min_impurity_decrease': 0.002857142857142857}
best score: 0.8260381593714927

我们用’criterion’: ‘entropy’, ‘min_impurity_decrease’: 0.002857142857142857该参数来拟合模型,并用该模型预测交叉验证集。
in:

clf = DecisionTreeClassifier(criterion='entropy', min_impurity_decrease=0.002857142857142857)
clf.fit(X_train, Y_train)
train_score = clf.score(X_train, Y_train)
test_score = clf.score(X_test, Y_test)
print('train score: {0}; test score: {1}'.format(train_score, test_score))

out:

DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,max_features=None, max_leaf_nodes=None,min_impurity_decrease=0.002857142857142857,min_impurity_split=None, min_samples_leaf=1,min_samples_split=2, min_weight_fraction_leaf=0.0,presort=False, random_state=None, splitter='best')train score: 0.8834269662921348; test score: 0.8491620111731844

四、模型使用

用该模型来预测测试集:
in:

TEST = read_dataset('C:/Users/dell/Desktop/titanic/test.csv')
Ypred = clf.predict(TEST)TEST['Surived']= Ypred
TEST.head()

out:

sklearn决策树--泰坦尼克号幸存者预测相关推荐

  1. 《scikit-learn机器学习》决策树③ -泰坦尼克号幸存者预测【思路+代码】

    泰坦尼克号预测: 1.思路 1.1 数据处理 1.2 选择模型并训练 1.3 用前剪枝对模型进行优化 1.4 试试其他的决策树模型 2.具体代码实现(代码来源于本书,不做详细解释) 2.1 数据处理 ...

  2. 决策树入门案例:泰坦尼克号幸存者预测

    决策树 1 概述 1.1 决策树是如何工作的 1.2 分类树 DecisionTreeClassifier 1.3 回归树 DecisionTreeRegressor 1.4 案例练习 1. 用回归树 ...

  3. 特征工程实践:泰坦尼克号幸存者预测

    文章目录 泰坦尼克号幸存者预测 泰坦尼克号幸存者预测 数据集下载地址:https://www.kaggle.com/c/titanic/data . 本案例主要展示特征工程对数据集的处理方法,模型只选 ...

  4. #泰坦尼克号幸存者预测

    泰坦尼克号幸存者预测 泰坦尼克号训练数据见百度网盘: 链接:https://pan.baidu.com/s/1yHvYb2usyW24LqacHk9-Dw 提取码:p1do import pandas ...

  5. 机器学习-泰坦尼克号幸存者预测

    机器学习-泰坦尼克号幸存者预测 泰坦尼克灾难数据描述 PassengerId:乘客的ID号,这个是顺序编号,用来唯一标识一名乘客.这个特征和幸存与否无关,我们不使用这个特征. Survived:1表示 ...

  6. 决策树sklearn实现泰坦尼克号幸存者的预测 及决策树优缺点、参数、属性、接口总结

    泰坦尼克号的沉没是世界上最严重的海难事故之一,今天我们通过分类树模型来预测一下哪些人可能成为幸存者. 数据集来自https://www.kaggle.com/c/titanic,数据集包含两个csv格 ...

  7. 【1 - 决策树 - 案例部分:泰坦尼克号幸存者预测】菜菜sklearn机器学习

    课程地址:<菜菜的机器学习sklearn课堂>_哔哩哔哩_bilibili 第一期:sklearn入门 & 决策树在sklearn中的实现 第二期:随机森林在sklearn中的实现 ...

  8. sklearn机器学习:泰坦尼克号幸存者的预测

    这是Kaggle的一道题,这里使用决策树完成预测,方便起见就直接在jupyter lab上来做这题了. 1.首先导入需要的包 #1.导包 import pandas as pd import nump ...

  9. 泰坦尼克号幸存者预测(案例)----决策树版

    1.导入需要的库 import pandas as pd from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplo ...

最新文章

  1. bzoj2724: [Violet 6]蒲公英(分块)
  2. Understand分析Kinect SDK 1.7自带例子(C++)图集一
  3. 高性能mysql整理
  4. 数据结构与算法之-----图(拓扑排序)
  5. 深度学习训练和推理有何不同?
  6. Mac解压Linux平台tar包报错:tar: Error reading Truncated input file
  7. 园林景观设计计算机制图,园林景观设计平面图效果图
  8. python模拟登录百度贴吧_Python百度贴吧多线程自动登录签到/自动打码
  9. HbuilderX未检测到手机或模拟器
  10. java 依赖倒置_Java设计原则—依赖倒置原则(转)
  11. 弗吉尼亚理工大学计算机科学,弗吉尼亚理工大学计算机科学排名第45(2020年TFE美国排名)...
  12. 如何用html制作彩虹,javascript – 如何使用HTML5画布生成彩虹圈?
  13. mysql学习笔记-索引优化【1】-索引失效原因
  14. C++基础之运算符重载
  15. 基于树莓派的遥控小车
  16. addClass与className的区别
  17. ecshop活动页_ECShop:专题活动
  18. Android简易老虎机(转动式)
  19. [CSR]在CSR8675的Source工程实现串口收发实例
  20. 一碗酸爽面-倒在黎明前

热门文章

  1. 为什么CPU需要时钟才能工作
  2. 秋招实习季,教你制作在线简历
  3. 教大家强制退出id账号_今天教大家怎么用手机注册自媒体账号之企鹅号。
  4. android国家码
  5. python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~
  6. 选择城市,按城市的首字母进行排序
  7. 程序员写程序的逻辑思维,和外行人想当然的思维,到底有什么不同
  8. Java并发编程与技术内幕:ThreadFactory、ThreadLocal
  9. 2017校招信息每日汇总(更新至8.4)
  10. Latex overleaf 图表公式参考文献