2016-05-15 4 views
4

Im, использующий реализацию Xgboost на sklearn для соревнования kaggle. Однако им получать это сообщение 'предупреждение':XgBoost: наименее населенный класс в y имеет только 1 члена, которого слишком мало

$ питон Script1.py /home/sky/private/virtualenv15.0.1dev/myVE/local/lib/python2.7/site-packages/sklearn/cross_validation .py: 516:

Предупреждение: наименее населенный класс в y имеет только 1 элемент, которого слишком мало. Минимальное количество меток для любого класса не может быть меньше n_folds = 3. % (min_labels, self.n_folds)), предупреждение)

Согласно еще одному вопросу на StackOverflow: «Убедитесь, что у вас есть по крайней мере 3 образцов в классе, чтобы иметь возможность сделать перекрестную проверку StratifiedKFold с к == 3 (Я думаю, что это CV по умолчанию, используемое GridSearchCV для классификации). "

И хорошо, у меня нет как минимум 3 образцов на класс.

Так что мои вопросы:

а) каковы альтернативы?

b) Почему я не могу использовать перекрестные проверки?

c) Что я могу использовать вместо этого?

... 
param_test1 = { 
    'max_depth': range(3, 10, 2), 
    'min_child_weight': range(1, 6, 2) 
} 

grid_search = GridSearchCV(

estimator= 
XGBClassifier(
    learning_rate=0.1, 
    n_estimators=3000, 
    max_depth=15, 
    min_child_weight=1, 
    gamma=0, 
    subsample=0.8, 
    colsample_bytree=0.8, 
    objective='multi:softmax', 
    nthread=42, 
    scale_pos_weight=1, 
    seed=27), 

    param_grid=param_test1, scoring='roc_auc', n_jobs=42, iid=False, cv=None, verbose=1) 
... 

grid_search.fit(train_x, place_id) 

Ссылки:

One-shot learning with scikit-learn

Using a support vector classifier with polynomial kernel in scikit-learn

ответ

1

Если у вас есть цель/класс с только один образец, то будет слишком мало для любой модели. Что вы можете сделать, это получить другой набор данных, желательно как можно более сбалансированный, поскольку большинство моделей лучше себя ведут в сбалансированных наборах.

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

+0

Я не могу получить новый набор данных, потому что его конкурс Kaggle. – KenobiShan

+0

Так что я просто удаляю образец, у которого есть эта одинокая цель ... Что, если я использую cv = 3, например .. тогда я удаляю цель/классы с количеством выборок <3, правильно? – KenobiShan

+1

Поскольку вы используете CV, вам нужно сделать этот простой анализ (проверьте, сколько выборок включено в каждую цель). Просто подсчитайте целевой вектор/столбец или используйте матрицу замешательства, тогда вы сможете иметь эти числа. Наконец, вы можете использовать Stratified K-fold CV, которое сохраняет исходную балансировку набора данных. Это решает проблему для CV, но у вас может быть очень искаженный/неуравновешенный набор, который ущемляет ваши модели. Вот функция SKlearn для Stratified K-fold CV: [link] (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.StratifiedKFold.html) – Rabbit

 Смежные вопросы

  • Нет связанных вопросов^_^