【问题标题】:SGDClassifier.partial_fit returns error of "classes should include labels"SGDClassifier.partial_fit 返回“类应包含标签”的错误
【发布时间】:2018-07-31 20:22:00
【问题描述】:

我尝试通过 SGDClassifer.partial_fit 预测我新添加的数据的标签,如下所示:

from sklearn import neighbors, linear_model
import numpy as np

def train_predict():

    X = [[1, 1], [2, 2.5], [2, 6.8], [4, 7]]
    y = [1, 2, 3, 4]

    sgd_clf = linear_model.SGDClassifier(loss="log")

    sgd_clf.fit(X, y)

    X1 = [[6,9]]
    y1=[5]

    f1 = sgd_clf.partial_fit(X1,y1)

    f1.predict([[6,9]])

    return f1


if __name__ == "__main__":
    clf = train_predict()

fit 可以完美地预测标签。但是,部分拟合的预测会导致错误:

in compute_class_weight
    raise ValueError("classes should include all valid labels that can be in y")

类似Sklearn SGDC partial_fit ValueError: classes should include all valid labels that can be in y,我看了partial_fit手册,http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.partial_fit

但我仍然无法弄清楚如何设置 partial_fit 的参数,以便能够预测动态添加的数据。

任何参考或想法?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    根本问题似乎是您的部分拟合输入数据不是原始数据的子集(输入到.fit())。

    该要求至少是我如何解释partial_fit()Xy 的文档:

    X : {array-like, sparse matrix}, shape (n_samples, n_features)

    Subset of the training data
    

    y : numpy 数组,形状 (n_samples,)

    Subset of the target values
    

    当您将X1y1classes = np.unique(y1) 一起使用时,错误也很明显(如文档中所建议的那样,产生:

    ValueError: `classes=array([5])` is not the same as on last call to
        partial_fit, was: array([1, 2, 3, 4])
    

    这表明 partial_fitfit 中使用。

    以下示例有效:

    X1 = X[2:3]
    y1 = y[2:3]
    
    classes = np.unique(y)
    f1 = sgd_clf.partial_fit(X1, y1, classes=classes)
    

    因此,请确保 X1y1 包含在您的原始数据集中。

    【讨论】:

    • 谢谢@Evert,正如建议的那样,我在这里向 X, y 添加了数据 - ideone.com/Tvm40m。这导致错误 classes=array([1, 2, 3, 4, 5]) is not the same as on last call to partial_fit, was: array([1, 2, 3, 4])
    • 如果您在ideone.com/Tvm40m 运行代码,您是否也会遇到类似的错误或工作正常?
    • @krishnadamarla 我只看到ImportError 代表sklearn;这没什么用。
    • @krishnadamarla 无论如何,您这样做的方式是不正确的:您在完成初始拟合后添加值。所以分类器仍然会抱怨最初不适合的新类/不匹配类。您需要第一次调用fitpartial_fit 之前获得相关数据。
    • @krishnadamarla 另外,如果您只对最后一个元素感兴趣,您可能不想使用[2:3] 索引。更多X1[-1:]y[-1:]。最后,.predict() 需要一个二维数组:f1.predict([[6, 9]])
    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2014-09-02
    • 2011-05-09
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多