Как оценить стабильность модели классификации xgboost - PullRequest
1 голос
/ 08 октября 2019

У меня есть:

a) модель классификации Python xgboost

b) еженедельные наборы данных (основа классификации) с начала 2018 года. Каждый набор данных имеет около 100 тысяч строк и 70столбцы (функции).

c) результаты еженедельного прогнозирования для наборов данных с использованием модели xgboost (с использованием логистической регрессии) в формате:

-дата моделирования;

-элементов;

-test_auc_mean для каждого элемента (в процентах).

Всего: около 100 наборов данных и 100 предикатов_результатов с января 2018 года.

Для оценки модели я использую такие метрики, как:

-auc

-конфузионная матрица

-точность

param = {
    'num_parallel_tree':num_parallel_tree,
    'subsample':subsample,
    'colsample_bytree':colsample_bytree,
    'objective':objective, 
    'learning_rate':learning_rate, 
    'eval_metric':eval_metric, 
    'max_depth':max_depth,
    'scale_pos_weight':scale_pos_weight,
    'min_child_weight':min_child_weight,
    'nthread':nthread,
    'seed':seed
}

bst_cv = xgb.cv(
    param, 
    dtrain,  
    num_boost_round=n_estimators, 
    nfold = nfold,
    early_stopping_rounds=early_stopping_rounds,
    verbose_eval=verbose,
    stratified = stratified
)

test_auc_mean = bst_cv['test-auc-mean']
best_iteration = test_auc_mean[test_auc_mean == max(test_auc_mean)].index[0]

bst = xgb.train(param, 
                dtrain, 
                num_boost_round = best_iteration)

best_train_auc_mean = bst_cv['train-auc-mean'][best_iteration]
best_train_auc_mean_std = bst_cv['train-auc-std'][best_iteration]

best_test_auc_mean = bst_cv['test-auc-mean'][best_iteration]
best_test_auc_mean_std = bst_cv['test-auc-std'][best_iteration]

print('''XGB CV model report
Best train-auc-mean {}% (std: {}%) 
Best test-auc-mean {}% (std: {}%)'''.format(round(best_train_auc_mean * 100, 2), 
                                          round(best_train_auc_mean_std * 100, 2), 
                                          round(best_test_auc_mean * 100, 2), 
                                          round(best_test_auc_mean_std * 100, 2)))

y_pred = bst.predict(dtest)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred>0.9).ravel()


print('''
     | neg | pos |
__________________
true_| {}  | {}  |
false| {}  | {}  |
__________________

'''.format(tn, tp, fn, fp))

predict_accuracy_on_test_set = (tn + tp)/(tn + fp + fn + tp)
print('Test Accuracy: {}%'.format(round(predict_accuracy_on_test_set * 100, 2)))

Модель дает мне общую картину (как обычно, auc составляет от 0,94 до.96) Проблема в том, что изменчивость предсказания некоторых конкретных предметов очень высока (сегодня предмет положительный, завтра предмет отрицательный, послезавтра снова положительный)

Я хочу оценить модельстабильность. Другими словами, я хочу знать, сколько элементов с переменными результатами он генерирует. В конце я хочу быть уверенным, что модель будет генерировать стабильные результаты с минимальными колебаниями. У вас есть мысли, как это сделать?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

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

Вы можете попробовать некоторые новые показатели, такие как точность, отзыв, оценка f1 или оценка fn к весууспех и неудача по-разному, но похоже, что у вас почти нет решений. Вы зависите от ввода данных здесь: s

Вы можете потратить некоторое время на обучение распределению населения и попытаться определить, какая часть населения колеблется во времени.

Вы также можете попытаться предсказать вероятности, а не классификацию, чтобы оценить, намного ли модель превышает ее пороговое значение.

Эти два решения больше похожи на побочные решения. (

1 голос
/ 09 октября 2019

Predict-proba of 1 item (mean-auc Гвендал, спасибо. Не могли бы вы указать 2 подхода, которые вы упомянули. 1) как я могу обучить распределение населения? через K-кластеризацию или другие методы обучения без учителя? 2) Например, я предсказал_проба (схема 1 конкретного элемента - в приложении). Как я могу оценить, находится ли модель намного выше своего порога? Путем сравнения предиката_пробы каждого элемента с его истинной меткой (например, предиката_пробы = 0,5 и метки = 1)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...