【问题标题】:Improve speed of scikit-learn multinomial logistic regression提高 scikit-learn 多项逻辑回归的速度
【发布时间】:2020-10-30 01:31:14
【问题描述】:

我正在尝试在 scikit learn 中训练一个逻辑回归模型,训练需要很长时间,大约 2 小时。数据集的大小为 21613 x 19。我是 scikit learn 的新手,因此我不知道我的代码是否错误,或者训练需要很长时间。非常感谢任何有关如何提高训练速度的建议!

用于训练的代码如下

# get the LogisticRegression estimator
from sklearn.linear_model import LogisticRegression

# training the model
# apply algorithm  to data using fit()
clf = LogisticRegression(solver='newton-cg',multi_class='multinomial')
clf.fit(X_train,y_train)

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    如果您有使用此求解器的特定原因,您可以做的一件事是通过设置 n_jobs=-1 参数来并行化计算。

    如果您愿意使用其他求解器,则可以使用具有 one-versus-rest 策略的更快求解器。例如:

    clf = LogisticRegression(solver='liblinear', multi_class='ovr')
    

    都在documentation,可以帮助您指导您选择求解器:

    求解器:{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, default=‘lbfgs’

    用于优化问题的算法。

    • 对于小型数据集,“liblinear”是一个不错的选择,而“sag”和 'saga' 对于大型的更快。

    • 对于多类问题,只有“newton-cg”、“sag”、“saga”和“lbfgs” 处理多项损失; “liblinear”仅限于一对一 计划。

    • ‘newton-cg’、‘lbfgs’、‘sag’和‘saga’处理L2或无惩罚

    • ‘liblinear’和‘saga’也处理 L1 惩罚

    • ‘saga’也支持‘elasticnet’惩罚

    • ‘liblinear’不支持设置惩罚=‘none’

    【讨论】:

    • 谢谢大佬,只是想问一下21000行的小数据集应该训练多长时间?
    • 我认为非常快,乘以您拥有的每个标签。你有很多类别吗?
    • 我在 15 分钟前尝试训练模型,但尚未完成训练
    • 这不是你的列数吗?
    【解决方案2】:

    由于您选择的求解器,它可能会那么慢。 newton-cg 是一种牛顿法。对于大型数据集,它很慢,因为它计算二阶导数。使用不同的求解器,例如 sag 或 saga,它们对于大型数据集来说速度很快。

    【讨论】:

    • 好的,谢谢。只是检查一下,训练应该多快完成?
    • 对您来说,最多需要大约 3 秒。只是好奇,您使用的是 kc_house_data 数据集吗?
    • 是的,就是那个数据集。仍然需要相当长的时间来训练。
    • 这可能是其他问题而不是您的代码,因为它很慢。因为当我使用 newton-cg 求解器在同一数据集上尝试逻辑回归时,执行大约需要 3 秒。在不提供任何求解器的情况下,它需要 2 秒才能给出输出。您使用的是哪个 IDE?
    【解决方案3】:

    您可能想要更改求解器。 documentation 表示 scikit-learn 有 5 个不同的求解器:“sag”、“saga”、“newton-cg”、“lbfgs”和“liblinear”(不适用于多项式)。

    import time
    from sklearn.datasets import make_classification
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    
    # Set training and validation sets
    X, y = make_classification(n_samples=1000000, n_features=19, n_classes = 8, n_informative=8)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000)
    
    # Solvers
    solvers = ['newton-cg', 'sag', 'saga', 'lbfgs']
    
    for sol in solvers: 
        start = time.time()
        logreg = LogisticRegression(solver=sol, multi_class='multinomial')
        logreg.fit(X_train, y_train)
        end = time.time()
        print(sol + " Fit Time: ",end-start)
    

    输出(来自 16GB RAM 8 核 Macbook):

    为问题选择合适的求解器可以节省大量时间(代码改编自here)。要确定哪个求解器适合您的问题,您可以查看documentation 中的表格以了解更多信息(请注意,对于大型数据集,'newton-cg' 并不快)。

    【讨论】:

      猜你喜欢
      • 2016-07-31
      • 2017-03-31
      • 2016-02-21
      • 2018-06-29
      • 2019-09-20
      • 2018-03-01
      • 2012-06-27
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多