Получение NaN в X_train и X_test после обучения / разделения данных - PullRequest
0 голосов
/ 30 июня 2019

Привет программистам всего мира. У меня проблема с вводом данных в мою модель машинного обучения.

Я попытался прочитать CSV-файл в python с помощью панд, а затем выполнить разбиение на данные обучения и тестирования. После этого я масштабирую результаты с помощью StandardScaler, и когда я добираюсь до кормящей части, у меня по каким-то причинам есть данные NaN. PS: Я уверен, что это потому, что мне не хватает данных, а скорее потому, что у меня бесконечные данные

Это то, что у меня есть с точки зрения кода ....

# Importing and organizing required packages and libraries
import pandas as pd;
import numpy as np;
from sklearn.model_selection import train_test_split;
from sklearn.metrics import confusion_matrix, classification_report;
from sklearn.preprocessing import StandardScaler;
from sklearn.ensemble import RandomForestClassifier;
from sklearn.neural_network import MLPClassifier;

#Reading in all of the excel files created from preprocessing.py
dataframe2 = pd.read_csv('dataframe2.csv');
dataframe3 = pd.read_csv('dataframe3.csv');
dataframe4 = pd.read_csv('dataframe4.csv');
dataframe5 = pd.read_csv('dataframe5.csv');

#Function used for creating class labels
def labelCreation(dataframe):
    labels = [];
    index = dataframe['LoC'].index.values;
    for i in range(len(index)):
        if str(dataframe.iloc[i]['Unnamed: 0']) == str(dataframe.iloc[i]['Replacing_line_number']):
            labels.append('1');
        else:
            labels.append('0');
    return labels;

#Picking features for training
def features(dataframe):
    X = dataframe[['Similar_Chars','Similar_Tokens','Edit_Distance','LoC_SemiColon','Replacement_Line_SemiColon','LoC_Open_Bracket_Char',
       'Replacement_Line_Open_Bracket_Char','LoC_Close_Bracket_Char','Replacement_Line_Close_Bracket_Char']];
    return X;

#Training and splitting the data
X_train, X_test, Y_train, Y_test = train_test_split(features(dataframe = dataframe2), labelCreation(dataframe = dataframe2), test_size=0.2);
#X_train, X_test, Y_train, Y_test = train_test_split(features(dataframe = dataframe3), labelCreation(dataframe = dataframe3), test_size=0.2);
#X_train, X_test, Y_train, Y_test = train_test_split(features(dataframe = dataframe4), labelCreation(dataframe = dataframe4), test_size=0.2);
#X_train, X_test, Y_train, Y_test = train_test_split(features(dataframe = dataframe5), labelCreation(dataframe = dataframe5), test_size=0.2);

#Scalling is added in order to get the optimized result
sc = StandardScaler();
X_train = sc.fit_transform(X_train);
X_test = sc.transform(X_test);

#Feeding the data into a random forest classifier model
rfc = RandomForestClassifier(n_estimators = 200);
rfc.fit(X_train, Y_train);
pred_rfc = rfc.predict(X_test);

#Let's see how well the model performed
print(classification_report(Y_test, pred_rfc));
print(confusion_matrix(Y_test, pred_rfc));

#Feeding the data into a neural network model
mlpc=MLPClassifier(hidden_layer_sizes=(11,11,11), max_iter=500);
mlpc.fit(X_train, Y_train);
pred_mlpc = mlpc.predict(X_test);

#Let's see how well the model performed
print(classification_report(Y_test, pred_mlpc));
print(confusion_matrix(Y_test, pred_mlpc));

Когда я запустил весь код выше и набрал X_train[:10], я получил

