该项目为机器学习入门最经典的项目,通过对泰坦尼克号上人员信息的分析,预测哪些人更可能生还。其中包含三个数据集:训练集,测试集和提交样本示例。

训练集:用于模型训练,共包含12列信息。

PassengerID:乘客ID;

Survived:生存与否(1表示生存,0表示死亡)

Pclass:船舱等级(1最好,2其次,3最差)

Name:乘客姓名

Sex:用户性别(male:男性;female:女性)

Age:用户年龄

Parch:用户直系亲属人数(配偶/子女/父母)

SibSp:用户近亲人数(除直系外的亲属)

Ticket:船票

Fare:船票价格

Cabin:船舱号

Embarked:登船港口

测试集也是预测集,检验训练的模型分类的正确率,没有生存列,共十一列。将预测的结果上传至Kaggle项目中,即可得到对应的得分和排名。

一、导入数据

导入数据后可先通过.head(), .describe(), .info()等描述统计信息对整个数据集有个基本的认识,了解到各列的数据类型,最大最小值,是否有缺失异常值等等。

首先通过图表来看看几个主要因素与生存之间的关系。

1、性别与生存的关系

import matplotlib.pyplot as plt

train_data.groupby('Sex').agg('mean')[['Died','Survived']].plot(kind='bar',stacked=True,color=['#8C888A','#FDE18A'])

plt.title('性别与生存的关系图')

plt.xlabel('性别')

plt.ylabel('生存')

plt.show()

图中明显可以看出,女性的生存率达到7成,而男性只有2成,因此女性比男性更容易存活。

2、船舱级别与生存的关系

train_data.groupby('Pclass').agg('mean')[['Died','Survived']].plot(kind='bar',stacked=True,color=['#8C888A','#FDE18A'])

plt.title('船舱级别与生存的关系图')

plt.xlabel('船舱级别')

plt.ylabel('生存')

plt.show()

其中级别1船舱等级最高,级别3船舱等级最低。 级别1的生存率要略高于级别2,级别3的生存率最低,死亡人数最多。 而船舱级别基本可以一定程度上反应乘客的收入,阶级等,可以认为,越有钱阶级越高的人生存的概率越大。所以船舱级别也是影响生存的一个重要特征。

2.1 进一步分析船舱与性别与生存关系

#data = pd.DataFrame()

train_data.groupby(['Pclass','Sex']).agg('sum')[['Died','Survived']].plot(kind='bar',stacked=True,color=['#8C888A','#FDE18A'])

plt.title('船舱级别和性别与生存的关系图')

plt.xlabel('船舱级别与性别')

plt.ylabel('生存')

plt.show()

从这个图能更清晰的看到,级别1和2中的女性几乎都能生还,级别3中的女性生还也不少。级别3男性的死亡概率最高。

3、船票价格与生存率的关系

data = train_data.ix[:,['Fare','Survived']]

plt.hist([data[data.Survived==1]['Fare'],data[data.Survived==0]['Fare']],bins=30,color=('#FDE18A','#8C888A'),stacked=True)

plt.title('船票与生存的关系')

plt.xlabel('船票价格')

plt.ylabel('生存')

plt.show()

可见,船票价格越高,生存率比例越高。由于低船票的人数众多,虽然生存率低,但生存人数也相对较多。所以船票可能不能很好的作为特征,可以作为参考。

二、数据清洗

下面将训练集与测试集结合起来对数据进行清洗

# 将训练集与测试集结合起来进行数据清洗

full = train_data.append(test_data,ignore_index=True)

full.shape

(1309, 13)

# 12列中 取出survived列,作为目标标签,去掉passengerID列,无用

target = train_data.Survived

#full.drop('Survived',axis=1,inplace=True)

full.drop('PassengerId',axis=1,inplace=True)

full.head()

首先对Name列进行处理,注意到姓名列中基本由三部分组成,姓、名、头衔,因此我们将其中的头衔提取出来。

# 从name列中提取出title,查看训练集中共有多少title

