首页 > 其他分享 >泰坦尼克号旅客生存概率预测

泰坦尼克号旅客生存概率预测

时间:2023-03-10 13:34:06浏览次数:36  
标签:泰坦尼克号 Features 生存 df age pclass 旅客 train history

数据预处理

加载数据集

import numpy as np
import pandas as pd
all_df =  pd.read_csv("titanic.csv")

部分数据

 

提取所需要的列

cols=['survived','name','pclass','sex','age','embarked']#定义所需要的列
all_df=all_df[cols] #返回指定的列
all_df[:2]

处理完之后的部分数据

 

删除名字列

因为名字作为特征对预测没有任何作用

df=all_df.drop(['name'],axis=1)

数据填充并替换

在年龄字段中,有些人的年龄数据丢失了,要补上,补上的方法就是使用平均年龄。使用dataframe['column'].mean()函数处理

在舱位字段中,因为舱位是以'1st','2nd','3rd'方式保存,要输入到神经网络中,应当是转为数值

在性别字段中,都是用female和male表示,因此也要转换为整数,使用dataframe.map({映射表})函数处理

出发地有多种,可以转换为独热编码表示,使用pandas的get_dummies(dataframe,要转换的column)函数处理。

age_mean=df['age'].mean() #计算年龄均值
df['age']=df['age'].fillna(age_mean) #填充空白年龄
df['pclass']=df['pclass'].fillna('3rd') #填充空白舱位
df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int) #将舱位根据映射表转换为整数
df['sex']=df['sex'].map({'female':0,'male':1}).astype(int) #将性别根据映射表转换为整数
x_OneHot_df=pd.get_dummies(data=df,columns=['embarked'])#将出发地转换为独热编码表示

 将DataFrame转换为矩阵表示

ndarray=x_OneHot_df.values

拆分特征集和标签集 

DataFrame中可以发现,第一列都是是否生还,用0和1表示,作为标签集,之后的列都是作为特征

Label = ndarray[:,0] # ':'表示第一维的全部数据,0表示第二维的第0项
Features = ndarray[:,1:] # ':'表示第一维的全部数据,1:表示第二维的第1项以及之后所有项

 

将数据进行标准化

MinMaxScaler((范围)).fit_transform(矩阵) 函数可以将数据标准化,缩放到指定区间,使用时要先指定区间、再用

from sklearn import preprocessing
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))
scaledFeatures=minmax_scale.fit_transform(Features)

 分离训练集和验证集

msk = np.random.rand(len(all_df)) < 0.8  #rand(n),表示生成n个0到1之间的随机数,小于0.8的作为boolan值True,是一个数组
print(msk) #对于每一项数据,都产生了一个bool类型索引 
train_df = all_df[msk] #索引True加入到训练集 
test_df = all_df[~msk] #索引为False的加入到测试集

 np.random.rand(n) 会产生n个随机数,是一个数组

np.random.rand(n) < 0.8 则是将数组内小于0.8的作为True,大于0.8的作为False,这样就得到了一个Boolean类型数组,与n个随机数一一对应。

经过上述转换后,Boolean数组可以作为数据中的索引。

dataframe中可以使用bool索引,将索引为true的都返回。

 

将上述数据处理过程打包成一个函数

输入参数为一个数据集,返回这个数据集的特征集 以及 标签集

def PreprocessData(raw_df):
    df=raw_df.drop(['name'],axis=1) #删除名字一列
    age_mean=df['age'].mean() #求年龄的平均值
    df['age']=df['age'].fillna(age_mean) #用平均值填补空白的年龄
    df['pclass']=df['pclass'].fillna('3rd')  #将舱位空的用3rd填充
    df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int) #将舱位映射到整数1,2,3
    df['sex']=df['sex'].map({'female':0,'male':1}).astype(int) #性别映射到整数1,2
    x_OneHot_df=pd.get_dummies(data=df,columns=['embarked']) #出发地改成独热编码表示
    ndarray=x_OneHot_df.values #将DataFrame转换为矩阵表示
    Label = ndarray[:,0] #将所有项的第0列作为标签
    Features = ndarray[:,1:] #将所有项的第1列以及以后的所有列作为特征集
    minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))#设置数据缩放尺度为0到1区间
    scaledFeatures=minmax_scale.fit_transform(Features) #对Feature转换到0到1区间
    return scaledFeatures,Label #返回压缩后的特征集以及标签集

 

