ValueError: 输入包含NaN、无穷大或对于dtype(‘float64’)来说过大的值,而这是在预处理数据时发生的

我有两个CSV文件(训练集测试集)。由于在一些列中可以看到NaN值(status, hedge_value, indicator_code, portfolio_id, desk_id, office_id)。

我开始处理时,先用对应列的某个巨大值替换NaN值。然后我进行LabelEncoding以去除文本数据并将其转换为数值数据。现在,当我尝试对分类数据进行OneHotEncoding时,我遇到了错误。我尝试逐一将输入传递给OneHotEncoding构造函数,但对于每一列我都得到了相同的错误。

基本上,我的最终目标是预测回报值,但我因为数据预处理部分的这个问题而卡住了。我该如何解决这个问题呢?

我使用Python3.6,结合PandasSklearn进行数据处理。

代码

import pandas as pdimport matplotlib.pyplot as pltimport numpy as nptest_data = pd.read_csv('test.csv')train_data = pd.read_csv('train.csv')# 替换NaN值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].valuesy_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])# =============================================================================# 编码分类数据,即文本数据,因为计算只能在数字上进行,所以像国家名称、购买状态这样的文本会带来麻烦from sklearn.preprocessing import LabelEncoder, OneHotEncoderlabelencoder_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() # 使用独热编码替换国家名称

错误

Traceback (most recent call last):  File "<ipython-input-4-4992bf3d00b8>", line 58, in <module>    x_train = onehotencoder.fit_transform(x_train).toarray() # 使用独热编码替换国家名称  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: 输入包含NaN、无穷大或对于dtype('float64')来说过大的值

回答:

在发布问题后,我再次检查了数据集,发现了另一列包含NaN。我简直不敢相信我浪费了这么多时间在上面,而我本可以使用Pandas函数来获取包含NaN的列列表。使用以下代码,我发现我漏掉了三列。我之前是在视觉上搜索NaN,而我本可以直接使用这个函数。在处理了这些新的NaN后,代码正常工作了。

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

结果

portfolio_id      Falsedesk_id           Falseoffice_id         Falsepf_category       Falsestart_date        Falsesold               Truecountry_code      Falseeuribor_rate      Falsecurrency          Falselibor_rate         Truebought             Truecreation_date     Falseindicator_code    Falsesell_date         Falsetype              Falsehedge_value       Falsestatus            Falsereturn            Falsedtype: bool

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

ValueError: 输入包含NaN、无穷大或对于dtype(‘float64’)来说过大的值,使用LinearRegression

我在Python中练习机器学习,遇到一个障碍但我感到很困惑。我使用的数据集是titanic.csv。我试图使用线性回归来计算Age列的缺失值。

training = dftrain[['Age','SibSp','Parch','Fare','Pclass','Sex_female',                'Sex_male','Embarked_C','Embarked_Q','Embarked_S']]testing  = dftest[['Age','SibSp','Parch','Fare','Pclass','Sex_female',               'Sex_male','Embarked_C','Embarked_Q','Embarked_S']]unify = pd.concat([training, testing])train = unify[unify['Age'].notnull()]clf = LinearRegression()#clf.fit(train.drop(['Age'],axis = 1), train['Age'])pd.set_option('display.max_rows',None )train 

我手动尝试修复错误,通过执行,

train[train['Age'].isnull()]

使用上述代码,我得到的是没有值的列,这表明没有NaN值。我对所有列都进行了这样的检查。我还使用了,

train.notnull().count() Age           1046SibSp         1046Parch         1046Fare          1046Pclass        1046Sex_female    1046Sex_male      1046Embarked_C    1046Embarked_Q    1046Embarked_S    1046dtype: int64    

但每当我认为一切都准备好并取消注释clf.fit()函数时,我就会得到错误

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

请帮助我,我无法找出我的代码中有什么问题。


回答:

你使用了train.notnull().count():这将返回每个列中非NaN值的总数。它不会返回NaN值的计数。你可以通过将这个数字(在本例中为1046)与数据集中总行数进行比较来验证这一点。

使用train.isnull().sum()来查找训练数据集中存在的NaN值总数。如果你看到正数,那么你的训练集中有NaN值。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注