name=set()

for i in train_data['Name']:

name.add(i.split(',')[1].split('.')[0].strip())

print(name)

{'Mme', 'Capt', 'Mrs', 'Don', 'Mr', 'Dr', 'Col', 'Jonkheer', 'Ms', 'Major', 'Rev', 'the Countess', 'Master', 'Miss', 'Sir', 'Mlle', 'Lady'}

# 从name列中提取出title

def gettitles(name):

return name.split(',')[1].split('.')[0].strip()

titleDf=pd.DataFrame()

titleDf['title'] = full['Name'].map(gettitles)

titleDf.head()

# 将title合并为6个

title_mapDict = {

"Capt": "Officer",

"Col": "Officer",

"Major": "Officer",

"Jonkheer": "Royalty",

"Don": "Royalty",

"Sir" : "Royalty",

"Dr": "Officer",

"Rev": "Officer",

"the Countess":"Royalty",

"Mme": "Mrs",

"Mlle": "Miss",

"Ms": "Mrs",

"Mr" : "Mr",

"Mrs" : "Mrs",

"Miss" : "Miss",

"Master" : "Master",

"Lady" : "Royalty"

}

full['title'] = titleDf['title'].map(title_mapDict)

# 成功从Name中提取出title并增加到full列表中

接下来对年龄列进行处理,由于年龄中有不少缺失值,考虑到年龄和性别、客舱等级、头衔关系较大,因此用其对应的平均值来填入对应的空值中。

# 年龄中有很多缺失值,其中与年龄相关的参数主要考虑为:性别,客舱级别和头衔,用其平均值来填充对应人群的年龄。

Age_class = full.ix[:890,:].groupby(['Sex','Pclass','title'])

Age_mean = Age_class.mean().sort_values(by=['Sex','Pclass','title']) # groupby之后求mean,是对满足groupby条件的其余所有数值类型的列求均值

Age_mean = Age_mean.reset_index()[['Sex','Pclass','title','Age']] # reset_index后取出该4列

# 用求得的年龄值取填对应空值

def fill_age(row):

condition = (

(row['Sex']==Age_mean['Sex'])&

(row['Pclass']==Age_mean['Pclass'])&

(row['title']==Age_mean['title'])

)

return Age_mean[condition]['Age'].values[0] #返回的是列表形式,所以需选出其中的值。

# a function that fills the missing values of the Age variable

full['Age'] = full.apply(lambda row: fill_age(row) if np.isnan(row['Age']) else row['Age'], axis=1)

4、年龄与生存的关系

# 取出年龄与生存这两列的训练数据

AgeDf = full.ix[0:890,['Age','Survived']]

plt.hist([AgeDf[AgeDf.Survived==1]['Age'],AgeDf[AgeDf.Survived==0]['Age']],stacked=True,color=('#FDE18A','#8C888A'),bins=30)

plt.title('年龄与生存率的关系图')

plt.xlabel('年龄')

plt.ylabel('生存情况')

plt.show()

船上以20-40岁的人居多,因此相比于这个年龄段的年轻人,18岁以下的未成年人生存率明显更高。结合之前对性别的分析,18岁以上的生存人数中肯定女性占大部分。

对船票列进行数据处理,填充缺失值。

# 对Fare 缺失值填充, Fare与Age Pclass有较强相关

Fare_mean = full.ix[:890,:].groupby(['Age','Pclass']).mean()

Fare_mean = Fare_mean.reset_index()[['Age','Pclass','Fare']]

full[full['Fare'].isnull().values==True]

# 可看到测试集中Fare为NAN数据的年龄60.5并没有在训练集中出现过

# 所以我们采用60+ 年龄,PClass=3 的年龄平均值来填充

'''Fare_mean_over60=Fare_mean[Fare_mean.Age>60]Fare_mean_over60=Fare_mean_over60.groupby(['Pclass']).mean()Fare_mean_over60=Fare_mean_over60.reset_index()[['Pclass','Age','Fare']]Fare_mean_over60'''

