缩短 sklearn 逻辑回归的运行时间

Posted

技术标签:

【中文标题】缩短 sklearn 逻辑回归的运行时间【英文标题】:shortening runtime for sklearn Logistic Regression 【发布时间】:2021-01-30 06:57:06 【问题描述】:

我目前有一个 Flask 服务器,它接收数据并对其应用逻辑回归算法。但是,我计划将其转换为 AWS Lambda 函数,并且我希望算法在时间上尽可能高效。

输入是这样的:

代码的算法部分只有几行:

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)
y_predict_test = classifier.predict(X)
oldlist = classifier.predict_proba(X)
problist = sortProb(oldlist)
return(problist)

目前处理此过程大约需要 2.6 秒。有没有办法加快速度?

谢谢

【问题讨论】:

在样本上运行您的模型 这能回答你的问题吗? Speeding up sklearn logistic regression 【参考方案1】:

这不是 lambda 通常在机器学习管道中使用的方式。通常,您会使用 lambda 进行一些数据格式化并将结果传递到托管经过训练的模型的 SageMaker 端点。但是对于一些非常小的模型,我想你可以试试 lambda 作为你的后端。

首先,无论您使用的是 lambda 还是任何后端,您很可能都不想在每次调用端点时都训练模型,您只想进行推理(除非我们专门讨论在线学习)。

因此,像往常一样离线训练您的模型,然后使用该训练过的模型进行推理。逻辑回归是一种非常简单的算法(至少是推理部分),因此您可以提取相关参数并将它们“硬编码”到具有适当推理逻辑的 lambda 函数中。

这是提取模型系数和截距的方法。

# This is the offline part
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)

coef, intercept = clf.coef_, clf.intercept_

并在您的 lambda 函数中使用它们。以下是你可以如何实现它(我在这里使用numpy,但你可以随意实现它)。另外,我省略了 lambda 的样板代码。

# This goes into your lambda function
coef, intercept = # hardcoded parameters here

def sigmoid(X):
    return 1 / (1 + np.exp(-X))

def predict(X, intercept, coef):
    return sigmoid(np.dot(X, coef.T) + intercept)

# compute prediction
predict(X[0], intercept, coef)

【讨论】:

我不太明白如何在 lambda 中进行离线训练?我希望能够将数据框传递到 LogReg 算法并获取概率列表。不知道离线如何使用它。如果您不介意,我可以获取您的 reddit 用户名,以便我可以带这个 convo 聊天吗? 我所说的离线训练是指你在不使用 lambda 的情况下执行训练步骤(本地在你的计算机上或你可以访问的某个虚拟服务器上),一旦完成,你只需提取参数然后将其硬编码到您的 lambda 函数中。这假设您的端点仅负责预测,而不负责实际训练。如果你打算同时进行训练和预测,那么我认为 lambda 不适合这样的任务,你很可能需要设计不同的策略。

以上是关于缩短 sklearn 逻辑回归的运行时间的主要内容,如果未能解决你的问题,请参考以下文章

逻辑回归 SKLEARN 无法将字符串转换为浮点数:“DailyReturns”

获取 sklearn 逻辑回归的边际效应

sklearn上的逻辑回归函数

在 sklearn 中计算管道逻辑回归 predict_proba

训练期间的sklearn逻辑回归损失值

为啥 sklearn 逻辑回归正则化权重和截距?