Advertisement

kaggle泰坦尼克号生存预测

阅读量:

导入数据

复制代码
    train=pd.read_csv('train.csv')
    test=pd.read_csv('test.csv')
    train_test=pd.concat([train,test],ignore_index=True)
    
    
    python

查看数据

复制代码
    train_test.info()
    train_test.head()
    
    
    python
在这里插入图片描述
在这里插入图片描述

填充缺失值

年龄、船票价格、座舱号、登船港口 均存在缺失记录
登船港口
分析登船港口字段中的缺失数据所在记录:

复制代码
    train_test[train_test['Embarked'].isnull()==1]
    
    
    python
在这里插入图片描述

注意到这两个人的座位号跟车票号码都是一样的,并推测他们可能是同一团体的人,并认为他们很有可能在同一个港口下船。

复制代码
    train_test[train_test['Ticket'].str.contains('1135',na=False)]
    
    
    python
在这里插入图片描述

部分票号以1135开头的乘客可能从C或S港口上船。仅凭票号无法确定登船港口。进一步观察发现:当票号以1135开头且客舱号以B开头时,在登船记录中显示所有此类情况均来自C港。因此可推断该乘客应属于C港。

复制代码
    train_test['Embarked'].fillna('C',inplace=True)
    
    
    
    python

票价

复制代码
    train_test[train_test['Fare'].isnull()==1]
    
    
    powershell
在这里插入图片描述

填充思路:可以从座位等级入手,采用舱位等级为3的均值来替代

复制代码
    fare=train_test[train_test['Pclass']==3]['Fare'].mean()
    train_test['Fare'].fillna(fare,inplace=True)
    
    
    python

研究所有与年龄无关的因素是否可能间接反映年龄的信息。通过分析数据集中的各个字段特征,在姓名中发现了乘客头衔的信息。提取出这些乘客头衔的相关信息。

复制代码
    def name_tran(name):
    name=name.split(',')[1]
    name=name.split('.')[0]
    name=name.strip()
    return name;
    train_test['Name']=train_test['Name'].map(name_tran)
    train_test['Name'].value_counts()
    
    
    python
在这里插入图片描述

查看缺失值中,各个姓名种类的数量:

复制代码
    train_test[train_test['Age'].isnull()==1]['Name'].value_counts()
    
    
    python
在这里插入图片描述

用各个姓名种类的平均值来分别填充缺失值:

复制代码
    Name_mean=train_test.groupby('Name').Age.mean()
    train_test.set_index("Name",inplace=True)
    train_test["Age"].fillna(Name_mean,inplace=True)
    train_test.reset_index(inplace=True)
    
    
    python

客舱号
客舱号缺失值太多,这里选择直接删除:

复制代码
    train_test.drop('Cabin',axis=1,inplace=True)
    
    
    python

**

数据处理

**
移除Ticket、passengerId字段
passengerid仅作为表单序号存在
由于其具有大量离散值而难以分类的字段为Ticket

复制代码
    train_test.drop('Ticket',axis=1,inplace=True)
    train_test.drop('PassengerId',axis=1,inplace=True)
    train_test.info()
    
    
    python
在这里插入图片描述

SibSpParch分别表示船上的兄弟姐妹数量以及直系亲属的数量,并即相当于家庭人口数量。

复制代码
    train_test['Family']=train_test['SibSp']+train_test['Parch']
    train_test['Family'].value_counts()
    
    
    python
在这里插入图片描述

可以把家庭人口数 进行进一步的划分:
0~3:小型家庭
4~6:中型家庭
7~:大家庭

复制代码
    def Family_tran(family):
    if 0<=family<4:
        family=1;
    if 4<=family<7:
        family=2;
    if 7<=family:
        family=3;
    return family
    train_test['Family']=train_test['Family'].map(Family_tran)
    train_test.drop('SibSp',axis=1,inplace=True)
    train_test.drop('Parch',axis=1,inplace=True)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/c8mFPYrZfgdoAJ1jhiNkz0wLlX7b.png)

姓名
在上面讨论过姓名中包含着称呼,可以根据称呼对姓名进行划分:

复制代码
    train_test.replace(['the Countess','Jonkheer'],'noble',inplace=True)
    train_test.replace(['Major','Sir','Capt'],'official',inplace=True)
    train_test.replace(['Mrs','Dona','Mme'],'women',inplace=True)
    train_test.replace(['Miss','Ms','Mile','Lady'],'Lady',inplace=True)
    train_test.replace(['Master','Mr'],'man',inplace=True)
    train_test.replace(['Rev','Dr','Col','Don'],'Staff',inplace=True)
    
    
    python

船票价格
对(Fare)船票的价格进行划分:

复制代码
    train_test['Fare'].describe()
    
    
    python
在这里插入图片描述

根据价格分布,可以按下面几个等级划分:
0-15:低价
15-30:中等价格
30~:高价

复制代码
    def Fare_tran(fare):
    if 0<=fare <16:
        fare=1;
    if 16<= fare <30:
        fare=2;
    if 30<=fare:
        fare=3;       
    return fare
    train_test['Fare']=train_test['Fare'].map(Fare_tran)
    
    
    python

年龄
按照四个等级来划分年龄:
0~15:青少年和小孩
16~35:年轻人
36~60:中年人
60~:老年人

复制代码
    def Age_tran(age):
    if 0<=age<=15:
        age=1;
    if 15<age<36:
        age=2;
    if 36<=age<60:
        age=3;
    if 60<=age:
        age=4;
    return age
    train_test['Age']=train_test['Age'].map(Age_tran)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/U8eBDdl4a0KWXRngNPFMILZmCx1v.png)

将所有数值类型的属性改为object:

复制代码
    train_test['Pclass']=train_test['Pclass'].astype('object')
    train_test['Age']=train_test['Age'].astype('object')
    train_test['Fare']=train_test['Fare'].astype('object')
    train_test['Family']=train_test['Family'].astype('object')
    
    
    python

对所有属性建立虚变量

复制代码
    train_test_2=pd.get_dummies(train_test)
    
    
    python

模型学习

建立训练集

复制代码
    source_x=train_test_2.drop('Survived',axis=1).loc[:890,:]
    source_y=train_test_2.loc[:890,'Survived']
    pred_x=train_test_2.loc[891:,:]
    
    
    python

调用sklearn包进行训练:

复制代码
    from sklearn.model_selection import train_test_split
    train_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=.7)
    from sklearn.linear_model import LogisticRegression
    model=LogisticRegression()
    model.fit(train_x,train_y)
    model.score(test_x,test_y)
    
    
    python
在这里插入图片描述

得分83

预测并保存文件

复制代码
    pred_y=model.predict(pred_x.drop('Survived',axis=1))
    pred_y=pred_y.astype(int)
    passengerid=ty['PassengerId']
    pred_Df=pd.DataFrame(
    {'PassengerId':passengerid,
     'Survived':pred_y})
     pred_Df.to_csv('pred2.csv',index=False)
    
    
    python

最后上传kaggle

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~