full['Fare']=full['Fare'].fillna(11.637752)

对登船港口进行缺失值填充

# 对Embarked 进行空值填充

# 查看空值信息

full[full['Embarked'].isnull().values==True]

# 可看出,其没有亲属朋友,头等舱乘客大都在C和S港口登船

Embarked_count = full.ix[:890].groupby(['Embarked','Pclass']).count()

Embarked_count

# 各港口头等舱船费的中位数

Embarked_count = full.ix[:890].groupby(['Embarked','Pclass']).median()

Embarked_count

# 可见,C的船费更接近80

full['Embarked']=full['Embarked'].fillna('C')

# 再填充cabin,因缺失较多,因此用U (Unknown)来填充

full['Cabin']=full['Cabin'].fillna('U')

下面对亲属列进行统一处理

# 删除name列

full.drop('Name',axis=1,inplace=True)

# 查看parch共有多少;

parch = set()

for i in full['Parch']:

parch.add(i)

parch

{0, 1, 2, 3, 4, 5, 6, 9}

# 查看Parch和SibSp,因他们都是对乘客亲属人数的统计,所以查看他们的和

def sum(x,y):

return x+y+1

full['reletive']=sum(full['Parch'],full['SibSp'])

count = set()

for i in full['reletive']:

count.add(i)

print(count)

{1, 2, 3, 4, 5, 6, 7, 8, 11}

'''家庭类别:小家庭Family_Single:家庭人数=1中等家庭Family_Small: 2<=家庭人数<=4大家庭Family_Large: 家庭人数>=5'''

full['Family_Single']=full['reletive'].map(lambda s: 1 if s==1 else 0)

full['Family_Small']=full['reletive'].map(lambda s: 1 if 2<=s<=4 else 0)

full['Family_Large']=full['reletive'].map(lambda s: 1 if s>=5 else 0)

full.drop(['Parch','SibSp'],axis=1,inplace=True)

full

full.drop('reletive',axis=1,inplace=True)

full.shape

(1309, 32)

# Fare进行处理

'''full['Fare_one']=full['Fare'].map(lambda s: 1 if s<=10 else 0)full['Fare_two']=full['Fare'].map(lambda s: 1 if 10

full['Fare_free']=full['Fare'].map(lambda s : 1 if s==0 else 0)

full['Fare_low'] = full['Fare'].map(lambda s : 1 if 0

full['Fare_medium'] = full['Fare'].map(lambda s : 1 if 10

full['Fare_high'] = full['Fare'].map(lambda s : 1 if 30

full['Fare_super'] = full['Fare'].map(lambda s : 1 if s>80 else 0 )

full.drop('Fare',axis=1,inplace=True)

最后对ticket列进行处理。

'''对ticket列进行特征提取,首先先了解ticket列里都有哪些特征观察到ticket列里的字符串有各种类型,里面还有各种符号。因此,首先先把里面的符号都去掉。'''

full['Ticket'] = full['Ticket'].replace('/','',regex=True)

full['Ticket'] = full['Ticket'].replace('\.','',regex=True)

def split_ticket(ticket):

return ticket.split(' ')

full['Ticket'] = full['Ticket'].map(split_ticket)

full['Ticket']

# 对分割好后的Y 取出不全为数字的元素

ticket=[]

for i in full['Ticket']:

if len(i)>1:

ticket.append(i[0])

else:

ticket.append('XX')

full['Ticket'] = ticket

# 成功将ticket列分割好后,进行one-hot编码

Y = pd.DataFrame()

Y = pd.get_dummies(full['Ticket'],prefix='Ticket')

# 合并

full = pd.concat([full,Y],axis=1)

full.drop('Ticket',axis=1,inplace=True)

对处理好后的列进行二值处理或one-hot编码后,删除重复列,即完成。

最后得到了68列特征。

接下来就要这些特征进行选择与提取

三、特征提取与建模

我选择的是随机森林作为分类模型,因此在特征提取中我们也使用了随机森林方法进行特征选择,因其具有特征重要度这个指标,所以可以通过该指标来对特征进行排序,从而选择出重要度高的一些特征作为输入。

# 选出原始数据集特征

train = full.loc[:890]

test = full.loc[891:]

'''# 采用随机森林模型进行特征选择from sklearn.ensemble import RandomForestClassifierimport matplotlib.pyplot as pltclf = RandomForestClassifier(n_estimators=200,oob_score = -1)clf = clf.fit(train,target)

