Scikit-learn:AttributeError:'bool'对象没有属性'any'

Sha*_* H. 1 python numpy pandas scikit-learn

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

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'
Run Code Online (Sandbox Code Playgroud)

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

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

重现错误的代码:

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'
Run Code Online (Sandbox Code Playgroud)

Sha*_* H. 6

经过进一步调查,我发现这是因为有些内容pd.NA进入了我的数据集。
None作品替换它们就好了!

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

根据我的理解(我没有检查,只是猜测),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
Run Code Online (Sandbox Code Playgroud)

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

虽然这个问题并不直接与 scikit-learn 相关,而是与 numpy 的工作方式相关,但这就是我找到它的方式,所以无论如何我都会标记它:shrug::)