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

Большие данные и машинное обучение (v2) - лекц...

Anton
January 11, 2025

Большие данные и машинное обучение (v2) - лекция-7: построение предсказательной модели регрессии

Лекция курса "Большие данные и машинное обучение" (v2.0-МОТ)
Лекция-7: построение предсказательной модели регрессии

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

- Простая (одномерная) регрессионная модель
- Регрессионные модели
- Признаковое описание объекта
- Предсказательная модель
- Параметрическое семейство функций
- Функция потерь
- Градиентный спуск
- Обобщающая способность модели
- Точечный график: Matplotlib:Scatter, Seaborn:Relplot
- Построение модели линейной регрессии: Sklearn: LinearRegression
- Пример: построение моделей регрессии в датасете ILO (МОТ - Международная организация труда) ilostat.ilo.org
- Объединение множества специализированных таблиц в одну таблицу объектов с целевыми признаками
- Построение точечного графика для пары выбранных признаков
- Модель одномерной линейной регрессии для пары признаков
- Смысл предсказания
- Стандартизация переменных
- Подгонка модели: удаление выбросов, алгоритм RANSAC
- Sklearn: RANSACRegressor
- Оценка качества модели
- Оценка качества: средневзвешенная квадратичная ошибка (MSE)
- Оценка качества: коэффициент детерминации R^2
- График остатков
- Полиномиальная модель регрессии
- Sklearn: LinearRegression + PolynomialFeatures
- Многомерная линейная регрессия: модель регресси для нескольких параметров
- Пример: две объясняющие колонки и одна целевая - модель, график (3Д)

лекция с данными ILO: 20.05.2021

Anton

January 11, 2025
Tweet

More Decks by Anton

