gpt4 book ai didi

python - Sklearn SGDClassifier 部分拟合

转载 作者:IT老高 更新时间:2023-10-28 21:49:25 24 4
gpt4 key购买 nike

我正在尝试使用 SGD 对大型数据集进行分类。由于数据太大而无法放入内存,我想使用 partial_fit 方法来训练分类器。我选择了适合内存的数据集样本(100,000 行)来测试 fitpartial_fit:

from sklearn.linear_model import SGDClassifier

def batches(l, n):
for i in xrange(0, len(l), n):
yield l[i:i+n]

clf1 = SGDClassifier(shuffle=True, loss='log')
clf1.fit(X, Y)

clf2 = SGDClassifier(shuffle=True, loss='log')
n_iter = 60
for n in range(n_iter):
for batch in batches(range(len(X)), 10000):
clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y))

然后我使用相同的测试集测试两个分类器。在第一种情况下,我得到 100% 的准确率。据我了解,SGD 默认通过训练数据 5 次(n_iter = 5)。

在第二种情况下,我必须将数据传递 60 次才能达到相同的准确度。

为什么会有这种差异(5 对 60)?还是我做错了什么?

最佳答案

我终于找到了答案。您需要在每次迭代之间打乱训练数据,因为在实例化模型时设置 shuffle=True 不会在使用 partial_fit 时打乱数据(它只适用于fit)。注意:在 sklearn.linear_model.SGDClassifier page 上查找此信息会很有帮助。 .

修改后的代码如下:

from sklearn.linear_model import SGDClassifier
import random
clf2 = SGDClassifier(loss='log') # shuffle=True is useless here
shuffledRange = range(len(X))
n_iter = 5
for n in range(n_iter):
random.shuffle(shuffledRange)
shuffledX = [X[i] for i in shuffledRange]
shuffledY = [Y[i] for i in shuffledRange]
for batch in batches(range(len(shuffledX)), 10000):
clf2.partial_fit(shuffledX[batch[0]:batch[-1]+1], shuffledY[batch[0]:batch[-1]+1], classes=numpy.unique(Y))

关于python - Sklearn SGDClassifier 部分拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24617356/

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