Scikit-learn - ValueError: Input contains NaN, infinity or a value too large for dtype('float32') with Random Forest
Scikit-learn - ValueError: Input contains NaN, infinity or a value too large for dtype('float32') with Random Forest
首先,我查看了有关此错误的不同帖子,其中 none 可以解决我的问题。
所以我正在使用 RandomForest,我能够生成森林并进行预测,但有时在生成森林的过程中,我会收到以下错误。
ValueError: Input contains NaN, infinity or a value too large for 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 ML
Studio 上 运行 我的代码,两种情况下都会出现错误。
我确定这不是我的数据集造成的,因为大多数时候我没有收到错误,而是我自己从不同的输入生成数据集。
编辑: 我可能发现我的 0 值不是真正的 0 值。这些值就像
3.0x10^-314
尝试使用 float64
而不是 float32
。
编辑:
- 向我们展示执行此操作的数据集
我假设在你数据框的某处你有时有 nan 值。
这些可以简单地使用
删除
dataframe1 = dataframe1.dropna()
但是,使用这种方法您可能会丢失一些有价值的训练数据,因此可能值得研究 .fillna() 或 sklearn.preprocessing.Imputer 以增加 df 中 nan 单元的一些值。
在没有看到 dataframe1 的来源的情况下,很难给出完整/完整的答案,但可能正在进行某种训练、测试拆分,导致传递的数据帧有时仅具有 nan 值.
前段时间,当我在参数中使用 CPU 的明确数量时,例如您的 n_jobs = 4
,我遇到了不稳定的错误。尝试完全不使用 n_jobs
或使用 n_jobs = -1
进行自动 CPU 计数检测。可能会有帮助。
自从我改正了编辑的问题后,我再没有错误了。我只是将 3.0x10^-314
值替换为零。
首先,我查看了有关此错误的不同帖子,其中 none 可以解决我的问题。
所以我正在使用 RandomForest,我能够生成森林并进行预测,但有时在生成森林的过程中,我会收到以下错误。
ValueError: Input contains NaN, infinity or a value too large for 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 ML
Studio 上 运行 我的代码,两种情况下都会出现错误。
我确定这不是我的数据集造成的,因为大多数时候我没有收到错误,而是我自己从不同的输入生成数据集。
编辑: 我可能发现我的 0 值不是真正的 0 值。这些值就像
3.0x10^-314
尝试使用 float64
而不是 float32
。
编辑:
- 向我们展示执行此操作的数据集
我假设在你数据框的某处你有时有 nan 值。
这些可以简单地使用
删除dataframe1 = dataframe1.dropna()
但是,使用这种方法您可能会丢失一些有价值的训练数据,因此可能值得研究 .fillna() 或 sklearn.preprocessing.Imputer 以增加 df 中 nan 单元的一些值。
在没有看到 dataframe1 的来源的情况下,很难给出完整/完整的答案,但可能正在进行某种训练、测试拆分,导致传递的数据帧有时仅具有 nan 值.
前段时间,当我在参数中使用 CPU 的明确数量时,例如您的 n_jobs = 4
,我遇到了不稳定的错误。尝试完全不使用 n_jobs
或使用 n_jobs = -1
进行自动 CPU 计数检测。可能会有帮助。
自从我改正了编辑的问题后,我再没有错误了。我只是将 3.0x10^-314
值替换为零。