【问题标题】:How to initialize coef_init and intercept_init for a new training model?如何为新的训练模型初始化 coef_init 和 intercept_init?
【发布时间】:2018-08-14 10:47:47
【问题描述】:

正如这里所指定的,https://stackoverflow.com/a/35662770/5757129,我存储了我的第一个模型的系数和截距。稍后,我将它们作为初始化程序传递给我的第二个 fit() ,如下所示,用于在旧模型之上学习新数据。

from sklearn import neighbors, linear_model
import numpy as np
import pickle
import os

def train_data():

    x1 = [[8, 9], [20, 22], [16, 18], [8,4]]
    y1 = [0, 1, 2, 3]

    #classes = np.arange(10)

    #sgd_clf = linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1,warm_start=True)

    sgd_clf = linear_model.SGDClassifier(loss="hinge",max_iter=10000)

    sgd_clf.fit(x1,y1)

    coef = sgd_clf.coef_
    intercept = sgd_clf.intercept_

    return coef, intercept


def train_new_data(coefs,intercepts):

    x2 = [[18, 19],[234,897],[20, 122], [16, 118]]
    y2 = [4,5,6,7]

    sgd_clf1 = linear_model.SGDClassifier(loss="hinge",max_iter=10000)

    new_model = sgd_clf1.fit(x2,y2,coef_init=coefs,intercept_init=intercepts)

    return new_model


if __name__ == "__main__":

    coefs,intercepts= train_data()

    new_model = train_new_data(coefs,intercepts)

    print(new_model.predict([[16, 118]]))
    print(new_model.predict([[18, 19]]))
    print(new_model.predict([[8,9]]))
    print(new_model.predict([[20,22]]))

当我运行它时,我得到了仅从 new_model 训练的标签。例如,print(new_model.predict([[8,9]])) 必须将标签打印为 0,print(new_model.predict([[20,22]])) 必须将标签打印为 1。但它会打印从 4 到 7 匹配的标签。

我是否以错误的方式将 coef 和从旧模型拦截到新模型?

编辑:根据@vital_dml 答案重新构建问题

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    我不确定为什么需要将系数和截距从第一个模型传递到第二个模型,但是,您会遇到这样的错误,因为您的第一个模型是针对 4 个类y1 = [0, 1, 2, 3] 进行训练的,而第二个模型有 2 个类@ 987654326@,这是有争议的。

    根据scikit-learn documentation,你的linear_model.SGDClassifier()返回:

    coef_ : array, shape (1, n_features) if n_classes == 2 else (n_classes, n_features) - 分配给特征的权重。

    intercept_ : 数组,形状 (1,) if n_classes == 2 else (n_classes,) - 决策函数中的常数。

    因此,在您的问题中,两个模型中的类和功能的数量必须相同。

    无论如何,我鼓励你想想你真的需要这样做吗?也许你可以连接这些向量。

    【讨论】:

    • 嗨,Vital,我现在在两个模型中都维护了相同的类。请参阅 cahnges 问题。我想将 coef 和拦截从旧模型传递到新模型,因为我想加载旧模型结果而不是在获取新数据时重新训练所有这些结果
    • 您好,您可能会得到以前从未有过的观察/课程,这似乎与在线学习方法有关。您的第二个模型只是使用第一个模型的系数进行初始化,而它对这些系数所针对的类一无所知。因此,您要么想将每个新观察结果与以前的观察结果连接起来并针对所有可能的类一起训练,要么研究一些在线学习方法,简要描述为here
    • 嗨,谢谢。是的,我之前在链接中浏览过this answer。您能否解释一下这种加载和再训练是如何发生的?保存泡菜文件,加载和重新训练并不能帮助我了解如何在加载文件后重新训练。您是否有一个小型原型的链接,显示了如何执行再训练?我看到另一个指定反向传播方法的答案。如果是这种情况,我可能不得不转向 MLPClassifier。 ?
    • 关于课程,我尝试了像here 这样的 partial_fit() 方式。在这里,我知道以前的所有课程。在链接中显示的当前方法中,我为每个新实例保留了单独的 for 循环。如果我将所有 partial_fits() 保留在单个 for 循环中,我的旧数据就会被记住。然而,这不是我所期待的。将所有 partial_fit() 保持在单个循环中使其再次批量学习
    • 该答案中的用户指定使用 tensorflow。也许我必须离开 scikit-learn 进行再培训?我也试过 scikit 神经网络,MLPclassifier。它也不会以我目前正在做的方式重新训练。也许我必须得到 MLPClassifier 的权重。你知道我如何加载权重并发送到下一个模型吗?
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多