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

泰坦尼克乘客生存预测实战

程序员文章站 2022-06-06 22:27:18
泰坦尼克乘客生存预测实战(决策树篇)大纲1.读取数据及预处理2.构建决策树模型3.在测试集上预测4.输出预测结果5. 决策树可视化算法背景:决策树的核心环节:构造和剪枝构造:选择划分的特征和特征值剪枝:预剪枝和后剪枝用于避免模型过拟合现象,提高泛化能力选择特征的依据:纯度、信息熵(构建决策树的过程就是样本纯度不断提升、信息熵不断下降的过程)由此引申出了三类构造算法:ID3 C4.5 CART概略介绍:ID3:以信息增益(大)为依据选择特征;优:简单方便缺:倾向于选择...

泰坦尼克乘客生存预测实战(决策树篇)

大纲
1.读取数据及预处理
2.构建决策树模型
3.在测试集上预测
4.输出预测结果
5. 决策树可视化

算法背景:

  • 决策树的核心环节:构造和剪枝

构造:选择划分的特征和特征值
剪枝:预剪枝和后剪枝用于避免模型过拟合现象,提高泛化能力

  • 选择特征的依据:纯度、信息熵(构建决策树的过程就是样本纯度不断提升、信息熵不断下降的过程)
  • 由此引申出了三类构造算法:ID3 C4.5 CART

概略介绍:
ID3:
以信息增益(大)为依据选择特征;
优:简单方便
缺:倾向于选择取值比较多的属性,只能处理类别特征
C4.5:
以信息增益率(大)为依据选择特征;
优:采用了后剪枝策略(悲观剪枝PEP)、离散化处理连续特征、可以处理缺失值、
CART:分类回归决策树
以基尼系数(小)/(回归用最小二乘偏差MSE或最小绝对偏差MAE)为依据选择特征,且只会生成二叉树;
优:使用CCP后剪枝(代价复杂度剪枝策略–剪枝前后的误差率变化/减去的叶子数量)

问题导入:泰坦尼克问题是一个比较经典的案例,此次实验的目的在于用决策树进行乘客的生存预测,数据集中的具体字段为:
泰坦尼克乘客生存预测实战

#导入可能用到的工具包
import numpy as np
import pandas as pd
from sklearn.tree import  DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import warnings
warnings.filterwarnings('ignore')
  1. 读取数据、展示、简单的预处理
traindata = pd.read_csv("train.csv",engine="python")
testdata = pd.read_csv("test.csv",engine="python")
print("train's shape:",traindata.shape)
print("test's shape:",testdata.shape)
traindata.describe()
traindata.describe(include=["O"])
traindata.info()
testdata.info()

根据info()可以看出数据的缺失情况主要出现在#缺失值:age Fare Cabin Embarked,并且Cabin缺失的过多,没办法补救了可以考虑直接剔除,其他的特征使用填充的方式补全。

del traindata['Cabin']
del testdata['Cabin']

age_mean = traindata['Age'].mean()
fare_mean = traindata['Fare'].mean()
embarked_mode = traindata.Embarked.mode()
traindata['Age'].fillna(age_mean,inplace=True)
testdata['Age'].fillna(age_mean,inplace=True)
testdata['Fare'].fillna(fare_mean,inplace=True)
traindata['Embarked'].fillna(embarked_mode,inplace=True)
testdata['Embarked'].fillna(embarked_mode,inplace=True)
traindata.head()
testdata.head()

该数据集的任务为预测乘客是否存活,其中乘客ID ,姓名以及票编号其实对分类不具有参考意义,把他们加入到模型中可能会影响决策树的构建(如ID3算法的一个弊端:倾向于选择划分类别多的特征 e.g.日期,ID,学号等)

delte_features = ['PassengerId','Name','Ticket']
for feature in delte_features:   
    del traindata[feature]
    del testdata[feature]
 
print("train's shape:",traindata.shape)
print("test's shape:",testdata.shape)

对训练集和测试集做相同的编码操作:

all_data = pd.concat((traindata,testdata),axis=0)
all_data.shape
y_train = traindata['Survived']
del all_data['Survived']
all_data = pd.get_dummies(all_data)
x_train = all_data[:len(traindata)]
x_test = all_data[len(traindata):]
print("x_train's shape:",x_train.shape)
print("x_test's shape:",x_test.shape)

预览一下,操作是否正确

x_train.head()
  1. 构建决策树模型
# ID3算法
id3_model = DecisionTreeClassifier(criterion='entropy')
id3_model.fit(x_train,y_train)
accuracy_id3 = id3_model.score(x_train,y_train)
print("id3算法的分类准确率为(训练集):{}".format(accuracy_id3))

# 交叉验证
print("ID3算法-10折交叉验证的平均结果为:",np.mean(cross_val_score(id3_model,x_train,y_train,cv=10)))
# CART算法
cart_model = DecisionTreeClassifier(criterion='gini')
cart_model.fit(x_train,y_train)
accuracy_cart = cart_model.score(x_train,y_train)
print("CART算法的分类准确率为(训练集):{}".format(accuracy_cart))

# 交叉验证
print("CART算法-10折交叉验证的平均结果为:",np.mean(cross_val_score(cart_model,x_train,y_train,cv=10)))
  1. 在测试集上预测
predict_result_CART = cart_model.predict(x_test)
predict_result_ID3 = id3_model.predict(x_test)

predict_result_CART
  1. 输出预测结果
result = pd.DataFrame({'Survived':predict_result_CART})
summit = pd.concat((x_test,result),axis=1)
summit.head()
summit.to_csv("predict_summit.csv",index=None)
  1. 决策树可视化
from sklearn import tree
import matplotlib.pyplot as plt
fig,axes = plt.subplots(nrows=1,ncols=1,dpi=600)
tree.plot_tree(cart_model,feature_names=x_train.columns,class_names=['0','1'],filled=True);
fig.savefig('tree.png')

结果展示:
泰坦尼克乘客生存预测实战
小结:本实验完成了《数据分析实战45讲》的第19讲内容(泰坦尼克乘客生存预测),源数据参见github链接,整体来说挖掘的比较粗糙,并没有做调优工作以及深入的分析挖掘工作,当基本流程还是比较明确的,有一个小tips:sklearn0.23版(好像21以上都可吧)已经可以支持直接用tree.plot_tree(model,……)来可视化决策树了,记得该行代码后要加上分号“;”,保存的图片还是蛮清晰的就是太大了不好看,也亏我白搞了老半天的graphviz haha,当作一个教训吧!~~~~

本文地址:https://blog.csdn.net/wenkang2261/article/details/107577432