Ошибка значения, но не могу понять, где она идет не так после выполнения RepeatedKFold - PullRequest
0 голосов
/ 29 февраля 2020

ОШИБКА: (Входные данные содержат NaN, бесконечность или значение, слишком большое для dtype ('float64')) *

Я пытаюсь внедрить PCA в тренировочном наборе и проверить оценка регрессии Logisti c с использованием метода RepeatedKFold. У меня есть тренировочный набор, x_train с соответствующей зависимой переменной, y_train. Поскольку мой код выдает ошибку, я проверил, как изменяется набор данных, когда я продолжаю. Я понял, что проблема заключается в for-l oop (для train_index, test_index в kf.split (X_train)).

import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import RepeatedKFold
from sklearn.linear_model import LogisticRegression


X_train, X_test, Y_train, Y_test = train_test_split(x_train, y_train, test_size=0.10, random_state = 1)

S_scaler = StandardScaler()
X_train = S_scaler.fit_transform(X_train)
X_test = S_scaler.transform(X_test)

pca = PCA(n_components=150)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

kf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=None)

log_reg = LogisticRegression(penalty='l2', C=0.1)

list_scores = []

for train_index, test_index in kf.split(X_train):
      #print("Train:", train_index, "\nValidation:",test_index)
      _X_train, _X_test = X_train[train_index], X_train[test_index] 
      _Y_train, _Y_test = Y_train[train_index], Y_train[test_index]

      log_reg.fit(_X_train, _Y_train)
      y2_pred = log_reg.predict(_X_test)
      list_scores.append(accuracy_score(_Y_test, y2_pred))

Я выяснил, где происходит ошибка, используя операторы печати для значений NaN в наборы данных train и test (в матричной форме), использующие следующий код:

for train_index, test_index in kf.split(X_train):
      #print("Train:", train_index, "\nValidation:",test_index)
      _X_train, _X_test = X_train[train_index], X_train[test_index] 
      _Y_train, _Y_test = Y_train[train_index], Y_train[test_index]

      print("{}\n, {}\n, {}\n, {}\n".format(np.where(np.isnan(_X_train)), np.where(np.isnan(_X_test)), np.where(np.isnan(_Y_train)), np.where(np.isnan(_Y_test)) ))

Проблема, похоже, связана с зависимой переменной (серия y_train pandas), которая имеет только 2 уникальных значения ( 0 и 1) перед for-l oop (проверяется с помощью y_train.isnull (). Sum (), который возвращает 0). Как только я пытаюсь использовать for для l oop, чтобы сделать меньшие наборы данных для реализации repeatkfold, подмножества y_train ведут себя странно, так как я понятия не имею, как появляются значения NaN. Ниже приведен результат оператора print, в котором мне удалось вывести индекс элементов NaN. Я верю, что все подмножества независимых переменных совершенно в порядке. Но что-то кажется неправильным при создании подмножеств зависимой переменной (y_train)

(array([], dtype=int64), array([], dtype=int64))
, (array([], dtype=int64), array([], dtype=int64))
, (array([ 32,  36,  39,  46,  62,  84,  91,  92,  94, 111]),)
, (array([ 2, 14, 19, 26, 30, 47, 56, 60, 90, 93]),)

(array([], dtype=int64), array([], dtype=int64))
, (array([], dtype=int64), array([], dtype=int64))
, (array([ 2, 14, 19, 26, 30, 47, 56, 60, 90, 93]),)
, (array([ 32,  36,  39,  46,  62,  84,  91,  92,  94, 111]),)

(array([], dtype=int64), array([], dtype=int64))
, (array([], dtype=int64), array([], dtype=int64))
, (array([13, 17, 26, 31, 38, 46, 57, 59, 64, 91, 93, 94]),)
, (array([  2,  33,  38,  46,  80,  90,  93, 112]),)

(array([], dtype=int64), array([], dtype=int64))
, (array([], dtype=int64), array([], dtype=int64))
, (array([  2,  33,  38,  46,  80,  90,  93, 112]),)
, (array([13, 17, 26, 31, 38, 46, 57, 59, 64, 91, 93, 94]),)

4 строки - это наборы данных для _X_train, _X_test, _Y_train, _Y_test соответственно во время каждой итерации RepeatedKFold.

PS: простите за длинный пост.

РЕДАКТИРОВАТЬ:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-a8cd69d5480d> in <module>()
     21 
     22 
---> 23       log_reg.fit(_X_train, _Y_train)
     24       y2_pred = log_reg.predict(_X_test)
     25       list_scores.append(accuracy_score(_Y_test, y2_pred))

2 frames
/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan, msg_dtype)
     58                     msg_err.format
     59                     (type_err,
---> 60                      msg_dtype if msg_dtype is not None else X.dtype)
     61             )
     62     # for object dtype data, we only check for NaNs (GH-13254)

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
...