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

Posted

技术标签:

【中文标题】Scikit-learn - ValueError:输入包含 NaN、无穷大或对于随机森林的 dtype(\'float32\') 来说太大的值【英文标题】:Scikit-learn - ValueError: Input contains NaN, infinity or a value too large for dtype('float32') with Random ForestScikit-learn - ValueError:输入包含 NaN、无穷大或对于随机森林的 dtype('float32') 来说太大的值 【发布时间】:2018-12-12 13:52:08 【问题描述】:

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

所以我正在使用 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 ML Studio 上运行我的代码,两种情况下都会出现错误。

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

这是part of the dataset I use

编辑:我可能发现我的 0 值不是真正的 0 值。这些值就像

3.0x10^-314

【问题讨论】:

是否可以共享数据和完整的代码。如果是,请这样做。并且请检查您使用的是所有库的最新版本。 @VivekKumar 我添加了我的数据集的一部分,我在问题中输入的代码就是我使用的所有代码。在本地,我使用最新版本的 scikit-learn 和 numpy 14.4.4 而不是 14.4.5,而且我不使用 pandas。而在 Azure ML Studio 中,管理环境的是微软,它使用 Anaconda4.0/python3.5 【参考方案1】:

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

这些可以简单地使用

删除
dataframe1 = dataframe1.dropna()

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

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

【讨论】:

由于我正在生成自己的数据集,我知道数据集中不可能有 NaN 值。 您是否尝试过以上方法来验证这一点?在你不知情的情况下,某处的某些东西可能会被投射到 nan。 我正在尝试使用它,但我现在不能告诉你它是否有效,因为我没有收到 100% 的错误 @ThomasR 没关系,只要经过合理尝试次数的测试就回复。 在这种情况下尝试 features=np.empty([len(InputData),10]).astype(np.float64)【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

不是这样的

以上是关于Scikit-learn - ValueError:输入包含 NaN、无穷大或对于随机森林的 dtype('float32') 来说太大的值的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn : ValueError: no enough values to unpack (expected 2, got 1)

在管道中使用时带有 scikit-learn PLSRegression 的 ValueError

使用 scikit-learn 预测单个值会导致 ValueError

在 Python 中实现逻辑回归时 Scikit-learn ValueError

ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素

使用 scikit-learn python 的线性 SVM 时出现 ValueError