2017-03-08 74 views
0

我正在尝试使用HashingVectorizer来训练带有文本数据的SGDClassifier。我想知道如何组装从多个文件读取到的partial_fit()批次。如何获得scikit-learn的迭代partial_fit

以下代码是通过迭代获取批量数据的适当方式吗?有没有最佳做法或推荐的方式来做到这一点?

class MyIterable: 
def __init__(self, files, batch_size): 
    self.files = files 
    self.batch_size = batch_size 
def __iter__(self): 
    batchstartmark = 0 
    for line in fileinput.input(self.files): 
     while batchstartmark < self.batch_size 
      yield line.split('\t') 
      batchstartmark += 1 

在此先感谢!

+0

请详细解释一下你想做什么? –

回答

1

只是在这里判断这种方法的理论: 这是一个非常非常糟糕的做法!

由于SGDClassifier使用随机梯度下降(使用mini-批,如果你想),你应该尽量满足SGDs数学分析的假设。

SGD的基本思路是:挑一些随机元素和下降。您的代码显然两点发散:

  • A)你是捡以相同的顺序您的元素每个时间
  • B)你是采样(不是真的)无需更换
    • 所以X17不会得到回升,直到所有其他X在这个时代
回升

您对A的无知会导致非常糟糕的表现,并且可能性很高。

B很难分析。有不同的理论观点,主要依赖于一些具体问题(当然凸和非凸问题之间存在差异),而是经典的(具有最一般的收敛性证明),有时采样无需替换(又名:shuffle并在时代/循环中迭代)被使用,并且通常收敛速度更快。

+0

你是对的,谢谢!到现在为止,我总是使用classifier.fit(),因为我的数据适合内存,默认情况下会对数据进行混洗。 – cookiedealer