部分适合和热启动有什么区别?

时间:2016-06-27 11:05:15

标签: python python-2.7 machine-learning scikit-learn

上下文

我正在使用来自scikit库的Passive Aggressor,并混淆了是使用热启动还是部分适合。

迄今为止的努力

  1. 参考了这个帖子讨论:
  2. https://github.com/scikit-learn/scikit-learn/issues/1585

    1. 浏览 _fit _partial_fit 的scikit代码。
    2. 我的观察

      1. _fit 依次调用 _partial_fit

      2. 设置 warm_start 后, _fit 使用 {{1}调用 _partial_fit }}

      3. 在没有 self.coef_ 参数的情况下调用 _partial_fit 时, coef_init 已设置,它继续使用 self.coef_

      4. 问题

        我觉得两者最终都提供了相同的功能。那么,它们之间的基本区别是什么?在哪种情况下,使用其中任何一种?

        我错过了一些明显的东西吗?任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:1)

我不知道被动攻击者,但至少在使用SGDRegressor时, partial_fit仅适合1个时代,而fit将适合多个(直到损失收敛或max_iter 到达了)。因此,在将新数据拟合到模型中时,partial_fit只会将模型向新数据迈进一步,但是使用fitwarm_start时,就像将旧数据组合在一起一样数据和您的新数据结合在一起,并一次拟合模型,直到收敛为止。

示例:

from sklearn.linear_model import SGDRegressor
import numpy as np

np.random.seed(0)
X = np.linspace(-1, 1, num=50).reshape(-1, 1)
Y = (X * 1.5 + 2).reshape(50,)

modelFit = SGDRegressor(learning_rate="adaptive", eta0=0.01, random_state=0, verbose=1,
                     shuffle=True, max_iter=2000, tol=1e-3, warm_start=True)
modelPartialFit = SGDRegressor(learning_rate="adaptive", eta0=0.01, random_state=0, verbose=1,
                     shuffle=True, max_iter=2000, tol=1e-3, warm_start=False)
# first fit some data
modelFit.fit(X, Y)
modelPartialFit.fit(X, Y)
# for both: Convergence after 50 epochs, Norm: 1.46, NNZs: 1, Bias: 2.000027, T: 2500, Avg. loss: 0.000237
print(modelFit.coef_, modelPartialFit.coef_) # for both: [1.46303288]

# now fit new data (zeros)
newX = X
newY = 0 * Y

# fits only for 1 epoch, Norm: 1.23, NNZs: 1, Bias: 1.208630, T: 50, Avg. loss: 1.595492:
modelPartialFit.partial_fit(newX, newY)

# Convergence after 49 epochs, Norm: 0.04, NNZs: 1, Bias: 0.000077, T: 2450, Avg. loss: 0.000313:
modelFit.fit(newX, newY)

print(modelFit.coef_, modelPartialFit.coef_) # [0.04245779] vs. [1.22919864]
newX = np.reshape([2], (-1, 1))
print(modelFit.predict(newX), modelPartialFit.predict(newX)) # [0.08499296] vs. [3.66702685]

答案 1 :(得分:0)

首先,让我们看一下example.com/sailsapp.fit()之间的区别。

.partial_fit()将使您从头开始培训。因此,您可以将其视为只能用于模型一次的选项。如果您再次使用一组新数据调用.fit(),则该模型将建立在新数据上,并且不会影响先前的数据集。

.fit()将使您可以使用增量数据更新模型。因此,该选项可以在模型中多次使用。如果无法将整个数据集加载到内存中,请参考here

如果.partial_fit().fit()都将被使用一次,则没有任何区别。

.partial_fit()仅可以在warm_start中使用,它可以让您从上一个.fit()的功效开始学习。现在,这听起来与fit()的目的相似,但推荐的方式是partial_fit()。可以多次使用相同的增量数据执行partial_fit(),以提高学习效果。

答案 2 :(得分:0)

如果为warm_start = False,则随后每次调用.fit()(在最初调用.fit()partial_fit()之后)都会重置模型的可训练参数以进行初始化。如果为warm_start = True,则对.fit()的每个后续调用(在对.fit()partial_fit()的初始调用之后)将保留上一次运行中模型的可训练参数的值,并使用最初的那些。 无论warm_start的值如何,每次对partial_fit()的调用都会保留先前运行的模型参数,并在最初使用它们。

使用MLPRegressor的示例:

import sklearn.neural_network
import numpy as np
np.random.seed(0)
x = np.linspace(-1, 1, num=50).reshape(-1, 1)
y = (x * 1.5 + 2).reshape(50,)
cold_model = sklearn.neural_network.MLPRegressor(hidden_layer_sizes=(), warm_start=False, max_iter=1)
warm_model = sklearn.neural_network.MLPRegressor(hidden_layer_sizes=(), warm_start=True, max_iter=1)

cold_model.fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[0.17009494]])] [array([0.74643783])]
cold_model.fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60819342]])] [array([-1.21256186])]
#after second run of .fit(), values are completely different
#because they were re-initialised before doing the second run for the cold model

warm_model.fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39815616]])] [array([1.651504])]
warm_model.fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39715616]])] [array([1.652504])]
#this time with the warm model, params change relatively little, as params were
#not re-initialised during second call to .fit()

cold_model.partial_fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60719343]])] [array([-1.21156187])]
cold_model.partial_fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60619347]])] [array([-1.21056189])]
#with partial_fit(), params barely change even for cold model,
#as no re-initialisation occurs

warm_model.partial_fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39615617]])] [array([1.65350392])]
warm_model.partial_fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39515619]])] [array([1.65450372])]
#and of course the same goes for the warm model

答案 3 :(得分:-1)

关于差异。 热启动它只是一个类的属性。 部分适合它是此类的方法。这是完全不同的事情。

关于相同的功能。是的,部分适合将使用 self.coef _ 因为它仍然需要在训练期间获得一些值来更新。对于空 coef_init ,我们只需将零值添加到 self.coef _ ,然后进入下一步培训。

描述

首次开始: 无论如何(有或没有热启动)。我们将训练零系数,但结果我们将保存系数的平均值。

N + 1开始:

热情的开始。我们将通过方法 _allocate_parameter_mem 检查我们之前的系数并将其训练。结果保存我们的平均系数。

没有热情的开始。我们将零系数(作为第一次开始)并进入训练步骤。结果我们仍然会将平均系数写入内存。