背景:
我在机器学习案例中执行代码时遇到问题。我已经通过一个丑陋的解决方法解决了该问题,因此我能够执行笔记本,但是我仍然不完全了解问题的原因。
当我尝试执行以下代码(使用sklearn的 OneHotEncoder 创建虚拟变量)时,就会出现问题。
categorical_columns = ~np.in1d(train_X.dtypes, [int, float])
尽管代码执行没有任何错误,但是它无法将numpy.int64识别为int数据类型,因此将所有int64数据类型列归为分类,并将其解析为OneHotEncoder。
train_X
是具有以下列和数据类型的pandas数据框对象,如您所见,整数存储为numpy.int64。
该代码最初是在Mac上的Jupyter Notebook中编写的,可以正常工作,并且在Google云上的Colaboraty中也可以正常运行。所有其他尝试在几乎相同的Windows计算机上从Jupyter运行代码的人都遇到了与运行脚本时相同的问题。
问题:
在Windows计算机上,似乎numpy.int64没有链接到本机int数据类型。
我尝试并验证过的内容
我在这里注意到了一个奇怪的“ on win32”,但根据post 1和post 2
来看,它似乎仅仅是“微软的无限智慧”的产物。问题:
为什么在Windows上所有内容都运行64位时numpy.int64不能转换为本地int数据类型,而在Mac和其他系统上却如此?
答案 0 :(得分:2)
对于Windows 64上默认的int
为什么是int32
的原因,我没有任何答案,但这是一个非常令人困惑的事实:
np.dtype('int')
在64位Windows上返回dtype('int32')
,在64位Linux上返回dtype('int64')
。
另请参阅the second warning here和此numpy github issue。
在您的具体情况下,我将使用pandas的is_numeric_dtype
函数来以独立于平台的简单方式检查数值:
from pandas.api.types import is_numeric_dtype
categorical_columns = ~train_X.dtypes.apply(is_numeric_dtype).to_numpy()