建立模型

建立数据处理函数

from sklearn import preprocessing
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1)) #指定压缩的目标区间
def PreprocessData(raw_df):
    df=raw_df.drop(['name'],axis=1)
    age_mean=df['age'].mean()
    df['age']=df['age'].fillna(age_mean)
    df['pclass']=df['pclass'].fillna('3rd')
    df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int)
    df['sex']=df['sex'].map({'female':0,'male':1}).astype(int)
    x_OneHot_df=pd.get_dummies(data=df,columns=['embarked'])
    ndarray=x_OneHot_df.values #将DataFrame转换为矩阵表示
    Label = ndarray[:,0] #将所有项的第0列作为标签
    Features = ndarray[:,1:] #将所有项的第1列以及以后的所有列作为特征集
    minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))#设置数据缩放尺度为0到1区间
    scaledFeatures=minmax_scale.fit_transform(Features) #对Feature转换到0到1区间
    return scaledFeatures,Label #返回压缩后的特征集以及标签集

数据预处理

import urllib.request
import os
import numpy as np
import pandas as pd
all_df =  pd.read_csv("titanic.csv")
cols=['survived','name','pclass','sex','age','embarked']
all_df=all_df[cols]
msk = np.random.rand(len(all_df)) < 0.8  #rand(n),表示生成n个0到1之间的随机数,小于0.8的作为boolan值True,是一个数组
print(msk) #对于每一项数据,都产生了一个bool类型索引 
train_df = all_df[msk] #索引True加入到训练集 
test_df = all_df[~msk] #索引为False的加入到测试集
train_Features,train_Label = PreprocessData(train_df) #分离出训练集中的 特征集 和 标签集
test_Features,test_Label=PreprocessData(test_df)   #分离出测试集中的 特征集 和 标签集

建立并训练模型

from keras.models import Sequential
from keras.layers import Dense,Dropout
import matplotlib.pyplot as plt
def show_train_history(history,train,validation):
    plt.plot(history.history[train])
    plt.plot(history.history[validation])
    plt.title('Train_History')
    plt.xlabel('Epoch')
    plt.ylabel(train)
    plt.legend(['train','validation'],loc='upper left')
    plt.show()
model = Sequential()
model.add(Dense(units=40,
               input_dim=6,
               kernel_initializer='uniform',
               activation='relu'))
model.add(Dense(units=30,
               kernel_initializer='uniform',
               activation='relu'))
model.add(Dense(units=1,
               kernel_initializer='uniform',
               activation='sigmoid'))
model.compile(loss='binary_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
train_history = model.fit(x=train_Features,
                         y=train_Label,
                         validation_split=0.1,
                         epochs=30,
                         batch_size=30,
                         verbose=2)

输出训练历史

show_train_history(train_history,'accuracy','val_accuracy')
show_train_history(train_history,'loss','val_loss')

 

 

评估模型准确率

scores=model.evaluate(x=test_Features,
                     y=test_Label)
print('模型准确率:',scores[1])

加入数据并处理数据

创建Jack和Rose数据,合并到所有数据中并预测

Jack = pd.Series([0,'Jack','3rd','male',23,'Southampton'])
Rose = pd.Series([1,'Rose','1st','female',20,'Southampton'])
JR_df = pd.DataFrame([list(Jack),list(Rose)],
                    columns=['survived','name','pclass','sex','age','embarked'])
all_df=pd.concat([all_df,JR_df])
all_Features,Label = PreprocessData(all_df)

输出所有预测概率

all_probability = model.predict(all_Features)
print(all_probability)

 将预测概率与原表合并

Uniondf=all_df
Uniondf.insert(len(all_df.columns),'probability',all_probability)

查看生存概率大于90%但是死亡的人数据

Uniondf[(Uniondf['survived']==0) & (Uniondf['probability']>0.9) ]

 

标签:泰坦尼克号,Features,生存,df,age,pclass,旅客,train,history
From: https://www.cnblogs.com/RedNoseBo/p/17201617.html

相关文章