GridSearchCV на работающем конвейере возвращает ValueError - PullRequest
0 голосов
/ 12 октября 2018

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

Мой конвейер, кажется, работает хорошо, и я могу его применить:

pipeline.fit(X_train, y_train)
preds = pipeline.predict(X_test)

И я получаю достойный результат.

Но GridSearchCV явно что-то не нравится, и я не могу этого понять.

Мой конвейер:

feats = FeatureUnion([('age', age),
                      ('education_num', education_num),
                      ('is_education_favo', is_education_favo),
                      ('is_marital_status_favo', is_marital_status_favo),
                      ('hours_per_week', hours_per_week),
                      ('capital_diff', capital_diff),
                      ('sex', sex),
                      ('race', race),
                      ('native_country', native_country)
                     ])

pipeline = Pipeline([
        ('adhocFC',AdHocFeaturesCreation()),
        ('imputers', KnnImputer(target = 'native-country', n_neighbors = 5)),
        ('features',feats),('clf',LogisticRegression())])

Мой поиск в сетке:

hyperparameters = {'imputers__n_neighbors' : [5,21,41], 'clf__C' : [1.0, 2.0]}

GSCV = GridSearchCV(pipeline, hyperparameters, cv=3, scoring = 'roc_auc' , refit = False) #change n_jobs = 2, refit = False

GSCV.fit(X_train, y_train)

Я получаю 11 подобных предупреждений:

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / ipykernel / main .py: 11: SettingWithCopyWarning: пытается установить значение для копии фрагмента из DataFrame.Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

, и это сообщение об ошибке:

/ home / jo / anaconda2 / envs / py35 / lib /python3.5 / site-packages / ipykernel / main .py: 11: SettingWithCopyWarning: значение пытается быть установлено для копии фрагмента из DataFrame.Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy /home/jo/anaconda2/envs/py35/lib/python3.5/site-packages / ipykernel / main .py: 12: SettingWithCopyWarning: пытается установить значение для копии фрагмента из DataFrame.Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy /home/jo/anaconda2/envs/py35/lib/python3.5/site-packages / ipykernel / main .py: 14: SettingWithCopyWarning: пытается установить значение для копии фрагмента из DataFrame.Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

--------------------------------------------------------------------------- ValueError Traceback (последний вызов был последним) в () 3 GSCV = GridSearchCV (конвейер, гиперпараметры, cv = 3, оценка = 'roc_auc', refit = False) #change n_jobs = 2, refit= Неверно 4 ----> 5 GSCV.fit (X_train, y_train)

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / model_selection / _search.py in fit (self, X, y, groups) 943 поезд / тестовый набор.944 "" "-> 945 return self._fit (X, y, groups, ParameterGrid (self.param_grid)) 946 947

/ home / jo / anaconda2 / envs / py35 / lib / python3.5/site-packages/sklearn/model_selection/_search.py ​​в _fit (self, X, y, groups, parameter_iterable) 562 return_times = True, return_parameters = True, 563 error_score = self.error_score) -> 564 для параметров в parameter_iterable 565для поезда, тест в cv_iter) 566

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / externals / joblib / parallel.py в call (self, iterable) 756 # было отправлено.В частности, это охватывает край 757 # случая Parallel, используемого с исчерпанным итератором. -> 758, в то время как self.dispatch_one_batch (iterator): 759 self._iterating = True 760 else:

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / externals / joblib / parallel.py в dispatch_one_batch (self, iterator) 606 возвращает False 607 иначе: --> 608 self._dispatch (задачи) 609 return True 610

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / externals / joblib / parallel.py в _dispatch (self, batch) 569 dispatch_timestamp = time.time () 570 cb = BatchCompletionCallBack (dispatch_timestamp, len (batch),self) -> 571 job = self._backend.apply_async (batch, callback = cb) 572 self._jobs.append (job) 573

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / externals / joblib / _parallel_backends.py в apply_async (self, func, callback) 107 def apply_async (self, func,callback = Нет): 108 "" "Запланировать запуск функции" "" -> 109 result = ImmediateResult (func) 110 if callback: 111 callback (result)

