【问题标题】:Scikit-learn: AttributeError: 'bool' object has no attribute 'any'Scikit-learn:AttributeError:'bool'对象没有属性'any'
【发布时间】:2021-06-08 13:04:35
【问题描述】:

所以,我正在研究管道,但在安装时偶然发现了这个错误:

Traceback (most recent call last):
  File "C:/Users/Shawn/Documents/temp/bool_issue.py", line 7, in <module>
    _assert_all_finite(array, False)
  File "C:\Users\Shawn\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\utils\validation.py", line 103, in _assert_all_finite
    if _object_dtype_isnan(X).any():
AttributeError: 'bool' object has no attribute 'any'

这实际上是一些自定义代码来测试问题,见下文

在回溯之后,我看到 _object_dtype_isnan() 采用一个 numpy 数组,并以布尔掩码(布尔数组)的形式返回另一个 numpy 数组。
但是,由于某种原因,它有时会直接返回一个布尔值。

重现错误的代码:

import numpy as np
import pandas as pd
from sklearn.utils.validation import _assert_all_finite

bad_array = np.array(['F', 'F', 'M', 'F', 'M', pd.NA, 'F', 'M'], dtype='object')

_assert_all_finite(bad_array, False)  # Raises AttributeError

【问题讨论】:

    标签: python pandas numpy scikit-learn


    【解决方案1】:

    经过进一步调查,我发现这是因为我的数据集中有一些pd.NA
    None 替换它们就可以了!

    # For my original pandas DataFrame
    X.replace(to_replace=pd.NA, value=None, inplace=True)
    

    根据我的理解(我没有检查,只是猜测),numpy 不会尝试进行元素比较,因为里面有外部对象,所以它会执行整个数组的比较。
    此外,使用pd.NA 处理掩码似乎是一团糟:

    >>> array = np.array(['F', 'F', 'M', 'F', 'M', pd.NA, 'F', 'M'], dtype='object')
    >>> mask = np.equal(array, np.array(['F', ] * len(array)))
    Traceback (most recent call last):
      File "C:/Users/Shawn/Documents/temp/bool_issue.py", line 7, in <module>
        mask = np.equal(array, np.array(['F', ] * len(array)))
      File "pandas\_libs\missing.pyx", line 360, in pandas._libs.missing.NAType.__bool__
    TypeError: boolean value of NA is ambiguous
    

    因此,如果您有在 numpy 数组中替换它们的技巧,请分享!

    虽然这个问题与 scikit-learn 没有直接关系,但与 numpy 的工作方式有关,这就是我发现它的方式,所以无论如何我都会标记它:耸耸肩::)

    【讨论】:

      【解决方案2】:

      所以,我最近又遇到了同样的错误,但这一次,它不适用于None

      长话短说,将 scikit-learn 从 0.23.2 更新到 0.24.2 解决了这个问题 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2020-08-06
        相关资源
        最近更新 更多