提升Scikit-learn多项逻辑回归训练速度的方法咨询
关于Scikit-learn逻辑回归训练耗时过长的问题与提速建议
首先,针对你的情况:21613×19的数据集训练耗时2小时确实偏久,这个规模的数据集正常训练应该在数分钟到十几分钟内完成,大概率是参数设置或预处理不到位导致的,下面是具体的优化建议:
1. 优先对特征做标准化处理
逻辑回归的求解器(尤其是基于梯度的newton-cg、lbfgs、sag/saga)对特征尺度非常敏感。如果你的特征数值范围差异很大,会导致求解器收敛速度极慢。建议用StandardScaler做标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) # 之后用标准化后的特征训练模型 clf.fit(X_train_scaled, y_train)
2. 更换更高效的求解器
你当前使用的newton-cg求解器在多分类场景下的效率不如一些现代求解器,推荐尝试以下两种:
saga:适合大规模数据集,支持L1/L2正则,多分类场景下收敛速度快,是当前最推荐的选项之一sag:类似saga,但仅支持L2正则,速度也比newton-cg快很多
修改代码示例:
clf = LogisticRegression(solver='saga', multi_class='multinomial', n_jobs=-1) clf.fit(X_train_scaled, y_train)
3. 开启并行计算
LogisticRegression的n_jobs参数可以指定使用的CPU核心数,设置为-1会利用所有可用核心,对于多分类任务能大幅缩短训练时间,上面的示例已经包含了这个参数。
4. 调整迭代与收敛参数
- 检查
max_iter:默认是100,如果模型一直不收敛会持续迭代,可适当增大(比如设为1000),但如果预处理到位,其实不需要太大的迭代次数 - 调整
tol:设置更大的容忍度(比如从默认的1e-4改为1e-3),可以让模型提前停止迭代,牺牲一点精度换取速度
示例:
clf = LogisticRegression(solver='saga', multi_class='multinomial', n_jobs=-1, max_iter=1000, tol=1e-3)
5. 检查数据质量
- 确认数据集没有冗余特征:比如高度相关的特征,可以用相关性分析(如
corr())剔除重复或高度相关的特征,减少计算量 - 确保数据类型合适:将特征矩阵转换为
float32类型(如果当前是float64),可以减少内存占用,提升计算速度:
X_train = X_train.astype('float32')
最后,按照上面的步骤调整后,你的训练时间应该能降到几分钟以内。如果还是有问题,可以检查是否有其他代码逻辑拖慢了训练(比如fit前的不必要计算)。
内容的提问来源于stack exchange,提问作者Joel2342
相关产品推荐
相关产品推荐

