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

时间:2019-06-06 08:51:10

标签: python pandas numpy machine-learning dask

我正在使用带有dask的python创建一个逻辑回归模型,以加快训练时的速度。

我有x是要素数组(numpy数组),y是标签向量。

编辑: numpy数组为:x_train(n * m大小)浮点数数组,y_train是(n * 1)个整数向量,它们是训练的标签。两者都非常适合sklearn LogisticRegression.fit并在此正常工作。

我尝试使用此代码创建一个熊猫df,然后将其转换为dadd ddf并对其进行训练,如图here

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上发现了this issue

解释使用此代码代替

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数组的数据进行逻辑回归训练?

谢谢。

3 个答案:

答案 0 :(得分:0)

dask_ml似乎没有问题。看着sourcestd的计算方法如下:

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)

答案 1 :(得分:0)

您可以使用

绕过标准验证
purrr

或者您可以使用@Emptyless代码获取有问题的column_indices 然后从阵列中删除这些列。

答案 2 :(得分:0)

聚会有点晚了,但我还是来了。希望未来的读者欣赏它。这个答案是针对 Multiple Columns 错误的。

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

A source for partitioning

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

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