Other Decks in Education

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 j +w 2 x j 2 +...+w d x j d
  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. Функция стоимости (эмпирический риск) • Усредненная сумма квадратичных ошибок (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) • Решается методом наименьших квадратов (МНК) аналитически или итеративно
  11. Градиентный спуск • Итеративное решение задачи минимизации методом наименьших квадратов

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

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

    произойдет переобучение? • Будет ли a(x) приближать y на всем X? • Будет ли значение J(w) мало на новых данных?
  14. Sklearn: LinearRegression • scikit-learn.org/stable/modules/generated/ sklearn.linear_model.LinearRegression.html • Строит гиперплоскость y=w 0

    +w 1 x 1 +...+w m x m (линейная регрессия): .coef_ — массив коэффициентов w j для x j .intercept_ — смещение w 0 по y (пересечение с осью y при x=(0, …,0)) • .fit(X, y) — обучить модель • .predict(X_fit) — получить из обученной модели предсказанные значения y для каждого из значений X_fit
  15. Sklearn: LinearRegression • Для простой линейной регрессии y=w 0 +w

    1 x 1 .coef_[0] — коэффициент w 1 для x 1 .intercept_ — смещение w 0 по y (пересечение с осью y при x 1 =0) • .fit(X, y) — обучить модель • .predict(X_fit) — получить из обученной модели предсказанные значения y для каждого из значений X_fit
  16. import numpy as np #X = np.array ([[1, 2, 3,

    4, 5]] ).T X = np.array( [[1], [2], [3], [4], [5]] ) y = np.array( [1, 3, 5, 7, 9] ) from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print( 'w0 (смещение): %f' % slr.intercept_ ) print( 'w1 (наклон): %f' % slr.coef_[0] ) import numpy as np # отрезок для построения регрессии # newaxis - превратить строку в столбец, X_fit будет 2д-массив X_fit = np.linspace(X.min(), X.max())[:, np.newaxis] #print( X_fit ) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X_fit, slr.predict(X_fit), color='red') plt.xlabel('Объясняющая переменная') plt.ylabel('Целевая переменная')
  17. import numpy as np #X = np.array ([[1, 2, 3,

    4, 5]] ).T X = np.array( [[1], [2], [3], [4], [5]] ) y = np.array( [1, 3, 5, 7, 7] ) from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print( 'w0 (смещение): %f' % slr.intercept_ ) print( 'w1 (наклон): %f' % slr.coef_[0] ) import numpy as np # отрезок для построения регрессии # newaxis - превратить строку в столбец, X_fit будет 2д-массив X_fit = np.linspace(X.min(), X.max())[:, np.newaxis] #print( X_fit ) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X_fit, slr.predict(X_fit), color='red') plt.xlabel('Объясняющая переменная') plt.ylabel('Целевая переменная')
  18. Статистика МОТ ilostat.ilo.org • Данные по разным тематикам распределены по

    множеству таблиц • Данные в таблицах разбиты по странам (ref_area) и годам (time), а также по другим разрезам (sex, classif1, classif2 и т. п.) • Обычно в одной таблице одно целевое численное значение obs_value
  19. Статистика МОТ ilostat.ilo.org • Скачаем разные таблицы • Объектом будет

    страна в выбранный год • В каждой из таблиц - отфильтруем или перегруппируем данные так, чтобы комбинация значений ref_area+time встречалось один раз на всю таблицу - переменуем колонку obs_value на val_имя_признака • Объединим таблицы по ref_area+time в одну большую таблицу
  20. reg-model-ilo.py import pandas import numpy as np data_cpi = pandas.read_csv('CPI_NCYR_COI_RT_A.csv')

    data_cpi = data_cpi[ data_cpi.classif1 == 'COI_COICOP_CP01T12' ] [['ref_area', 'time', 'obs_value']] data_cpi = data_cpi.rename(columns={ 'obs_value': 'val_cpi_change' }) data_cpi = data_cpi.set_index(['ref_area', 'time'])
  21. # Collective bargaining coverage rate (%) | Annual data_bargaining =

    pandas.read_csv('data-ilo/ILR_CBCT_NOC_RT_A.csv') data_bargaining = data_bargaining[['ref_area', 'time', 'obs_value']] data_bargaining = data_bargaining.rename(columns={ 'obs_value': 'val_bargaining' }) data_bargaining = data_bargaining.set_index(['ref_area', 'time']) # Trade union density rate (%) | Annual data_union_density = pandas.read_csv('data-ilo/ILR_TUMT_NOC_RT_A.csv') data_union_density = data_union_density[ ['ref_area', 'time', 'obs_value'] ] data_union_density = data_union_density.rename(columns={ 'obs_value': 'val_union_density' }) data_union_density = data_union_density.set_index(['ref_area', 'time'])
  22. ...

  23. data = data_wage.join([ data_cpi, data_population, data_hours_worked, data_weekly_hours_worked, data_bargaining, data_union_density, data_inflow_workers,

    data_outflow_workers, data_social_protection, data_unemployment, data_children, data_output_per_worker, data_fatal_injuries, data_days_not_worked_strikes, data_days_not_worked_per_1000_strikes, data_strikes, data_workers_in_strikes ]) print( data )
  24. Возьмем колонки • Mean nominal hourly labour cost per employee

    by economic activity | Annual [PPP] - код: LAC_4HRL_ECO_CUR_NB_A_PPP - ilostat.ilo.org/topics/labour-costs/ • Fatal occupational injuries per 100000 workers by economic activity | Annual - код: INJ_FATL_ECO_RT_A - ilostat.ilo.org/topics/safety-and-health-at-work/
  25. • Mean nominal hourly labour cost per employee by economic

    activity | Annual [PPP] • LAC_4HRL_ECO_CUR_NB_A_PPP • Стоимость рабочей силы в пересчете на час • Labour cost is the cost incurred by the employer in the employment of labour in a specified reference period. It comprises remuneration for work performed, payments in respect of time paid for but not worked, bonuses and gratuities, the cost of food, drink and other payments in kind, cost of workers' housing borne by employers, employers' social security expenditures, cost to the employer for vocational training, welfare services and miscellaneous items, such as transport of workers, work clothes and recruitment, together with taxes regarded as labour cost. This is a harmonized series: (1) data reported as weekly, monthly and yearly are converted to hourly in the local currency series, using data on average weekly hours if available; and (2) data are converted to a common currency, using exchange rates for the series in U.S. dollars and using 2017 purchasing power parity (PPP) rates for the series in constant 2017 PPP $. The latter series allows for international comparisons by taking account the differences in relative prices between countries. Data are disaggregated by economic activity according to the latest version of the International Standard Industrial Classification of All Economic Activities (ISIC) available for that year. For more information, refer to the concepts and definitions page.
  26. • Fatal occupational injuries per 100000 workers by economic activity

    | Annual • INJ_FATL_ECO_RT_A • Несчастные случаи на производстве со смертельным исходом • The incidence rate is the average number of new cases of fatal occupational injury during the calendar year per 100,000 workers in the reference group. Data are presented disaggregated by sex and economic activity, according to the latest version available of the International Standard Industrial Classification of all Economic Activities (ISIC). For more information, refer to the concepts and definitions page.
  27. Похоже на обратную зависимость • Чем выше стоимость рабочей силы,

    тем меньше несчастных случаев со смертельным исходом • Или наоборот: чем меньше несчастных случаев на производстве, тем выше стоимоть рабочей силы • (мы не говорим про причины и следствия, но можем говорить, что один показатель сопутствует другому) • Коэффициент корреляции по Пирсону: -0.566307
  28. # Mean nominal hourly labour cost per employee # by

    economic activity | Annual [PPP] col1 = 'val_LAC_4HRL_ECO_CUR_NB_A_PPP' # Fatal occupational injuries per 100000 workers # by economic activity | Annual col2 = 'val_INJ_FATL_ECO_RT_A' col1_lab = col1 + '\n' + ilo.ilo_data_codes[col1] col2_lab = col2 + '\n' + ilo.ilo_data_codes[col2] X = data[[col1]].to_numpy() y = data[col2].to_numpy() print( X ) print( y )
  29. [[9.200e-01] [1.050e+00] [7.640e+00] [8.220e+00] [2.012e+01] ... [1.178e+01] [1.408e+01] [8.040e+00] [9.710e+00]

    [9.600e+00]] [ 7.67 6.78 1.87 13.64 2. 5.3 4.5 4.7 3.8 5. 4.6 3.9 3.9 4.1 4.8 4.44 3.01 3.44 2. 4. 4. 3. 4.4 2.12 2.25 2.77 1.78 8.6 8.3 7.3 7.3 6. 5.2 6. 5.8 7.2 7.1 6.4 3.26 3.6 3.63 3.82 3. 2.27 2.82 2.7 2.12 2.24 ... 4.66 3.91 3.72 4.6 4.1 2. 4.7 4.7 5.4 4. 3.5 3.3 4.3 4. 5.1 2.6 2.6 3.8 5. 1.4 1.6 1.6 1.7 0.98 1. 5.7 7.5 5.58 4.3 3.6 ]
  30. from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print(

    'w0 (смещение): %f' % slr.intercept_ ) print( 'w1 (наклон): %f' % slr.coef_[0] ) import numpy as np # отрезок для построения регрессии # newaxis - превратить строку в столбец, X_fit будет 2д-массив X_fit = np.linspace(X.min(), X.max())[:, np.newaxis] print(X_fit) # Точечный график + регрессия plt.scatter(X, y, c='blue', marker='o', s=100) plt.plot(X_fit, slr.predict(X_fit), color='red') plt.title("[%d samples]" % len(data), fontsize = 18) plt.xlabel(col1_lab) plt.ylabel(col2_lab)
  31. Предсказание здесь • По значению по горизонтали угадываем значение по

    вертикали • У нас есть: значение стоимости рабочей силы в этом году в этой стране • Угадываем количество несчастных случаев на производстве на 100000 человек в этом же году в этой же стране • Чем качественнее модель, тем больше шансов получить близкое значение • При условии, что связь между переменными существует в природе
  32. Стандартизация переменных • Иногда может быть полезно для сходимости некоторых

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

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

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

    (residual — разностный, threshold - порог) • Подбирается вручную для конкретного набора, зависит от задачи
  36. Sklearn: RANSACRegressor 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=0.3, #1.0,#2.0,#3.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)
  37. # отрезок для построения регрессии # newaxis - превратить строку

    в столбец, X_fit будет 2д-массив #X_fit = np.linspace(X.min(), X.max())[:, np.newaxis] X_fit = np.linspace(X.min(), X.max())[:, np.newaxis] plt.scatter(X[inlier_mask], y[inlier_mask], c='blue', marker='o', s=100, label='Не-выбросы') plt.scatter(X[outlier_mask], y[outlier_mask], c='lightgreen', marker='s', s=100, label='Выбросы') plt.plot(X_fit, ransac.predict(X_fit), color='red') plt.title("[%d samples, residual threshold=%.2f]" % (len(X), 2.0), fontsize = 18) plt.xlabel(col1_lab) plt.ylabel(col2_lab) plt.legend(loc='upper left') Sklearn: RANSACRegressor
  38. Оценка качества модели • Разбить на обучающую и тестовую выборки

    sklearn.model_selection.train_test_split • График остатков • Средневзвешенная квадратичная ошибка (MSE) sklearn.metrics.mean_squared_error • Коэффициент детерминации R2 (приведенная MSE) — значения от 0 (плохо) до 1 (хорошо). sklearn.metrics.r2_score
  39. from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split 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
  40. Оценка качества: средневзвешенная квадратичная ошибка (MSE) MSE= 1 n SSE=

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

    y_train_pred) ) print( 'MSE тестирование: %f' % mean_squared_error(y_test, y_test_pred) ) MSE тренировка: 3.4773465097369503 MSE тестирование: 3.6395965706367286 Оценка качества: средневзвешенная квадратичная ошибка (MSE)
  42. Оценка качества: коэффициент детерминации 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
  43. from sklearn.metrics import r2_score print( 'R^2 тренировка: %f' % r2_score(y_train,

    y_train_pred) ) print( 'R^2 тестирование: %f' % r2_score(y_test, y_test_pred) ) R^2 тренировка: 0.33319535833404923 R^2 тестирование: 0.2761747330034261 Оценка качества: коэффициент детерминации R2
  44. График остатков • Чем ближе к горизонтальной линии 0, тем

    меньше ошибка (остаток) plt.scatter(y_train_pred, y_train_pred - y_train, c='blue', marker='o', s=100, label='Тренировочные данные') plt.scatter(y_test_pred, y_test_pred - y_test, c='lightgreen', marker='s', s=100, label='Тестовые данные') plt.title("[%d samples]"%len(X), fontsize = 18) plt.xlabel('Предсказанные значения') plt.ylabel('Остатки') plt.legend(loc='upper left') xmin = min(y_train_pred.min(), y_test_pred.min()) - 1 xmax = max(y_train_pred.max(), y_test_pred.max()) + 1 plt.hlines(y=0, xmin=xmin, xmax=xmax, lw=2, color='red') plt.xlim([xmin, xmax])
  45. Sklearn: LinearRegression + PolynomialFeatures • scikit-learn.org/stable/modules/generated/ sklearn.preprocessing.PolynomialFeatures.html • Не подбирает

    коэффициенты, а трансформирует объясняющие переменные, после чего можно тренировать линейную модель
  46. 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])
  47. LinearRegression + PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.preprocessing import

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

    np.arange(250, 600, 10)[:, np.newaxis] # график plt.scatter(X, y, s=100, label='тренировочные точки') plt.plot(X_fit, lr.predict(X_fit), label='линейная подгонка', linestyle='--') plt.plot(X_fit, pr.predict(quad.fit_transform(X_fit)), label='квадратичная подгонка') plt.legend(loc = 'upper left')
  49. reg-model-ilo.py import numpy as np from sklearn.linear_model import LinearRegression from

    sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score quad = PolynomialFeatures(degree=2) # quadratic X_quad = quad.fit_transform(X) cubic = PolynomialFeatures(degree=3) X_cubic = cubic.fit_transform(X)
  50. regr = LinearRegression() X_fit = np.arange(X.min(), X.max())[:, 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))
  51. # график plt.scatter(X, y, label='тренировочные точки', color='lightgray') plt.plot(X_fit, y_lin_fit, label='линейная

    (d=1), R^2=' + str(linear_r2), color='blue', lw=2, linestyle=':') plt.plot(X_fit, y_quad_fit, label='квадратичная (d=2), R^2=' + str(quad_r2), color='red', lw=2, linestyle='-') plt.plot(X_fit, y_cubic_fit, label='кубическая (d=3), R^2=' + str(cubic_r2), color='green', lw=2, linestyle='--') plt.title("[%d samples]"%len(X), fontsize = 18) plt.xlabel(col1_lab) plt.ylabel(col2_lab) plt.legend(loc = 'upper right')
  52. Несколько параметров • Две объясняющие колонки и одна целевая •

    y = w 0 + w 1 *x 1 + w 2 *x 2 • Регрессия будет плоскость в 3-д пространстве
  53. # объясняющие колонки # Mean nominal hourly labour cost per

    employee # by economic activity | Annual [PPP] col1 = 'val_LAC_4HRL_ECO_CUR_NB_A_PPP' # Collective bargaining coverage rate (%) | Annual col2 = 'val_ILR_CBCT_NOC_RT_A' # целевая колонка # Fatal occupational injuries per 100000 workers # by economic activity | Annual col3 = 'val_INJ_FATL_ECO_RT_A' col1_lab = col1 + '\n' + ilo.ilo_data_codes[col1] col2_lab = col2 + '\n' + ilo.ilo_data_codes[col2] col3_lab = col3 + '\n' + ilo.ilo_data_codes[col3] X = data[[col1, col2]].to_numpy() y = data[col3].to_numpy()
  54. from sklearn.linear_model import LinearRegression slr = LinearRegression() slr.fit(X, y) print(

    'w0 (смещение): %f' % slr.intercept_ ) print( 'w1 (наклон-1): %f' % slr.coef_[0] ) print( 'w2 (наклон-2): %f' % slr.coef_[1] ) print( 'R^2: %f' % slr.score(X, y) ) w0 (смещение): 5.269117 w1 (наклон-1): -0.155139 w2 (наклон-2): 0.026627 R^2: 0.395166
  55. • R^2: 0.300929 (одна объясняющая переменная) • R^2: 0.395166 (две

    объясняющие переменные) • corr-1: -0.548570 • corr-2: -0.023067 TODO: • Подобрать 2-ю колонку с лучшим показателем корреляции • Добавить еще колонок • Провести эксперимент — улучшит ли большее количество колонок качество подгонки
  56. Кстати • Т. к. степенная регрессия строится через степенное преобразование

    отдельных признаков и последующую линейную подгонку, можно строить смешанные формы регрессии, где отдельные признаки останутся линейными, а другие — будут степенными • Причем, для каждого отдельного признака можно выбирать произвольный порядок степени
  57. Лабораторная работа • Воспроизвести код лабы • Построить модель регрессии

    и оценить качество модели для 2-х переменных из датасета МОТ (ILO) с высокой степенью корреляции (см. лаба «разведочный анализ»)
  58. Задание: рынок недвижимости, данные от Сбербанка • kaggle: Sberbank Russian

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