在MNIST上使用SGDClassifier

时间:2017-07-24 15:21:55

标签: python machine-learning scikit-learn classification mnist

我正在使用动手机器学习w / scikit_Learn“( O'Reilly 进行自学,目前正在使用具有不同分类器的MNIST数据。

第94页的文字说SGDClassifier能够执行多类分类并使用OvA算法。当我尝试像这样拟合分类器时:

sgd_clf = SGDClassifier()
sgd_clf.fit(x_train, y_train) 

我收到错误:

  

输入形状不好(55000,10)。

这似乎与案文相矛盾。

数据信息

x_train.shape为55000x784,y_train.shape为55000x10,且均为numpy.ndarray

当我适合KNeighborsClassifier时,它完美无缺。

SGDClassifier是否解决了多类分类问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

the documentation中所述,

  

与其他分类器一样,SGD必须安装两个阵列:阵列X.   大小[n_samples,n_features]持有训练样本,和   保存目标值的大小为[n_samples]的数组Y(类标签)   对于训练样本

这意味着y是一个由类标签组成的一维数组,如下例所示(取自上面的链接):

>>> from sklearn.linear_model import SGDClassifier
>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = SGDClassifier(loss="hinge", penalty="l2")
>>> clf.fit(X, y)
SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,
       eta0=0.0, fit_intercept=True, l1_ratio=0.15,
       learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
       penalty='l2', power_t=0.5, random_state=None, shuffle=True,
       verbose=0, warm_start=False)

因此,您应该将y转换为由类标签组成的向量(在您的情况下为0-9)。