将逻辑回归模型拟合到 MNIST 数据需要很长时间

Posted

技术标签:

【中文标题】将逻辑回归模型拟合到 MNIST 数据需要很长时间【英文标题】:Fitting Logistic Regression model to MNIST data takes very long 【发布时间】:2019-09-15 11:43:32 【问题描述】:

我正在尝试将 sklearn 中的 LogisticRegression 模型应用于 MNIST 数据集,并且我已将训练 - 测试数据拆分为 70-30 拆分。

但是,当我简单地说 model.fit(train_x, train_y) 需要很长时间。

我在启动逻辑回归时没有添加任何参数。

代码:

import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_mldata
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

import tempfile

test_data_home = tempfile.mkdtemp()
mnist = fetch_mldata('MNIST original', data_home = test_data_home)


x_train, x_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size = 0.30, random_state = 0)

lr = LogisticRegression(penalty = 'l2')
lr.fit(x_train, y_train)

【问题讨论】:

你能分享你正在运行的代码吗?还有你机器的规格? @alift 为规格和代码添加了图片 将有助于查看代码,并告诉您大约需要多长时间才能获得结果? 10分钟? 1小时?等 @alift 花了大约 20 分钟来使模型适应数据。这两行字面上就是我到目前为止所做的。 嗯,你的规格对我来说似乎不错,但 20 分钟太多了。恐怕我无法帮助您,因为您没有共享代码,仅用您共享的两行代码就找不到问题。如果您不愿意分享代码,请看这里,看看您在做什么不同,希望对您有所帮助:scikit-learn.org/stable/auto_examples/linear_model/…。祝你好运 【参考方案1】:

首先,MINST 不是二分类,而是多分类。所以关于 scikit-learn 中的文档:

multi_class : str, 'ovr', 'multinomial', 'auto',默认值:'ovr' If 选择的选项是“ovr”,那么每个二元问题都适合 标签。对于“多项式”,最小化的损失是多项式损失 适合整个概率分布,即使数据是 二进制。当solver='liblinear'时,'multinomial'不可用。 '汽车' 如果数据是二进制的,或者如果solver='liblinear',则选择'ovr',并且 否则选择“多项式”。

您需要在创建模型时强调它。

由于 MINST 具有相同数量级的功能,我相信如果您明确将您的求解器称为 saga,它的收敛速度比其他求解器更快。

所以我会以 Scikitlearn here 为例设置训练参数,并将您的代码更改为:

lr = LogisticRegression(C=50. / train_samples,
                         multi_class='multinomial',
                         penalty='l1', solver='saga', tol=0.1)
lr.fit(x_train, y_train)

【讨论】:

【参考方案2】:

您提出的问题似乎相当模糊,但我相当确定您的逻辑回归没有收敛。除非您担心过度拟合,否则我不确定为什么现在要包含“L2”惩罚项。无论如何,如果您查看sklearn docs,它会说:

用于优化问题的算法。

对于小型数据集,“liblinear”是一个不错的选择,而“sag”和“saga”对于大型数据集来说更快。 对于多类问题,只有“newton-cg”、“sag”、“saga”和“lbfgs”处理多项损失; “liblinear”仅限于一对一的方案。 “newton-cg”、“lbfgs”和“sag”只处理 L2 惩罚,而“liblinear”和“saga”处理 L1 惩罚。 请注意,“sag”和“saga”的快速收敛仅在具有大致相同规模的特征上得到保证。您可以使用 sklearn.preprocessing 中的缩放器对数据进行预处理。

我会立即建议您添加参数 `solver = sag'(或任何其他可以处理 L2 惩罚的求解器),因为文档明确指出只有某些求解器可以处理 L2 惩罚,并且 默认求解器仅限 liblinear处理 L1 罚分。有一篇关于逻辑回归求解器的非常棒的帖子,您可以查看您的数据集:Solvers for Logistic Regression

请记住,L2 和 L1 正则化是为了处理过度拟合,因此,您甚至可以更改 lr 定义中的 C 参数。请查看 sklearn 文档以获取更多信息。希望这可以帮助。

【讨论】:

以上是关于将逻辑回归模型拟合到 MNIST 数据需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

6.逻辑回归

svm 需要很长时间进行超参数调整

逻辑回归

逻辑斯蒂回归(logisic regression)和SVM的异同

机器学习实战精读--------回归

吴裕雄 python 神经网络——TensorFlow实现回归模型训练预测MNIST手写数据集