Прогнозирование
В области данных науки важно понимать, какие выводы можно сделать на основе имеющихся данных. Например, можно ли по данным о климате и загрязнении предсказать изменение температуры в будущем? Какие сайты могут заинтересовать человека на основании его личных данных из интернета? Как история болезни пациента может помочь определить его реакцию на лечение?
Для ответа на подобные вопросы специалисты в области данных разработали методы прогнозирования. В этой главе мы рассмотрим один из наиболее распространённых методов, который основан на использовании значения одной переменной для предсказания значения другой переменной.
Этот метод был разработан Фрэнсисом Гальтоном, английским географом, антропологом и статистиком. Мы уже рассматривали данные, которые он собрал для изучения наследственности. Таблица «heights» содержит информацию о росте 934 взрослых детей и их родителей (все значения указаны в дюймах).
MidParent | Child |
---|---|
75.43 | 73.2 |
75.43 | 69.2 |
75.43 | 69 |
75.43 | 69 |
... | ... |
Основная идея метода заключается в том, чтобы использовать данные о росте родителей для прогнозирования роста их детей. После того как была замечена положительная корреляция между двумя переменными, были сделаны соответствующие прогнозы.
Мы используем функцию «predict_child», которая принимает в качестве параметра рост родителей и возвращает средний рост детей, у которых рост родителей находится в диапазоне плюс-минус полдюйма от указанного значения.
def predict_child(mpht):
"""Return a prediction of the height of a child
whose parents have a midparent height of mpht.
The prediction is the average height of the children
whose midparent height is in the range mpht plus or minus 0.5 inches.
"""
close_points = heights.where('MidParent', are.between(mpht-0.5, mpht + 0.5))
return close_points.column('Child').mean()
Затем мы применяем эту функцию ко всем значениям роста родителей и визуализируем результаты.
Данный метод прогнозирования называется регрессией. В следующих разделах мы рассмотрим, как можно улучшить этот метод и избежать использования произвольных диапазонов для определения близости значений. Другой взгляд на корреляцию: понимание и применение коэффициента корреляции
В области разработки и тестирования программного обеспечения корреляция играет важную роль в анализе данных. Коэффициент корреляции, или r, измеряет силу линейной связи между двумя переменными. В графическом представлении он показывает степень скопления точек данных вокруг прямой линии.
Коэффициент корреляции r — это число от -1 до 1, где:
Функция r_scatter принимает значение r в качестве параметра и генерирует график рассеяния, который визуально демонстрирует корреляцию, близкую к указанному значению r. Однако из-за случайности моделирования корреляция не всегда точно равна r.
Вычисление r
Формула для r основана на стандартных единицах измерения обеих переменных. Формула выглядит следующим образом: r = среднее значение произведения стандартных единиц измерения двух переменных.
Процесс вычисления включает следующие шаги:
Пример кода на Python иллюстрирует этот процесс.
После выполнения этих шагов можно получить значение r, которое является мерой корреляции между данными.
Свойства r
Значение r имеет несколько важных свойств:
Эти свойства делают r полезным инструментом для анализа данных и понимания их взаимосвязи.
Функция correlation
Для упрощения процесса вычисления корреляции можно создать функцию correlation, которая принимает таблицу данных и метки столбцов и возвращает значение r. Это позволяет легко повторять вычисления для разных наборов данных.
Применение функции correlation к различным таблицам данных позволяет увидеть корреляцию между различными переменными, такими как цена и эффективность, а также цена и ускорение. Эти результаты подтверждают наблюдения о характере взаимосвязи между этими переменными.
Ограничения корреляции
Важно понимать, что корреляция не является причиной и следствием. Она только измеряет взаимосвязь между переменными и не может определить причинно-следственные связи. Также корреляция ограничена измерением только линейных связей, и наличие нелинейных отношений может привести к низкой корреляции. Кроме того, корреляция может быть искажена выбросами, которые могут существенно повлиять на её значение. ### Анализ данных о росте детей и их родителей с использованием регрессионного анализа
Этот график выглядит так, как будто он нарисован на исходной шкале. Изменились только числа на оси. Это подтверждает, что мы можем понять процесс прогнозирования, работая в стандартных единицах.
Форма точечной диаграммы Галтона примерно напоминает форму сплюснутого шара — то есть она примерно эллипсовидная. Не все точечные диаграммы являются сплюснутыми, и даже не все линейно связанные диаграммы имеют такую форму. Но в этом разделе мы притворимся, что являемся Галтоном и можем работать только со сплюснутыми точечными диаграммами. В следующем разделе мы расширим наш анализ на другие формы графиков.
Здесь представлена сплюснутая точечная диаграмма, где две переменные измеряются в стандартных единицах. Линия 45 градусов показана красным цветом.
Однако линия 45 градусов не проходит через центр вертикальной полосы. Вы можете видеть, что вертикальная линия на уровне 1,5 стандартных единиц показана чёрным цветом. Точки на графике рядом с синей линией имеют высоту, которая находится примерно в диапазоне от -2 до 3. Красная линия слишком высока, чтобы попасть в центр.
Поэтому линия 45 градусов — это не «линия среднего значения». Эта линия называется зелёной линией.
Обе линии проходят через начало координат (0,0). Зелёная линия проходит через центр вертикальной полосы (по крайней мере, приблизительно), она более плоская, чем красная линия 45 градусов.
Наклон линии 45 градусов равен 1. Поэтому наклон зелёной «линии среднего значения» положительный, но меньше 1.
Каково может быть значение? Вы угадали — это r.
Зелёная «линия среднего значения» называется линией регрессии, и мы скоро объясним почему. Но сначала давайте смоделируем несколько сплюснутых точечных диаграмм с разными значениями r и посмотрим, как меняется линия. В каждом случае мы рисуем красную линию 45 градусов для сравнения.
Функция для моделирования называется regression_line и принимает параметр r.
regression_line(0.95)
regression_line(0.6)
Когда r близко к 1, точечная диаграмма, линия 45 градусов и линия регрессии очень похожи. Однако для более низких значений r линия регрессии явно более плоская.
С точки зрения прогнозирования это означает, что для родителей ростом 1,5 стандартные единицы мы прогнозируем рост дочерей немного ниже 1,5 стандартных единиц. Если рост родителей составляет 2 стандартные единицы, мы прогнозируем, что рост детей будет немного меньше 2 стандартных единиц.
Другими словами, мы предсказываем, что дети будут ближе к среднему значению, чем их родители.
Фрэнсиса Гальтона это не обрадовало. Он всегда надеялся, что особенно высокие родители будут иметь особенно высоких детей. Однако данные ясны: Гальтон понял, что обычно у высоких родителей не бывает особенно высоких детей. Гальтон назвал это явление «регрессией к посредственности».
Гальтон также заметил, что у особенно низкорослых родителей обычно бывают дети, которые относительно них выше. Обычно переменная со средним значением намного ниже, чем другая переменная. Это называется эффектом регрессии.
В регрессии мы используем значение одной переменной (мы называем её x) для прогнозирования значения другой переменной (которую мы называем y). Когда переменные x и y измеряются в стандартных единицах, уравнение линии регрессии имеет наклон r и проходит через начало координат. Таким образом, уравнение регрессии можно записать следующим образом:
В исходных единицах уравнение выглядит следующим образом:
Следующие три функции вычисляют корреляцию, наклон и пересечение. Они принимают три параметра: имя таблицы, метку столбца, содержащего x, и метку столбца, содержащего y.
def correlation(t, label_x, label_y):
return np.mean(standard_units(t.column(label_x))*standard_units(t.column(label_y)))
def slope(t, label_x, label_y):
r = correlation(t, label_x, label_y)
return r*np.std(t.column(label_y))/np.std(t.column(label_x))
def intercept(t, label_x, label_y):
return np.mean(t.column(label_y)) - slope(t, label_x, label_y)*np.mean(t.column(label_x))
Корреляция между ростом родителей и детей составляет 0,32:
galton_r = correlation(heights, 'MidParent', 'Child')
galton_r
0.32094989606395924
Мы также можем найти уравнение регрессионной линии, чтобы предсказать рост детей на основе роста родителей:
galton_slope = slope(heights, 'MidParent', 'Child')
galton_intercept = intercept(heights, 'MidParent', 'Child')
galton_slope, galton_intercept
(0.63736089696947895, 22.636240549589751)
Уравнение регрессионной линии выглядит следующим образом:
Это также называется уравнением регрессии. Основное назначение уравнения регрессии — прогнозировать y на основе x.
Например, для роста родителей 70,48 дюйма регрессионная линия предсказывает, что рост ребёнка составит 67,56 дюйма.
galton_slope*70.48 + galton_intercept
67.557436567998622
Наш первоначальный прогноз, основанный на расчёте среднего роста всех детей, чей рост родителей близок к 70,48 дюймам, очень близок: 67,63 дюйма, а прогноз по регрессионной линии составляет 67,55 дюйма.
heights_with_predictions.where('MidParent', are.equal_to(70.48)).show(3)
MidParent | Child | Prediction |
---|---|---|
70.48 | 74 | 67.6342 |
70.48 | 70 | 67.6342 |
70.48 | 68 | 67.6342 |
(опущено 5 строк)
Вот все строки из таблицы Гальтона, наш первоначальный прогноз и прогноз роста детей по регрессионной линии.
heights_with_predictions = heights_with_predic
tions.with_column(
'Regression Prediction', galton_slope*heights.column('MidParent') + galton_intercept
)
heights_with_predictions
MidParent | Child | Prediction | Regression Prediction |
---|---|---|---|
75.43 | 73.2 | 70.1 | 70.7124 |
75.43 | 69.2 | 70.1 | 70.7124 |
75.43 | 69 | 70.1 | 70.7124 |
75.43 | 69 | 70.1 | 70.7124 |
73.66 | 73.5 | 70.4158 | 69.5842 |
73.66 | 72.5 | 70.4158 | 69.5842 |
73.66 | 65.5 | 70.4158 | 69.5842 |
73.66 | 65.5 | 70.4158 | 69.5842 |
72.06 | 71 | 68.5025 | 68.5645 |
72.06 | 68 | 68.5025 | 68.5645 |
(опущено 924 строки)
heights_with_predictions.scatter('MidParent')
Серые точки показывают прогнозы по регрессионной линии, каждая из которых находится на линии. Обратите внимание, что эта линия очень близка к золотой линии среднего значения. Для этих данных регрессионная линия хорошо аппроксимирует центральную линию вертикальной полосы.
Все прогнозируемые значения находятся на прямой линии, называемой «сглаженными значениями». Функция fit использует имя таблицы и метки x и y, возвращая массив сглаженных значений, по одному для каждой точки графика.
def fit(table, x, y):
"""Return the height of the regression line at each x value."""
a = slope(table, x, y)
b = intercept(table, x, y)
return a * table.column(x) + b
Следующий график легче увидеть прямую линию:
heights.with_column('Fitted', fit(heights, 'MidParent',
Примечание: В тексте запроса присутствуют синтаксические ошибки, поэтому перевод может содержать неточности. Перевод текста на русский язык:
Метод scatter() для построения прямой линии можно использовать и другим способом: в методе scatter() используется опция fit_line=True.
heights.scatter('MidParent', fit_line=True)
Результирующий график:
Наклон — это отношение, которое стоит изучить подробнее. Мы используем пример из набора данных о беременных женщинах из знакомой нам больничной системы. Точечная диаграмма веса по сравнению с ростом беременных женщин выглядит как футбольный мяч, который использовался много раз во время игры, но достаточно близко к мячу, чтобы мы могли провести линию тренда через него. В следующем разделе мы увидим, как сделать это доказательство более формальным.
baby = Table.read_table('baby.csv')
baby.scatter('Maternal Height', 'Maternal Pregnancy Weight', fit_line=True)
Результирующий график:
slope(baby, 'Maternal Height', 'Maternal Pregnancy Weight')
3.5728462592750558
Наклон линии регрессии составляет 3,57 фунта на дюйм. Это означает, что для женщин с разницей в росте в один дюйм мы прогнозируем разницу в весе при беременности в 3,57 фунта. Для женщин с разницей роста в два дюйма мы ожидаем разницу в весе при беременности примерно в 7,14 фунта (2 * 3,57).
Обратите внимание, что вертикальные полосы на графике расположены на расстоянии одного дюйма друг от друга, потому что рост уже округлён до ближайшего дюйма. Другой способ рассмотреть наклон — взять две смежные полосы (разделенные одним дюймом), что эквивалентно двум группам женщин с разницей в росте один дюйм. Наклон 3,57 фунта на дюйм означает, что средняя масса тела группы с более высоким ростом примерно на 3,57 фунта больше, чем у группы с низким ростом.
Предположим, наша цель — использовать регрессию для оценки роста бассет-хаунда на основе его веса, и образец соответствует модели регрессии. Предположим, что наблюдаемая корреляция r равна 0,5, а сводная статистика двух переменных выглядит следующим образом:
average | SD | |
---|---|---|
height | 14 inches | 2 inches |
weight | 50 pounds | 5 pounds |
Для вычисления уравнения линии регрессии нам нужны наклон и точка пересечения.
Уравнение линии регрессии позволяет нам оценить предполагаемый рост (в дюймах) на основе заданного веса (фунты):
Линия регрессии наклон измеряет увеличение предполагаемого роста по мере увеличения единицы веса. Наклон является положительным значением, но важно отметить, что это не означает, что мы считаем, что собаки станут выше, если их вес увеличится. Наклон отражает разницу средних высот между двумя группами собак, которые различаются по весу на один фунт. Конкретно, рассмотрим группу весом w фунтов и другую группу весом w + 1 фунт. Мы ожидаем, что вторая группа будет иметь среднее значение на 0,2 дюйма выше. Это верно для всех значений w в выборке.
В общем случае наклон линии регрессии можно интерпретировать как среднее увеличение y при увеличении x на одну единицу. Обратите внимание, что если наклон отрицательный, то для каждого увеличения x среднее значение y будет уменьшаться.
Даже если мы не установили математическую основу для уравнения регрессии, мы видим, что когда точечная диаграмма имеет форму футбольного мяча, она даёт довольно хорошие прогнозы. Это удивительный математический факт, независимо от формы точечной диаграммы, одно и то же уравнение даёт «лучший» прогноз для всех линий. Это тема следующего раздела.
Мы уже рассмотрели шаги, предпринятые Гамильтоном и Пирсоном для разработки уравнения линии регрессии через точечную диаграмму в форме футбольного мяча. Но не все точечные диаграммы имеют форму футбольного мяча или даже линейны. Есть ли «лучшая» линия для каждой точечной диаграммы? Если да, можем ли мы использовать формулу наклона и точки пересечения, разработанную в предыдущем разделе, или нам нужна новая формула?
Чтобы решить эти проблемы, нам нужно разумное определение «наилучшего». Напомним, что цель этой линии — предсказать или оценить значение y при заданном значении x. Оценка обычно не идеальна. Каждое значение отклоняется от истинного значения из-за ошибки. Разумный стандарт для «лучшей» линии заключается в том, что она имеет общую ошибку как можно меньше среди всех возможных линий.
В этом разделе мы точно определим этот стандарт и посмотрим, сможем ли мы определить оптимальную линию в соответствии со стандартом.
Наш первый пример — набор данных романа «Маленькие женщины», где каждая глава представляет собой строку. Цель состоит в том, чтобы оценить количество символов (то есть букв, пробелов, знаков препинания и т. д.) на основе количества предложений. Вспомните, что мы пытались реализовать это на первом уроке этого курса.
little_women = Table.read_table('little_women.csv')
little_women = little_women.move_to_start('Periods')
little_women.show(3)
Periods | Characters |
---|---|
189 | 21759 |
188 | 22148 |
231 | 20558 |
(Опущено 44 строки)
little_women.scatter('Periods', 'Characters')
График:
Чтобы исследовать данные, нам потребуется использовать функции correlation(), slope(), intercept() и fit(), определённые в предыдущем разделе.
correlation(little_women, 'Periods', 'Characters')
0.92295768958548163
Точечная диаграмма явно близка к линейной, корреляция больше 0,92.
На следующем графике показана наша точечная диаграмма и линия, разработанная в предыдущем разделе. Мы ещё не знаем, является ли это лучшей линией. Сначала мы должны точно выразить значение «оптимального».
lw_with_predictions = little_women.with_column('Linear Prediction', fit(little_women, 'Periods', 'Characters'))
lw_with_predictions.scatter('Periods')
График:
Соответственно, для каждой точки на точечной диаграмме ошибка прогноза представляет собой расчёт фактического значения за вычетом прогнозируемого значения. Это вертикальное расстояние между точкой и линией, отрицательное, если точка находится ниже линии.
actual = lw_with_predictions.column('Characters')
predicted = lw_with_predictions.column('Linear Prediction')
errors = actual - predicted
lw_with_predictions.with_column('Error', errors)
Periods | Characters | Linear Prediction | Error |
---|---|---|---|
189 | 21759 | 21183.6 | 575.403 |
188 | 22148 | 21096.6 | 1051.38 |
231 | 20558 | 24836.7 | -4278.67 |
195 | 25526 | 21705.5 | 3820.54 |
255 | 23395 | 26924.1 | -3529.13 |
140 | 14622 | 16921.7 | -2299.68 |
131 | 14431 | 16138.9 | -1707.88 |
214 | 22476 | 23358 | -882.043 |
337 | 33767 | 34056.3 | -289.317 |
185 | 18508 | 20835.7 | -2327.69 |
(Опущено 37 строк)
Мы можем использовать slope() и intercept(), чтобы вычислить наклон и точку пересечения линии соответствия. Следующий график показывает эту линию (светло-голубым цветом). Соответствующие четырем точкам ошибки показаны красным цветом. Эти четыре точки ничем особенным не выделяются. Они были выбраны просто для ясности. Функция lw_errors() принимает наклон и точку пересечения (в указанном порядке) в качестве параметров и строит этот график.
lw_reg_slope = slope(little_women, 'Periods', 'Characters')
lw_reg_intercept = intercept(little_women, 'Periods', 'Characters')
print('Slope of Regression Line: ', np.round(lw_reg_slope), 'characters per period')
print('Intercept of Regression Line:', np.round(lw_reg_intercept), 'characters')
lw_errors(lw_reg_slope, lw_reg_intercept)
Slope of Regression Line: 87.0 characters per period
Intercept of Regression Line: 4745.0 characters
График:
Если мы используем другую линию для создания нашей оценки, ошибка будет другой. Следующий график показывает, насколько велика ошибка, если мы используем совершенно глупую линию.
lw_errors(50, 10000)
График: Метод наименьших квадратов
Мы хотим оценить зависимость одной переменной от другой. Для этого мы будем искать прямую линию, которая наилучшим образом соответствует нашим данным.
Для оценки качества соответствия линии данным используется сумма квадратов отклонений наблюдаемых значений от значений, предсказанных линией. Наша задача — минимизировать эту сумму.
Прямая линия описывается уравнением $y = ax + b$. Мы можем подставить это уравнение в нашу сумму квадратов и получить функцию от коэффициентов $a$ и $b$, которую надо минимизировать:
$Q(a, b) = \sum_{i=1}^n (y_i - (ax_i + b))^2$.
Здесь $x_i$ и $y_i$ — значения переменных из нашего набора данных.
Чтобы найти минимум функции двух переменных, нужно вычислить её частные производные по каждой из переменных и приравнять их к нулю. В результате мы получим систему уравнений для коэффициентов $a$ и $b$. Решая эту систему, мы найдём коэффициенты, которые минимизируют сумму квадратов.
В итоге мы получаем следующие формулы для коэффициентов:
Эти формулы позволяют нам найти коэффициенты $a$ и $b$ для прямой линии, которая наилучшим образом описывает наши данные.
Пример
Пусть у нас есть набор данных, состоящий из пар значений $(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)$. Мы хотим найти прямую линию $y = ax + b$, которая наилучшим образом соответствует этим данным.
Сначала мы вычисляем суммы:
Затем мы подставляем эти суммы в формулы для коэффициентов и получаем:
Теперь мы можем использовать эти формулы для вычисления коэффициентов $a$ и $b$. Если мы подставим эти коэффициенты в уравнение $y = ax + b$, то получим прямую линию, которая наилучшим образом соответствует нашим данным. Перевод текста на русский язык:
0.098343821597819972 intercept(shotput, 'Вес поднятого', 'Расстояние броска') 5.9596290983739522
Даже если точечная диаграмма не имеет форму ядра, имеет ли смысл использовать эти формулы? Мы можем ответить на этот вопрос, найдя наклон и точку пересечения, которые минимизируют среднеквадратичную ошибку (MSE).
Мы определим функцию shotput_linear_mse
, которая принимает наклон и точку пересечения в качестве параметров и возвращает соответствующую MSE. Затем применение minimize
к shotput_linear_mse
вернёт оптимальные наклон и точку пересечения.
def shotput_linear_mse(any_slope, any_intercept):
x = shotput.column('Вес поднятого')
y = shotput.column('Расстояние броска')
fitted = any_slope*x + any_intercept
return np.mean((y - fitted) ** 2)
minimize(shotput_linear_mse)
array([ 0.09834382, 5.95962911])
Эти значения совпадают с теми, что мы получили с помощью нашей формулы. Вывод:
Независимо от формы точечной диаграммы существует уникальная линия, которая может минимизировать оценочную среднеквадратичную ошибку. Она называется линией регрессии, а её наклон и точка пересечения задаются следующими формулами:
Переводчик: Это
cov(x, y)/var(x)
.
fitted = fit(shotput, 'Вес поднятого', 'Расстояние броска')
shotput.with_column('Лучшая прямая линия', fitted).scatter('Вес поднятого')
Приведённый выше график усиливает наше предыдущее наблюдение о том, что точечная диаграмма немного изогнута. Поэтому лучше всего подходит кривая, а не прямая. Исследовательская гипотеза предполагает, что связь между поднятым весом и расстоянием ядра является квадратичной. Поэтому давайте используем квадратичную функцию для прогнозирования и посмотрим, сможем ли мы найти наилучшую кривую.
Нам нужно найти лучшую квадратичную функцию среди всех квадратичных функций, а не лучшую прямую линию среди всех прямых линий. Метод наименьших квадратов позволяет нам это сделать.
Эта математическая задача минимизации сложна и нелегко обнаружить только путём проверки точечной диаграммы. Однако численная минимизация и линейное прогнозирование одинаково просты! Снова используя минимизацию, мы можем получить наилучший квадратичный прогноз. Давайте посмотрим, как это работает.
Вспомните форму квадратичной функции:
f(x) = ax^2 + bx + c
a
, b
и c
— константы.
Чтобы найти наилучшую квадратичную функцию на основе поднятого веса для прогнозирования расстояния, мы сначала пишем функцию с тремя константами в качестве переменных, вычисляем подогнанные значения с использованием квадратичной функции, а затем возвращаем среднеквадратичное отклонение.
Эту функцию называют shotput_quadratic_mse
. Обратите внимание, что определение похоже на определение lw_mse
, но подогнанные значения основаны на квадратичной, а не на линейной функции.
def shotput_quadratic_mse(a, b, c):
x = shotput.column('Вес поднятого')
y = shotput.column('Расстояние броска')
fitted = a*(x**2) + b*x + c
return np.mean((y - fitted) ** 2)
Теперь мы можем использовать minimize
, как и раньше, и найти константы, которые минимизируют MSE.
best = minimize(shotput_quadratic_mse)
best
array([ -1.04004838e-03, 2.82708045e-01, -1.53182115e+00])
Мы прогнозируем, что спортсмен, который может поднять x
килограммов, бросит ядро примерно на -0,00104x^2 + 0,2827x - 1,5318
метров. Например, если спортсмен может поднять 100 кг, прогнозируемое расстояние составит 16,33 метра. Вблизи центра вертикальной полосы с весом около 100 килограммов на графике разброса.
(-0.00104)*(100**2) + 0.2827*100 - 1.5318
16.3382
Вот все прогнозы для Weight Lifted
. Вы можете видеть, что они проходят через центр графика разброса, примерно соответствуя ему.
x = shotput.column(0)
shotput_fit = best.item(0)*(x**2) + best.item(1)*x + best.item(2)
shotput.with_column('Best Quadratic Curve', shotput_fit).scatter(0)
Предположим, специалист по данным уже решил использовать линейную регрессию для оценки значения переменной отклика на основе прогнозирующей переменной. Чтобы понять, насколько эффективен этот метод оценки, исследователь должен знать, насколько далеко оценка находится от фактического значения. Эти различия называются остатками.
Остаток — это то, что осталось после оценки.
Остатки — это вертикальное расстояние между линией регрессии и точками. Каждая точка на графике разброса имеет остаток. Остаток — это разница между наблюдаемым значением y
и подогнанным значением y
, поэтому для точки (x, y)
:
Функция residual
вычисляет остатки. Этот расчёт предполагает, что все связанные функции уже определены: standard_units
, correlation
, slope
, intercept
и fit
.
def residual(table, x, y):
return table.column(y) - fit(table, x, y)
Продолжая пример данных Хадсона о росте детей, давайте вычислим подогнанные значения и остатки на основе роста родителей (прогнозирующая переменная) для оценки роста взрослых детей (переменная отклика).
heights = heights.with_columns(
'Fitted Value', fit(heights, 'MidParent', 'Child'),
'Residual', residual(heights, 'MidParent', 'Child')
)
heights
MidParent | Child | Fitted Value | Residual |
---|---|---|---|
75,43 | 73,2 | 70,7124 | 2,48763 |
75,43 | 69,2 | 70,7124 | -1,51237 |
75,43 | 69 | 70,7124 | -1,71237 |
75,43 | 69 | 70,7124 | -1,71237 |
73,66 | 73,5 | 69,5842 | 3,91576 |
73,66 | 72,5 | 69,5842 | 2,91576 |
73,66 | 65,5 | 69,5842 | -4,08424 |
73,66 | 65,5 | 69,5842 | -4,08424 |
72,06 | 71 | 68,5645 | 2,43553 |
72,06 | 68 | 68,5645 | -0,564467 |
(опущено 924 строки)
Если переменных слишком много, визуализация всегда очень помогает для начала. Функция scatter_fit
отображает график разброса данных и линию регрессии.
def scatter_fit(table, x, y):
table.scatter(x, y, s=15)
plots.plot(table.column(x), fit(table, x, y), lw=4, color='gold')
plots.xlabel(x)
plots.ylabel(y)
scatter_fit(heights, 'MidParent', 'Child')
Постройте график остатков и прогнозирующую переменную, чтобы построить график остатков. Функция residual_plot
делает именно это.
def residual_plot(table, x, y):
x_array = table.column(x)
t = Table().with_columns(
x, x_array,
'residuals', residual(table, x, y)
)
t.scatter(x, 'residuals', color='r')
xlims = make_array(min(x_array), max(x_array))
plots.plot(xlims, make_array(0, 0), color='darkblue', lw=4)
plots.title('Residual Plot')
residual_plot(heights, 'MidParent', 'Child')
Рост родителей отображается на оси абсцисс, как и на исходном графике разброса. Теперь ось ординат показывает остатки. Обратите внимание, что график выглядит так, будто он центрирован вокруг горизонтальной линии y=0
(показано тёмно-синим цветом). Также обратите внимание, что на графике не видно восходящего или нисходящего тренда. 1. Стандартное отклонение остатков равно стандартному отклонению y. Это согласуется с результатами наблюдений. Если r = 0, то линия регрессии представляет собой горизонтальную линию на уровне среднего значения y. В этом случае среднеквадратичная ошибка регрессии равна квадратному корню из дисперсии расстояний от точек до среднего значения y, что соответствует стандартному отклонению y. Фактически, если r = 0, между двумя переменными нет линейной связи, и использование линейной регрессии не имеет смысла.
Другое объяснение r
Мы можем переформулировать результат независимо от формы точечной диаграммы:
Стандартное отклонение подогнанных значений является пропорцией стандартного отклонения наблюдаемых значений y, где коэффициент пропорциональности равен |r|.
Чтобы увидеть, как возникает эта пропорция, обратите внимание, что все подогнанные значения лежат на линии регрессии, в то время как наблюдаемые значения y представляют собой высоты всех точек на точечной диаграмме, которые более изменчивы.
scatter_fit(heights, 'MidParent', 'Child')
Диапазон подогнанных значений составляет от 64 до 71, тогда как рост всех детей сильно варьируется, примерно от 55 до 80.
Для численной проверки результата нам нужно только вычислить согласованность обеих сторон.
correlation(heights, 'MidParent', 'Child')
0.32094989606395924
Здесь стандартное отклонение подогнанного значения роста по сравнению со стандартным отклонением наблюдаемого значения роста:
np.std(heights.column('Fitted Value'))/np.std(heights.column('Child'))
0.32094989606395957
Этот коэффициент равен r, подтверждая наш результат.
Где появляется абсолютное значение? Во-первых, стандартное отклонение не может быть отрицательным числом, и коэффициент стандартного отклонения также не может быть отрицательным. Что происходит, когда r — отрицательное число? Пример эффективности использования топлива и ускорения покажет это.
correlation(hybrid, 'acceleration', 'mpg')
-0.5060703843771186
np.std(hybrid.column('fitted mpg'))/np.std(hybrid.column('mpg'))
0.5060703843771186
Коэффициент двух стандартных отклонений равен |r|.
Более стандартный способ объяснить этот результат — вспомнить:
Поэтому возведём обе стороны в квадрат:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )