通过自己的整体学习第一名的源码,前期对字段的处理很细致,全面;建模的过程稍微比较浅。
导入整个过程中需要的三类库:
#数据处理importpandasaspdimportnumpyasnpimportrandomasrnd#可视化importseabornassnsimportmatplotlib.pyplotasplt%matplotlibinline#模型fromsklearn.linear_modelimportLogisticRegressionfromsklearn.svmimportSVC,LinearSVCfromsklearn.ensembleimportRandomForestClassifierfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.naive_bayesimportGaussianNBfromsklearn.linear_modelimportPerceptronfromsklearn.linear_modelimportSGDClassifierfromsklearn.treeimportDecisionTreeClassifier导入数据导入数据后查看数据的大小
查看全部的字段:
train.columnsIndex(['PassengerId','Survived','Pclass','Name','Sex','Age','SibSp','Parch','Ticket','Fare','Cabin','Embarked'],dtype='object')下面是字段的具体含义:
本案例中的数据主要是有两种类型:
查看训练集和测试集的缺失值情况:
同时也可以通过info函数来查数据的基本信息:
作者基于数据的基本信息和常识,给出了自己的一些假设和后面的数据处理和分析方向:
主要是对分类的变量Sex、有序变量Pclss、离散型SibSp、Parch进行分析来验证我们的猜想
1、船舱等级(1-头等,2-二等,3-三等)
结论:头等舱的人更容易生还
2、性别
结论:女人更容易生还
3、兄弟姐妹/配偶数
结论:兄弟姐妹或者配偶数量相对少的乘客更容易生还
4、父母/孩子数
结论:父母子女在3个的时候,更容易生还
上面都是基于简单的统计和可视化方面的分析,下面的过程是基于各种机器学习建模的方法来进行分析,前期做了很多的预处理好特征工程的工作。
票价ticket和客舱号Cabin对我们分析几乎是没有用的,可以考虑直接删除:
主要是根据现有的特征属性中找到一定的关系,来生成新的特征,或者进行一定的特征属性转化。
根据名称Name生成找到称谓,比如Lady、Dr、Miss等信息,来查看这个称谓和生还信息之间是否存在关系
使用交叉表的形式统计:
将提取出来的称谓进行整理,归类为常见的称谓和Rare信息:
称谓本身是文本型对后期建模无用,我们直接转成数值型:
title_mapping={"Mr":1,"Miss":2,"Mrs":3,"Master":4,"Rare":5}fordatasetincombine:#存在数据的进行匹配dataset['Title']=dataset['Title'].map(title_mapping)#不存在则补0dataset['Title']=dataset['Title'].fillna(0)train.head()同时还需要删除部分字段:
train=train.drop(['Name','PassengerId'],axis=1)test=test.drop(['Name'],axis=1)combine=[train,test]train.shape,test.shape#((891,9),(418,9))字段Sex将性别的Male和Female转成0-Male,1-Female
fordatasetincombine:dataset['Sex']=dataset['Sex'].map({'female':1,'male':0}).astype(int)性别、年龄、生还之间的关系:
1、首先就是字段的缺失值处理。
我们观察到年龄字段是存在缺失值的,我们通过Sex(0、1)和Pclass(1、2、3)的6种组合关系来进行填充。缺失值情况:
填充的具体过程:
2、年龄分段分箱
3、转成数值分类
首先根据Parch和SibSp两个字段生成一个FamilySize字段
fordatasetincombine:dataset["FamilySize"]=dataset["SibSp"]+dataset["Parch"]+1#每个FamilySize的生还均值train[['FamilySize','Survived']].groupby(['FamilySize'],as_index=False).mean().sort_values(by='Survived',ascending=False)根据字段FamilySize来判断是否Islone:如果家庭成员FamilySize是一个人,那肯定是Islone的,用1表示,否则用0表示
最后将Parch,SibSp,andFamilySize删除,仅保留是否一个人Islone:
#将Parch,SibSp,andFamilySize删除,仅保留是否一个人Islonetrain=train.drop(['Parch','SibSp','FamilySize'],axis=1)test=test.drop(['Parch','SibSp','FamilySize'],axis=1)combine=[train,test]train.head()生成新字段2新字段2是Age和Pclass的乘积:
Embarked字段取值有SQC。首先我们填充里面的缺失值
查看这个字段是存在缺失值的:
处理:找出众数、填充缺失值、查看每个取值的均值
将文本类型转成数值型:
训练集这个字段是没有缺失值,测试集中存在一个:
使用中值进行填充:
实行分箱操作:
将每个段转成数值型的数据:
下面是具体的建模过程,我们先划分数据集:
#训练集X_train=train.drop("Survived",axis=1)Y_train=train["Survived"]#测试集X_test=test.drop("PassengerId",axis=1).copy()X_train.shape,Y_train.shape,X_test.shape每个模型的具体过程:
#模型实例化logreg=LogisticRegression()#拟合过程logreg.fit(X_train,Y_train)#测试集预测Y_pred=logreg.predict(X_test)#准确率求解acc_log=round(logreg.score(X_train,Y_train)*100,2)acc_log#结果81.37逻辑回归模型得到的系数:
结论:性别对我们的生还真的是一个重要的影响因素
将上面9种模型的结果(准确率)进行对比:
通过对比结果:决策树和随机森林在这份数据集表现的效果是最好的;其次就是KNN(K近邻)算法。