Scikit learn-ValueError:输入包含NaN、infinity或对于带有随机前导的dtype('float32')来说太大的值

2024-04-25 09:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我检查了关于这个错误的不同帖子,没有一个能解决我的问题。

所以我使用了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 MLStudio上运行代码,两种情况下都会发生错误。

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

这是一个part of the dataset I use

编辑我可能喜欢我有0值,而不是真正的0值。这些价值观就像

3.0x10^-314


Tags: orof数据importforinputlen错误
3条回答

前一段时间,当我在参数中使用显式的CPU数量时,我得到了不稳定的错误,比如你的n_jobs=4。尝试完全不使用n_jobs,或者使用n_jobs=-1进行自动CPU计数检测。也许会有帮助。

我想在你的数据框中,你有时会有nan值。

只需使用

dataframe1 = dataframe1.dropna()

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

如果看不到dataframe1的来源,很难给出完整的答案,但有可能是某种类型的列正在进行测试拆分,导致数据帧在某些时候只传递了nan值。

既然我纠正了编辑的问题,我就没有错误了。我只将3.0x10^-314值替换为零。

相关问题 更多 >