【问题标题】:Does model get retrained entirely using .fit() in sklearn and tensorflow模型是否完全使用 .fit() 在 sklearn 和 tensorflow 中重新训练
【发布时间】:2021-03-27 18:53:55
【问题描述】:

我正在尝试在 Python 中使用机器学习。现在我正在使用 sklearn 和 TensorFlow。我想知道如果我有一个模型需要在新数据出现时更新该怎么办。例如,我有财务数据。我用 TensorFlow 构建了一个 LSTM 模型并对其进行了训练。但是每天都有新数据进来,我不想每天都重新训练模型。有没有办法只更新模型而不是从头开始重新训练?

在 sklearn 中,.fit() 方法的文档(以 DecisionTreeClassifier 为例)说它

根据训练集 (X, y) 构建决策树分类器。

所以看起来它会从头开始重新训练整个模型。

在tensorflow中,.fit()方法(以Sequential为例)说

用固定数量的 epoch 训练模型(在 数据集)。

所以看起来它确实更新了模型而不是重新训练。但我不确定我的理解是否正确。我将不胜感激。如果 sklearn 确实使用 .fit() 重新训练了整个模型,是否有一个函数可以只更新模型而不是从头开始重新训练?

【问题讨论】:

  • 两者都重新训练模型。您正在寻找的是在线学习(OL)。 OL 是一种机器学习方法,其中数据按顺序可用,我们使用它来预测每个时间步长的未来数据。但它有其缺点,它存在许多收敛问题(梯度消失),并且网络的最佳深度(通常)是未知的。根据我的经验,通常会每隔几天或几周对模型进行一次新数据的训练,然后部署新模型。

标签: python tensorflow scikit-learn


【解决方案1】:

在 sklearn 中,.fit() 方法在数据集上重新训练,即当您在任何数据集上使用 .fit() 时,任何与之前训练有关的信息都将被丢弃。因此,假设您每天都有新数据进入,对于大多数 sklearn 算法,您每次都必须重新训练。 虽然,如果你想重新训练 sklearn 模型而不是从头开始训练,sklearn 的一些算法(如 SGDClassifier)提供了一个名为 partial_fit() 的方法。这些可用于重新训练和更新现有模型的权重。

根据 Tensorflow,.fit() 方法实际上是在训练模型不会丢弃与先前训练有关的任何信息。因此,每次通过 TF 使用 .fit() 时,它实际上都会重新训练模型。

提示:您可以使用 TF 中的 SaveModel 保存最佳模型,并在更多数据不断流入时重新加载和重新训练模型。

【讨论】:

    【解决方案2】:

    在 tensorflow 中,有一个名为 train_on_batch() 的方法,您可以在模型上调用它。

    假设您将模型定义为顺序模型,并且您最初使用 fit 方法在现有 initial_dataset 上对其进行了训练。

    现在,您手中有了新数据 -> 将其命名为 X_new_train,y_new_train

    因此您可以使用 train_on_batch() 更新现有模型

    一个例子是:

         #generate some X_new_train (one batch)
         X_new_train = tf.random.normal(shape=[no_of_samples_in_one_batch,100])
    
         #generate corresponding y_new_train
    
         y_new_train = tf.constant([[1.0]]*no_of_samples_in_one_batch)
    
         model.train_on_batch(X_new_train,y_new_train)
    

    请注意,no_of_samples_in_one_batch(也称为批量大小)的概念在这里并不那么重要。我的意思是您的数据中的任何数量的样本都将被视为一批!

    现在,来到 sklearn,我不确定是否所有机器学习模型都可以增量学习(从新示例更新权重)。有一个支持增量学习的模型列表:

    https://scikit-learn.org/0.15/modules/scaling_strategies.html#incremental-learning

    【讨论】:

      【解决方案3】:

      当你说更新而不是训练时。它只是使用新数据更新权重吗?

      如果是这样,您可以采用两种迁移学习方法。

      1. 微调:使用旧模型的权重初始化模型,然后根据新数据重新训练。
      2. 添加新层:添加新层并仅更新该层中的权重,同时冻结网络中剩余的权重。

      有关更多详细信息,请阅读tansferlearning 上的 tensorflow 指南

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        相关资源
        最近更新 更多