/ home / jo / anaconda2 /envs / py35 / lib / python3.5 / site-packages / sklearn / externals / joblib / _parallel_backends.py в init (self, batch) 324 # Не откладывать приложение, чтобы избежать сохранения ввода325 # аргументов в памяти -> 326 self.results = batch () 327 328 def get (self):

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages/sklearn/externals/joblib/parallel.py в call (self) 129 130 def call (self): -> 131 return [func (* args, ** kwargs)для func, args, kwargs в self.items] 132 133 def len (self):

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-пакеты / sklearn / externals / joblib / parallel.py в (.0) 129 130def call (self): -> 131 return [func (* args, ** kwargs) для func, args, kwargs в self.items] 132 133 def len (self):

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / model_selection / _validation.py в _fit_and_score (оценка, X, y, секретарь, поезд, тестирование, подробные, параметры, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, error_score) 236 estimator.fit (X_train, ** fit_params) 237 else: -> 238 estimator.fit (X_train, y_train, ** fit_params 239) 239Исключение составляет e:

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / pipe.py в соответствии (self, X, y, ** fit_params) 266Эта оценка 267 "" "-> 268 Xt, fit_params = self._fit (X, y, ** fit_params) 269, если self._final_estimator не равно None: 270 self._final_estimator.fit (Xt, y, ** fit_params)

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / pipe.py в _fit (self, X, y, ** fit_params) 232 прохода 233 elif hasattr (transform, "fit_transform"): -> 234 Xt = transform.fit_transform (Xt, y, ** fit_params_steps [name]) еще 235: 236 Xt = transform.fit (Xt, y, ** fit_params_steps [name]) \

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / sklearn / base.py в fit_transform (self, X, y, ** fit_params) 495 else:496 # метод соответствия арности 2 (контролируемое преобразование) -> 497 возврат self.fit (X, y, ** fit_params) .transform (X) 498 499

в соответствии (self, X, y)16 self.ohe.fit (X_full) 17 # Создайте Dataframe, который не содержит нулевых значений, переменные категории - OHE, со всеми строками ---> 18 X_ohe_full = self.ohe.transform (X_full [~ X [self.col] .isnull ()]. ​​drop (self.col, axis = 1)) 19 20 # Поместить классификатор в строки, где col равно нулю

/ home / jo / anaconda2 / envs / py35 / lib /python3.5 / site-packages / pandas / core / frame.py в getitem (self, key) 2057 return self._getitem_multilevel (key) 2058 else: -> 2059 return self._getitem_column (key) 20602061 def _getitem_column (self, key):

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / pandas / core / frame.py в _getitem_column (self, key) 2064 # получить столбец 2065
если self.columns.is_unique:-> 2066 вернуть self._get_item_cache (ключ) 2067 2068 # дублировать столбцы и возможно уменьшить размерность

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / pandas / core /generic.py в _get_item_cache (self, item) 1384 res = cache.get (item)
1385, если res - None: -> 1386 values ​​= self._data.get (item) 1387 res = self._box_item_values ​​(item,значения) 1388
кеш [item] = res

/ home / jo / anaconda2 / envs / py35 / lib / python3.5 / site-packages / pandas / core / internals.py в get (self, item, fastpath) 3550 loc = indexer.item () 3551 else: -> 3552 повысить ValueError («не может пометить индекс пустым ключом») 3553 3554 вернуть self.iget (loc, fastpath = fastpath)

ValueError: невозможно пометить индекс пустым ключом

1 Ответ

0 голосов
/ 18 апреля 2019

Без дополнительной информации, я полагаю, это потому, что ваши X_train и y_train переменные являются pandas dataframe, базовая библиотека обучения sci-kit не сравнима с этими: например, .fitметод классификатора ожидает массива, подобного объекту.

При подаче данных на фреймы панд вы случайно индексируете их как массивы, которые не стабильны в пандах .

Попробуйте преобразовать данные тренировок в массивы:

X_train_arr = X_train.to_numpy()
y_train_arr = y_train.to_numpy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...