ОШИБКА: (Входные данные содержат 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').