将得到的结果绘出图形如上所示,是根据每个特征对生存标签的影响重要程度来排列的。我们使用SelectFromModel进行特征选择。选择好后,采用网格搜索法对随机森林的参数进行调参,找到最优的参数组合。具体代码如下:

# 选择特征。

from sklearn.feature_selection import SelectFromModel

model = SelectFromModel(clf,threshold ='median',prefit=True)

train_reduced = model.transform(train)

train_reduced.shape

(891, 34)

# 测试集同样用transform选择特征

test_reduced = model.transform(test)

test_reduced.shape

(418, 34)

'''使用随机森林模型作为分类器,采用网格搜索法进行调参。'''

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import GridSearchCV

from sklearn.model_selection import StratifiedKFold

# 首先给出参数可能值字典

para_grid={

'max_features':['sqrt','auto','log2'],

'n_estimators':[50,100,200],

'min_samples_leaf':[1,3,10],

'min_samples_split':[2,5,10],

'max_depth':[4,6,8],

'oob_score':['False','True']

}

# 确定调参的算法模型

forest_model = RandomForestClassifier()

# 5折随机生成交叉验证集

cross_validation = StratifiedKFold(n_splits=5)

# 确定网格搜索参数

grid_search=GridSearchCV(

forest_model,

param_grid = para_grid,

scoring='accuracy',

cv = cross_validation,

verbose=1

)

# 训练模型

grid_search.fit(train_reduced,target)

model = grid_search

parameters = grid_search.best_params_

print('best score: {}'.format(grid_search.best_score_))

print('best parameters: {}'.format(parameters))

model = RandomForestClassifier(**parameters)

model.fit(train_reduced,target)

将测试集带入到训练好的模型中即可,将结果上传后的排名为700多名,排名前8%。

小结:

通过这次项目实践基本掌握使用python进行机器学习的过程,包括数据处理,特征选择与提取,模型训练与调参等等。最后的结果也还算不错。想要获得更高的排名,不仅要优化模型,对特征的进一步研究与提取也是很关键的,还有很多东西要学习,我在学习过程中也从网上很多大牛那里学到了不少,边做边学习,对机器学习感兴趣的朋友也欢迎一起交流,共同进步。

