1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-data8-textbook-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
13.md 49 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 06:54 043962f

Прогнозирование

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

Для ответа на подобные вопросы специалисты в области данных разработали методы прогнозирования. В этой главе мы рассмотрим один из наиболее распространённых методов, который основан на использовании значения одной переменной для предсказания значения другой переменной.

Этот метод был разработан Фрэнсисом Гальтоном, английским географом, антропологом и статистиком. Мы уже рассматривали данные, которые он собрал для изучения наследственности. Таблица «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 = 1 указывает на идеальную положительную линейную связь;
  • r = -1 указывает на идеальную отрицательную линейную связь;
  • r = 0 указывает на отсутствие линейной связи.

Функция r_scatter принимает значение r в качестве параметра и генерирует график рассеяния, который визуально демонстрирует корреляцию, близкую к указанному значению r. Однако из-за случайности моделирования корреляция не всегда точно равна r.

Вычисление r

Формула для r основана на стандартных единицах измерения обеих переменных. Формула выглядит следующим образом: r = среднее значение произведения стандартных единиц измерения двух переменных.

Процесс вычисления включает следующие шаги:

  1. Преобразование каждой переменной в стандартные единицы измерения.
  2. Перемножение каждой пары стандартных единиц.
  3. Вычисление среднего значения полученных произведений.

Пример кода на Python иллюстрирует этот процесс.

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

Свойства r

Значение r имеет несколько важных свойств:

  • Это чистое число без единиц измерения, так как оно основано на стандартных единицах.
  • Оно не зависит от масштаба осей графика.
  • Его значение не меняется при перестановке осей x и y.

Эти свойства делают 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 = \frac{\sum_{i=1}^n x_iy_i - \frac{1}{n}(\sum_{i=1}^nx_i)(\sum_{i=1}^ny_i)}{\sum_{i=1}^n x_i^2 - \frac{1}(n)(\sum_{i=1}^nx_i)^2}$;
  • $b = \frac{1}{n}\sum_{i=1}^ny_i - a\cdot\frac{1}{n}\sum_{i=1}^nx_i$.

Эти формулы позволяют нам найти коэффициенты $a$ и $b$ для прямой линии, которая наилучшим образом описывает наши данные.

Пример

Пусть у нас есть набор данных, состоящий из пар значений $(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)$. Мы хотим найти прямую линию $y = ax + b$, которая наилучшим образом соответствует этим данным.

Сначала мы вычисляем суммы:

  • $\sum_{i=1}^n x_i = x_1 + x_2 + ... + x_n$;
  • $\sum_{i=1}^n y_i = y_1 + y_2 + ... + y_n$;
  • $\sum_{i=1}^n x_iy_i = x_1y_1 + x_2y_2 + ... + x_ny_n$.

Затем мы подставляем эти суммы в формулы для коэффициентов и получаем:

  • $a = \frac{(\sum_{i=1}^n x_iy_i) - (\frac{1}{n} (\sum_{i=1}^n x_i))(\frac{1}{n} (\sum_{i=1}^n y_i))}{(\sum_{i=1}^n x_i^2) - (\frac{1}{n^2} (\sum_{i=1}^n x_i)^2)}$;
  • $b = \frac{1}{n} \sum_{i=1}^n y_i - a \cdot \frac{1}{n} \sum_{i=1}^n x_i$.

Теперь мы можем использовать эти формулы для вычисления коэффициентов $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 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/wizardforcel-data8-textbook-zh.git
git@gitlife.ru:oschina-mirror/wizardforcel-data8-textbook-zh.git
oschina-mirror
wizardforcel-data8-textbook-zh
wizardforcel-data8-textbook-zh
master