如何将数据类型更改为 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 的数据帧的主要内容,如果未能解决你的问题,请参考以下文章
pandas - 将 df.index 从 float64 更改为 unicode 或字符串
错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”