【Scikit-Learn】决策树预测坦坦尼克号幸存者

2023-11-22 03:59

本文主要是介绍【Scikit-Learn】决策树预测坦坦尼克号幸存者,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据集下载地址为:www.kaggle.com/c/titanic.

本文通过泰坦尼克号数据集及使用决策树模型来熟悉sklearn相关类的使用,并给出以下例子:
1. 首先将数据集进行数据清洗,然后训练决策树模型并可视化该决策树。
2. 分析不同深度、不同阈值对决策树的影响。
3. 使用GridSearchCV类来选择决策树的最佳参数

1. 数据预处理

这里最值得学习的是,乘客登船的港口Embarked原本为字母“S、C、Q”,这里需要将S、C、Q序列化为数值类型,例如S=0,C=1,Q=2

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pddef 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')# 处理登船港口数据labels = data['Embarked'].unique().tolist()data['Embarked'] = data['Embarked'].apply(lambda n: labels.index(n))# 处理缺失数据data = data.fillna(0)return datatrain = read_dataset('datasets/titanic/train.csv')train.head()

这里写图片描述

2.模型训练

这里可以看到模型对训练样本评分高,但对测试集评分低,这是过拟合的现象。

# 划分数据集
from sklearn.model_selection import train_test_splity = train['Survived'].values
X = train.drop(['Survived'], axis=1).valuesX_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))
'''train dataset: (712, 7); test dataset: (179, 7)
'''# 模型训练
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))
'''train score: 0.984550561798; test score: 0.77094972067
'''

3. 可视化决策树

from sklearn.tree import export_graphviz
import pydotpluswith open("titanic.dot", 'w') as f:f = export_graphviz(clf, out_file=f)# 画图,保存到pdf文件或png文件
# 设置图像参数
dot_data = export_graphviz(clf, out_file=None,# feature_names的顺序必须按照放入模型时数据集特征x1,x2,...,xn的feature_names=train.drop(['Survived'], axis=1).columns.values.tolist(), # class_name 的顺序必须按照数据集标签的升序排列,这里[unsurvied=0,survived=1]class_names=['unsurvived','survived'],filled=True, rounded=True,special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
# 保存图像到pdf文件
graph.write_pdf("tree.pdf")# 保存图像到png文件
# graph.write_png("tree.png")

由于决策树图片过大,这里只截取一部分
这里写图片描述

4. 不同深度对决策树的影响

决策树模型里面有一个参数max_depth控制决策树的最大深度,不同深度将会对模型产生不同的影响。

下面通过遍历不同的深度参数来训练决策树,并画出模型的socre曲线。

# 参数选择 max_depth
def cv_score(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)depths = range(2, 15)
scores = [cv_score(d) for d in depths]
tr_scores = [s[0] for s in scores]
cv_scores = [s[1] for s in scores]# 选出最佳深度及socre
best_score_index = np.argmax(cv_scores)
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))# 画出不同深度对应的score
plt.figure(figsize=(10, 6), dpi=144)
plt.grid()
plt.xlabel('max depth of decision tree')
plt.ylabel('score')
plt.plot(depths, cv_scores, '.g-', label='cross-validation score')
plt.plot(depths, tr_scores, '.r--', label='training score')
plt.legend()

这里写图片描述

5. 不同阈值对决策树的影响

如果节点的分裂导致的不纯度的下降程度大于或者等于这个节点的值,那么这个节点将会被分裂。
决策树的参数min_impurity_split用于指定信息熵或基尼不纯度的阈值,当决策树分裂后,其信息增益低于这个阈值时,则不再分裂。

