泰坦尼克乘客生存预测实战
泰坦尼克乘客生存预测实战(决策树篇)
大纲
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')
- 读取数据、展示、简单的预处理
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()
- 构建决策树模型
# 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)))
- 在测试集上预测
predict_result_CART = cart_model.predict(x_test)
predict_result_ID3 = id3_model.predict(x_test)
predict_result_CART
- 输出预测结果
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)
- 决策树可视化
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