文章目录
1. 数据集获取、分割
kaggle 上有数据集,但是我只找到了训练集没有找到测试集合,所以我准备将训练集中的一部分拿出来当作测试集,以下是我分割训练集和测试集的代码。
下载网址: https://www.kaggle.com/chickgod/train-tatanic
- 原文件叫
tatanic.csv
- 训练集文件叫
tatanic_train.csv
- 测试集文件叫
tatanic_test.csv
import csv
import pandas as pd
# 把全部的数据读进来
with open('tatanic.csv','r') as f:
o_file = csv.reader(f)
# 每 8 个数据抽取一个做测试集
counter = 0
for row in o_file:
if counter % 8 == 0:
with open('tatanic_test.csv','a',newline='') as f2:
writer = csv.writer(f2)
writer.writerow(row)
else:
with open('tatanic_train.csv','a',newline='') as f3:
writer = csv.writer(f3)
writer.writerow(row)
counter += 1
## 这样操作之后,原来 csv 的标题行会被写入 tatanic_test.csv 中,但是不会写入 tatanic_train.csv 中
## 所以这里需要在 tatanic_train.csv 文件中重新加上标头行
csv_file = pd.read_csv('tatanic.csv')
title_line = csv_file.columns
train_file = pd.read_csv('tatanic_train.csv', header=None)
train_file.columns = title_line
train_file.to_csv('tatanic_train.csv')
错误写法:
csv_file = pd.read_csv('tatanic.csv')
title_line = csv_file.columns
train_file = pd.read_csv('tatanic_train.csv', header=None)
train_file.to_csv('tatanic_train.csv',columns=title_line)
不可以直接在写入 csv 文件的时候指定 column,原因我也不知道是什么,总之大家注意一下
2. 数据的可视化
2.1 生还者和没生还者的比例
## 生还的人和没生还的比例
csv_doc = pd.read_csv('tatanic.csv')
df = pd.DataFrame(csv_doc)
survive = df['Survived']
static_data = survive.value_counts()
print(static_data)
x_axis = [str(i) for i in static_data.keys()]
y_axis = static_data.values
plt.bar(x_axis,y_axis)
plt.show()
2.2 年龄分布
#######年龄分布
age_info = df['Age']
plt.hist(age_info,bins=20,color='skyblue')
plt.show()
2.3 性别分布
#### 男女比例
sex_info = df['Sex']
statistic_data = sex_info.value_counts()
x_axis = [i for i in statistic_data.keys()]
y_axis = statistic_data.values
plt.bar(x_axis,y_axis)
plt.show()
2.3 所有变量的相关性
corr_metrix = df.corr(method='pearson')
print(corr_metrix)
sns.heatmap(corr_metrix,annot=True,cmap=palettable.cmocean.diverging.Curl_10.mpl_colors)
# sns.heatmap(corr_metrix,annot=True)
plt.show()
3. 数据预处理
import pandas as pd
# 有些特征没有用可以直接过滤掉,比如 passengerID,Name,Ticket
def processing(df_doc):
df_result = pd.DataFrame()
#### Pclass 转成one-hot编码
df_doc_Pclass = pd.get_dummies(df_doc['Pclass'])
df_doc_Pclass.columns = ['Pclass' + str(i) for i in df_doc_Pclass.columns]
df_result = pd.concat((df_result,df_doc_Pclass),axis=1)
#### Name 不要了
#### sex 转换成独热码
df_doc_Sex = pd.get_dummies(df_doc['Sex'])
df_result = pd.concat((df_result,df_doc_Sex),axis=1)
#### age 不需要转换直接添加, 因为存在空值,所以需要加一项辅助判断是否有空值
df_result = pd.concat((df_result,df_doc['Age'].fillna(0)),axis=1)
df_age_is_null = df_doc['Age'].isna().astype('int32')
df_result['Age_is_null'] = df_age_is_null
print(df_result)
#### SibSp Parch Fare 作为数字特征直接搬过来 Ticket 不重要,直接舍去
df_result = pd.concat((df_result,df_doc['SibSp'],df_doc['Parch'],df_doc['Fare']),axis=1)
#### 对于 cabin 这一列的空值,我们不进行填充,但是增加辅助列 cabin_null 作为辅助特征
df_result['Cabin_null'] = pd.isna(df_doc['Cabin']).astype('int32')
#### embarked 一共分三类用独热编码处理
df_doc_embarked = pd.get_dummies(df_doc['Embarked'])
df_result = pd.concat((df_result,df_doc_embarked),axis=1)
print(df_result)
return df_result
if __name__ == '__main__':
df_doc_train = pd.read_csv('tatanic_train.csv')
df_doc_train = pd.DataFrame(df_doc_train)
df_doc_test = pd.read_csv('tatanic_test.csv')
df_doc_test = pd.DataFrame(df_doc_test)
df_train_data = processing(df_doc_train)
df_train_label = df_doc_train['Survived'].values
df_test_data = processing(df_doc_test)
df_test_label = df_doc_test['Survived'].values
注释写的挺详细的,需要的自己看一下吧~
4. 建立模型
import tensorflow as tf
from tensorflow.keras import layers, models
def model(train_data,train_label):
model = models.Sequential()
model.add(layers.Dense(20, activation='relu', input_shape=(15,)))
model.add(layers.Dense(40, activation='relu'))
model.add(layers.Dense(80, activation='relu'))
model.add(layers.Dense(40, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=["AUC"])
record = model.fit(train_data,train_label, batch_size=64, epochs=30, validation_split=0.2)
return model, record
特别注意,这里一定要用
tensorflow.keras
而不要直接从keras
里面import layer
模块和models
模块,否则会报以下错误:
raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. "
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
- 模块导入的时候改成
from tensorflow.keras import models, layers
问题就解决了- 在训练模型 fit 的时候,我们用
record
变量来接受这个训练的过程,把所有的训练的信息都保存在了record
里,可以方便后面用record
里的数据来进行作图
5. 训练模型
model, record = model(df_train_data,df_train_label)
训练的部分是用 fit
函数来进行的,这里调用刚才定义的 model 进行训练 ,训练后返回 model 和 record;
6. 查看训练过程数据
loss = record.history['loss']
auc = record.history['auc']
val_loss = record.history['val_loss']
val_auc = record.history['val_auc']
print(loss)
print(auc)
print(val_loss)
print(val_auc)
注意!! 只有在
fit
函数里面设置了validation_split
才会有val_loss
和val_auc
否则只有loss 和 auc
7. 训练数据可视化
- 将要画的数据通过
pandas
进行结构化处理;- 这里把
loss
和val_loss
放在一个dataframe
里- 使用
seaborn
这个库来进行图像绘制,是matplotlib
的更高级封装,画出的图更好看,更强大
###### loss 曲线
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame({'loss':loss,'val_loss':val_loss})
sns.scatterplot(data=df)
sns.lineplot(data=df)
plt.show()
##### auc 曲线 #### val_auc 曲线
df2 = pd.DataFrame({'auc':auc,'val_auc':val_auc})
sns.scatterplot(data=df2)
sns.lineplot(data=df2)
plt.show()
8. 模型保存
8.1 Keras 的方式保存和读取
8.1 Keras 方式保存模型(不能跨平台,只能python使用)
#### 整个模型保存
model.save('./model.h5')
#### 只保存权重
model.save_weights('./model_weights.h5')
#### 保存模型结构
structure = model.to_json()
8.2 Keras 方式重新加载模型和参数
#### 重新加载模型结构和参数
model = models.load_model('./model.h5')
evaluation = model.evaluate(df_test_data,df_test_label)
#### 重新加载参数
#(1) 需要先重新恢复模型的结构
model_structure = models.model_from_json(json_string=structure)
model_structure.compile( # 重新把所有的模块连接起来并指定优化器、损失和 metrics
optimizer='adam',
loss='binary_crossentropy',
metrics=['AUC']
)
#(2) 再载入模型的参数
model_structure.load_weights('./model_weights.h5')
# 用加载出来的模型进行评估测试
evaluation = model_structure.evaluate(df_test_data,df_test_label)
8.2 Tensorflow 原生的方式保存和读取
- 存储的时候,只是在后面多了个参数设置
save_format = 'tf'
tensorflow
存储权重的时候有后缀ckpt
但是存储整个模型的时候是存到一个文件夹里面- 读取的时候还是用的
tensorflow
中的keras
的模块来进行加载
9. 写在后面
以上所有模块都是在 30天吃掉那只 tensorflow 的源代码基础上进行重写,重新思考和添加或删减的,如果有错误或者不能精准实现功能,请自行进行调整,毕竟每个人的思路都不是一样的,有错误望指正