python泰坦尼克号生存预测论文_Kaggle 泰坦尼克号生存预测--8%(Python)相关推荐

  1. python泰坦尼克号生存预测论文_泰坦尼克号生存率预测(基于Python)

    背景:泰坦尼克号(RMS Titanic)是英国白星航运公司下辖的一艘奥林匹克级邮轮,于1909年3月31日在爱尔兰贝尔法斯特港的哈兰德与沃尔夫造船厂动工建造.她是当时世界上体积最庞大.内部设施最豪华 ...

  2. zillow房价预测比赛_Kaggle竞赛 —— 房价预测 (House Prices)

    这个比赛总的情况就是给你79个特征然后根据这些预测房价 (SalePrice),这其中既有离散型也有连续性特征,而且存在大量的缺失值.不过好在比赛方提供了data_description.txt这个文 ...

  3. python泰坦尼克号生存预测论文_【数据分析】预测泰坦尼克号存活率 -- Python决策树...

    此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉. 前言 最近学习了 预测泰坦尼克号存活率,是一个烂大街的项目了,它是kaggle科学竞赛网站上一个入门的数据分析 ...

  4. python数据分析实战:生存分析与电信用户流失预测

    文章目录 1.背景 1.1 生存分析.KM曲线及Cox回归 1.2 案例背景 2.AIC向前逐步回归法进行特征选择 3.Cox模型搭建 3.1 特征重要性分析 3.2 模型校准 3.3 对个体进行预测 ...

  5. 利用R语言对泰坦尼克号沉没事件幸存者的数据分析与预测

    题外话:在文章正式开始之前,我还是想先写一点题外话,一是为了引出写作这篇博客的目的,二则是希望能够记录下现在的所思所想为以后留个纪念.首先介绍一下自己,毕业3年多的小硕一枚,大学期间学的专业是高分子材 ...

  6. 泰坦尼克号上的乘客是否生还的预测分析

    1 本文是以<Python机器学习及实践 从零开始通往kaggle竞赛之路>为参考书籍进行的实践 通过随机分类模型以及XGBoost模型进行泰坦尼克号上的乘客是否生还的预测分析 2 实验代 ...

  7. 泰坦尼克号预测python_kaggle:泰坦尼克号获救预测_Titanic_EDA##

    问题 数据来源于Kaggle,通过一组列有泰坦尼克号灾难幸存者或幸存者的训练样本集,我们的模型能否基于不包含幸存者信息的给定测试数据集确定这些测试数据集中的乘客是否幸存. 代码与数据分析 导入必要的包 ...

  8. 在jupytor中运行随机森林预测泰坦尼克旅客生存情况

    在jupytor中运行随机森林预测泰坦尼克旅客生存情况 数据集链接链接: link. 百度网盘:链接: https://pan.baidu.com/s/1_pQ-3iG4dr0hrvU_5hYUtg ...

  9. python 用模型预测数据 代码_万字案例 | 用Python建立客户流失预测模型(含源数据+代码)...

    客户流失是所有与消费者挂钩行业都会关注的点.因为发展一个新客户是需要一定成本的,一旦客户流失,成本浪费不说,挽回一个客户的成本更大. 今天分享一个用户流失预测,以电信行业为例. 所以,电信行业在竞争日 ...

  10. 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

    更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详 ...

最新文章

  1. Windows10下安装unbuntu双系统 以及花屏解决办法
  2. PlaceHolder 控件使用
  3. 新一轮全球“太空竞赛”正上演 争夺几万亿美元大蛋糕
  4. java整合redis集群_SpringBoot2.X整合Redis(单机+集群+多数据源)-Lettuce版
  5. 【unity】拓展自定义编辑器窗口(二)
  6. OpenCV配置选项参考
  7. c++中调用Com组件的方法详解
  8. 地图图元的闪烁效果制作
  9. centos 安装jdk_centos7配置jdk
  10. html中表单的校验的插件,功能强大的jquery.validate表单验证插件
  11. 【LeetCode】【HOT】21. 合并两个有序链表(递归)
  12. c语言变量名由啥组成,一个c语言是由什么构成
  13. Python面向对象——继承
  14. 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
  15. php startup memcache,centos php 安装memcache模块
  16. DHT分布式哈希表通俗讲解
  17. python mysql 优化_Python之MySQL优化(上)
  18. mysql admin php_apache+php+mysql+phpadmin 服务环境搭建
  19. java学习笔记参考
  20. 惠勒延迟选择实验(转)

热门文章

  1. php+bmp+加密,郁闷啊,谁知道BMP图片加密技术吗
  2. 今日头条网页数据采集接口
  3. liunx基础知识篇 偏指令
  4. android+状态栏显示图标大全,状态栏中的Android显示图标
  5. Linux进程虚拟内存大 性能,Linux进程分析(一) 虚拟内存和物理内存
  6. 【saltstack】认证失败,无法生成minion_master.pub问题处理总结
  7. 中芯国际三季度营业收入创新高;德州仪器与德赛西威签署合作备忘录 | 全球TMT...
  8. 黎曼的zeta函数(1)
  9. 云计算时代IT产业六大发展趋势
  10. hive查看表中列的信息命令_Linux查看硬件信息之dmidecode命令详解