Sklearn SGDClassifier部分拟合

发布于 2021-01-29 15:11:41

我正在尝试使用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)?还是我做错了什么?

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    修改后的代码如下:

    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))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看