• Titanic 泰坦尼克号预测-Tensorflow 方法-【Kaggle 比赛】


    本文介绍Kaggle入门比赛Titanic泰坦尼克号幸存预测的解题思路,使用的是神经网络和Tensorflow框架。提交代码附在本文的最后部分。

    基本思路为:

    1. 导入数据集
    2. 对数据预处理
    3. 训练
    4. 预测并输出结果

    一、入门介绍

    1. 比赛介绍

            Kaggle是一个数据建模和数据分析竞赛平台。

            泰坦尼克号幸存预测是Kaggle上的一个入门级比赛,利于平台给的数据集,预测泰坦尼克号上不同乘客的幸存情况,并熟悉机器学习基础知识。

    2. 板块介绍

    Titanic比赛的主页-Kaggle
    Titanic比赛的主页-Kaggle

    比赛地址:Titanic - Machine Learning from Disaster

    Titanic - Machine Learning from Disasterhttps://www.kaggle.com/competitions/titanic

    Kaggle的主页面如上,我们主要关注 Overview、Data 和 Submit Predictions 三个板块

    • Overview: 比赛的基本介绍
    • Data: 数据集的结构和字段介绍,在这里可以下载所需要的数据集
    • Submit Predictions: 提交预测结果,并查看本次比赛的分数

    其他板块如 Code 可以查看其他团队分享的代码,Discussion 是解题思路的分享,Leaderboard 是分数排行榜。

    3. 平台提交流程

    1. 首先在 data 板块中点击“Download All”下载训练集和测试集
    2. 训练集附带真实结果,而测试集是用来做预测并提交结果
    3. 编写代码预测后,按照要求的格式在 Submit Predictions 上传结果,并查看本次提交的分数与排名

    二、方法介绍

    1.理解需求

    比赛很简单:创建一个模型,预测哪些乘客在泰坦尼克号沉船中幸存下来。
    下载下来的数据包括三个文件:训练集(train.csv), 测试集(test.csv), 提交示例(gender_submission.csv)

    • 训练集(train.csv):用于神经网络进行训练的数据集,包含真实结果列(Survival)
    • 测试集(test.csv):训练好模型后,用此文件中数据进行预测得到结果
    • 提交示例(gender_submission.csv):最终提交结果的格式示例,包含 PassengerId 和 Survived 两列

    2.数据预处理

    • 可以用各种工具(pandas、Excel 和 Kaggle 自带表格等)分析训练集的数据,判断每一列的数据类型和是否有空缺等情况
    • 去除对结果不影响的列
    • 对空缺的单元进行填充

    3.构建模型

    • 使用 keras 的 Sequence 模型
    • 隐藏层使用 relu 激活函数

    4.模型评估

    • 使用 keras 的 compile, fit, evaluate 方法进行训练和评估
    • 使用 keras 的 predict 方法预测结果,并将结果按提交示例形成 csv 文件输出

    三、编码过程

    • 首先在 data 板块中点击“Download All”下载训练集和测试集

    1.导入数据 load_data

    • 使用 pandas 的 read_csv 方法,导入数据 load_data
    1. # 提前将所有包引入
    2. import pandas as pd
    3. import numpy as np
    4. import tensorflow as tf
    5. from tensorflow.python.keras import activations
    6. import matplotlib.pyplot as plt
    7. from tensorflow.keras import regularizers
    8. import datetime
    9. # 导入数据
    10. def load_data(path_url, test_path_url):
    11. raw_train_dataset = pd.read_csv(path_url)
    12. raw_test_dataset = pd.read_csv(test_path_url)
    13. return raw_train_dataset, raw_test_dataset
    14. if __name__ == "__main__":
    15. # 1. 导入数据
    16. path_url = r"kaggle\titanic\train.csv"
    17. test_path_url = r"kaggle\titanic\test.csv"
    18. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)

    2.数据预处理 preprocess

    • 首先我们确定数据集 features_test

      训练集 train.csv 中共包含 12 列,分别是 passengerId,survival,pclass,name,sex,Age,sibsp,parch,ticket,fare,cabin,embarked。

      通过分析可知对预测结果有影响的列为 Pclass,Sex,Fare,Age,SibSp,Parch,Embarked,而Survived为真实标签列。PassengerId在测试集中会用到。

      根据以上分析确定所需的列,形成features_test,将训练集裁剪为所需列。

    • 接下来对数据的缺失值进行填补

      用pandas的describe()和isnull().sum()方法可以对训练集进行数值统计,考虑以中位数来替代缺失值。其中缺失较多的列为Age和Fare列。

    • 数据类型统一为数字编码
      考虑Sex和Embarked列是字符串,将其修改为每一个可能性字符单独一列,并去除原列。

    • 归一化输入(标准化)
      第一步是零均值化,每个训练数据𝑥减去均值𝜇。第二步是归一化方差。

    • 分别处理训练集和测试集
      对于训练集,我们要把Survived列单独提出来作为标签,即真实值。

      对于测试集,对比提交示例(gender_submission.csv)文件,我们保留PassengerId列作为索引id。

    1. # 数据预处理的基础方法
    2. def preprocess(raw_dataset, features, train=True):
    3. """用于predict的数据预处理
    4. Args:
    5. input: dataset = pandas.DataFrame对象
    6. """
    7. # 以中位数来替代
    8. if "Age" in features:
    9. raw_dataset["Age"].fillna(raw_dataset["Age"].median(), inplace=True)
    10. raw_dataset["Fare"].fillna(raw_dataset["Fare"].median(), inplace=True)
    11. # Embarked也可以为最多值
    12. raw_dataset["Embarked"].fillna(raw_dataset["Fare"].median(), inplace=True)
    13. dataset = raw_dataset[features]
    14. dataset = dataset.copy()
    15. # 由于 embarked=登船港口, Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton
    16. Embarked = dataset.pop("Embarked")
    17. # 根据 embarked 列来写入新的 3 个列
    18. dataset["S"] = (Embarked == "S") * 1.0
    19. dataset["C"] = (Embarked == "C") * 1.0
    20. dataset["Q"] = (Embarked == "Q") * 1.0
    21. # 根据 sex 列来写入新的 2 个列
    22. Sex = dataset.pop("Sex")
    23. dataset["Male"] = (Sex == "male") * 1.0
    24. dataset["Female"] = (Sex == "female") * 1.0
    25. dataset_withoutna = dataset
    26. if train:
    27. labels = dataset_withoutna["Survived"]
    28. dataset_withoutna.pop("PassengerId")
    29. dataset_withoutna.pop("Survived")
    30. # 标准化,归一化输入
    31. train_stats = dataset_withoutna.describe()
    32. train_stats = train_stats.transpose()
    33. normed_train_data = (dataset_withoutna - train_stats["mean"]) / train_stats[
    34. "std"
    35. ]
    36. return np.array(normed_train_data), np.array(labels)
    37. else:
    38. labels = dataset.pop("PassengerId")
    39. dataset.fillna(0, inplace=True)
    40. test_stats = dataset.describe()
    41. test_stats = test_stats.transpose()
    42. normed_test_data = (dataset - test_stats["mean"]) / test_stats["std"]
    43. return np.array(normed_test_data), np.array(labels)
    44. if __name__ == "__main__":
    45. # 1. 导入数据
    46. path_url = r"kaggle\titanic\train.csv"
    47. test_path_url = r"kaggle\titanic\test.csv"
    48. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)
    49. # 2. 数据预处理
    50. features_test = [
    51. "PassengerId",
    52. "Pclass",
    53. "Sex",
    54. "Fare",
    55. "Age",
    56. "SibSp",
    57. "Parch",
    58. "Embarked",
    59. ]
    60. features_train = features_test + ["Survived"]
    61. # 获取预处理后的训练集和标签
    62. train_dataset, labels = preprocess(raw_train_dataset, features_train)

    3.训练 train 

    • 采用Sequential构建网络模型
      通过Kera 提供的网络容器Sequential生成网络模型,模型的深度为4层,分别有64、32、16和1个的神经单元,前三层使用relu激活函数并应用𝐿2正则化。

    • compile,fit,evaluate和predict
      在Sequential搭建好网络结构后,compile,fit,evaluate和predict是常用的keras训练和验证的方法。

      首先是compile,即模型装配。用于设置网络使用的优化器对象、损失函数类型,评价指标等设定。这里我们选定Adam优化器,binary_crossentropy损失函数,设置测量指标为准确率。

      接下来是fit,即模型训练。模型装配完成后,即可通过 fit()函数送入待训练的数据集和验证用的数据集,这一步称为模型训练。此处可选定epochs数量,并设定从训练集中切分出的验证集的比例。

      evaluate,即模型测试,测试在训练所有样本上的性能表现。

      predict,即模型预测,可使用训练好的模型去预测新样本的标签信息。predict方法将在下一节预测输出中使用。

      evaluate和predict的区别是,evaluate是用已有的真实结果进行检测,而predict是单纯输出预测结果。

    1. # 训练
    2. def train(train_dataset, labels, epochs=120, batch_size=512, is_plot=False):
    3. model = tf.keras.Sequential(
    4. [
    5. # 1. input_shape = 输入形状
    6. # ND 张量的形状:. 最常见的情况是带有 shape 的 2D 输入。
    7. # (batch_size, ..., input_dim)(batch_size, input_dim)
    8. # train_dataset.shape[1] = 4
    9. # 现在模型就会以尺寸为 (*, 4) 的数组作为输入,
    10. # 2. kernel_regularizer = 应用于kernel权重矩阵的正则化函数。
    11. # 𝐿2正则化:范数的平方
    12. tf.keras.layers.Dense(
    13. 64,
    14. activation="relu",
    15. input_shape=(train_dataset.shape[1],),
    16. kernel_regularizer=regularizers.l2(0.001),
    17. ),
    18. tf.keras.layers.Dense(
    19. 32, activation="relu", kernel_regularizer=regularizers.l2(0.001)
    20. ),
    21. tf.keras.layers.Dense(16, activation="relu"),
    22. tf.keras.layers.Dense(1, name="prediction"),
    23. ]
    24. )
    25. # 在 Keras 中提供了 compile()和 fit()函数方便实现逻辑。
    26. # compile:首先通过compile 函数指定网络使用的优化器对象、损失函数类型,评价指标等设定,这一步称为装配
    27. # fit: 模型装配完成后,即可通过 fit()函数送入待训练的数据集和验证用的数据集
    28. model.compile(
    29. # Adam的学习律默认为0.001
    30. optimizer=tf.keras.optimizers.Adam(),
    31. # BinaryCrossentropy:计算真实标签和预测标签之间的交叉熵损失
    32. loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    33. # 设置测量指标为准确率
    34. metrics=["accuracy"],
    35. )
    36. # early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
    37. # 模型装配完成后,即可通过 fit()函数送入待训练的数据集和验证用的数据集,这一步称为模型训练
    38. # fit函数的参数:
    39. # x = Input data
    40. # y = Target data
    41. # verbose = 'auto'、0、1 或 2 详细模式。
    42. # 0 = 静音,1 = 进度条,2 = 每个 epoch 一行。'auto' 在大多数情况下默认为 1
    43. history = model.fit(
    44. x=train_dataset,
    45. y=labels,
    46. epochs=epochs,
    47. validation_split=0.01,
    48. batch_size=batch_size,
    49. verbose="auto",
    50. # callbacks=[early_stop]
    51. )
    52. # 显示训练情况
    53. if is_plot:
    54. plot_history(history)
    55. # 可以通过 Model.evaluate(db)循环测试完 db 数据集上所有样本
    56. loss, accuracy = model.evaluate(train_dataset, labels, verbose=2)
    57. print("Accuracy:", accuracy)
    58. return model
    59. if __name__ == "__main__":
    60. # 1. 导入数据
    61. path_url = r"kaggle\titanic\train.csv"
    62. test_path_url = r"kaggle\titanic\test.csv"
    63. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)
    64. # 2. 数据预处理
    65. features_test = [
    66. "PassengerId",
    67. "Pclass",
    68. "Sex",
    69. "Fare",
    70. "Age",
    71. "SibSp",
    72. "Parch",
    73. "Embarked",
    74. ]
    75. features_train = features_test + ["Survived"]
    76. # 获取预处理后的训练集和标签
    77. train_dataset, labels = preprocess(raw_train_dataset, features_train)
    78. # 3. 训练
    79. model = train(train_dataset, labels, epochs=256, is_plot=True)

    4.真实预测并输出csv predict_out

    • 使用predict进行预测
    • 将大于0.5的值设置为1,反之设置为0
    • 输出提交的csv文件
      参考提交示例(gender_submission.csv)文件,第一列为PassengerId,第二列为预测结果,并使用to_csv方法输出csv文件。
    1. # 真实预测并输出csv
    2. def predict_out(model, csv_path):
    3. # model.evaluate 和 model.predict 的区别
    4. # https://blog.csdn.net/DoReAGON/article/details/88552348
    5. # 两者差异:
    6. # 1
    7. # 输入输出不同
    8. # model.evaluate输入数据(data)和金标准(label),然后将预测结果与金标准相比较,得到两者误差并输出.
    9. # model.predict输入数据(data),输出预测结果
    10. # 2
    11. # 是否需要真实标签(金标准)
    12. # model.evaluate需要,因为需要比较预测结果与真实标签的误差
    13. # model.predict不需要,只是单纯输出预测结果,全程不需要金标准的参与.
    14. predictions = model.predict(test_dataset)
    15. # 通过astype()方法可以强制转换数据的类型。
    16. predictions = (tf.sigmoid(predictions).numpy().flatten() > 0.5).astype(int)
    17. print(predictions.shape, predictions)
    18. # 输出结果
    19. output = pd.DataFrame({"PassengerId": passenger_id, "Survived": predictions})
    20. # index=False 不保存行索引,index=是否保留行索引
    21. output.to_csv(csv_path, index=False)
    22. print(f"您的提交文件保存成功! 位置在{csv_path}")
    23. return predictions
    24. if __name__ == "__main__":
    25. # 1. 导入数据
    26. path_url = r"kaggle\titanic\train.csv"
    27. test_path_url = r"kaggle\titanic\test.csv"
    28. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)
    29. # 2. 数据预处理
    30. features_test = [
    31. "PassengerId",
    32. "Pclass",
    33. "Sex",
    34. "Fare",
    35. "Age",
    36. "SibSp",
    37. "Parch",
    38. "Embarked",
    39. ]
    40. features_train = features_test + ["Survived"]
    41. # 获取预处理后的训练集和标签
    42. train_dataset, labels = preprocess(raw_train_dataset, features_train)
    43. # 3. 训练
    44. model = train(train_dataset, labels, epochs=256, is_plot=True)
    45. # 获取预处理后的测试集和序号
    46. test_dataset, passenger_id = preprocess(
    47. raw_test_dataset, features_test, train=False
    48. )
    49. csv_path = f"./submission_{get_time()}.csv"
    50. prediction = predict_out(model, csv_path)

     5.其他工具方法

    • 显示训练情况 plot_history

      使用model.fit的返回值History.history即训练数据记录,读取accuracy和val_accuracy来绘制准确率曲线。

      1. # 显示训练情况
      2. def plot_history(history):
      3. # histoty的返回值
      4. # A History object. Its History.history attribute is a record of training loss values and metrics values at successive epochs, as well as validation loss values and validation metrics values (if applicable).
      5. # 一个历史对象。它的 History.history 属性是连续 epoch 的训练损失值和指标值的记录,
      6. # 以及验证损失值和验证指标值(如果适用)。
      7. # history.history:loss、accuracy、val loss、val accuracy
      8. hist = pd.DataFrame(history.history)
      9. hist["epoch"] = history.epoch
      10. plt.figure()
      11. plt.xlabel("Num of Epochs")
      12. plt.ylabel("value")
      13. # plt.plot(hist["epoch"], hist["loss"], label="Loss")
      14. # plt.plot(hist["epoch"], hist["val_loss"], label="val_loss")
      15. plt.plot(hist["epoch"], hist["accuracy"], label="accuracy")
      16. plt.plot(hist["epoch"], hist["val_accuracy"], label="val_accuracy")
      17. plt.ylim([0, 1])
      18. plt.legend()
      19. plt.show()
    • 获取年月日时分秒 get_time

      在输出预测结果csv的时候附上时间,方便区别。

    1. # 获取年月日时分秒
    2. def get_time():
    3. return datetime.datetime.now().strftime("%Y%m%d%H%M")
    • 主函数 main
    1. # #### Titanic - Machine Learning from Disaster
    2. if __name__ == "__main__":
    3. # 1. 导入数据
    4. path_url = r"kaggle\titanic\train.csv"
    5. test_path_url = r"kaggle\titanic\test.csv"
    6. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)
    7. # 2. 数据预处理
    8. features_test = [
    9. "PassengerId",
    10. "Pclass",
    11. "Sex",
    12. "Fare",
    13. "Age",
    14. "SibSp",
    15. "Parch",
    16. "Embarked",
    17. ]
    18. features_train = features_test + ["Survived"]
    19. # 获取预处理后的训练集和标签
    20. train_dataset, labels = preprocess(raw_train_dataset, features_train)
    21. # 3. 训练
    22. model = train(train_dataset, labels, epochs=256, is_plot=True)
    23. # 获取预处理后的测试集和序号
    24. test_dataset, passenger_id = preprocess(
    25. raw_test_dataset, features_test, train=False
    26. )
    27. csv_path = f"./submission_{get_time()}.csv"
    28. prediction = predict_out(model, csv_path)
    29. # 验证与原始数据raw_test_dataset长度是否一致
    30. if prediction.shape[0] == raw_test_dataset.shape[0]:
    31. print(f"--预测长度={prediction.shape[0]}校验通过 √")
    32. else:
    33. print(
    34. f"--预测长度与raw_test_dataset长度不一致 ×,prediction.shape={prediction.shape},raw_test_dataset.shape={raw_test_dataset.shape}"
    35. )

    四、总结

    调整validation_split的比例为0.01后,最后最高分数为0.78947,排名前8%。基本达到学习完成Titanic泰坦尼克号幸存预测比赛的程度。

    比赛中比较重要的是需要对数据进行仔细分析,可以利用Excel和pandas等工具分析数据,提取出有用的数据列,并对缺失值进行填补。

    五、参考资料

    1. 机器学习项目实战(一): Kaggle Titanic机器学习项目实战(一): Kaggle Titanichttps://wangxin1248.github.io/machinelearning/2018/10/titanic.html

    2. Kaggle入门系列(三)Titanic初试身手

    https://zhuanlan.zhihu.com/p/29086614http://xn--kaggletitanic-130u340bnvcfd1366ar7zf4cucvpmny2bdk67bza

    3. Titanic Tutorial

    Titanic Tutorialhttps://www.kaggle.com/code/alexisbcook/titanic-tutorial

    4. 用TensorFlow完成Kaggle Titanic竞赛

    用TensorFlow完成Kaggle Titanic竞赛https://www.jianshu.com/p/f5a7487e6ff2

    六、代码原文

    titanic_predict.py

    1. import pandas as pd
    2. import numpy as np
    3. import tensorflow as tf
    4. from tensorflow.python.keras import activations
    5. import matplotlib.pyplot as plt
    6. from tensorflow.keras import regularizers
    7. import datetime
    8. # 显示训练情况
    9. def plot_history(history):
    10. # histoty的返回值
    11. # 一个历史对象。它的 History.history 属性是连续 epoch 的训练损失值和指标值的记录,以及验证损失值和验证指标值(如果适用)。
    12. # history.history:loss、accuracy、val loss、val accuracy
    13. hist = pd.DataFrame(history.history)
    14. hist["epoch"] = history.epoch
    15. plt.figure()
    16. plt.xlabel("Num of Epochs")
    17. plt.ylabel("value")
    18. plt.plot(hist["epoch"], hist["accuracy"], label="accuracy")
    19. plt.plot(hist["epoch"], hist["val_accuracy"], label="val_accuracy")
    20. plt.ylim([0, 1])
    21. plt.legend()
    22. plt.show()
    23. # 导入数据
    24. def load_data(path_url, test_path_url):
    25. raw_train_dataset = pd.read_csv(path_url)
    26. raw_test_dataset = pd.read_csv(test_path_url)
    27. return raw_train_dataset, raw_test_dataset
    28. # 数据预处理的基础方法
    29. def preprocess(raw_dataset, features, train=True):
    30. """用于predict的数据预处理
    31. Args:
    32. input: dataset = pandas.DataFrame对象
    33. """
    34. # 以中位数来替代
    35. if "Age" in features:
    36. raw_dataset["Age"].fillna(raw_dataset["Age"].median(), inplace=True)
    37. raw_dataset["Fare"].fillna(raw_dataset["Fare"].median(), inplace=True)
    38. raw_dataset["Embarked"].fillna(raw_dataset["Fare"].median(), inplace=True)
    39. dataset = raw_dataset[features]
    40. dataset = dataset.copy()
    41. # 由于 embarked=登船港口, Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton
    42. Embarked = dataset.pop("Embarked")
    43. # 根据 embarked 列来写入新的 3 个列
    44. dataset["S"] = (Embarked == "S") * 1.0
    45. dataset["C"] = (Embarked == "C") * 1.0
    46. dataset["Q"] = (Embarked == "Q") * 1.0
    47. # 根据 sex 列来写入新的 2 个列
    48. Sex = dataset.pop("Sex")
    49. dataset["Male"] = (Sex == "male") * 1.0
    50. dataset["Female"] = (Sex == "female") * 1.0
    51. dataset_withoutna = dataset
    52. if train:
    53. labels = dataset_withoutna["Survived"]
    54. dataset_withoutna.pop("PassengerId")
    55. dataset_withoutna.pop("Survived")
    56. # 标准化
    57. train_stats = dataset_withoutna.describe()
    58. train_stats = train_stats.transpose()
    59. normed_train_data = (dataset_withoutna - train_stats["mean"]) / train_stats[
    60. "std"
    61. ]
    62. return np.array(normed_train_data), np.array(labels)
    63. else:
    64. labels = dataset.pop("PassengerId")
    65. dataset.fillna(0, inplace=True)
    66. test_stats = dataset.describe()
    67. test_stats = test_stats.transpose()
    68. normed_test_data = (dataset - test_stats["mean"]) / test_stats["std"]
    69. return np.array(normed_test_data), np.array(labels)
    70. # 训练
    71. def train(train_dataset, labels, epochs=120, batch_size=512, is_plot=False):
    72. model = tf.keras.Sequential(
    73. [
    74. # 1. input_shape = 输入形状
    75. # ND 张量的形状:. 最常见的情况是带有 shape 的 2D 输入。
    76. # 2. kernel_regularizer = 应用于kernel权重矩阵的正则化函数。
    77. # 𝐿2正则化:范数的平方
    78. tf.keras.layers.Dense(
    79. 64,
    80. activation="relu",
    81. input_shape=(train_dataset.shape[1],),
    82. kernel_regularizer=regularizers.l2(0.001),
    83. ),
    84. tf.keras.layers.Dense(
    85. 32, activation="relu", kernel_regularizer=regularizers.l2(0.001)
    86. ),
    87. tf.keras.layers.Dense(16, activation="relu"),
    88. tf.keras.layers.Dense(1, name="prediction"),
    89. ]
    90. )
    91. # 在 Keras 中提供了 compile()和 fit()函数方便实现逻辑。
    92. # compile:首先通过compile 函数指定网络使用的优化器对象、损失函数类型,评价指标等设定,这一步称为装配
    93. # fit: 模型装配完成后,即可通过 fit()函数送入待训练的数据集和验证用的数据集
    94. model.compile(
    95. # Adam的学习律默认为0.001
    96. optimizer=tf.keras.optimizers.Adam(),
    97. # BinaryCrossentropy:计算真实标签和预测标签之间的交叉熵损失
    98. loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    99. # 设置测量指标为准确率
    100. metrics=["accuracy"],
    101. )
    102. # 模型装配完成后,即可通过 fit()函数送入待训练的数据集和验证用的数据集,这一步称为模型训练
    103. # verbose = 'auto'、0、1 或 2 详细模式。
    104. # 0 = 静音,1 = 进度条,2 = 每个 epoch 一行。'auto' 在大多数情况下默认为 1
    105. history = model.fit(
    106. x=train_dataset,
    107. y=labels,
    108. epochs=epochs,
    109. validation_split=0.3,
    110. batch_size=batch_size,
    111. verbose="auto",
    112. # callbacks=[early_stop]
    113. )
    114. # 显示训练情况
    115. if is_plot:
    116. plot_history(history)
    117. # 可以通过 Model.evaluate(db)循环测试完 db 数据集上所有样本
    118. loss, accuracy = model.evaluate(train_dataset, labels, verbose=2)
    119. print("Accuracy:", accuracy)
    120. return model
    121. # 真实预测并输出csv
    122. def predict_out(model, csv_path):
    123. # model.evaluate 和 model.predict 的区别
    124. # https://blog.csdn.net/DoReAGON/article/details/88552348
    125. # 两者差异:
    126. # 1
    127. # 输入输出不同
    128. # model.evaluate输入数据(data)和金标准(label),然后将预测结果与金标准相比较,得到两者误差并输出.
    129. # model.predict输入数据(data),输出预测结果
    130. # 2
    131. # 是否需要真实标签(金标准)
    132. # model.evaluate需要,因为需要比较预测结果与真实标签的误差
    133. # model.predict不需要,只是单纯输出预测结果,全程不需要金标准的参与.
    134. predictions = model.predict(test_dataset)
    135. # 通过astype()方法可以强制转换数据的类型。
    136. predictions = (tf.sigmoid(predictions).numpy().flatten() > 0.5).astype(int)
    137. print(predictions.shape, predictions)
    138. # 输出结果
    139. output = pd.DataFrame({"PassengerId": passenger_id, "Survived": predictions})
    140. # index=False 不保存行索引,index=是否保留行索引
    141. output.to_csv(csv_path, index=False)
    142. print(f"您的提交文件保存成功! 位置在{csv_path}")
    143. return predictions
    144. # 获取年月日时分秒
    145. def get_time():
    146. return datetime.datetime.now().strftime("%Y%m%d%H%M")
    147. # #### Titanic - Machine Learning from Disaster
    148. if __name__ == "__main__":
    149. # 1. 导入数据
    150. path_url = r"kaggle\titanic\train.csv"
    151. test_path_url = r"kaggle\titanic\test.csv"
    152. raw_train_dataset, raw_test_dataset = load_data(path_url, test_path_url)
    153. # 2. 数据预处理
    154. features_test = [
    155. "PassengerId",
    156. "Pclass",
    157. "Sex",
    158. "Fare",
    159. "Age",
    160. "SibSp",
    161. "Parch",
    162. "Embarked",
    163. ]
    164. features_train = features_test + ["Survived"]
    165. # 获取预处理后的训练集和标签
    166. train_dataset, labels = preprocess(raw_train_dataset, features_train)
    167. # 3. 训练
    168. model = train(train_dataset, labels, epochs=256, is_plot=True)
    169. # 获取预处理后的测试集和序号
    170. test_dataset, passenger_id = preprocess(
    171. raw_test_dataset, features_test, train=False
    172. )
    173. # 输出预测结果
    174. csv_path = f"./submission_{get_time()}.csv"
    175. prediction = predict_out(model, csv_path)
    176. # 验证与原始数据raw_test_dataset长度是否一致
    177. if prediction.shape[0] == raw_test_dataset.shape[0]:
    178. print(f"--预测长度={prediction.shape[0]}校验通过 √")
    179. else:
    180. print(
    181. f"--预测长度与raw_test_dataset长度不一致 ×,prediction.shape={prediction.shape},raw_test_dataset.shape={raw_test_dataset.shape}"
    182. )

    依赖库 requirements.txt

    1. pandas==1.4.3
    2. numpy==1.20.3
    3. matplotlib==3.4.3
    4. tensorflow-cpu==2.9.1
  • 相关阅读:
    《高效能人士的七个习惯》思维导图
    【虚拟现实】二、主要的AR/VR硬件设备
    Minecraft 1.16.5模组开发(五十三) 多种生物类型(Variant)
    linux系统---LNMP架构下部署社区论坛与博客
    A New Image Contrast Enhancement Algorithmusing Exposure Fusion Framework
    圣经投屏Java+sqlite3极速版
    东芝发布智能栅极驱动光电耦合器,简化功率器件外围电路的设计
    C语言基础篇 —— 3.4 二重指针
    搭建远端存储,深度解读SPDK NVMe-oF target
    Python搭配GBase 8s
  • 原文地址:https://blog.csdn.net/TimVan1596/article/details/126407492