我正在使用带有 dask 的 python 来创建逻辑回归模型,以便在训练时加快速度。
我有 x 是特征数组(numpy 数组),y 是标签向量。
编辑: numpy 数组是:x_train(n*m 大小)浮点数数组,y_train是 (n*1) 整数向量,是训练的标签。两者都非常适合sklearn LogisticRegression.fit,并且在那里工作正常。
我尝试使用此代码创建一个熊猫 df,然后将其转换为 dask ddf 并对其进行训练,如下所示
from dask_ml.linear_model import LogisticRegression
from dask import dataframe as dd
df["label"] = y_train
sd = dd.from_pandas(df, npartitions=3)
lr = LogisticRegression(fit_intercept=False)
lr.fit(sd, sd["label"])
但是收到错误
找不到add_intercept的签名:
我在 Gitgub 上发现了这个问题
解释如何改用此代码
from dask_ml.linear_model import LogisticRegression
from dask import dataframe as dd
df["label"] = y_train
sd = dd.from_pandas(df, npartitions=3)
lr = LogisticRegression(fit_intercept=False)
lr.fit(sd.values, sd["label"])
但是我收到此错误
值错误:检测到多个常量列!
如何使用 dask 对源自 numpy 数组的数据进行逻辑回归?
谢谢。
您可以使用以下方法绕过标准验证
lr = LogisticRegression(solver_kwargs={"normalize":False})
或者您可以使用@Emptyless代码来获取错误的column_indices ,然后从数组中删除这些列。
这似乎不是dask_ml
的问题。查看源,使用以下公式计算std
:
mean, std = da.compute(X.mean(axis=0), X.std(axis=0))
这意味着对于您提供的数组中的每一列,dask_ml
计算标准偏差。如果其中一列的标准差等于零(np.where(std == 0))
),则意味着该列的变异为零。
包含零变异的列不允许任何训练,因此需要在训练模型之前将其删除(在数据准备/清理步骤中)。
您可以通过检查以下内容来快速检查哪些列没有变化:
import numpy as np
std = sd.std(axis=0)
column_indices = np.where(std == 0)
print(column_indices)
派对有点晚了,但我还是来了。希望未来的读者欣赏它。此答案适用于多列错误。
一个 Dask数据帧被拆分为许多 Pandas 数据帧。这些称为分区。如果你将 npartitions 设置为 1,它应该具有与 sci-kit learn 完全相同的效果。如果您将其设置为更多分区,它会将其拆分为多个数据帧,但我发现它会更改数据帧的形状,最终导致多列错误。它还可能导致溢出警告。不幸的是,调查此错误的直接原因不符合我的兴趣。这可能仅仅是因为数据帧太大或太小。
分区源
在搜索引擎索引错误下方:
ValueError: Multiple constant columns detected!
RuntimeWarning: overflow encountered in exp return np.exp(A)