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
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.
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.
Essayez d’utiliser float64 au lieu de float32. EDIT: - Montrez-nous le jeu de données qui l'a fait