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