其他分享
首页 > 其他分享> > kaggle 泰坦尼克号 (预测人员是否存活)

kaggle 泰坦尼克号 (预测人员是否存活)

作者:互联网

通过学习其他人的代码,了解整个预测过程,以下代码为他人代码。

登录kaggle中找到titantic 下载所用数据。如下:

gender_submission是最终提交形式,只包含两列:人员编号、是否存活

test为测试数据,train为训练数据

使用jupyter notebook进行作业

首先导入所需要的基本库,(并非所有,后面还会需要导入其他库)

matplotlib inline的存在可以不需要再添加plt.show()即可将图像显示出。

导入数据

其中pd.read_csv中的index_col=0意为指定文件中的第一列为索引,pd.concat是将两个文件进行连接,使其成为一个整体。这里是将训练数据和测试数据进行了连接。

查看数据信息     pd.info()

Survived:是否存活

Pclass:客舱等级

SibSp:旁系亲属

Parch:直系亲属

Ticket:票编号

Fare:票价

Cabin:客舱编号

Embarked:上船时的港口编号

我们可以看出,Age数据有缺失,Embarked数据有缺失

下面进行数据分析:

对存活率进行统计,.value_counts()是对所提取列数目进行统计

通过sns.barplot画出性别与存活的关系,发现女性比男性存活率高

客舱等级越高存活率越高

旁系亲属数量适中,存活率高

直系亲属适中,存活率高

sns.kdeplot是核密度估计,kernel density estimator

Embarked也与生存率相关较大,港口编号S的存活率最低

sns.countplot是计数图,对Emnarked中的不同港口编号的存活率进行计数。

下面开始对姓名进行划分,建立新的称呼

从数据中可以看出,name较长

给all_data创建新的列名Title,.split('.')[0],split(',')[1]分别表示,将name按照.进行分割,取出第1个元素的值;将name按照,进行分割,取出第2个元素的值,.strip()即将两边空白字符。以第一个name为例:

即取得Mr字符。

对姓名中的称呼进行替换,总共分为6类,

dict.fromkeys(seq[, value])用于创建一个新字典,seq做字典的值,Value为字典所有键对应的初始值。即将[]中的字符替换为[]外的字符。dict.update(dict2)用于将dict2的键值对更新至dict中去,即将替换后的字符更新至Title_dict中。

通过map函数,将分类后的title放入Title列中,并绘制

不同的称呼,存活率不同。

将直系亲属与旁系亲属合并,统计整个家族人数目。

家属2-4人的存活率较高。因此将家族数目进行分类,构建特征。

人数分别为2-4、大于7、1/大于4小于等于7,对其进行画图第2类存活率最高

将甲板上的缺失项填充Unknown,并提取其首字母

.str.get(i)为取第i个元素

value_counts为计数函数。统计乘客的共票号数并建立新的Ticketgroup列,票号数2-4的存活率最高并对其进行分类

各元素关联分析完毕后,进行数据清洗

由于Age的缺失值较多,利用随机森林对Age缺失值进行预测

首先导入随机森林算法,随机森林属于集成算法,即将多个决策树集成为一个森林,每棵决策树之间无关联。当得到新的输入样本时,森林中的每一颗决策树进行判断,判断其应属于哪一类,并利用多数服从少数原则对其进行判定应属哪一类。

因为它属于集成学习,因此其在sklearn中的ensemble内。

利用性别、称呼、及等级三个特征构建森林模型,以此来填充缺失值

将特征值输入

由于输入数据离散且无序,因此先对其进行数字化操作,pd.get_dummies类似于One hot encoder,将其数字化处理。

将已知年龄所对应数据划分为训练数据,未知年龄划分为测试数据

notnull()为非缺失数据,isnull为缺失数据,x,y分别为训练数据中的输入输出,输入从第2列开始所有列,输出为第一列即Age列

使用随机森林进行训练,n_estimators为需建立子树的数目,子树越多,模型性能越好,时间越长;random_state是为了控制随机状态,让其勿出现重复结果;n_jobs告知引擎有多少处理器是它可以使用。 “-1”意味着没有限制,而“1”值意味着它只能使用一个处理器。

