ValueError:在预处理数据时,输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

Posted

技术标签:

【中文标题】ValueError:在预处理数据时,输入包含 NaN、无穷大或对于 dtype(\'float64\') 来说太大的值【英文标题】:ValueError: Input contains NaN, infinity or a value too large for dtype('float64') while preprocessing DataValueError:在预处理数据时,输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值 【发布时间】:2018-05-25 19:35:34 【问题描述】:

我有两个 CSV 文件(Training set 和 Test Set)。由于在少数列中有可见的NaN 值(statushedge_valueindicator_codeportfolio_iddesk_idoffice_id)。

我通过将NaN 值替换为与该列对应的一些巨大值来开始该过程。 然后我正在做LabelEncoding 删除文本数据并将它们转换为数值数据。 现在,当我尝试对分类数据执行 OneHotEncoding 时,我得到了错误。我尝试将输入一一输入OneHotEncoding 构造函数,但每一列都出现相同的错误。

基本上,我的最终目标是预测返回值,但因此我被困在数据预处理部分。我该如何解决这个问题?

我正在使用Python3.6PandasSklearn 进行数据处理。

代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

test_data = pd.read_csv('test.csv')
train_data = pd.read_csv('train.csv')

# Replacing Nan values here
train_data['status']=train_data['status'].fillna(2.0)
train_data['hedge_value']=train_data['hedge_value'].fillna(2.0)
train_data['indicator_code']=train_data['indicator_code'].fillna(2.0)
train_data['portfolio_id']=train_data['portfolio_id'].fillna('PF99999999')
train_data['desk_id']=train_data['desk_id'].fillna('DSK99999999')
train_data['office_id']=train_data['office_id'].fillna('OFF99999999')

x_train = train_data.iloc[:, :-1].values
y_train = train_data.iloc[:, 17].values

# =============================================================================
# from sklearn.preprocessing import Imputer
# imputer = Imputer(missing_values="NaN", strategy="mean", axis=0)
# imputer.fit(x_train[:, 15:17])
# x_train[:, 15:17] = imputer.fit_transform(x_train[:, 15:17])
# 
# imputer.fit(x_train[:, 12:13])
# x_train[:, 12:13] = imputer.fit_transform(x_train[:, 12:13])
# =============================================================================


# Encoding categorical data, i.e. Text data, since calculation happens on numbers only, so having text like 
# Country name, Purchased status will give trouble
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
x_train[:, 0] = labelencoder_X.fit_transform(x_train[:, 0])
x_train[:, 1] = labelencoder_X.fit_transform(x_train[:, 1])
x_train[:, 2] = labelencoder_X.fit_transform(x_train[:, 2])
x_train[:, 3] = labelencoder_X.fit_transform(x_train[:, 3])
x_train[:, 6] = labelencoder_X.fit_transform(x_train[:, 6])
x_train[:, 8] = labelencoder_X.fit_transform(x_train[:, 8])
x_train[:, 14] = labelencoder_X.fit_transform(x_train[:, 14])


# =============================================================================
# import numpy as np
# x_train[:, 3] = x_train[:, 3].reshape(x_train[:, 3].size,1)
# x_train[:, 3] = x_train[:, 3].astype(np.float64, copy=False)
# np.isnan(x_train[:, 3]).any()
# =============================================================================


# =============================================================================
# from sklearn.preprocessing import StandardScaler
# sc_X = StandardScaler()
# x_train = sc_X.fit_transform(x_train)
# =============================================================================

onehotencoder = OneHotEncoder(categorical_features=[0,1,2,3,6,8,14])
x_train = onehotencoder.fit_transform(x_train).toarray() # Replace Country Names with One Hot Encoding.

错误

Traceback (most recent call last):

  File "<ipython-input-4-4992bf3d00b8>", line 58, in <module>
    x_train = onehotencoder.fit_transform(x_train).toarray() # Replace Country Names with One Hot Encoding.

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 2019, in fit_transform
    self.categorical_features, copy=True)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 1809, in _transform_selected
    X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 453, in check_array
    _assert_all_finite(array)

  File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 44, in _assert_all_finite
    " or a value too large for %r." % X.dtype)

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

【问题讨论】:

【参考方案1】:

错误在于您将其视为非分类特征的其他特征。

'hedge_value''indicator_code' 等列包含混合类型数据,例如来自原始 csv 的 TRUEFALSE 和来自您的 fillna() 调用的 2.0。 OneHotEncoder 无法处理它们。

如 OneHotEncoder fit() 文档中所述:

 fit(X, y=None)

    Fit OneHotEncoder to X.
    Parameters: 

    X : array-like, shape [n_samples, n_feature]

        Input array of type int.

您可以看到它要求所有 X 都是数字(int,但 float 可以)类型。

作为一种解决方法,您可以这样做来对分类特征进行编码:

X_train_categorical = x_train[:, [0,1,2,3,6,8,14]]
onehotencoder = OneHotEncoder()
X_train_categorical = onehotencoder.fit_transform(X_train_categorical).toarray()

然后将其与您的非分类特征连接起来。

【讨论】:

嗨,实际上这不是问题,不知何故 TrueFalse 已经转换为 1s 和 0s。我发现了我的问题,还有其他三个列中有 NaN,我错过了。所以,只需处理那些 NaN 就解决了我的问题。我们可以通过邮件连接吗?我是 ML 的新手,很想讨论更多问题。 您可以使用 df.columns[df.isnull().sum()>0] 仅打印具有空值的列【参考方案2】:

发布问题后,我再次浏览数据集,发现另一列带有NaN。当我可以使用 Pandas 函数来获取包含 NaN 的列的列表时,我不敢相信我浪费了这么多时间。所以,使用下面的代码,我发现我错过了三列。当我可以使用此功能时,我正在视觉搜索NaN。处理完这些新的NaNs 后,代码运行正常。

pd.isnull(train_data).sum() > 0

结果

portfolio_id      False
desk_id           False
office_id         False
pf_category       False
start_date        False
sold               True
country_code      False
euribor_rate      False
currency          False
libor_rate         True
bought             True
creation_date     False
indicator_code    False
sell_date         False
type              False
hedge_value       False
status            False
return            False
dtype: bool

【讨论】:

您可以使用 df = df.dropna(how='any',axis=0) 删除具有 NaN 值的行【参考方案3】:

要在生产中使用它,最佳实践是使用 Imputer,然后将模型保存在 pkl 中

这是一个问题

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

最好用this

【讨论】:

以上是关于ValueError:在预处理数据时,输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:输入包含 NaN、无穷大或对于 dtype 来说太大的值

ValueError:检查输入时出错:预期的dense_26_input具有形状(45781,)但得到的数组具有形状(2,)

自定义 DataGenerator tensorflow 错误“ValueError:无法找到可以处理输入的数据适配器”

ValueError:无法解释输入“State/UnionTerritory”

获取 ValueError:y 在使用 scikit learn 的 LabelEncoder 时包含新标签

使用随机森林时,scikit 中的“ValueError: max_features must be in (0, n_features]”