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

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

Многие статистические данные, основанные на небольших выборках, дают необъективные оценки; обычно главный член систематической ошибки пропорционален 1/n, где n — размер выборки. Следовательно, среднее значение результатов, основанных на нескольких подвыборках, вероятно, более смещено, чем один результат, основанный на всех данных, по крайней мере, в той мере, в какой отдельные выборки малы. Складной нож предлагает способы установить разумные пределы уверенности в сложных ситуациях.

Техника складного ножа была разработана Морисом Кенуем (1924–1973) в 1949 году и усовершенствована в 1956 году. Джон Тьюки расширил эту технику в 1958 году и предложил название «складной нож», потому что, как и физический складной нож (компактный складной нож), это грубый и готовый инструмент, который может импровизировать решение множества проблем, даже если конкретные проблемы могут быть более эффективно решены с помощью специально разработанного инструмента.

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

Оценка интересующей величины с помощью складного ножа — это среднее значение значений, которые вы получаете из каждой выборки складного ножа, где вы пропускаете одно наблюдение.

grades = np.array([ 98, 97, 87.4, 93, 90.5,  88.3,  88.75, 82, 89, 72])
# Leaving one observation out from grades to get the jackknife sample and store the mean grades
mean_grades= []
n = len(grades)
index = np.arange(n)

for i in range(n):
    jk_sample = np.mean(grades[index != i])
    mean_grades.append(jk_sample)

# The jackknife estimate is the mean of the mean grades from each sample
mean_grades_jk = np.mean(np.array(mean_grades))
print("Jackknife estimate of the mean = {}".format(mean_grades_jk))
Jackknife estimate of the mean = 88.595

Дисперсия оценки складного ножа в n-1 раз превышает дисперсию оценок отдельной выборки складного ножа, где n — количество наблюдений в исходной выборке.

Для расчета 95% доверительного интервала складного ножа можно использовать медиану.

# Leaving one observation out to get the jackknife sample and store the median grade
median_grades = []
for i in range(n):
    jk_sample = grades[index != i]
    median_grades.append(np.median(jk_sample))

median_grades = np.array(median_grades)

# Calculating jackknife estimate and it's variance
jk_median_grade = np.mean(median_grades)
jk_var = (n-1)*np.var(median_grades)

# Assuming normality, calculate lower and upper 95% confidence intervals
jk_lower_ci = jk_median_grade - 1.96*np.sqrt(jk_var)
jk_upper_ci = jk_median_grade + 1.96*np.sqrt(jk_var)
print("Jackknife 95% CI lower = {}, upper = {}".format(jk_lower_ci, jk_upper_ci))
Jackknife 95% CI lower = 88.14, upper = 89.61

Спасибо за прочтение!