【问题标题】:very long runs times with sklearn.linear_model.SGDClassifier using log loss function使用对数损失函数的 sklearn.linear_model.SGDClassifier 运行时间很长
【发布时间】:2019-11-29 18:46:03
【问题描述】:

我正在尝试复制 here 所做的工作:

该项目的目标是建立一个逻辑机器学习模型来预测投资失败与否的概率。

sklearn部分代码如下:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import Imputer, StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import SGDClassifier

pipeline_sgdlogreg = Pipeline([
    ('imputer', Imputer(copy=False)), # Mean imputation by default
    ('scaler', StandardScaler(copy=False)),
    ('model', SGDClassifier(loss='log', max_iter=1000, tol=1e-3, random_state=1, warm_start=True))
])


param_grid_sgdlogreg = {
    'model__alpha': [10**-5, 10**-2, 10**1],
    'model__penalty': ['l1', 'l2']
}

grid_sgdlogreg = GridSearchCV(estimator=pipeline_sgdlogreg, param_grid=param_grid_sgdlogreg, 
                              scoring='roc_auc', n_jobs=-1, pre_dispatch='2*n_jobs', cv=5, 
                              verbose=1, return_train_score=False)
grid_sgdlogreg.fit(X_train, y_train)

GridSearchCV(cv=5, error_score='raise',
       estimator=Pipeline(memory=None,
       steps=[('imputer', Imputer(axis=0, copy=False, missing_values='NaN', strategy='mean', verbose=0)), 
              ('scaler', StandardScaler(copy=False, with_mean=True, with_std=True)), 
              ('model', SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,
       penalty='l2', power_t=0.5, random_state=1, shuffle=True,
       tol=0.001, verbose=0, warm_start=True))]),
       fit_params=None, iid=True, n_jobs=-1,
       param_grid={'model__alpha': [1e-05, 0.01, 10], 'model__penalty': ['l1', 'l2']},
       pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
       scoring='roc_auc', verbose=1)
grid_sgdlogreg.best_score_
grid_sgdlogreg.best_params_

我在训练集中有大约 200000 行数据。初始运行 6 小时后没有产生任何结果或消息。

将我的训练集减少到 100 行,模型在大约 9 秒内运行。 200 行似乎无休止地运行。

在我尝试复制的 python 笔记本示例中,训练集有 730000 行,运行只用了 3.3 分钟。

我在具有 16 GB 内存的 8 核 i7 上并行运行。

我猜我需要对数据进行额外的预处理,但不知道从哪里开始。我应该在我的数据中查找哪些可能导致此问题的内容?

【问题讨论】:

    标签: scikit-learn logistic-regression


    【解决方案1】:

    我认为将SGDClassifiermax_iter 参数值减少到(10,30) 范围内的某个位置可能是一个不错的选择,因为您有足够大的数据集进行二进制分类,您不必做1000迭代次数。

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2020-10-02
      相关资源
      最近更新 更多