热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python泰坦尼克号存活率分析

对泰坦尼克号的数据进行特征分析、数据清理、数据填充、处理分类特征、将连续特征转化为离散特征、合并特征、制作模型、模型预测importpandasaspdimportnumpya

对泰坦尼克号的数据 进行特征分析、数据清理、数据填充、处理分类特征、将连续特征转化为离散特征、合并特征、制作模型、模型预测

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#将警告不显示
import warnings
warnings.filterwarnings('ignore')#导入测试集和训练集
train_df=pd.read_csv('train.csv')
# train_df.head()
test_df=pd.read_csv('test.csv')
combine=[train_df,test_df]PassengerId=test_df['PassengerId']#因为后续会将该列删除 所以先对这一列数据进行备份

特征分析
分析存活率与几个因素之间的关系

#pclass与survived的关系
train_df[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Sex与survived的关系
train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#SibSp与Survived的关系
train_df[['SibSp','Survived']].groupby(['SibSp'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Parch与Survived的关系
train_df[['Parch','Survived']].groupby(['Parch'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Embarked与Survived的关系
train_df[['Embarked','Survived']].groupby(['Embarked'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#绘制年龄与死亡率、存活率的条形图
fig=plt.figure(figsize=(12,8))ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)age1=train_df.Age[train_df['Survived']==0]
age2=train_df.Age[train_df['Survived']==1]ax1.set_title('Survived=0')
ax1.hist(age1,bins=20)
ax1.set_xlabel('age')
ax1.set_yticks([10,20,30,40,50,60])ax2.set_title('Survived=1')
ax2.hist(age2,bins=20)
ax2.set_xlabel('age')
ax2.set_yticks([10,20,30,40,50,60])
#定义同一规格的y轴 方便查看死亡与存货的区别plt.show()

在这里插入图片描述

#fare和Survived 绘制图像
fare=train_df.Fare[train_df['Survived']==1]
plt.hist(fare)
plt.show()

在这里插入图片描述
数据清理

#删除无用特征
train_df=train_df.drop(['Ticket','Cabin'],axis=1)
test_df=test_df.drop(['Ticket','Cabin'],axis=1)
combine=[train_df,test_df]
train_df.head()

#创建新特征train_df.Name.str.extract(' ([a-zA-Z]+)\.',expand=False)
#通过正则表达式 将姓名中与性别有关的称呼截取出来 创建为新的特征for database in combine:database['Title']=database.Name.str.extract(' ([a-zA-Z]+)\.',expand=False)pd.crosstab(train_df['Title'],train_df['Sex'])
#crosstab 交叉提取列 两个参数(列,行)

在这里插入图片描述

#分类title 归为几个大类
for database in combine:database['Title']=database['Title'].replace(['Lady','Countess','Capt','Col','Don','Dr','Major','Rev','Sir','Jonkheer','Dona'],'Rare')#将出现次数少的归类为Rare一类database['Title']=database['Title'].replace('Mlle','Miss')#将表达为同一意思的称呼归为一类database['Title']=database['Title'].replace('Ms','Miss')database['Title']=database['Title'].replace('Mme','Mrs')
#replace函数 两个参数(被替换内容,替换后内容) train_df[['Title','Survived']].groupby(['Title'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#删除无用两列数据
train_df.drop(['PassengerId','Name'],axis=1,inplace=True)
test_df.drop(['PassengerId','Name'],axis=1,inplace=True)
combine=[train_df,test_df]
train_df

数据填充

#快速查找缺失值
train_df.info()

在这里插入图片描述
从图中会发现 Age 和 Embarked 都有缺失值

#填充Embarked特征(缺失值较少 利用众数进行填充)
freq=train_df.Embarked.dropna().mode()[0]
#mode 显示数量最多的数for database in combine:database.Embarked=database.Embarked.fillna(freq)

#填充Age(缺失值较多 不可以用众数填充 需通过其他特征填充值)
grp = train_df.groupby(['Pclass','Sex','Title'])['Age'].mean().reset_index()#定义一个新函数 填充缺失值
def fill_age(x):return grp[(grp['Pclass']==x['Pclass']) & (grp['Sex']==x['Sex']) & (grp['Title']==x['Title'])].Age.values[0]#如果缺失值的三个条件满足平均的三个条件,即填充对应的Age值#用lambda 定义另一个简单的新的函数 判断Age值是否缺失
train_df['Age'] = train_df.apply(lambda x: fill_age(x) if np.isnan(x['Age']) else x['Age'] ,axis=1)
test_df['Age'] = test_df.apply(lambda x: fill_age(x) if np.isnan(x['Age']) else x['Age'] ,axis=1)
combine = [train_df,test_df]

处理分类特征
将数据根据分类转化为数字 0.1.2.3…

#处理sex 将数据转化为1和0
for database in combine:database['Sex'] = database['Sex'].map({'female':1,'male':0}).astype(int)

#处理Title
title_mapping = {'Mr':1 ,'Miss':2 ,'Mrs':3 ,'Master':4 ,'Rare':5}
for database in combine:database['Title'] = database['Title'].map(title_mapping).astype(int)

在这里插入图片描述
将连续特征转化为离散特征
将连续的数据 分为几组\几类

#处理Age离散化#将age分为五组 准确分组
train_df['AgeBand'] =pd.cut(train_df['Age'],5)
train_df['AgeBand']

在这里插入图片描述
通过切割数据 可以将Age准确的分为五个组 并将不同组用1.2.3.4.5代替

for database in combine:database.loc[ database[&#39;Age&#39;] <16,&#39;Age&#39;]&#61;0database.loc[(database[&#39;Age&#39;] >&#61;16)&(database[&#39;Age&#39;] <32),&#39;Age&#39;]&#61;1database.loc[(database[&#39;Age&#39;] >&#61;32)&(database[&#39;Age&#39;] <48),&#39;Age&#39;]&#61;2database.loc[(database[&#39;Age&#39;] >&#61;48)&(database[&#39;Age&#39;] <64),&#39;Age&#39;]&#61;3database.loc[ database[&#39;Age&#39;] >&#61;64,&#39;Age&#39;]&#61;4train_df.drop([&#39;AgeBand&#39;],axis&#61;1,inplace&#61;True)
combine&#61;[train_df,test_df]
train_df

利用qcut处理Fare的数据

#处理Fare &#xff08;不可用cut均分的方法 使用qcut 根据数量均等分&#xff09;
train_df[&#39;FareBand&#39;]&#61;pd.qcut(train_df[&#39;Fare&#39;],4,duplicates&#61;&#39;drop&#39;)#处理test_df中的缺失值&#xff08;因为缺失1个&#xff0c;所以选择平均值填充&#xff09;
test_df[&#39;Fare&#39;] &#61; test_df[&#39;Fare&#39;].fillna(test_df[&#39;Fare&#39;].mean())for dataset in combine:dataset.loc[ dataset[&#39;Fare&#39;] <&#61;7.91,&#39;Fare&#39;]&#61;0dataset.loc[(dataset[&#39;Fare&#39;] >7.91)&(dataset[&#39;Fare&#39;] <&#61;14.454),&#39;Fare&#39;]&#61;1dataset.loc[(dataset[&#39;Fare&#39;] >14.454)&(dataset[&#39;Fare&#39;] <&#61;31),&#39;Fare&#39;]&#61;2dataset.loc[dataset[&#39;Fare&#39;] >31,&#39;Fare&#39;]&#61;3dataset[&#39;Fare&#39;] &#61; dataset[&#39;Fare&#39;].astype(int)train_df.drop([&#39;FareBand&#39;],axis&#61;1,inplace&#61;True)
combine&#61;[train_df,test_df]
train_df

在这里插入图片描述

合并特征


将SibSp(兄弟姐妹配偶)和Parch(父母)两组数据合并为一组Family
后借助family判断是否为一个人出行IsAlong


for database in combine:database[&#39;Family&#39;]&#61;database[&#39;SibSp&#39;] &#43; database[&#39;Parch&#39;] &#43; 1# train_df.head()for database in combine:database[&#39;IsAlong&#39;]&#61;1database.loc[database[&#39;Family&#39;]>1,&#39;IsAlong&#39;]&#61;0train_df.drop([&#39;SibSp&#39;,&#39;Parch&#39;,&#39;Family&#39;],inplace&#61;True,axis&#61;1)
test_df.drop([&#39;SibSp&#39;,&#39;Parch&#39;,&#39;Family&#39;],inplace&#61;True,axis&#61;1)train_df

在这里插入图片描述
制作模型

#选择变量
X_train &#61; train_df.drop(&#39;Survived&#39;,axis&#61;1)
Y_train &#61; train_df[&#39;Survived&#39;]

#逻辑回归模型
from sklearn.linear_model import LogisticRegressionlogreg &#61; LogisticRegression()#实例化 调用
logreg.fit(X_train,Y_train)#fit拟合模型
Y_pred &#61; logreg.predict(test_df)#利用predict进行预测
acc_log &#61; round(logreg.score(X_train,Y_train)*100)#round函数--四舍五入 保留两位小数#支持向量机 SVC
from sklearn.svm import SVCsvc &#61; SVC()
svc.fit(X_train,Y_train)
Y_prd &#61; svc.predict(test_df)
acc_svc &#61; round(svc.score(X_train,Y_train)*100,2)#决策树
from sklearn.tree import DecisionTreeClassifierdecision_tree &#61; DecisionTreeClassifier()
decision_tree.fit(X_train,Y_train)
Y_pred &#61; decision_tree.predict(test_df)
acc_decision_tree &#61; round(decision_tree.score(X_train,Y_train)*100,2)#随机森林
from sklearn.ensemble import RandomForestClassifierrandom_forest &#61; RandomForestClassifier()
random_forest.fit(X_train,Y_train)
Y_pred &#61; random_forest.predict(test_df)
acc_random_forest &#61; round(random_forest.score(X_train,Y_train)*100,2)#K阶近邻
from sklearn.neighbors import KNeighborsClassifierknn &#61; KNeighborsClassifier()
knn.fit(X_train,Y_train)
Y_pred &#61; knn.predict(test_df)
acc_knn &#61; round(knn.score(X_train,Y_train)*100,2)#朴素贝叶斯
from sklearn.naive_bayes import GaussianNBgaussian &#61; GaussianNB()
gaussian.fit(X_train,Y_train)
Y_pred &#61; gaussian.predict(test_df)
acc_gaussian &#61; round(gaussian.score(X_train,Y_train)*100,2)

将模型根据评分进行排名

models &#61; pd.DataFrame({ #采用字典&#39;Modle&#39;:[&#39;Logistic Regression&#39;,&#39;Support Vector Machines&#39;,&#39;KNN&#39;,&#39;Naive Bayes&#39;,&#39;Decision Tree&#39;,&#39;Random Forest&#39;],&#39;Score&#39;:[acc_log,acc_svc,acc_knn,acc_gaussian,acc_decision_tree,acc_random_forest]
})
models.sort_values(by&#61;&#39;Score&#39;,ascending&#61;False)

在这里插入图片描述
模型预测
有以上模型的排名情况 可选择决策树对数据进行预测

#决策树
from sklearn.tree import DecisionTreeClassifierdecision_tree &#61; DecisionTreeClassifier()
decision_tree.fit(X_train,Y_train)
Y_pred &#61; decision_tree.predict(test_df)
acc_decision_tree &#61; round(decision_tree.score(X_train,Y_train)*100,2)#定义一个新的变量 为预测后的值
submission &#61; pd.DataFrame({&#39;PassengerId&#39;:PassengerId,&#39;Survived&#39;:Y_pred
})#将结果输出为文件
submission.to_csv(&#39;submission.csv&#39;,index&#61;False)
submission

在这里插入图片描述


推荐阅读
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在试用版软件中,为了提升用户体验并有效提醒用户剩余的使用次数,本文通过Java IO文件操作实现了一个试用版软件的使用次数提示机制。具体而言,每次启动软件时,程序会读取存储在文件中的剩余使用次数,并在每次执行后更新该数值。当用户启动软件时,系统会显示当前剩余的使用次数,确保用户清楚了解自己的试用状态。该机制不仅提高了软件的友好性,还增强了用户的购买意愿。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
author-avatar
牛奶香橙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有