gpt4 book ai didi

python - MNIST 和 SGDClassifier 分类器

转载 作者:行者123 更新时间:2023-11-30 08:55:43 25 4
gpt4 key购买 nike

我正在尝试使用在线( out-of-core) 学习算法来解决 MNIST 问题,使用 SGDClassifier但似乎准确率并不总是在增加。

这种情况我该怎么办?以某种方式保存最准确的分类器?SGDClassifier 是否收敛到某个最佳解决方案?

这是我的代码:

import numpy as np
from sklearn.linear_model.stochastic_gradient import SGDClassifier
from sklearn.datasets import fetch_mldata
from sklearn.utils import shuffle

#use all digits
mnist = fetch_mldata("MNIST original")
X_train, y_train = mnist.data[:70000] / 255., mnist.target[:70000]

X_train, y_train = shuffle(X_train, y_train)
X_test, y_test = X_train[60000:70000], y_train[60000:70000]

step =1000
batches= np.arange(0,60000,step)
all_classes = np.array([0,1,2,3,4,5,6,7,8,9])
classifier = SGDClassifier()
for curr in batches:
X_curr, y_curr = X_train[curr:curr+step], y_train[curr:curr+step]
classifier.partial_fit(X_curr, y_curr, classes=all_classes)
score= classifier.score(X_test, y_test)
print score

print "all done"

我在 MNIST 上测试了 LinearSVM 与 SGD,使用 10k 样本进行训练,10k 样本进行测试,得到 0.883 13,95 和 0.85 1,32,因此 SGD 速度更快,但准确性较低。

#test linearSVM vs SGD
t0 = time.time()
clf = LinearSVC()
clf.fit(X_train, y_train)
score= clf.score(X_test, y_test)
print score
print (time.time()-t0)

t1 = time.time()
clf = SGDClassifier()
clf.fit(X_train, y_train)
score= clf.score(X_test, y_test)
print score
print (time.time()-t1)

我还在这里找到了一些信息 https://stats.stackexchange.com/a/14936/16843

更新:超过一次(10次)通过数据达到了90.8%的最佳准确率。所以它可以是解决方案。 SGD 的另一个特点是数据在传递到分类器之前必须进行混洗。

最佳答案

第一条评论:您正在使用带有默认参数的 SGDClassifier:它们可能不是此数据集的最佳值:也可以尝试其他值(特别是对于 alpha,正则化参数)。

现在回答你的问题,线性模型不太可能在像 MNIST 这样的数字图像分类任务数据集上表现得很好。您可能想尝试线性模型,例如:

  • SVC(kernel='rbf')(但不可扩展,请尝试训练集的一小部分)并且不是增量/核外
  • ExtraTreesClassifier(n_estimator=100) 或更多,但也不是核心外的。子估计器的数量越多,训练所需的时间就越长。

您还可以尝试Nystroem approximation通过使用适合数据小子集(例如 10000样本),然后将整个转换后的训练集传递给线性模型,例如 SGDClassifier:它需要对数据集进行 2 次传递。

还有一个pull request for 1 hidden layer perceptron在 github 上,它的计算速度应该比 ExtraTreesClassifier 更快,并且在 MNIST 上达到 98% 的测试集准确率(并且还提供用于核外学习的partial_fit API)。

编辑:SGDClassifier 分数估计值的波动是预期的:SGD 代表随机梯度下降,这意味着一次只考虑一个示例:糟糕分类样本可能会导致模型权重的更新,这对其他样本来说是有害的,因此您需要对数据进行多次传递,以使学习率降低到足以获得验证准确性的更平滑的估计。您可以使用itertools.repeat在 for 循环中对数据集执行多次(例如 10 次)。

关于python - MNIST 和 SGDClassifier 分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com