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

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

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

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

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

ИЗМЕНИТЬ. Мне, наверное, понравилось, что у меня было значение 0, которое не было реальным значением 0. Ценности были похожи на

3.0x10^-314


person Thomas    schedule 04.07.2018    source источник
comment
Можете ли вы поделиться данными и полным кодом? Если да, пожалуйста, сделайте это. А также убедитесь, что вы используете последние версии всех библиотек.   -  person Vivek Kumar    schedule 04.07.2018
comment
@VivekKumar Я добавил часть своего набора данных, и код, который я задал в вопросе, - это весь код, который я использую. Локально я использую последнюю версию scikit-learn и numpy 14.4.4 вместо 14.4.5, и я не использую pandas. А в Azure ML Studio средой управляет Microsoft, и она использует Anaconda4.0 / python3.5.   -  person Thomas    schedule 04.07.2018


Ответы (4)


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

их можно просто удалить, используя

dataframe1 = dataframe1.dropna()

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

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

person Kieran Lavelle    schedule 04.07.2018
comment
Поскольку я создаю свой собственный набор данных, я знаю, что невозможно, чтобы в наборе данных были значения NaN. - person Thomas; 04.07.2018
comment
Вы пробовали это, чтобы убедиться в этом? Что-то где-то, вероятно, передается наню без вашего ведома. - person Kieran Lavelle; 04.07.2018
comment
Я пытаюсь использовать его, но прямо сейчас не могу сказать, работает ли он, так как я не получаю сообщение об ошибке 100% - person Thomas; 04.07.2018
comment
@ThomasR это нормально, просто ответьте после проверки на разумное количество попыток. - person Kieran Lavelle; 04.07.2018
comment
В этом случае попробуйте features = np.empty ([len (InputData), 10]). Astype (np.float64) - person Kieran Lavelle; 04.07.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Thomas; 04.07.2018

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

person Thomas    schedule 06.07.2018

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

person CrazyElf    schedule 04.07.2018

Попробуйте использовать float64 вместо float32. РЕДАКТИРОВАТЬ :

  • Покажите нам набор данных, который сделал это
person Simba    schedule 04.07.2018
comment
Это не тот случай - person Swarit Agarwal; 04.09.2019