Scikit-learn - ValueError:输入包含 NaN、无穷大或对于具有随机森林的 dtype('float32') 来说太大的值



首先,我已经检查了有关此错误的不同帖子,但没有一个可以解决我的问题。

所以我正在使用 RandomForest,我能够生成森林并进行预测,但有时在生成森林的过程中,我会收到以下错误。

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

同一数据集会发生此错误。有时数据集会在训练期间创建错误,而大多数情况下不会。错误有时会在开始时发生,有时发生在训练的中间。

这是我的代码:

import pandas as pd
from sklearn import ensemble
import numpy as np
def azureml_main(dataframe1 = None, dataframe2 = None):
# Execution logic goes here
Input = dataframe1.values[:,:]
InputData = Input[:,:15]
InputTarget = Input[:,16:]
limitTrain = 2175
clf = ensemble.RandomForestClassifier(n_estimators = 10000, n_jobs = 4 );
features=np.empty([len(InputData),10])
j=0
for i in range (0,14):
if (i == 1 or i == 4 or i == 5 or i == 6 or i == 8 or i == 9 or  i == 10 or i == 11 or i == 13 or i == 14):
features[:,j] = (InputData[:, i])
j += 1     

clf.fit(features[:limitTrain,:],np.asarray(InputTarget[:limitTrain,1],dtype = np.float32))
res = clf.predict_proba(features[limitTrain+1:,:])
listreu = np.empty([len(res),5])
for i in range(len(res)):
if(res[i,0] > 0.5):
listreu[i,4] = 0;
elif(res[i,1] > 0.5):
listreu[i,4] = 1;
elif(res[i,2] > 0.5):
listreu[i,4] = 2;
else:
listreu[i,4] = 3;

listreu[:,0] = features[limitTrain+1:,0]
listreu[:,1] = InputData[limitTrain+1:,2]
listreu[:,2] = InputData[limitTrain+1:,3]
listreu[:,3] = features[limitTrain+1:,1]

# Return value must be of a sequence of pandas.DataFrame
return pd.DataFrame(listreu),

我在本地和Azure MLStudio 上运行了我的代码,两种情况下都会发生错误。

我确信这不是由于我的数据集,因为大多数时候我没有收到错误,并且我自己从不同的输入生成数据集。

这是我使用的数据集的一部分

编辑:我可能发现我有0值,这不是真正的0值。价值观就像

3.0x10^-314

我假设在数据帧中的某个地方有时有nan值。

这些可以简单地删除

dataframe1 = dataframe1.dropna()

但是,使用这种方法,您可能会丢失一些有价值的训练数据,因此可能值得研究.fillna((或sklearn.preprocessing.Imputer,以增加df中nan单元的一些值。

如果没有看到数据帧1的来源,很难给出完整/完整的答案,但有可能正在进行某种训练,测试拆分,导致数据帧在某些时候仅具有nan值。

由于我纠正了编辑问题,所以我没有更多的错误。我只是用零替换3.0x10^-314值。

前段时间,当我在参数中使用显式数量的 CPU 时,例如您的n_jobs = 4,我遇到了不稳定的错误。尽量不要使用n_jobs或使用n_jobs = -1进行自动 CPU 计数检测。也许会有所帮助。

尝试使用float64而不是float32。 编辑:

  • 向我们展示执行此操作的数据集

最新更新