Ненужное раздражение с помощью функции перекрестной проверки scikit-learn заключается в том, что по умолчанию данные не перемешаны ; возможно, было бы неплохо сделать тасование выбором по умолчанию - конечно, это предполагало бы, что вначале для cross_val_score
будет доступен аргумент тасования, но, к сожалению, это не так ( docs ).
Итак, вот что происходит; 150 образцов набора данных радужной оболочки стратифицированы :
iris.target[0:50]
# result
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0])
iris.target[50:100]
# result:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1])
iris.target[100:150]
# result:
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2])
Теперь 3-кратная процедура CV с 150 стратифицированными образцами, как показано выше, и сообщение об ошибке:
ValueError: Only one class present in y_true
Надеемся, что
должен начать обретать смысл: в каждой из 3 ваших проверочных сгибов присутствует только одна метка, поэтому вычисление ROC невозможно (не говоря уже о том, что в каждой проверочной сгибе модель видит метки, невидимые в соответствующих тренировочных сгибах) .
Итак, просто перетасуйте свои данные раньше:
from sklearn.utils import shuffle
X_s, y_s = shuffle(X, y)
cross_val_score(model, X_s, y_s, cv=3, scoring="roc_auc")
и с тобой все будет в порядке.