- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用在线( 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/
我使用 SVM 分类器将文本分类为好文本和乱码。我正在使用 python 的 scikit-learn 并按如下方式进行操作: ''' Created on May 5, 2017 ''' impor
我已经训练了一个模型并确定了一个我想要部署它的“阈值”,但我无法理解阈值与分数的关系。 X = labeled_data[features].reset_index(drop=True) Y = np
我使用 SGDClassifier 结合部分拟合方法来使用大量数据进行训练。我想监控何时达到可接受的收敛水平,这意味着我想知道某些数据每 n 次迭代的损失(可能是训练,可能是保留,也许两者都有)。 我
我正在尝试使用 this 之后的 SGDClassifier 对短语进行分类教程 我的管道如下所示: p_clf = Pipeline([('vect', CountVectorizer(analyz
我确实创建了一个与此类似的 scikit 模型。但现在我想提取两个输出。我不知道在训练时如何通过这个。我确实尝试过类似于Keras。 [y,z] 作为列表。但它在 scikit 中不起作用。以前有人尝
我正在使用 sklearn.linear_model.SGDClassifier 训练一个简单的线性模型。我看到一些结果,在相同的训练集上进行训练有时会产生截然不同的结果。我正在尝试运行一个实验,在其
我正在处理 Aurelien Geron's Hands-On ML textbook并且在尝试训练 SGDClassifier 时遇到了困难。 我正在使用 MNIST 手写数字数据并通过 Anaco
我正在尝试使用 SGD 对大型数据集进行分类。由于数据太大而无法放入内存,我想使用 partial_fit 方法来训练分类器。我选择了适合内存的数据集样本(100,000 行)来测试 fit 与 pa
因此,我已尽一切可能来解决此错误,这也是我巨大的挫败感。 from sklearn.linear_model import SGDClassifier train_labels_9 = [(label
我正在尝试使用 scikit-learn 进行文本分类。 我的文本无法很好地分类。我认为我可以通过添加可以以整数数组的形式推导的数据来改进预测。 例如,示例 1 将带有 [3, 1, 5, 2],示例
我正在使用使用 scikit_Learn 进行机器学习实践”(O'Reilly)进行自学,目前正在使用具有不同分类器的 MNIST 数据。 第 94 页的文本表示,SGDClassifier 能够执行
我目前正在使用 partial_fit 和 SGDClassifier拟合模型来预测图像上的主题标签。 我遇到的问题是 SGDClassifier 需要预先指定类。这可以离线拟合模型,但我想在观察新主
我可能无法在这里找到我需要的帮助,但我希望互联网上的聪明编码者可以帮助我。我正在尝试使用 Python 的 Sci-Kit learn SGDClassifier 对物理事件进行分类。这些物理事件创建
我正在尝试使用在线( out-of-core) 学习算法来解决 MNIST 问题,使用 SGDClassifier但似乎准确率并不总是在增加。 这种情况我该怎么办?以某种方式保存最准确的分类器?SGD
我知道我可能会将损失函数更改为以下之一: loss : str, 'hinge' or 'log' or 'modified_huber' The loss function to be used.
我想在训练 SGDClassifier 时使用重要性采样。我已经看到 fit 和 partial_fit 方法中有一个 sample_weight 参数,但我不确定这个参数是如何工作的。 假设我有 1
我正在使用 sklearn 库来训练和测试我的数据。 targetDataCsv = pd.read_csv("target.csv","rt")) testNormalizedCsv = csv.
我正在尝试使用 SGDClassifier 对一些数据进行建模,但由于某种原因,我的准确性很差。我对此很陌生,所以我不太明白为什么。 这是我的代码: from sklearn.preprocessin
我正在尝试使用 scikit-learn 版本 0.15.1 中的 SGDClassifier。除了迭代次数之外,似乎没有任何方法可以设置收敛标准。因此,我想通过在每次迭代时检查错误来手动执行此操作,
我找不到 SGDClassifier in Scikit-learn 的学习率公式当 learning_rate='optimal' 时,在同一函数的原始 C++ 源代码中https://leon.b
我是一名优秀的程序员,十分优秀!