【机器学习kaggle赛事】泰坦尼克号生存预测

目录

写在前面

 数据集情况查看

数据清洗

Embarked:

Fare

Age

Cabin

 特征工程

1,探究Sex与Survived的相关性 

2,探究Pcalss与Survived的关联性 

3,Embarked:不同的上船地点对生存率是否有影响 

​4,Name与Survived的相关性

 5,Cabin与Survived之间的相关性

6,探究孤身一人和有家人陪伴的生存率(SibSp,Parch)

 7、探究年龄Age与Survived的相关性

8、Fare与Survived之间的相关性

特征选择 

构建包含最终选择特征的数据集

 分割训练数据和测试数据

构建训练集和数据集 

不同模型对比  

通过决策树看各个特征的重要性

模型训练


写在前面

回顾这个项目的基本流程:

1、查看数据集,合并训练集测试集以一起进行数据清洗 

2、数据清洗:查看数据集空缺值,并填充空缺值

3、探索性可视化:通过透视表和图表,探究各个特征与label(需要预测的值)的相关性,若有相关性则保留。

4、特征工程:

  • 若特征为离散型特征(类别型特征)(Name,Pclass,Embarked,Sex等),则进行独热编码,若特征为连续型数值(Fare,Age),则对特征数值进行分组,并对不同组别进行赋值,再进行Ont_hot编码处理
  • 属性几乎相同的多个特征(如SibSp: 乘客在船上的兄妹姐妹数/配偶数,Parch: 乘客在船上的父母数/子女数都属于亲人),在分别探究其与label的相关性决定保留后,可以将它们重组为新的特征。

 4、特征选择:通过相关系数来选择

 数据集情况查看

 将训练数据与测试数据连接起来,以便一起进行数据清洗。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
 
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
    
    # 这里需要注意的是,如果没有后面的ignore_index=True
    #那么index的值在连接后的这个新数据中是不连续的 继续从 0开始,如果要按照index删除一行数据,可能会发现多删一条。
full = pd.concat([train, test], ignore_index=True)
full.head()  # 默认显示5行
 

PassengerId: 乘客ID;

Survived: 生存情况,0代表不幸遇难,1代表存活;

Pclass: 仓位等级,1为一等舱,2为二等舱,3为三等舱;

Name: 乘客姓名;

Sex: 性别;

Age: 年龄;

SibSp: 乘客在船上的兄妹姐妹数/配偶数(即同代直系亲属数);

Parch: 乘客在船上的父母数/子女数(即不同代直系亲属数);

Ticket: 船票编号;

Fare: 船票价格;

Cabin: 客舱号;

Embarked: 登船港口(S: Southampton; C: Cherbourg Q: Queenstown)

#查看字符型数据情况:
full.describe(include=['O'])

full.describe().T

#describe()函数只能查看数据类型的描述统计信息,无法查看类似字符类型的信息。
#故需用info()函数进一步查看每一列的数据信息。
full.info()

数据清洗

print(full.isnull().sum()) # 查看数据的缺失情况
PassengerId       0
Survived        418
Pclass            0
Name              0
Sex               0
Age             263
SibSp             0
Parch             0
Ticket            0
Fare              1
Cabin          1014
Embarked          2
dtype: int64

缺失值 Age 263, Fare 1 ,Cabin 1014, Embarked 2

Embarked:

分类数据,使用最常见的类别取代,用众数填充。

#用众数填补Embarked    
#查看众数
full.Embarked.mode()
full['Embarked'].fillna('S',inplace=True)

Fare

船票费用是类别数据,但是不同客舱的票价不同 ,用Fare空缺所在的客舱号的票价中位数来填充


#填补Fare空缺值,用Pclass==3的客舱票价的中位数来填充
full[full.Fare.isnull()]#查看Fare缺失值的信息,获得Pclass
full.Fare.fillna(full[full.Pclass==3]['Fare'].median(),inplace=True)

Age

用中位数来填充年龄
如果是数值类型,使用平均值或者中位数进行填充

#年龄(Age) 最小值为0.17,不存在0值,其数据缺失率为263/1309=20.09%,由于Age的平均数与中位数接近,故选择平均值作为缺失项的填充值。
full.Age.fillna(full.Age.mean(),inplace = True)
# full['Age']=full['Age'].fillna(full['Age'].mean())
full.Age.describe()
'''count    1309.000000
mean       29.881138
std        12.883193
min         0.170000
25%        22.000000
50%        29.881138
75%        35.000000
max        80.000000
Name: Age, dtype: float64'''

Cabin

  • 1,用U来填充,表示unkown

字符串类型,按照实际情况填写,无法追踪的信息,用”Unknow”填充。处理Cabin缺失值 U代表Unknow

 full['Cabin'] = full['Cabin'].fillna('U')
  • 2缺失个数:

687 超过75%的数据缺失,故不打算填补。考虑以Cabin是否缺失来构建一个新特征,看是否对生存有影响。若没有影响,则删除该列

full.Cabin.isnull().sum()
#1014

#创造新特征Cabin_exist,判断Cabin与Survived的相关性,相关性不大则删除
full['Cabin_exist'] = full['Cabin'].map(lambda x:"Yes" if type(x)==str else "No")# 判断类型是否相等
full[["Cabin_exist", "Survived"]].groupby("Cabin_exist",as_index=False).mean()
Cabin_exist Survived
0 No 0.299854
1 Yes 0.666667
full =full.drop('Cabin_exist',axis = 1)
full.head()

#将字符转换为数值
full['Cabin_exist'] = full['Cabin'].map(lambda x: 1 if type(x)==str else 0)
full = full.drop('Cabin',axis = 1)
full.head()

# full.loc[full.Cabin.notnull(),'Cabin'] = 1
# full.loc[full.Cabin.isnull(),'Cabin'] = 0
# full.Cabin.isnull().sum()#验证填充效果

sns.barplot(x="Cabin_exist",y="Survived",data=full)
full.isnull().sum()
#数据处理完毕

full.head()

 特征工程

1,探究Sex与Survived的相关性 

'''======================================================特征工程========================================================================'''
#1,探究Sex与Survived的相关性
full[['Sex','Survived']].groupby('Sex',as_index = False).mean().sort_values('Survived',ascending = False)
sns.countplot(x = 'Sex',hue = 'Survived',data =full)

#Sex(性别),将字符映射到字符
sex_dict = {'male': 1,'female':0}
full['Sex'] = full['Sex'].map(sex_dict)
full['Sex'].head()

full[["Pclass","Sex","Survived"]].groupby(["Pclass","Sex"],as_index=False).mean().sort_values(by="Survived",ascending=False)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值