array([[-0.49869515, -0.39609005, -1.2919533 , -0.96747226,  0.74307391,
     1.02449721,  0.59744363,  1.06693051,  0.58006304],
   [-0.49869515, -0.39609005,  1.22954406,  1.03362137,  0.74307391,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [        nan,         nan,         nan,         nan,         nan,
            nan,         nan,         nan,         nan],
   [-0.49869515, -0.39609005, -0.67191297, -0.96747226, -1.34576115,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [        nan,         nan,         nan,         nan,         nan,
            nan,         nan,         nan,         nan],
   [ 0.09153914, -0.39609005, -0.75458501,  1.03362137,  0.74307391,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [-0.49869515, -0.39609005, -0.50656888, -0.96747226,  0.74307391,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [-0.49869515, -0.39609005, -0.79592103, -0.96747226,  0.74307391,
     1.02449721, -1.67379807,  1.06693051, -1.72395057],
   [ 0.68177344,  2.20020466,  0.48549566, -0.96747226, -1.34576115,
     1.02449721, -1.67379807,  1.06693051, -1.72395057],
   [-0.20357801, -0.39609005, -0.58924092,  1.03362137,  0.74307391,
     1.02449721,  0.59744363,  1.06693051,  0.58006304]])

Также, когда я запускаю X_test[:10], я получаю аналогичный результат

array([[ 3.04271061,  1.33477309, -2.11867374,  1.03362137,  0.74307391,
     1.02449721,  0.59744363,  1.06693051,  0.58006304],
   [-0.49869515,  0.46934152, -0.13454468, -0.96747226, -1.34576115,
     1.02449721,  0.59744363, -0.93726817,  0.58006304],
   [ 0.09153914, -0.39609005, -0.75458501,  1.03362137,  0.74307391,
     1.02449721,  0.59744363,  1.06693051,  0.58006304],
   [-0.20357801, -0.39609005,  1.43622417,  1.03362137, -1.34576115,
     1.02449721,  0.59744363,  1.06693051,  0.58006304],
   [        nan,         nan,         nan,         nan,         nan,
            nan,         nan,         nan,         nan],
   [-0.49869515, -0.39609005, -1.45729739, -0.96747226, -1.34576115,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [ 1.27200773,  2.20020466, -0.25855274,  1.03362137,  0.74307391,
     1.02449721,  0.59744363,  1.06693051,  0.58006304],
   [-0.20357801, -0.39609005, -1.12660921,  1.03362137, -1.34576115,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304],
   [        nan,         nan,         nan,         nan,         nan,
            nan,         nan,         nan,         nan],
   [-0.49869515, -0.39609005, -0.96126512, -0.96747226, -1.34576115,
    -0.97608856,  0.59744363, -0.93726817,  0.58006304]])

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

Надеюсь, это обеспечит достаточный фон для моей проблемы. Если бы кто-нибудь мог протянуть руку, это было бы очень признательно.

1 Ответ

1 голос
/ 01 июля 2019

У меня была похожая проблема с наличием NaN внутри моего DataFrame после считывания его из файла CSV. Моя проблема заключалась в том, что информация, записываемая в CSV-файл, содержал данные NaN, что дало эту проблему Один из вариантов, который у вас есть, - это просто найти в вашем CSV-файле NaN и посмотреть, в этом ли ваша проблема. В любом случае, если вы все же хотите передавать данные через нейронную сеть без ошибок, вы можете просто удалить их из набора данных. Я загрузил свой, используя numpy:

dataset =  np.loadtxt("./CSV Files/Dataset.csv", delimiter=",")
dataset = dataset[~np.any(np.isnan(dataset), axis=1)]

Вторая строка просматривает список элементов в исходном массиве и объединяет его для удаления любых элементов, содержащих NaN, таким образом, данные могут передаваться через нейронную сеть. Мой набор данных был двумерным массивом, поэтому он удалил бы весь элемент массива, если бы он содержал элемент NaN. Напоминаем, что если у вас есть основные истины в отдельном файле, и они связаны с элементами NaN, вы также захотите их удалить. Все, что вам нужно сделать, это получить индексы из набора данных и удалить элементы этих индексов из вашего основного списка истинности:

nanIndex = np.argwhere(np.isnan(dataset))
nanIndex = np.delete(nanIndex, 1, 1)
nanIndex = np.unique(nanIndex)
truthValues = np.delete(truthValues, nanIndex)

где trueValues ​​- это ваш 2-й список меток (опять-таки, это проблема 2-го списка, иначе, если это просто 1-й день). Этот код создает двумерный массив позиций, в которых NaN существует в вашем наборе данных. Я просто объединяю его до значений х или уникальных строк. Примером этого является то, где изначально NanIndex: (строка 1)

 [[153   0]
 [153   1]
 [153   2]
 [154   0]
 [154   1]]

и преобразуется в: (строка 2)

[[153]
 [153]
 [153]
 [154]
 [154]]

который в итоге становится: (строка 3)

[[153]
 [154]]

Эти позиции затем просто удаляются из массива истинных значений в строке 4.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...