«KeyError: 0» с xgboost, scikit-learn и пандами - PullRequest
0 голосов
/ 14 сентября 2018

Я создал эту демонстрацию, чтобы продемонстрировать ошибку, генерируемую внутренними компонентами библиотеки.Этот код разбивает набор данных на train / eval / test и использует train / eval для поиска гиперпараметров, ранней остановки, в то время как набор тестов сохраняется для последующей оценки.Я сузил ошибку, чтобы она была связана с перекрестной проверкой GridSearchCV, но я не смог выяснить точную причину и исправить ее.

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
import xgboost as xgb

iris = datasets.load_iris()
df = pd.DataFrame(data=np.c_[iris['data'], iris['target']], columns=iris['feature_names'] + ['target'])
X, y = df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']], df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train_split, X_eval_split, y_train_split, y_eval_split = train_test_split(X_train, y_train, test_size=0.25, random_state=42)

parameters = {
    'max_depth': (2, 3, 4),
}

fit_params = {
    'early_stopping_rounds': 2,
    'eval_set': (X_eval_split, y_eval_split),
}

model = xgb.XGBClassifier()
gs = GridSearchCV(model, parameters, cv=3)
gs.fit(X_train_split, y_train_split, **fit_params)

Однако я получаю это неясное сообщение:

Traceback (most recent call last):
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 3078, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "t.py", line 36, in <module>
    gs.fit(X_train_split, y_train_split, **fit_params)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/model_selection/_search.py", line 640, in fit
    cv.split(X, y, groups)))
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 779, in __call__
    while self.dispatch_one_batch(iterator):
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 625, in dispatch_one_batch
    self._dispatch(tasks)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 588, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 111, in apply_async
    result = ImmediateResult(func)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 332, in __init__
    self.results = batch()
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 131, in __call__
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 131, in <listcomp>
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/sklearn/model_selection/_validation.py", line 458, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/xgboost/sklearn.py", line 526, in fit
    for i in range(len(eval_set))
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/xgboost/sklearn.py", line 526, in <genexpr>
    for i in range(len(eval_set))
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/frame.py", line 2688, in __getitem__
    return self._getitem_column(key)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/frame.py", line 2695, in _getitem_column
    return self._get_item_cache(key)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/generic.py", line 2489, in _get_item_cache
    values = self._data.get(item)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/internals.py", line 4115, in get
    loc = self.items.get_loc(item)
  File "/Users/foo/bar/.env/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 3080, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

Может ли кто-нибудь помочь с некоторыми указаниями о том, почему я получил эту ошибку?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Согласно документации :

eval_set ( list , необязательно) - список (X, y) пар кортежей для использования в качественабор проверки для ранней остановки

eval_set должен быть списком кортежей.Но у вас есть eval_set как только кортеж:

fit_params = {
    'early_stopping_rounds': 2,
    'eval_set': (X_eval_split, y_eval_split),
}

Измените это на:

fit_params = {
    'early_stopping_rounds': 2,
    'eval_set': [(X_eval_split, y_eval_split)],
}

и ваш код будет работать.

0 голосов
/ 15 сентября 2018

Когда я читаю трассировку ошибок, я вижу, что у метода fit возникла некоторая проблема.

KeyError: 0 означает, что интерпретатор ищет элемент / элемент во фрейме данных, который находится в 0-й индексированной позиции.Я попытался запустить ваши X_train_split, y_train_split и X_eval_split.Индексы разные и, возможно, это нарушает выполнение.

Однако цель перекрестной проверки может быть нарушена, если мы не будем перемешивать набор данных для обучения и оценки.

Попробуйте сбросить индекс вещей в методе подгонки, включая оценку (как он используется в параметрах).Если проблема не устранена, прочитайте концепцию параметров раннего останова, разделите тестовый раздел и области Gridsearch cv = 3, чтобы проверить наличие несоответствий.

Надеюсь, это даст вам некоторое представление об ошибке.

...