如何将数据类型更改为 float64 以便 sklearn 可以处理数据大于 np.float32 的数据帧

Posted

技术标签:

【中文标题】如何将数据类型更改为 float64 以便 sklearn 可以处理数据大于 np.float32 的数据帧【英文标题】:How could I change datatype to float64 so that sklearn can work on dataframe which has data greater than np.float32 【发布时间】:2020-03-10 11:18:06 【问题描述】:

在我的数据集中,很少有数据(即1.4619664882428694e+258)大于float32 最大值(3.4028235e+38)。现在在拟合模型时出现以下错误:

Input contains NaN, infinity or a value too large for dtype('float32').

我试过下面的代码:

df_features = pd.read_csv('data\df_features.csv')
df_target = pd.read_csv('data\df_target.csv')

X_train, X_test, y_train, y_test = train_test_split(df_features, df_target, test_size=.25, random_state=0)

model = AdaBoostRegressor()

try:
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    acc = r2_score(y_test, y_pred)
    print(acc)

except Exception as error:
    print(error)

如果我想使用真实数据而不进行规范化,我该如何解决这个问题?是否有任何选项可以让我将 sklearn 的默认数据类型设置为 float64。如果是,那怎么办?

【问题讨论】:

您可以发布您的部分数据吗? 我在这里添加了示例数据:github.com/bikashkarmokar/float32_bug_sklearn 考虑接受并支持我的回答。更多详情请关注 github 请求 【参考方案1】:

这可能不是问题的直接答案,但我认为出于实际目的,它应该作为数据科学问题来解决。

首先,1.4e258 的值让人感觉相当可疑,因为很难想象它在哪里可以具有有意义的物理意义。这样的极端值可能会严重破坏您的指标和模型。问题应该是它是否是异常值。答案取决于您的数据及其含义。

如果它是一个 oultier(如极值),正确的方法可能是完全删除该实例。这可能会提高训练模型在其余实例上的性能。缺点是模型在该实例或类似的极值上表现不佳。实际上,这要求您让使用该模型的每个人都意识到它对这些极端值的限制。

如果它不是异常值,则应考虑对其进行修改以使其对人类和机器都提供更多信息。这可能意味着使用更有意义的标度,例如对数标度:对人类来说更容易操作,并且可能避免重大的计算问题。另一种方法是使用某种重整化。例如,如果您的所有值都在 1e250 和 1e260 之间,您可以将它们除以 1e255。如果采用这些值的变量依赖于另一个变量,您可能会通过该值或其幂之一重新归一化,例如如果它是一个卷,您可能希望通过大小变量重新归一化为 3 次方。这可能有助于避免 sklearn 计算问题并制作更有意义的模型。

【讨论】:

【参考方案2】:

这是一个数值精度问题。目前没有解决方案。数字很​​大

我可以用这个来复制:

import numpy as np
from sklearn.ensemble import AdaBoostRegressor


X = np.repeat([1.4619664882428694e+258],100)
X = X.reshape(10,10)
y = np.ones((10,1))

model = AdaBoostRegressor()
model.fit(X,y)

ValueError: 输入包含 NaN、无穷大或一个太大的值 dtype('float32').

np.all(np.isfinite(X))
True

我在这里打开了一个请求:https://github.com/scikit-learn/scikit-learn/issues/15628

【讨论】:

以上是关于如何将数据类型更改为 float64 以便 sklearn 可以处理数据大于 np.float32 的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

在Julia时间将数据类型UInt64更改为Float

pandas - 将 df.index 从 float64 更改为 unicode 或字符串

将protobuf字段的类型从double更改为float

错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”

SQL Server 2012 如何将列的数据类型从位更改为日期字段?

离子电容器:如何将 ImagePicker 的类型更改为 Base64?