Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные - лекция-8 - регрессия - построение модели

3a855e4e8dd144b8942da2463831a067?s=47 Anton
April 03, 2019

Большие данные - лекция-8 - регрессия - построение модели

Регрессия, регрессионная модель — модель предсказания целевой переменной в непрерывной шкале

Часть 2: построение модели предсказания: линейная модель, криволинейной модели, выбросы, подгонка, оценка качества

Обновлено: 09.04.2020
[видео - брак] https://vk.com/video53223390_456239427

3a855e4e8dd144b8942da2463831a067?s=128

Anton

April 03, 2019
Tweet

Transcript

  1. Регрессия, регрессионная модель — модель предсказания целевой переменной в непрерывной

    шкале Часть 2: построение модели предсказания: линейная модель, криволинейной модели, выбросы, подгонка, оценка качества
  2. Источники • ВШЭ, Курсера • Python и машинное обучение, Себастьян

    Рашка • Обозначения в математических формулах могут отличаться между источниками
  3. Простая (одномерная) регрессионная модель • Задача: смоделировать связь между •

    единственным признаком (объясняющая переменная x) • и непрерывнозначным откликом (целевая переменная y) • (предсказать отклик y по значению x, когда x и y — числовые значения на непрерывной шкале)
  4. Регрессионные модели • Простая (линейная) регрессия (одна объясняющая переменная) •

    Множественная линейная регрессия (много объясняющих переменных) • Криволинейная (полиномиальная) регрессия (кривые высших порядков) • Задача: подобрать весовые коэффициенты w 0 ...w m так, чтобы наибольшее количество точек обучающей выборки находилось как можно ближе к линии регрессии по оси Y, в надежде на то, что неизвестные заранее точки тестовой выборки тоже окажутся достаточно близки к линии регрессии по оси Y. y=w 0 +w 1 x y=w 0 +w 1 x 1 +...+w m x m y=w 0 +w 1 x+w 2 x2 +...+w d xd
  5. Признаковое описание объекта • x(i) = ( x 1 (i),

    …, x m (i) ) — признаковое описание объекта x(i) (i-я строка таблицы, i=(1...n)) • x j — j-й признак объекта x, j=(1...m) • Матрица «объект — признаки» (feature data): nxm (n строк, m столбцов) • Обучающая выборка: каждой строке x(i) соответствует известный ответ y(i) F=‖x j (i)‖n×m = (x 1 (1)... x m (1) ... x 1 (n)... x m (n) )(y(1) ... y(n) )
  6. Предсказательная модель • Y - множество значений целевой переменной (ответов)

    y • Для регрессии Y = ℝ (вещественные числа: рациональные + иррациональные) • Предположим, что существует некий неизвестный «закон природы», который может предсказывать значение целевой переменной y по значениям признаков объекта x
  7. Предсказательная модель • Попробуем построить функцию y = ŷ(x) так,

    что: • ŷ = ŷ(x) — предсказанное значение для объекта x, • y = y(x) — эмпирическое (известное) значение для него же • ŷ(x) должна быть построена таким образом, чтобы предсказанное значение ŷ было достаточно близко к эмпирическому значению y в достаточном количестве случаев
  8. Параметрическое семейство функций • Пусть • A — параметрическое семейство

    функций • g — фиксированная параметрическая функция • w — параметр (вектор) • W — множество значений параметра w • Линейная модель регрессии — взвешенная сумма всех признаков (веса признаков — параметры): • Замечание: для удобства и единообразия записи введем новый признак x 0 =1 (для всех элементов выборки), тогда свободный коэффициент w 0 сможем внести внутрь общей суммы, нумерация j при этом будет начинаться с 0, а не с 1 ŷ=g(x ,w)=∑ j=0 m w j x j =w 0 x 0 +w 1 x 1 +...+w m x m ŷ(x)∈ A ,где A={a(x)=g(x ,w)∣w∈W }
  9. Функция потерь • Величина ошибки для одного объекта при выбранных

    параметрах w • Абсолютное значение ошибки или (равнозначная запись) • Квадратичная ошибка L(a, x , y)=|a(x)− y(x)| L(w)=L(w , x , y)=|g(x ,w)− y(x)|=|ŷ− y| L(w)=(g(w , x)− y(x))2 =( ŷ− y)2
  10. Регрессия vs вертикальные смещения простая (одномерная) линейная регрессия: ŷ=w 0

    +w 1 x
  11. Функция стоимости (эмпирический риск) • Усредненная сумма квадратичных ошибок (sum

    of squared errors, SSE) — ошибка, усредненная по всей выборке: J (w)= 1 n ∑ i=1 n ( y(i)−ŷ(i))2 = 1 n ∑ i=1 n ( y(i)−g(x(i) ,w))2 • Коэффициент усреднения 1/n — для удобства (иногда используют 1/2) • Задача поиска оптимальных коэффициентов w сводится к задаче минимизации функции стоимости J(w) • Решается методом наименьших квадратов (МНК) аналитически или итеративно
  12. Градиентный спуск • Итеративное решение задачи минимизации методом наименьших квадратов

    (МНК) • На каждой итерации (эпохе обучения) вычисляем ошибки, обновляем весовые коэффициенты (не забываем, что w, Δw, x, y, ŷ — векторы): • Градиентный спуск — сумма накопленных ошибок по всем образцам: • Стохастический градиентный спуск — обновляем веса по каждому тренировочному образцу: • η — коэффициент обучения (подбирается вручную экспериментально) • Обучение завершаем после того, как достигнут минимум (ошибка перестает уменьшаться) или прошло фиксированное число шагов Δ w=η( y(i)−ŷ(i))x(i) w:=w+Δ w Δ w=η ∑ i=1 n ( y(i)− ŷ(i))x(i)
  13. TODO (самостоятельно) • Разобрать подробнее, почему и что такое градиент,

    геометрический смысл алгоритма • Почему ошибка должна уменьшаться на каждой итерации (и будет ли)? (сходимость алгоритма) • Взять небольшую выборку, подогнать модель методом градиентного спуска вручную • Реализовать алгоритм программно, проверить на разобранной выборке
  14. Обобщающая способность модели • Найдем ли мы «закон природы» или

    произойдет переобучение? • Будет ли a(x) приближать y на всем X? • Будет ли значение J(w) мало на новых данных?
  15. Matplotlib: Scatter • matplotlib.org/api/_as_gen/matplotlib.pyplot.sca tter.html • Точечный график, то же,

    что и seaborn.relplot
  16. Sklearn: LinearRegression • scikit-learn.org/stable/modules/generated/ sklearn.linear_model.LinearRegression.html • Строит прямую y=w 0

    +w 1 x (простая линейная регрессия): .coef_ — множитель w 1 для x .intercept_ — сдвиг w 0 по y (пересечение с осью y при x=0) • .fit(X, y) — обучить модель • .predict(X_fit) — получить из обученной модели предсказанные значения y для каждого из значений X_fit
  17. Sklearn: LinearRegression import numpy as np X = np.array([[1, 2,

    3, 4, 5]]).T y = np.array([1, 3, 5, 7, 9]) from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print(u'наклон: ' + str(slr.coef_[0])) print(u'пересечение: ' + str(slr.intercept_)) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X, slr.predict(X), color='red') plt.xlabel(u'Объясняющая переменная') plt.ylabel(u'Целевая переменная')
  18. наклон: 2.0 пересечение: -1.0

  19. Sklearn: LinearRegression import numpy as np X = np.array([[1, 2,

    3, 4, 5]]).T y = np.array([1, 3, 5, 7, 7]) from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print(u'наклон: ' + str(slr.coef_[0])) print(u'пересечение: ' + str(slr.intercept_)) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X, slr.predict(X), color='red') plt.xlabel(u'Объясняющая переменная') plt.ylabel(u'Целевая переменная')
  20. наклон: 1.5999999999999999 пересечение: -0.20000000000000018

  21. Boston Housing, 1978 • Жилищный фонд в пригородах Бостона, 1978

    • 506 образцов • Здесь больше нет archive.ics.uci.edu/ml/datasets/Housing • Осталось здесь archive.ics.uci.edu/ml/machine-learning-databases/housing/ • Или поиск по датасетам на Каггле: www.kaggle.com/altavish/boston-housing-dataset
  22. Boston Hosing, 1978 • CRIM: уровень преступности на душу населения

    по городам • ZN: доля жилых земельных участков, предназначенных для лотов свыше 25000 кв. футов • INDUS: доля акров нерозничного бизнеса в расчете на город • CHAS: фиктивная переменная реки Чарльз (~1, если участок ограничивает реку, иначе 0) • NOX: концентрация окислов азота (частей на 10 млн.) • RM: среднее число комнат в жилом помещении • AGE: доля занимаемых владельцами единиц, построенных до 1940 г.
  23. Boston Hosing, 1978 • DIS: взвешенное расстояние до пяти Бостонских

    центров занятости • RAD: индекс доступности к радиальным шоссе • TAX: полная ставка налога на имущество на 10 тыс долларов • PTRATIO: соотношение ученик-учитель по городу • B: вычисляется как 1000 (Bk - 0.63)^2, где Bk — доля людей афроамериканского происхождения по городу • LSTAT: процент населения с более низким статусом • MEDV: Медианная стоимость занимаемых владельцами домов (в тыс долларов)
  24. boston-housing.py # coding=utf-8 import pandas as pd df = pd.read_csv("housing.data",

    header=None, sep='\s+') df.columns = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] print(df.head())
  25. Sklearn: LinearRegression X = df[['RM']].values y = df[['MEDV']].values from sklearn.linear_model

    import LinearRegression slr = LinearRegression() slr.fit(X, y) print(u'наклон: ' + str(slr.coef_[0])) print(u'пересечение: ' + str(slr.intercept_)) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X, slr.predict(X), color='red') plt.xlabel(u'Среднее число комнат [RM]') plt.ylabel(u'Цена в тыс. долл. [MEDV]')
  26. наклон: [9.10210898] пересечение: [-34.67062078]

  27. Стандартизация переменных • Иногда может быть полезно для сходимости некоторых

    алгоритмов • Например, поместить медиану выборки в 0, а квадратичную дисперсию масштабировать к 1 (поместить в область нормального распределения) • Sklearn.preprocessing.StandardScaler • TODO
  28. Подгонка модели: удаление выбросов, алгоритм RANSAC • RANSAC (Random sample

    consensus) — алгоритм подгонки регрессионной модели на не-выбросах • Не-выбросы (inliers) - «хорошие» точки данных • Выбросы — удаляем, игнорируем • Хорошие точки оставляем, строим модель на них • Остается определить, какие точки считать хорошими, а какие — плохими
  29. Итеративно • Выбрать случайное число не-выбросов, • подогнать модель (построить

    линию на выбранных точках), • проверить остальные точки на подогнанной модели: добавить точки в пределах допуска для не-выбросов (точки вблизи построенной линии), • повторно подогнать, оценить ошибку относительно не- выбросов, • завершить, если качество соответствует порогу или прошли все итерации
  30. Sklearn: RANSACRegressor • scikit-learn.org/stable/modules/generated/ sklearn.linear_model.RANSACRegressor.html • residual_threshold — порог не-выбросов

    • Подбирается вручную для конкретного набора, зависит от задачи
  31. Sklearn: RANSACRegressor X = df[['RM']].values y = df[['MEDV']].values from sklearn.linear_model

    import LinearRegression from sklearn.linear_model import RANSACRegressor ransac = RANSACRegressor(LinearRegression(), max_trials=100, min_samples=50, loss = 'absolute_loss', residual_threshold=5.0, #1.0,#5.0,#20.0, random_state=0) ransac.fit(X, y) import numpy as np # булева маска для не выбросов (todo: print) inlier_mask = ransac.inlier_mask_ # маска для выборосов outlier_mask = np.logical_not(inlier_mask)
  32. Sklearn: RANSACRegressor # отрезок для построения регрессии # newaxis -

    вложить массив в массив X_fit = np.linspace(3, 10)[:, np.newaxis] plt.scatter(X[inlier_mask], y[inlier_mask], c='blue', marker='o', s=100, label=u'Не-выбросы') plt.scatter(X[outlier_mask], y[outlier_mask], c='lightgreen', marker='s', s=100, label=u'Выбросы') plt.plot(X_fit, ransac.predict(X_fit), color='red') plt.xlabel(u'Среднее число комнат [RM]') plt.ylabel(u'Цена в тыс. долл. [MEDV]') plt.legend(loc='upper left')
  33. residual_threshold=1.0

  34. residual_threshold=5.0

  35. residual_threshold=20.0

  36. Без удаления выбросов

  37. Оценка качества модели • Разбить на обучающую и тестовую выборки

    sklearn.model_selection.train_test_split • График остатков • Средневзвешенная квадратичная ошибка (MSE) sklearn.metrics.mean_squared_error • Коэффициент детерминации R2 (приведенная MSE) — значения от 0 (плохо) до 1 (хорошо). sklearn.metrics.r2_score
  38. from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X =

    df.iloc[:, :-1].values y = df['MEDV'].values X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=0) slr = LinearRegression() slr.fit(X_train, y_train) y_train_pred = slr.predict(X_train) y_test_pred = slr.predict(X_test) Разбить модель: train_test_split
  39. Оценка качества: средневзвешенная квадратичная ошибка (MSE) MSE= 1 n SSE=

    1 n ∑ i=1 n ( y(i)− ŷ(i))2 • MSE (mean squared error) • SSE (sum of squared errors) — сумма квадратичных ошибок
  40. from sklearn.metrics import mean_squared_error print(u'MSE тренировка: ' + str( mean_squared_error(y_train,

    y_train_pred))) print(u'MSE тестирование: ' + str( mean_squared_error(y_test, y_test_pred))) MSE тренировка: 19.958219814238046 MSE тестирование: 27.195965766883354 Оценка качества: средневзвешенная квадратичная ошибка (MSE)
  41. Оценка качества: коэффициент детерминации R2 • SSE (sum of squared

    errors) — сумма квадратичных ошибок • SST (total sum of squares) — полная сумма квадратов отклонений от среднего • μ y — эмпирическое среднее признака: (y(1)+...+y(n))/n • значения от 0 (плохо) до 1 (хорошо) • При MSE=0 (SSE=0), R2=1 R2 =1− SSE SST =1− ∑ 1=1 n (y(i)− ŷ(i))2 ∑ 1=1 n (y(i)−μy )2
  42. from sklearn.metrics import r2_score print(u'R^2 тренировка: ' + str(r2_score(y_train, y_train_pred)))

    print(u'R^2 тестирование: ' + str(r2_score(y_test, y_test_pred))) R^2 тренировка: 0.7645451026942549 R^2 тестирование: 0.6733825506400177 Оценка качества: коэффициент детерминации R2
  43. График остатков • Чем ближе к горизонтальной линии 0, тем

    меньше ошибка (остаток) plt.scatter(y_train_pred, y_train_pred - y_train, c='blue', marker='o', s=100, label=u'Тренировочные данные') plt.scatter(y_test_pred, y_test_pred - y_test, c='lightgreen', marker='s', s=100, label=u'Тестовые данные') plt.xlabel(u'Предсказанные значения') plt.ylabel(u'Остатки') plt.legend(loc='upper left') plt.hlines(y=0, xmin=-10, xmax=50, lw=2, color='red') plt.xlim([-10, 50])
  44. None
  45. Полиномиальная модель регрессии y=w 0 +w 1 x+w 2 x2

    +...+w d xd
  46. Sklearn: LinearRegression + PolynomialFeatures • scikit-learn.org/stable/modules/generated/ sklearn.preprocessing.PolynomialFeatures.html • Не подбирает

    коэффициенты, а трансформирует объясняющие переменные, после чего можно тренировать линейную модель
  47. LinearRegression + PolynomialFeatures import numpy as np X = np.array([258.0,

    270.0, 294.0, 320.0, 342.0, 368.0, 396.0, 446.0, 480.0, 586.0]) [:, np.newaxis] y = np.array([236.4, 234.2, 252.8, 298.6, 314.2, 342.2, 360.8, 368.0, 391.2, 390.8])
  48. LinearRegression + PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.preprocessing import

    PolynomialFeatures lr = LinearRegression() pr = LinearRegression() quad = PolynomialFeatures(degree=2) # Простая линейная регрессия lr.fit(X, y) # Множественная регрессия на преобразованных признаках X_quad = quad.fit_transform(X) pr.fit(X_quad, y)
  49. LinearRegression + PolynomialFeatures # построим регрессию на отрезке X_fit =

    np.arange(250, 600, 10)[:, np.newaxis] # график plt.scatter(X, y, s=100, label=u'тренировочные точки') plt.plot(X_fit, lr.predict(X_fit), label=u'линейная подгонка', linestyle='--') plt.plot(X_fit, pr.predict(quad.fit_transform(X_fit)), label=u'квадратичная подгонка') plt.legend(loc = 'upper left')
  50. None
  51. boston-polynom.py X = df[['LSTAT']].values y = df[['MEDV']].values import numpy as

    np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score regr = LinearRegression() quad = PolynomialFeatures(degree=2) # quadratic cubic = PolynomialFeatures(degree=3) X_quad = quad.fit_transform(X) X_cubic = cubic.fit_transform(X) plt.legend(loc = 'upper right')
  52. boston-polynom.py # линейная подгонка X_fit = np.arange(X.min(), X.max(), 1)[:, np.newaxis]

    regr.fit(X, y) y_lin_fit = regr.predict(X_fit) linear_r2 = r2_score(y, regr.predict(X)) # квадратичная подгонка regr.fit(X_quad, y) y_quad_fit = regr.predict(quad.fit_transform(X_fit)) quad_r2 = r2_score(y, regr.predict(X_quad)) # кубическая подгонка regr.fit(X_cubic, y) y_cubic_fit = regr.predict(cubic.fit_transform(X_fit)) cubic_r2 = r2_score(y, regr.predict(X_cubic))
  53. boston-polynom.py # График plt.scatter(X, y, label=u'трениновочные точки', color='lightgray') plt.scatter(X_fit, y_lin_fit,

    label=u'линейная (d=1), R^2=' + str(linear_r2), color='blue', lw=2, linestyle=':') plt.scatter(X_fit, y_quad_fit, label=u'квадратичная (d=2), R^2=' + str(quad_r2), color='red', lw=2, linestyle='-') plt.scatter(X_fit, y_cubic_fit, label=u'кубическая (d=3), R^2=' + str(cubic_r2), color='green', lw=2, linestyle='--') plt.xlabel(u'% населения с более низким статусом [LSTAT]') plt.ylabel(u'Цена в тыс. долл. [MEDV]') plt.legend(loc = 'upper right')
  54. None
  55. Самостоятельно • Изучить больше алгоритмов построения модели регрессии — например,

    случайные деревья
  56. Кое-какие степенные регрессии

  57. None
  58. None
  59. None
  60. Задание: рынок недвижимости, данные от Сбербанка • kaggle: Sberbank Russian

    Housing Market www.kaggle.com/c/sberbank-russian-housing- market/data • (на прошлом этапе) Выявить признаки, которые наилучшим образом коррелируют • Построить для них предсказательные модели • Оценить качество предсказания