我正在尝试在scikit学习中训练逻辑回归模型,并且训练时间非常长,大约需要2个小时。数据集的大小为21613 x19。我是scikit学习的新手,因此我不知道我的代码是错误的还是训练时间很长。任何有关如何提高训练速度的建议将不胜感激!
下面用于训练的代码
# 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)
答案 0 :(得分:2)
如果有使用此求解器的特定原因,您可以做的一件事是通过设置n_jobs=-1
参数来并行化计算。
如果您愿意使用其他求解器,则可以通过 one-versus-rest 策略使用更快的求解器。例如:
clf = LogisticRegression(solver='liblinear', multi_class='ovr')
这一切都在documentation中,它可以帮助您指导选择求解器:
用于优化问题的算法。
对于小型数据集,“ liblinear”是一个不错的选择,而“ sag”和“ 大型的“传奇”更快。
对于多类问题,仅“ newton-cg”,“ sag”,“ saga”和“ lbfgs” 处理多项损失; “ liblinear”仅限于余数 方案。
“ newton-cg”,“ lbfgs”,“ sag”和“ saga”处理L2或不加罚款
“ liblinear”和“ saga”也处理L1处罚
“ saga”也支持“ elasticnet”惩罚
“ liblinear”不支持设置惩罚='none'
答案 1 :(得分:1)
由于您选择的求解器,速度可能很慢。牛顿-cg是牛顿法。对于大型数据集,这很慢,因为它会计算二阶导数。使用sag或saga等不同的求解器,它们对于大型数据集的速度很快。
答案 2 :(得分:1)
您可能想要更改求解器。 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)
为问题选择合适的求解器可以节省大量时间(代码改编自 here)。要确定哪种求解器适合您的问题,您可以查看 documentation 中的表格以了解更多信息(请注意,'newton-cg' 对于大型数据集并不会更快)。