scitkit SGDClassifier partial_fit不会逐步学习。返回“类应包含所有有效标签”

时间:2018-02-23 21:09:34

标签: python machine-learning scikit-learn

我将两个数据流传递给sgd_clf分类器,如下面的代码所示。第一个partial_fit正在获取第一个数据流x1,y1。第二个partial_fit正在取第二个数据流x2,y2。

下面的代码在第二个partial_fit步骤中给出了错误,该类在前面包含了lables。当我在x1,y1中包含x2 y2的所有数据时,此错误消失了。 (我的类标签包含在现在调用第二个partial_fit之前)

但是,我不能先提供这个x2 y2数据。如果我在第一次partial_fit()之前提供了所有数据,为什么我需要使用第二个partial_fit()?事实上,如果我之前知道所有数据,我不需要使用partial_fit(),我可以做fit()。

from sklearn import neighbors, linear_model
import numpy as np

def train_new_data():

    sgd_clf = linear_model.SGDClassifier()

    x1 = [[8, 9], [20, 22]]
    y1 = [5, 6]

    classes = np.unique(y1)

    #print(classes)

    sgd_clf.partial_fit(x1,y1,classes=classes)

    x2 = [10, 12]
    y2 = 8


    sgd_clf.partial_fit([x2], [y2],classes=classes)#Error here!!

    return sgd_clf

if __name__ == "__main__":

    print(train_new_data().predict([[20,22]]))

问题1:我对sklearn分类器的partial_fit()的理解是错误的,它会按照此处的指定动态获取数据:Incremental Learning

Q2:我想重新训练模型/使用新数据更新模型。我不想从头开始训练。 partial_fit会帮我解决这个问题吗?

问题3:我不仅仅针对SGDClassifier。我可以使用任何支持在线/批量学习的算法。我的主要目的是Q3。我有1000张图像的训练模型。我不想从头开始重新训练这个模型,因为我有一个/两个新的图像样本。既没有兴趣为每个新条目创建一个新模型,然后混合所有新条目。这降低了我在预测中的表现,以便搜索所有经过训练的模型。我只想在partial_fit的帮助下将这些新数据实例添加到训练模型中。这可行吗?

第四季:如果我不能用scikit分类器来实现Q2,请指导我如何实现这一目标

非常感谢任何建议或想法或参考。

1 个答案:

答案 0 :(得分:2)

您需要事先知道您需要多少课程。在第一次调用部分拟合之后,该算法假定您稍后不会添加任何新的

在你的例子中,你被添加到一个以前从未见过的新类(y2 = 8)中,并且在初始调用部分拟合时没有表示存在(仅包含标签" 5&# 34;和" 6")。您需要在第一次调用时将它添加到classes对象。

我还建议你从0开始为你的课程编号,只是为了保持一致。