数据文件:
链接:https://pan.baidu.com/s/1H3QBVLPv4WeUnIYH92OKEA?pwd=wh77
提取码:wh77
数据描述:
RMS 泰坦尼克号的沉没是历史上最为人熟知的海难事件之一。 1912 年 4 月 15 日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在船上的 2224 名乘客和机组人员中,共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会,从而促进了船舶安全规定的完善。
造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管在沉船事件中幸存下有一些运气因素,但有些人比其他人更容易存活下来,比如女人,孩子和上流社会。
在这个挑战中,要求完成哪些人可能存活下来的分析。特别的,要求运用机器学习工具来预测哪些乘客能够幸免于悲剧。titanic数据集的目标是根据乘客信息预测他们在Titanic号撞击冰山沉没后能否生存。
如图:
共有 11 个特征:
读取数据:
import pandas as pd
dftrain_raw = pd.read_csv('train.csv')
dftest_raw = pd.read_csv('test.csv')
dftrain_raw.head(10)
如下:
利用Pandas的数据可视化功能我们可以简单地进行探索性数据分析EDA(Exploratory Data Analysis):
import matplotlib.pyplot as plt
ax = dftrain_raw['Survived'].value_counts().plot(kind = 'bar',
figsize = (12,8),fontsize=15,rot = 0)
ax.set_ylabel('Counts',fontsize = 15)
ax.set_xlabel('Survived',fontsize = 15)
plt.show()
ax = dftrain_raw['Age'].plot(kind = 'hist',bins = 20,color= 'purple',
figsize = (12,8),fontsize=15)
ax.set_ylabel('Frequency',fontsize = 15)
ax.set_xlabel('Age',fontsize = 15)
plt.show()
删除不相关的两列:
df1=dftrain_raw.drop(['Name','Ticket'], axis=1)
df1.head(10)
df1.describe()
df1.isnull().sum()
dfresult= pd.DataFrame()
dfPclass = pd.get_dummies(dftrain_raw['Pclass']) # 标准化
dfPclass.columns = ['Pclass_' +str(x) for x in dfPclass.columns ] # 列名
dfresult = pd.concat([dfresult,dfPclass],axis = 1)
dfresult
dfSex = pd.get_dummies(dftrain_raw['Sex']) #性别编码
dfresult = pd.concat([dfresult,dfSex],axis = 1)
dfresult
dfresult['Age'] = dftrain_raw['Age'].fillna(0)
dfresult['Age_null'] = pd.isna(dftrain_raw['Age']).astype('int32')
dfresult['SibSp'] =dftrain_raw['SibSp']
dfresult['Parch'] = dftrain_raw['Parch']
dfresult['Fare'] = dftrain_raw['Fare']
dfresult['Cabin_null'] = pd.isna(dftrain_raw['Cabin']).astype('int32')
dfEmbarked = pd.get_dummies(dftrain_raw['Embarked'],dummy_na=True)
dfEmbarked.columns = ['Embarked_' + str(x) for x in dfEmbarked.columns]
dfresult = pd.concat([dfresult,dfEmbarked],axis = 1)
dfresult
y= dftrain_raw['Survived'].values
y
x=dfresult
分割数据:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=100)
选择使用最简单的Sequential,按层顺序模型:
import tensorflow as tf
from tensorflow.keras import models,layers
tf.keras.backend.clear_session()
model = models.Sequential()
model.add(layers.Dense(20,activation = 'relu',input_shape=(15,)))
model.add(layers.Dense(10,activation = 'relu' ))
model.add(layers.Dense(1,activation = 'sigmoid' ))
model.summary()
训练模型通常有3种方法,内置fit方法,内置train_on_batch方法,以及自定义训练循环。此处我们选择最常用也最简单的内置fit方法:
# 二分类问题选择二元交叉熵损失函数
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['AUC'])
history = model.fit(X_train,y_train,
batch_size= 64,
epochs= 30,
validation_split=0.2 #分割一部分训练数据用于验证
)
评估一下模型在训练集和验证集上的效果:
import matplotlib.pyplot as plt
def plot_metric(history, metric):
train_metrics = history.history[metric]
val_metrics = history.history['val_'+metric]
epochs = range(1, len(train_metrics) + 1)
plt.plot(epochs, train_metrics, 'bo--')
plt.plot(epochs, val_metrics, 'ro-')
plt.title('Training and validation '+ metric)
plt.xlabel("Epochs")
plt.ylabel(metric)
plt.legend(["train_"+metric, 'val_'+metric])
plt.show()
plot_metric(history,"loss")
plot_metric(history,"auc")
model.evaluate(x = X_test,y = y_test)
预测前十个值:
model.predict(X_test[0:10])
#model(tf.constant(x_test[0:10].values,dtype = tf.float32)) #等价写法
预测类别:
import numpy as np
predictions = np.argmax(model.predict(X_test[:10]),axis=1)
predictions
可以使用Keras方式保存模型,也可以使用TensorFlow原生方式保存。前者仅仅适合使用Python环境恢复模型,后者则可以跨平台进行模型部署。因此推荐第二种方法。
第一种:
保存模型结构及权重:
# 保存模型结构及权重
model.save('keras_model.h5')
del model #删除现有模型
# 加载保存的模型
model = models.load_model('keras_model.h5')
model.evaluate(X_test,y_test) # 评估
# 保存模型结构
json_str = model.to_json()
# 恢复模型结构
model_json = models.model_from_json(json_str)
保存模型权重
#保存模型权重
model.save_weights('keras_model_weight.h5')
# 恢复模型结构
model_json = models.model_from_json(json_str)
model_json.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['AUC']
)
# 加载权重
model_json.load_weights('keras_model_weight.h5')
model_json.evaluate(X_test,y_test)
第二种: TensorFlow原生方式保存
保存权重,该方式仅仅保存权重张量:
model.save_weights('tf_model_weights.ckpt',save_format = "tf")
保存模型结构与模型参数到文件,该方式保存的模型具有跨平台性便于部署:
model.save('tf_model_savedmodel', save_format="tf")
print('export saved model.')
model_loaded = tf.keras.models.load_model('tf_model_savedmodel')
model_loaded.evaluate(X_test,y_test)