泰坦尼克号生存预测python_用Python预测泰坦尼克生存情况-附数据集

介绍:通过逻辑回归算法,解决kaggle网站上的泰坦尼克生存情况预测问题,准确率在80%左右。

一、提出问题

什么样的人在泰坦尼克号中更容易存活?

二、理解数据

2.1 数据来源

数据来自kaggle,为方便大家联习,已经上传至百度云,点击下载就即可。

提取码:g474

2.2 导入数据

#忽略警告提示

import warnings

warnings.filterwarnings('ignore')

#导入数据

import pandas as pd

train_file = pd.read_csv('Titanic-master/Titanic-master/train.csv')

test_file = pd.read_csv('Titanic-master/Titanic-master/test.csv')

#数据集信息

train_file.shape

print("训练数据集信息",train_file.shape,'测试数据集信息',test_file.shape)

测试数据集比训练数据集少一列,是因为测试数据集里没有生存情况这一列,这一列是需要我们通过构建模型进行预测的。

#将两个表合并一起处理数据

full_data=train_file.append(test_file,ignore_index = True)

full_data.info()

各个字段信息对应的意思如下

三、数据集清理

包括数据预处理和特征工程两部分。

首先进行数据预处理:选择子集,导入研究问题需要的变量

列名重命名(如果列名不符合使用习惯)

缺失值处理

数据类型转换(比如将字符串类型的销售数量转换为数值类型)

数据排序(排序可以帮助我们发现更多有价值的信息)

异常值处理(比如数值超过定义范围)

从上文对数据集的初步分析可以知道,只需要对数据集中的缺失值和异常值进行处理即可,因为机器学习中的特征的传入值不能是空值。

# 数据的清洗

#缺失值的填充

#age 用平均值填充 fillna 需要返回一个值

full_data['Age'] = full_data['Age'].fillna(full_data['Age'].mean())

full_data.info()

#embarked 缺少较少,用最大众数填充

full_data['Embarked'].value_counts()

#S 填充空值

full_data['Embarked']=full_data['Embarked'].fillna('S')

full_data['Embarked'].shape

#cabin 缺失值较大,用unknow的u填充

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

full_data['Cabin'].shape

因为生存情况Survived属于标签,是用来做学习预测的,所以不需要进行处理。

接下来进行特征工程:

特征工程就是最大限度的从原始数据中提取特征,以供机器学习算法和模型使用。

“数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限”

#sex 男 0 女 1

sex_number ={'male': 0,'female':1}

full_data['Sex']=full_data['Sex'].map(sex_number)

full_data.head()

登船港口Embarked:

使用数据框的get_dummies对登船港口进行one-hot编码

#embarked

embarked_onehot=pd.DataFrame()

embarked_onehot=pd.get_dummies(full_data['Embarked'],prefix='Embarked')

embarked_onehot.head()

#将embarked添加到表中

full_data.drop('Embarked',axis =1,inplace=True)

full_data=pd.concat([full_data,embarked_onehot],axis=1)

full_data.head()

#pclsss

pclass_onehot=pd.DataFrame()

pclass_onehot=pd.get_dummies(full_data['Pclass'],prefix='Pclass')

pclass_onehot.head()

#将pclass并入到表中

full_data=pd.concat([full_data,pclass_onehot],axis=1)

full_data.drop('Pclass',axis=1,inplace = True)

full_data.head()

cabin,需要提取首字母,可以看出船舱号首字母是船舱类别,可以提取出首字母作为船舱类别。

# cabin 需要截取第一个作为特征

full_data['Cabin']=full_data['Cabin'].map(lambda x:x[0:1])

cabin_onehot = pd.DataFrame()

cabin_onehot=pd.get_dummies(full_data['Cabin'],prefix='Cabin')

cabin_onehot.head()

#合并

full_data=pd.concat([full_data,cabin_onehot],axis=1)

#删除cabin列

full_data.drop('Cabin',axis= 1,inplace= True)

full_data.head()

家庭大小familysize:除了以上比较明显的分类数据之外,还可以通过对数据进行处理得到新的分类数据,比如通过计算家庭成员的多少来进行家庭大小分类。

有两个变量SibSp(同代直系亲属数),Parch(不同代直系亲属数),将这两个变量相加,再加上乘客自己,就可以得到家庭人数。

首先定义一个空的数据框,用来存放处理之后的家庭类别数据,再通过map()函数和lambda条件判断,得出家庭类别

# 称呼对应头衔

#忽略 Name 这一块

#继续处理家庭的大小 = Parch+SibSp+1

family_df = pd.DataFrame()

family_df['family_size']=full_data['Parch']+full_data['SibSp']+1

family_df.describe()

# family_single 一个人 family_normal 2-4人 family_large >5

family_df['family_single']=family_df['family_size'].map(lambda x: 1 if x == 1 else 0)

family_df['family_normal']=family_df['family_size'].map(lambda x : 1 if x >=2 and x<=4 else 0)

family_df['family_large']=family_df['family_size'].map(lambda x: 1 if x >=5 else 0)

family_df.head()

#合并

full_data=pd.concat([full_data,family_df],axis=1)

# 特征提取后的结果

full_data.shape

2 特征选择

特征提取已经完成,接下来进行特征选取,这里用最简单的方法:相关系数方法,来筛选特征。

首先用df.corr()生成相关系数矩阵

#生成相关系数矩阵

full_corr=full_data.corr()

full_corr.head()

#排序

full_corr['Survived'].sort_values(ascending=False)

#合并正相关和负相关比较大的特征

full_s=pd.concat([full_data['Sex'],full_data['Fare'],pclass_onehot,family_df,cabin_onehot,embarked_onehot],axis=1)

full_s.head()

四、 构建模型

Kaggle上提供了两个数据集train.csv和test.csv。实质上train.csv是作为原始数据,供我们来训练模型评估模型的,test.csv为预测数据,里面没有包含生存情况,需要我们用模型进行预测并将结果提交给kaggle的。为了后文分析方便,将train.csv称为原始数据集sourse,test.csv称为预测数据集predict。

# 构建模型

# 提取 source 原始数据 predict 测试数据

print('训练数据的大小:',train_file.shape,'测试数据的大小:',test_file.shape)

source_x=full_s.loc[0:890,:]

source_y=full_data.loc[0:890,'Survived']

predict_x=full_s.loc[891:,:]

print('原始数据大小',source_x.shape,'预测数据大小',predict_x.shape)

再从原始数据中拆分出训练数据和测试数据:

from sklearn.cross_validation import train_test_split

#将测试数据分割成测试数据和训练数据 ,比例0.8

train_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=0.8)

通过查看原始数据的标签,可以发现泰坦尼克号的生存情况预测属于一个二分分类的情况,本文利用最简单的逻辑回归算法。

#导入逻辑回归模型

from sklearn.linear_model import LogisticRegression

#构建逻辑回归模型

model = LogisticRegression()

#训练模型

model.fit(train_x,train_y)

五 模型评估

测试数据查看模型准确率:

#查看准确度

model.score(test_x,test_y)

用模型对预测数据进行预测:

#模型评估

#预测survived

predict_x.head()

predict_y=model.predict(predict_x)

predict_y=predict_y.astype(int)

#合并表

passage_id=full_data.loc[891,'PassengerId']

predf= pd.DataFrame({'PassengerId':passage_id,'Survived':predict_y})

predf.head()

predf.shape

#导出csv

predf.to_csv('titanic_pred.csv',index=False)

end.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值