【参考:1-01 实战 泰坦尼克号沉船人员获救案例 数据清洗_哔哩哔哩_bilibili】
【参考:Titanic - Machine Learning from Disaster | Kaggle】
分析
实战
【参考:机器学习/Kaggle/泰坦尼克号/第一版 随机森林算法实现.ipynb · myaijarvis/AI - Gitee.com】
参考:《Tensorflow和keras-深度学习人工智能实践应用》
第11、12章
GitHub:点我
部分封装函数请看文章:【keras】1. MNIST手写数据集识别(重要)_myaijarvis notebook-CSDN博客
文章:【keras】2. CIFAR-10图像识别_myaijarvis notebook-CSDN博客
数据预处理
分析数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(10)
filepath="titanic3.xls"
读取数据并查看
all_df=pd.read_excel(filepath)
以上字段中的 ticket(船票号码)、 cabin(舱位号码),我们认为与要预测的结果 survived
(是否生存)关联不大,所以我们将其忽略,只选择下列字段到 Dataframe中。
clos=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df=all_df[clos]
进一步处理
df=all_df.drop(['name'],axis=1) # 去掉name
df.isnull().sum() # 查看有哪些属性有null值
age_mean=df['age'].mean()
df['age']=df['age'].fillna(age_mean) # 给age属性中的null填充平均值
fare_mean=df['fare'].mean()
df['fare']=df['fare'].fillna(fare_mean) # 给fare属性中的null填充平均值
df['sex']=df['sex'].map({'female':0,'male':1}).astype(int) # 将sex属性值转换为0,1
x_OneHot_df=pd.get_dummies(data=df,columns=['embarked']) # 将embarked属性值C、Q、S做一位有效编码转换
标准化
from sklearn import preprocessing
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1)) # 设置标准化范围(0,1)
scaledFeatures=minmax_scale.fit_transform(Features) # 对所有字段进行标准化
划分数据集
msk=np.random.rand(len(all_df))<0.8
train_df=all_df[msk] # 训练集
test_df=all_df[~msk] # 测试集 ~是取反符号
代码合集
有了以上的分析后可以封装一下过程
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(10)
def PreprocessData(raw_df):
df=raw_df.drop(['name'],axis=1)
age_mean=df['age'].mean()
df['age']=df['age'].fillna(age_mean)
fare_mead=df['fare'].mean()
df['fare']=df['fare'].fillna(fare_mead)
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
Label=ndarray[:,0]
Features=ndarray[:,1:]
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))
scaledFeatures=minmax_scale.fit_transform(Features)
return scaledFeatures,Label
filepath="titanic3.xls"
all_df=pd.read_excel(filepath)
clos=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df=all_df[clos]
msk=np.random.rand(len(all_df))<0.8
train_df=all_df[msk] # 训练集
test_df=all_df[~msk] # 测试集 ~是取反符号
train_Features,train_Label=PreprocessData(train_df)
test_Features,test_Label=PreprocessData(test_df)
MLP
训练
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense,Dropout
model=Sequential()
model.add(Dense(units=40 # 神经元个数 也是输出维度
,input_dim=9 # 输入维度 数据预处理后只有9个特征
,kernel_initializer='uniform' # 随机初始化参数w和b
,activation='relu'))
model.add(Dense(units=30,kernel_initializer='uniform',activation='relu'))
model.add(Dense(units=1
,kernel_initializer='uniform'
,activation='sigmoid'))
model.summary()
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=1)
评估
加入数据
Jack=pd.Series([0,'Jack',3,'male',23,1,0,5.0000,'S'])
Rose=pd.Series([1,'Rose',1,'female',20,1,0,100.0000,'S'])
JR_df=pd.DataFrame([list(Jack),list(Rose)]
,columns=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked'])
all_df=pd.concat([all_df,JR_df]) # 合并
all_features,Label=PreprocessData(all_df) # 数据处理
all_probability=model.predict(all_features) # 预测
预测前10位的存活率
# 接下来,我们将 all_df(姓名与所有特征字段)与 all_probability(预测结果)整合产生pd Dataframe
pd=all_df # 复制一份
pd.insert(len(all_df.columns),'probability',all_probability)
两位主角的存活率
背后的故事
pd[(pd['survived']==0)&(pd['probability']>0.9)] # 生存概率大于0.9却没有存活
图12-4的数据中, Allison,Mis. Helen Loraine与 Allison,Mrs. Hudson J C都是 Allison家族的人,他们依照我们的模型生存概率高,可是却没有存活,到底发生了什么事呢?
真实沉船中 Allison家族的故事是, Allisonー家人共有4位成员,即爸爸(30岁)、妈妈(25岁)、一个两岁的女儿 Loraine以及一个不满一岁的婴儿 Trevor。他们全家加上一名护士( Alice Cleaver)乘坐邮轮返回加拿大蒙特利尔。
因为搭乘救生艇女士优先,原本妈妈可以带着女儿与小婴儿上救生艇,但是因为找不到婴儿 Trevor,所以坚持不愿意上救生艇,而在船上到处寻找婴儿,最后全家一起在船上沉没。
然而命运捉弄人的是,原来小婴儿 Trevor早就被护士( Alice Cleaver)带上救生艇,但是没有告知 Allison家人,导致全家人都找不到婴儿。最后 Allison全家只有不满一岁的小婴儿 Trevor存活,但是失去了所有亲人。还好后来小婴儿 Trevor回到加拿大,由他的叔叔婶婶抚养长大。