训练完成后,进行Age预测,

将all_data中的Age列缺失项利用预测值进行替代。

接着对Embarked进行缺失值替代,从表中可以看出,只有Embarked只有2个数据缺失。且其Fare均为80,Pclass均为1,再对比之前数据,.median()为

中位数

Pclass为1时且Fare为80左右的Embarked为C,因此将其填充C

.fillna()即填充空缺项。

查看所有数据中,Fare是否缺失

可以看出,缺失Fare的Embarked=‘S’,Pclass为3,因此利用Fare中位数对其进行填充

下面将姓氏相同的化为一组,并分别提取组中妇女儿童及成年男性,因为妇女儿童及成年男性的幸存率不同

dict() 创建一个字典,,对所提取的姓氏进行统计

并对其统计结果创建新的列FamilyGroup

在大于1个的姓氏相同的组内,提取年龄小于12或者性别为女性的人群,将其划分为妇女儿童组

在大于1个的姓氏相同的组内,提取年龄大于12或者性别为男性的人群,将其划分为成年男性组

对女性儿童组中的幸存率进行统计,女性儿童组中,Survived=0为遇难组

对成年男性组中的幸存率进行统计,Survived=1为幸存组

推测出,遇难组的女性儿童幸存可能性较低,幸存组的成年男性幸存可能性较高

set()函数是用来创建一个无序不重复元素集,Dead_list为成年男性组中遇难人

Survived_list为成年男性组中幸存人

训练数据为无缺失Survived项的数据,.loc是根据index来索引,即通过行标签索引行数据

              loc[n]表示索引的是第n行(index 是整数)

              loc[‘d’]表示索引的是第’d’行(index 是字符)

测试数据为缺失Survived项数值,

将测试集中的遇难组中的Sex特征修改为male,Age 修改为60,Title修改为Mr,确保后期能够准确预测

将幸存组中的Sex特征修改为female,Age 修改为5,Title修改为Miss,确保后期能够准确预测

重新将train与test连接

选取特征,

将特征数字化处理

划分训练集与测试集

划分输入输出特征

开始训练,利用随机森林模型,并采用网格搜索算法搜索最优参数

导入所需用的库函数,管道、随机森林分类、网格搜索、selectkbest

管道机制中,确定selectkbest,分类算法使用随机森林

参数范围确定,随机森林中的参数,n_estmator子树数目,max_depth决策树深度

GridSearchCV()网格搜索

estimator为所使用的分类器,param_grid为需要最优化的参数的取值,scoring 为准确度评价标准

查看最优参数,best_paramas_ 后缀下划线表示该值非用户传入参数,而是计算得到结果

查看最优准确度

通过网格搜索确定好参数后,就开始进行训练

make_pipeline 用于创建管道并根据每个步骤所属的类为其自动命名

确定所需参数, max_features表示随机森林允许单个决策树使用特征的最大数量(Auto/None 、 sqrt、0.2)其中,sqrt 是每颗子树可以利用总特征数的平方根个;warm_start设置为True时,重用上一个调用的解决方案以适合并向整体添加更多估算器;random_state=10表示随机数生成器所产生的种子。

使用make_pipeline进行重命名为pipeline,接着进行训练

交叉验证

其中,cv=10,即进行kfold分类,将其分为10份

并输出其验证准确度均值及方差

进行预测,.predict(data)即为预测操作,将预测结果放入predictions

将预测结果按照要求存放,第一列为乘客ID,第二列为存活率

将其结果导出至文件内,在kaggle中只需要将结果按照csv文件形式上传即可,无需提交代码,

当然你也可以上传代码进行分享。

以上就是泰坦尼克人员幸存预测的整体过程,使用随机森林这种集成学习方法可以提高预测准确度。

OK。

好好学习,天天向上。

标签:泰坦尼克号,Age,kaggle,缺失,存活,幸存,数据,存活率,进行
来源: https://blog.csdn.net/qq_38581886/article/details/96128357