# 训练模型,并计算评分
def cv_score(val):clf = DecisionTreeClassifier(criterion='gini', min_impurity_split=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)# 指定参数范围,分别训练模型,并计算评分
values = np.linspace(0, 0.5, 50)
scores = [cv_score(v) for v in values]
tr_scores = [s[0] for s in scores]
cv_scores = [s[1] for s in scores]# 找出评分最高的模型参数
best_score_index = np.argmax(cv_scores)
best_score = cv_scores[best_score_index]
best_param = values[best_score_index]
print('best param: {0}; best score: {1}'.format(best_param, best_score))# 画出模型参数与模型评分的关系
plt.figure(figsize=(10, 6), dpi=144)
plt.grid()
plt.xlabel('threshold of gini')
plt.ylabel('score')
plt.plot(values, cv_scores, '.g-', label='cross-validation score')
plt.plot(values, tr_scores, '.r--', label='training score')
plt.legend()

这里写图片描述

6. 使用GridSearchCV类来寻找最佳参数

DecisionTreeClassifier()默认使用criterion=’gini’。

在criterion=’gini’的情况下,使用GridSearchCV类来寻找最佳min_impurity_split。

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")from sklearn.model_selection import GridSearchCVthresholds = np.linspace(0, 0.5, 50)
# Set the parameters by cross-validation
param_grid = {'min_impurity_split': thresholds}clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5) # DecisionTreeClassifier()默认使用criterion='gini'
clf.fit(X, y)
print("best param: {0}\nbest score: {1}".format(clf.best_params_, clf.best_score_))plot_curve(thresholds, clf.cv_results_, xlabel='gini thresholds')

这里写图片描述

使用GridSearchCV类同时寻找最佳的min_impurity_split、criterion。

from sklearn.model_selection import GridSearchCVentropy_thresholds = np.linspace(0, 1, 50)
gini_thresholds = np.linspace(0, 0.5, 50)# Set the parameters by cross-validation
param_grid = [{'criterion': ['entropy'], 'min_impurity_split': entropy_thresholds},{'criterion': ['gini'], 'min_impurity_split': gini_thresholds},{'max_depth': range(2, 10)},{'min_samples_split': range(2, 30, 2)}]clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
clf.fit(X, y)
print("best param: {0}\nbest score: {1}".format(clf.best_params_, clf.best_score_))
'''
best param: {'min_impurity_split': 0.55102040816326525, 'criterion': 'entropy'}
best score: 0.822671156004
'''

这篇关于【Scikit-Learn】决策树预测坦坦尼克号幸存者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407375

相关文章

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分辨率的效果 效果: 但是这样图像太锐利了,我们加入噪声去解决这个问题 [numthreads(8, 8, 1)]void CSMain(uint3 id

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

决策树的实现原理与matlab代码

很久不写博客了,感觉很长一段时间只是一味的看书,疏不知一味地看书、写代码会导致自己的思考以及总结能力变得衰弱。所以,我决定还是继续写博客。废话不多说了,今天想主要记录数据挖掘中的决策树。希望能够将自己的理解写得通俗易懂。 决策树是一种对实例分类的树形结构,树中包含叶子节点与内部节点。内部节点主要是数据中的某一特性,叶子节点是根据数据分析后的最后结果。 先看一组数据: 这组数据的特性包含

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

机器学习(西瓜书)第 4 章决策树

4.1 决策树基本流程 决策树模型 基本流程 在第⑵种情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别;在第⑶种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多的类别.注意这两种情形的处理实质不同:情形⑵是在利用当前结点的后验分布,而情形⑶则是把父结点的样本分布作为当前结点的先验分布. 基本算法 由算法4 .2可看出,决策树学习

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测 目录 多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测(完整源码和数据) 2.SS

【机器学习-监督学习】决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,依赖于强大的开源库如Scikit-learn、TensorFlow和PyTorch。本专栏介绍机器学习的相关算法以及基于Python的算法实现。

力扣 | 递归 | 区间上的动态规划 | 486. 预测赢家

文章目录 一、递归二、区间动态规划 LeetCode:486. 预测赢家 一、递归 注意到本题数据范围为 1 < = n < = 20 1<=n<=20 1<=n<=20,因此可以使用递归枚举选择方式,时间复杂度为 2 20 = 1024 ∗ 1024 = 1048576 = 1.05 × 1 0 6 2^{20} = 1024*1024=1048576=1.05 × 10^