繁体   English   中英

Python dask_ml线性回归多个常量列检测到错误

[英]Python dask_ml linear regression Multiple constant columns detected error

我正在使用 python 和 dask 创建逻辑回归模型,以便在训练时加快速度。

我有 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"])

但我收到这个错误

ValueError:检测到多个常量列!

如何使用 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 DataFrame被分成许多 Pandas DataFrame。 这些被称为分区。 如果您将 npartitions 设置为 1,它应该具有与 sci-kit learn 完全相同的效果。 如果您将其设置为更多分区,它会将其拆分为多个数据帧,但我发现它会更改数据帧的形状,最终导致多列错误。 它也可能导致溢出警告。 不幸的是,调查此错误的直接原因不符合我的利益。 可能仅仅是因为 DataFrame 太大或太小。

分区的来源

在搜索引擎索引错误下方:

  • ValueError: Multiple constant columns detected!
  • RuntimeWarning: overflow encountered in exp return np.exp(A)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM