我正在尝试使用scikit-learn中的LatentDirichletAllocation()类,其中evaluate_every
参数的描述如下。
评估困惑度的频率。仅在fit方法中使用。将其设置为0或负数以完全不评估训练中的困惑度。评估困惑度可以帮助您检查训练过程中的收敛情况,但也会增加总训练时间。每轮迭代评估困惑度可能会使训练时间增加一倍。
我将此参数设置为2(默认值为0),并观察到训练时间增加,但我在任何地方都找不到困惑度值。这些结果是被保存的,还是仅由模型用来决定何时停止?我希望使用困惑度值来衡量模型的进展和学习曲线。
回答:
它与perp_tol
参数一起使用来评估收敛情况,并且根据源码,这些值不会在迭代之间保存:
for i in xrange(max_iter): # ... # 检查困惑度 if evaluate_every > 0 and (i + 1) % evaluate_every == 0: doc_topics_distr, _ = self._e_step(X, cal_sstats=False, random_init=False, parallel=parallel) bound = self.perplexity(X, doc_topics_distr, sub_sampling=False) if self.verbose: print('iteration: %d, perplexity: %.4f' % (i + 1, bound)) if last_bound and abs(last_bound - bound) < self.perp_tol: break last_bound = bound self.n_iter_ += 1
请注意,您可以通过以下方式轻松调整现有源码来实现这一点:(1) 在__init__
方法中添加self.saved_bounds = []
这一行,(2) 在上述代码中添加self.bounds.append(bound)
,如下所示:
if last_bound and abs(last_bound - bound) < self.perp_tol: breaklast_bound = boundself.bounds.append(bound)
根据您保存更新后的类的位置,您还需要调整文件顶部的导入语句,以引用scikit-learn中的完整模块路径。