У меня есть:
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) Проблема в том, что изменчивость предсказания некоторых конкретных предметов очень высока (сегодня предмет положительный, завтра предмет отрицательный, послезавтра снова положительный)
Я хочу оценить модельстабильность. Другими словами, я хочу знать, сколько элементов с переменными результатами он генерирует. В конце я хочу быть уверенным, что модель будет генерировать стабильные результаты с минимальными колебаниями. У вас есть мысли, как это сделать?