Используйте GroupKFold во вложенной перекрестной проверке с использованием sklearn - PullRequest
0 голосов
/ 02 апреля 2020

мой код основан на примере на сайте sklearn: https://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html

Я пытаюсь использовать GroupKFold во внутреннем и внешнем резюме.

from sklearn.datasets import load_iris
from matplotlib import pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score, KFold,GroupKFold
import numpy as np

# Load the dataset
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

# Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100],
          "gamma": [.01, .1]}

# We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")

# Choose cross-validation techniques for the inner and outer loops,
# independently of the dataset.
# E.g "GroupKFold", "LeaveOneOut", "LeaveOneGroupOut", etc.
inner_cv = GroupKFold(n_splits=3)
outer_cv = GroupKFold(n_splits=3)

# Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)

# Nested CV with parameter optimization
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv, groups=y_iris)

Я знаю, что ввод значений y в аргумент groups - это не то, для чего он используется !! Для этого кода я получаю следующую ошибку:

.../anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
ValueError: The 'groups' parameter should not be None.

Есть ли у кого-нибудь идеи, как решить эту проблему?

Заранее спасибо за помощь,

Sören

1 Ответ

0 голосов
/ 02 апреля 2020

Как видно из документации для GroupKFold,
вы используете ее, когда хотите иметь непересекающихся групп для K-fold .
Это означает, что, если у вас нет отдельных групп данных, которые необходимо разделить при создании K-сгиба, вы не будете использовать этот метод.

Как говорится, для данного примера , вы должны вручную создать groups,
, который должен быть похожим на массив объектом, имеющим ту же форму, что и ваши y.
И

количество отдельных групп должно быть как минимум равным количеству сгибов

Ниже приведен пример кода из документации:

import numpy as np
from sklearn.model_selection import GroupKFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])
groups = np.array([0, 0, 2, 2])
group_kfold = GroupKFold(n_splits=2)
group_kfold.get_n_splits(X, y, groups)

Вы можете видеть, что groups имеет ту же форму, что и y,
и имеет две различные группы 0, 2, что соответствует количеству сгибов.

РЕДАКТИРОВАНИЕ:
get_n_splits(groups) метод GroupKFold объект возвращает количество итераций разбиения в перекрестном валидаторе , которое мы можем передать в качестве аргумента для ключевого слова cv для функции cross_val_score.

clf = GridSearchCV(estimator=svm, 
                   param_grid=p_grid, 
                   cv=inner_cv.get_n_splits(groups=y_iris))

nested_score = cross_val_score(clf, X=X_iris, y=y_iris, 
                               cv=outer_cv.get_n_splits(groups=y_iris))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...