web-dev-qa-db-fra.com

Scikit-learn - ValueError: l'entrée contient NaN, l'infini ou une valeur trop grande pour dtype ('float32') avec forêt aléatoire

Tout d’abord, j’ai vérifié les différents articles concernant cette erreur et aucun d’entre eux ne peut résoudre mon problème.

J'utilise donc RandomForest et je suis capable de générer la forêt et de faire une prédiction, mais parfois, lors de la génération de la forêt, l'erreur suivante apparaît.

ValueError: l'entrée contient NaN, l'infini ou une valeur trop grande pour dtype ('float32').

Cette erreur se produit avec le même jeu de données. Parfois, le jeu de données crée une erreur pendant la formation et la plupart du temps, pas du tout. L'erreur se produit parfois au début et parfois au milieu de la formation.

Voici mon code:

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),

J'exécute mon code localement et sur Azure ML Studio et l'erreur se produit dans les deux cas.

Je suis sûr que ce n'est pas dû à mon jeu de données car la plupart du temps, je ne reçois pas l'erreur et je le génère moi-même à partir d'une entrée différente.

Ceci est un une partie du jeu de données que j'utilise

EDITJ'ai probablement découvert que j'avais une valeur 0 qui n'était pas une valeur réelle. Les valeurs étaient comme 

3.0x10 ^ -314

3
Thomas R

Depuis que je corrige le problème du montage, je n’ai plus d’erreurs. Je viens de remplacer les valeurs 3.0x10 ^ -314 par des zéros.

0
Thomas R

Je présume que quelque part dans votre cadre de données, vous avez parfois des valeurs nan.

ceux-ci peuvent simplement être enlevés en utilisant 

dataframe1 = dataframe1.dropna()

Cependant, avec cette approche, vous risquez de perdre certaines données d’entraînement valables. Il peut donc être intéressant de regarder .fillna () ou sklearn.preprocessing.Imputer afin d’augmenter certaines valeurs pour les cellules nan dans le df.

Sans voir la source de dataframe1, il est difficile de donner une réponse complète/complète, mais il est possible qu’une division du test ou du train se déroule, ce qui a pour effet que le cadre de données n’est transmis qu’à des valeurs nan de temps en temps.

1
Kieran Lavelle

Essayez d’utiliser float64 au lieu de float32. EDIT: - Montrez-nous le jeu de données qui l'a fait

0
Simba