Это очень хороший вопрос, и ответ оказывается не таким простым.
Инстинктивно, большинство людей склонны рекомендовать парный t-тест студента ;но, как объяснено в превосходном посте Тесты статистической значимости для сравнения алгоритмов машинного обучения Мастерства машинного обучения, этот тест на самом деле не подходит для этого случая, поскольку его предположения фактически нарушаются:
Фактически этот [t-критерий Стьюдента] является обычным способом сравнения классификаторов с, возможно, сотнями опубликованных работ, использующих эту методологию.
Проблема заключается в ключевом допущении t-критерия парного Стьюдента.тест был нарушен.
А именно, наблюдения в каждой выборке не являются независимыми.Как часть процедуры перекрестной проверки в k-кратном формате, данное наблюдение будет использоваться в учебных наборах данных (k-1) раз.Это означает, что оценочные оценки навыков являются зависимыми, а не независимыми, и, в свою очередь, что вычисление t-статистики в тесте будет вводить в заблуждение неверно вместе с любыми интерпретациями статистики и p-значения.
Далее в статье рекомендуется рекомендовать тест Макнемара (см. Также this , теперь закрытый, вопрос SO), который реализован в пакете statsmodels Python.Я не буду притворяться, что что-то знаю об этом, и я никогда не использовал это, так что вам, возможно, придется делать дальнейшие раскопки здесь самим ...
Тем не менее, как сообщалось в вышеупомянутом посте,тест может быть подходом «последней инстанции»:
Это вариант, но он очень слабо рекомендуется.
и это то, что я собираюсь продемонстрировать здесь;используйте его с осторожностью.
Для начала вам понадобятся не только средние значения, но и фактические значения показателя эффективности в каждом из k-кратных значений вашей перекрестной проверки.Это не совсем тривиально в Scikit-Learn, но я недавно ответил на соответствующий вопрос по Методы перекрестной проверки в Scikit-Learn для каждого разделения данных , и я адаптирую ответ здесь, используя Boston Scikit-Learn.набор данных и два регрессора дерева решений (вы, безусловно, можете адаптировать их к своему собственному точному случаю):
from sklearn.model_selection import KFold
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
X, y = load_boston(return_X_y=True)
n_splits = 5
kf = KFold(n_splits=n_splits, shuffle=True)
model_1 = DecisionTreeRegressor(max_depth = 4, criterion='mae',random_state=1)
model_2 = DecisionTreeRegressor(max_depth = 8, criterion='mae', random_state=1)
cv_mae_1 = []
cv_mae_2 = []
for train_index, val_index in kf.split(X):
model_1.fit(X[train_index], y[train_index])
pred_1 = model_1.predict(X[val_index])
err_1 = mean_absolute_error(y[val_index], pred_1)
cv_mae_1.append(err_1)
model_2.fit(X[train_index], y[train_index])
pred_2 = model_2.predict(X[val_index])
err_2 = mean_absolute_error(y[val_index], pred_2)
cv_mae_2.append(err_2)
cv_mae_1
содержит значения нашей метрики (здесь означает абсолютную ошибку - MAE) для каждого из 5сгибы нашей 1-й модели:
cv_mae_1
# result:
[3.080392156862745,
2.8262376237623767,
3.164851485148514,
3.5514851485148515,
3.162376237623762]
и аналогично cv_mae_2
для нашей 2-й модели:
cv_mae_2
# result
[3.1460784313725494,
3.288613861386139,
3.462871287128713,
3.143069306930693,
3.2490099009900986]
Получив эти списки, теперь легко вычислить парный t-критерийстатистика вместе с соответствующим p-значением, используя соответствующий метод scipy :
from scipy import stats
stats.ttest_rel(cv_mae_1,cv_mae_2)
# Ttest_relResult(statistic=-0.6875659723031529, pvalue=0.5295196273427171)
, где в нашем случае огромное значение p означает, что not статистически значимая разница между нашими показателями MAE.
Надеюсь, это поможет - не стесняйтесь копать глубже самостоятельно ...