207 классов (многие с одним объектом), Movie - PullRequest
0 голосов
/ 01 августа 2020
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=1/3, random_state=85)
models = [
    RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42),
    LinearSVC(),
    MultinomialNB(),
    LogisticRegression(random_state=0),
]

# 5 Cross-validation
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))

entries = []
for model in models:
  model_name = model.__class__.__name__
  accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
  for fold_idx, accuracy in enumerate(accuracies):
    entries.append((model_name, fold_idx, accuracy))
    
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])

ошибка:

UserWarning: наименее заполненный класс в y имеет только 1 член, что меньше n_splits = 5.

1 Ответ

0 голосов
/ 01 августа 2020

При использовании перекрестной проверки он разделяет весь набор поездов, так что поезд и тест (в cv) будут иметь одинаковое распределение. Если есть 10 объектов с меткой «A», что составляет около 20% от общего числа примеров, он разделит их на группы, где в каждой группе есть 2 объекта с меткой «A», так что это также будет 20% от теста.

Но что происходит, когда метка «A» имеет только 1 объект (одна строка с этим классом), и вы пытаетесь разделить ее на 5 групп? Вы получаете эту ошибку. Он не знает, как с этим справиться.

Трудно сказать, как решить эту проблему, не зная, как выглядят ваши данные и что вам нужно. Разные проблемы могут иметь разные решения.

Вы можете:

  1. Удалить метку c из набора данных. Проверьте все классы с очень низкой частотой и сгруппируйте их все вместе в «Другое» или что-то в этом роде.
  2. Откажитесь от cv и используйте KFolds, что не требует, чтобы группы внутри cv имели одинаковое распределение .
...