Scikit-learn - ValueError: вход содержит NaN, бесконечность или значение, слишком большое для dtype ('float32') со случайным лесом - PullRequest
0 голосов
/ 04 июля 2018

Во-первых, я проверил различные сообщения об этой ошибке, и ни один из них не может решить мою проблему.

Итак, я использую 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, и ошибка возникает в обоих случаях.

Я уверен, что это не связано с моим набором данных, так как большую часть времени я не получаю сообщение об ошибке и сам генерирую набор данных из другого входа.

Это часть набора данных, который я использую

EDIT Я, вероятно, обнаружил, что у меня было значение 0, которое не было реальным значением 0. Значения были как

3.0x10 ^ -314

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Так как я исправляю проблему редактирования, у меня больше нет ошибок. Я просто заменяю 3.0x10 ^ -314 значения на нули.

0 голосов
/ 04 июля 2018

Я бы предположил, что где-то в вашем фрейме данных у вас иногда есть значения nan.

их можно просто удалить с помощью

dataframe1 = dataframe1.dropna()

Однако, при таком подходе вы можете потерять некоторые ценные обучающие данные, поэтому, возможно, стоит изучить .fillna () или sklearn.preprocessing.Imputer, чтобы увеличить некоторые значения для нано-ячеек в df.

Не видя источника фрейма данных1, трудно дать полный / полный ответ, но возможно, что происходит какое-то обучение, тестовое разбиение приводит к тому, что фрейм данных проходит только со значениями nan в течение некоторого времени.

0 голосов
/ 04 июля 2018

Некоторое время назад у меня возникали нестабильные ошибки, когда я использую явное количество CPU в параметре, таком как ваш n_jobs = 4. Постарайтесь вообще не использовать n_jobs или используйте n_jobs = -1 для автоматического определения количества процессоров. Может быть, это поможет.

0 голосов
/ 04 июля 2018

Попробуйте использовать float64 вместо float32. РЕДАКТИРОВАТЬ : - Покажите нам набор данных, который сделал это

...