Сравните, является ли разница в точности производительности моделей 2 ML статистически значимой или нет - PullRequest
0 голосов
/ 03 февраля 2019

Я впервые использую обмен стека, но мне нужна помощь с проблемой (это не домашняя работа или не проблема с заданием):

У меня есть два дерева решений: D1 = DecisionTreeClassifier(max_depth=4,criterion = 'entropy',random_state=1) и D2 = DecisionTreeClassifier(max_depth=8,criterion = 'entropy',random_state=1).Когда я выполнил 5-кратную перекрестную проверку для обоих из них для данного набора функций и соответствующих меток, я обнаружил, что их средняя точность проверки по 5-кратным значениям равна 0,59 и 0,57 соответственно.Как определить, является ли разница между их показателями статистически значимой или нет?(PS мы используем уровень значимости = 0,01).

Укажите, если здесь отсутствует какая-либо информация или термин значимости.

1 Ответ

0 голосов
/ 03 февраля 2019

Это очень хороший вопрос, и ответ оказывается не таким простым.

Инстинктивно, большинство людей склонны рекомендовать парный 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.

Надеюсь, это поможет - не стесняйтесь копать глубже самостоятельно ...

...