我已经在论坛的几组评论数据上构建了一个逻辑回归分类器,但该模型需要花费很长时间才能收敛(14-16小时)。我需要statsmodels
的输出来显示模型的适合度,所以遗憾的是使用sklearn
不是一种选择。 This post遇到类似的挑战,但没有解决方案。我不确定这对于统计数据是否是一个更好的问题,但是我最相似的问题都发布在这里!
模型细节:大约有100,000条评论/样本和5000个功能。特征空间是数据集中的前n个单词,标准化(TF-IDF,如果您熟悉的话)。因此,功能集非常稀疏。我使用密集矩阵来表示这一点。
我测试了一个1000个样本×1000个特征的模型,并且在1-2秒内适合和重新调整,因此需要花费16个小时来进行规范化似乎极端。在sklearn
中,完整的特征和样本集在大约10秒内完成拟合/正则化。
这是我使用的代码:
#X_train, X_test, y_train, y_test are from sklearn's train_test_split function.
#X_train is features for training data, Y_train are the classes, etc.
#these are all scipy dense matrices
#add constants to the feature set
sm.add_constant(X_train, prepend = True)
sm.add_constant(X_test, prepend = True)
#assign alpha
a_base = 1
alpha = a_base * np.ones(X_train.shape[1], dtype=np.float64)
alpha[0] = 0 #don't penalize the last value which is our intercept
#fit and regularize
logit = sm.Logit(y_train, X_train)
results=logit.fit_regularized(method="l1_cvxopt_cp", alpha=alpha, disp=True)
很高兴提供更多有用的代码和详细信息!
答案 0 :(得分:0)
您可以使用 Pearson优度统计或偏差统计来轻松完成此任务。
Pearson拟合优度统计
$$ X ^ 2 = \ sum_ {i} \ frac {(O_i - E_i)^ 2} {E_i} $$
偏差统计
$$ G ^ 2 = 2 \ sum_ {I} O_i \日志(\压裂{O_i} {E_i})$$
在这种情况下,您观察到的数据将是一组标记数据,您的预期将是您的模型预测的数据。实施我将留给你,但它肯定不会花费14-16小时甚至100,000个样品(如果你有那么多标签)。获得统计值后,您可以根据测试统计量,自由度和所需的置信度进行卡方检验。或者你可以省略置信度,只需使用得到的p值来告诉你模型“适合”的程度。
现在所有这一切,我真的不喜欢一个模型的单一“适合度”的想法。每个问题都是不同的,应该真正利用许多指标中的任何一个来分析它在特定预测任务中的实际执行情况。出于这个原因,sklearn为您提供了大量的方法来实现这一目标。花点时间查看sklearn.metrics课程,以及Model Evaluation上的文档部分。这正是sklearn所实施的,只有很少的关于这个主题的文献样本。这是一个密集的话题,可以引导你走进一个非常深的黑暗兔子洞,并引起团队成员或其他研究人员之间激烈的争论。
重要的是要了解您的模型实际上想要捕获和预测的内容。成功和失败的范围究竟是什么样的?一旦你完全理解了这一点,你就可以确定一种能够以智能方式捕捉到它的“准确度”。