Избавиться от мультиколлинеарности pandas

Захват высокой мультиколлинеарности в моделях statsmodels

Скажем, я подхожу к модели в statsmodels

Когда я делаю mod.summary() , я могу видеть следующее:

Иногда предупреждение отличается (например, на основе собственных значений матрицы проектирования). Как я могу зафиксировать условия высокой мультиколлинеарности в переменной? Хранится ли это предупреждение где-то в модельном объекте?

Кроме того, где я могу найти описание полей в summary() ?

2 ответа

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

Если в данных нет коллинеарности, можно ожидать, что ни одно из собственных значений не близко к нулю:

Однако если сказать x[4] — 2 * x[0] — 3 * x[2] = 0 , то

Одно из собственных значений (здесь самое первое) близко к нулю. Соответствующий собственный вектор:

Игнорирование почти нулевых коэффициентов, приведенное выше, в основном говорит, что x[0] , x[2] и x[4] являются коллинеарными (как и ожидалось). Если стандартизировать xs значения и умножить на этот собственный вектор, результат будет колебаться вокруг нуля с небольшой дисперсией:

Обратите внимание, что ys.var() — это собственное значение, которое было близко к нулю.

Итак, чтобы уловить высокую мультилинейность, взглянем на собственные значения матрицы корреляции.

Исходя из аналогичного вопроса для R, существуют некоторые другие варианты, которые могут помочь людям. Я искал одно число, которое улавливало коллинеарность, и варианты включали определитель и номер условия матрицы корреляции.

Согласно одному из ответов R, определитель матрицы корреляции будет «колебаться от 0 (идеальная коллинеарность) до 1 (без коллинеарности)». Я нашел ограниченный диапазон полезным.

Переведенный пример для определителя:

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

Источник

Пошаговое построение логистической регрессии в Python

Jul 12, 2020 · 9 min read

Логистическая регрессия — это алгоритм классификации машинного обучения, используемый для прогнозирования вероятности категориальной зависимой переменной. В логистической регрессии зависимая переменная является бинарной переменной, содержащей данные, закодированные как 1 (да, успех и т.п.) или 0 (нет, провал и т.п.). Другими словами, модель логистической регрессии предсказывает P(Y=1) как функцию X.

Условия логистической регрессии

  • Бинарная логистическая регрессия требует, чтобы зависимая переменная также была бинарной.
  • Для бинарной регрессии фактор уровня 1 зависимой переменной должен представлять желаемый вывод.
  • Использоваться должны только значимые переменные.
  • Независимые переменные должны быть независимы друг от друга. Это значит, что модель должна иметь малую мультиколлинеарность или не иметь её вовсе.
  • Независимые переменные связаны линейно с логарифмическими коэффициентами.
  • Логистическая регрессия требует больших размеров выборки.

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

Данные

Набор данных взят с репозитория машинного обучения UCI и относится к прямым маркетинговым кампаниям (телефонный обзвон) португальского банковского учреждения. Цель классификации в прогнозировании успеха подписки клиента (1/0) на срочный депозит (переменная y). Загрузить этот набор данных можно здесь.

Эт и данные предоставляют информацию о клиентах банка, которая включает 41,188 записей и 21 поле.

  1. age — возраст (число);
  2. job — вид должности (категории: “admin” (администратор), “blue-collar” (рабочий), “entrepreneur” (мелкий предприниматель), “housemaid” (горничная), “management” (руководитель), “retired” (на пенсии), “self-employed” (самозанятый), “services” (сфера услуг), “student” (учащийся), “technician” (техник), “unemployed” (не трудоустроен), “unknown” (неизвестно));
  3. marital — семейное положение (категории: “divorced” (разведён), “married” (замужем/женат), “single” (холост/не замужем), “unknown” (неизвестно));
  4. education — образование (категории: “basic.4y”, “basic.6y”, “basic.9y” (базовое), “high.school” (высшая школа), “illiterate” (без образования), “professional.course” (профессиональные курсы), “university.degree” (университетская степень), “unknown” (неизвестно));
  5. default — имеет ли просроченные кредиты (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  6. housing — имеет ли жилищный кредит (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  7. loan — имеет ли личный кредит (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  8. contact — вид связи (категории: “cellular” (мобильный), “telephone” (стационарный));
  9. month — месяц последнего обращения (категории: “jan” (январь), “feb” (февраль), “mar” (март), …, “nov” (ноябрь), “dec” (декабрь));
  10. day_of_week — день недели последнего обращения (категории: “mon” (понедельник), “tue” (вторник), “wed” (среда), “thu” (четверг), “fri” (пятница));
  11. duration — продолжительность последнего обращения в секундах (число). Важно: этот атрибут оказывает сильное влияние на вывод (например, если продолжительность=0, тогда y=’no’). Продолжительность не известна до момента совершения звонка, а по его завершению y будет, очевидно, известна. Следовательно этот вводный параметр должен включаться только в целях эталонного тестирования, для получения же реалистичной модели прогноза его следует исключать.
  12. campaign — число обращений, установленных в процессе этой кампании и для этого клиента (представлено числом и включает последнее обращение);
  13. pdays — число дней, прошедших с момента последнего обращения к клиенту во время предыдущей кампании (число; 999 означает, что ранее обращений не было);
  14. previous — число обращений, совершённых до этой кампании (число);
  15. poutcome — итоги предыдущей маркетинговой кампании (категории: “failure” (провал), “nonexistent” (несуществующий), “success” (успех));
  16. emp.var.rate — коэффициент изменения занятости (число);
  17. cons.price.idx — индекс потребительских цен (число);
  18. cons.conf.idx — индекс потребительского доверия (число);
  19. euribor3m — 3-х месячная европейская межбанковская ставка (число);
  20. nr.employed — количество сотрудников (число).

Прогнозируемая переменная (желаемая цель):

y —подписался ли клиент на срочный вклад (двоично: “1” означает “Да”, “0” означает “Нет”).

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

Источник

How to run a multicollinearity test on a pandas dataframe?

I am comparatively new to Python, Stats and using DS libraries, my requirement is to run a multicollinearity test on a dataset having n number of columns and ensure the columns/variables having VIF > 5 are dropped altogether.

I found a code which is,

But, I do not clearly understand, should I pass the dataset altogether in the X argument’s position? If yes, it is not working.

3 Answers 3

I also had issues running something similar. I fixed it by changing how variables was defined and finding another way of deleting its elements.

The following script should work with Anaconda 5.0.1 and Python 3.6 (the latest version as of this writing).

If you have many features it will take very long to run. So I made another change to have it work in parallel in case you have multiple CPUs available.

I tweaked with the code and managed to achieve the desired result by the following code, with a little bit of Exception Handling —

Firstly, thanks to @DanSan for including the idea of Parallelization in Multicollinearity computation. Now I have an at least 50% improvement in the computation time for a multi-dimensional dataset of shape (22500, 71). But I have faced one interesting challenge on a dataset I was working on. The dataset actually contains some categorical columns, which I have Binary encoded using Category-encoders, as a result of which some columns have got just 1 unique value. And for such columns, the value of VIF is non-finite or NaN !

The following snapshot shows the VIF values for some of the 71 binary-encoded columns in my dataset:

In these situations, the number of columns that will remain after using the codes by @Aakash Basu and @DanSan might sometimes become dependent on the order of the columns in the dataset, as per my bitter experience, since columns are dropped linearly based on the max VIF value. And columns with just one value is a bit stupid for any Machine Learning model, as it will forcibly impose a biasness into the system !

In order to handle this issue, you can use the following updated code:

Читайте также:  Что нужно делать чтобы избавиться от долгов

Источник

Как бороться с мультиколлинеарностью?

Как известно, уменьшение размерности применяется в машинном обучении в двух целях: для визуализации (чтобы данные с большим количеством признаков можно было отобразить в двух- или трёхмерном пространстве) и для уменьшения количества переменных.

Второе применение является более фундаментальным, базовым и основным. Здесь уместно вспомнить курс школьной математики, а точнее, систему уравнений, в которой переменных было больше, чем самих уравнений. И решить его в школьные годы мы, разумеется, не могли.

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

Продолжая говорить о базовых вещах, нельзя не вспомнить о понятии мультиколлинеарности . Когда в матрице признаков какие-то признаки являются линейной комбинацией друг друга — это называется сильной коллинеарностью (грубо говоря, можно выразить один признак через другой), а когда речь идёт о сильной корреляции — это слабая или частичная коллинеарность, что тоже плохо. Такая задача решается очень неустойчиво.

Как бороться с мультиколлинеарностью?

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

L1 — lasso regression:

L2 — ridge regression:

Штрафуя модель, мы ограничиваем то количество решений, которое в случае с мультиколлинеарностью слишком велико или бесконечно, некоторым набором решений. Да, в результате мы получаем несколько смещённую оценку, но она смещена не сильно. Таким образом от глобальной проблемы (задачу решить в принципе нельзя) мы переходим к конкретному результату, когда задача решена не самым оптимальным способом, но, тем не менее, устойчивое решение мы нашли.

Вообще, можно показывать очень интересные вещи с матричными фокусами, однако об этом пойдёт разговор в лекции про сингулярное разложение SVD . Если не хотите её пропустить, записывайтесь на курс «Data Scientist» в OTUS!

Есть вопрос? Напишите в комментариях!

Источник

Python, корреляция и регрессия: часть 3

Предыдущий пост см. здесь.

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

Матрицы

Матрица, — это двумерный массив чисел. Размерность матрицы выражается числом строк и столбцов.

Например, A — это матрица с четырьмя строками и двумя столбцами:

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

Массив numpy можно сконструировать из набора данных при помощи функции pandas df.values :

В результате выполнения этого примера получим следующий одномерный массив:

Можно также воспользоваться функцией из библиотеки numpy np.array , которая принимает последовательность скалярных величин либо последовательность последовательностей и, в случае если это возможно, конвертирует их в одномерный массив (в формате numpy.ndarray ):

В результате получим следующий одномерный массив:

Матрицы часто могут вырастать до больших размеров, поэтому, чтобы не переполнять информацией окно интерпретатора, можно ограничить число выводимых элементов, воспользовавшись функциями pandas head и tail либо функционалом индексации библиотеки numpy ( result_array[:5] ); в обоих случаях будет выведено заданное число элементов.

Библиотека pandas взаимодействует с функциями библиотеки numpy напрямую, получая выгоду от векторизованных операций, таких как log, exp, sqrt и др., на массивах/матрицах. С другой стороны, различные функции numpy могут без проблем использоваться с кадрами данных DataFrame (и рядами Series) библиотеки pandas при условии, что содержащиеся внутри данные являются числовыми. Например, np.exp(df), np.asarray(df), df.T.dot(df)).

Размерность

Элемент в i-ой строке и j-ом столбце обозначается как Aij. И поэтому в приведенном выше примере индексация будет такой:

Одним из фундаментальных атрибутов матрицы является ее размерность. Библиотеки pandas и numpy предоставляют функцию shape , которая в обоих случаях возвращает кортеж с размерностями массива: число строк, столбцов и других размерностей.

Векторы

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

Здесь y — это 4-мерный вектор; его i-й элемент обозначается как yi. Векторы в математической литературе индексируются, начиная с единицы, если не указано иное.

Так, обозначает первый элемент, не второй. В уравнениях векторы в основном закрепляются за переменными, обозначаемыми строчными буквами.

Программный интерфейс библиотеки numpy в отличие от библиотеки pandas (где Series и DataFrame могут служить соответственно для представления векторов и матриц) не делает различие между векторами и одностолбцовыми матрицами, и мы можем создать вектор, передав в функцию np.array единственную последовательность.

Сборка

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

На самом деле, нам потребуется это делать для члена смещения. Напомним, что β1 выражает константное значение, поэтому мы должны обеспечить, чтобы соответствующий x1 тоже был константой. Без смещения переменная y равнялось бы нулю, в случае когда значения x равны нулю.

Сложение и скалярное произведение

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

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

Имплементация на Python с использованием pandas:

Помимо скаляров и матриц, в pandas можно складывать совместимые матрицы, например, из матрицы можно вычитать скаляры либо совместимые матрицы. Умножение матриц на скаляр в результате дает матрицу, в которой каждый элемент умножен на скаляр.

Имплементация на Python с использованием pandas:

Матрично-векторное умножение

В функции dot с применением сложного алгоритма матричного умножения имплементирован стандартный способ умножения матриц. Например, результатом умножения матрицы размера 3 × 2 на матрицу размера 2 × 1 является матрица размера 3 × 1, при этом число столбцов слева должно совпадать с числом строк справа:

Для получения Ax надо помножить каждую строку A поэлементно с соответствующим элементом матрицы x и сложить результаты. Например, первая строка матрицы A содержит элементы 1 и 3. Они попарно умножаются на элементы в векторе x: 1 и 5. Затем, произведения чисел складываются и в результате получаем 16. Эта операция называется точечным произведением, или скалярным произведением, для чего, собственно, и предназначено матричное умножение.

Имплементация на Python с использованием pandas:

Матрично-матричное умножение

Выполнение матрично-матричного умножения матриц очень походит на матрично-векторное умножение. Из соответствующих элементов матриц A и B попарно, строка за строкой и столбец за столбцом, берется сумма произведений.

Как и ранее, мы можем умножать матрицы между собой, только когда число столбцов в первой матрице равно числу строк во второй. Если первая матрица A имеет размерность mA × nA, а вторая матрица B — размерность mB × nB, то для того чтобы их перемножить, nA и mB должны быть эквивалентными.

В приведенном выше наглядном примере:

К счастью, нам не нужно запоминать эту процедуру. В библиотеках pandas и numpy используются очень эффективные алгоритмы, которые выполняют матричную алгебру за нас.

Или то же самое в библиотеке numpy:

Транспонирование

Транспонировать матрицу означает перевернуть матрицу по главной диагонали, проходящей из верхнего левого угла в нижний правый угол. Транспонирование матрицы A обозначается как A T :

Столбцы и строки изменились таким образом, что:

Читайте также:  Как избавиться от клопов с помощью пара

Имплементация на Python с использованием pandas:

Подробнее об операциях с матрицами и векторами см. в моем репо на Gitgub для этой серии постов.

Нейтральная матрица

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

Единичная матрица — это нейтральная по умножению матрица (или нейтральный элемент для умножения). Как и при скалярном умножении на число 1, матричное умножение на нейтральную матрицу не имеет никакого эффекта.

Для получения нейтральной матрицы нам придется обратиться к функции библиотеке numpy np.identity , которая конструирует нейтральные матрицы. Учитывая, что они всегда квадратные, мы передаем всего один аргумент, который обозначает ширину и высоту одновременно.

Имплементация на Python с использованием pandas:

Обратная матрица

Если мы имеем квадратную матрицу A, то обратная для A матрица обозначается как A — 1 , и она будет иметь следующие свойства, где I — это нейтральная матрица:

Нейтральная матрица является обратной самой себе. Не все матрицы обратимы. Необратимые матрицы также называются сингулярными или вырожденными. Обратная матрица вычисляется посредством функции np.linalg.pinv из модуля линейной алгебры библиотеки numpy.

Имплементация на Python с использованием pandas:

Нормальное уравнение

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

Мы читаем «для отыскания β надо умножить инверсию произведения транспонированной X и X, на произведение транспонированной X и y», где X — это матрица независимых переменных (включая член пересечения) и y — вектор, содержащий зависимые переменные нашей выборки. Результат β содержит вычисленные коэффициенты. Нормальное уравнение относительно легко выводится из уравнения множественной регрессии, применяя правила матричного умножения, однако соответствующие математические выкладки лежат за пределами объема данного поста.

Указанное нормальное уравнение можно имплементировать на Python, используя для этого только те функции, с которыми мы только что познакомились:

Нормальное уравнение выражает математику регрессии методом обычных наименьших квадратов в очень сжатой форме. Его можно использовать следующим образом (помня о добавлении смещения):

В результате выполнения этого примера получим следующую матрицу:

Это значения представляют коэффициенты β1 и β2, которые соответствуют параметрам пересечения и наклона. К счастью, они согласуются со значениями, которые мы вычислили ранее.

Дополнительные признаки

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

В машинном усвоении закономерностей (Да-да, именно так. См. мои посты « Никто никого не обучает » и « Что такое machine learning? ») в качестве синонима для независимой переменной широко используется понятие «признак», англ. feature. Другими синонимами являются «предсказатель», «предиктор», «регрессор», «объяснительная переменная», либо просто «входная переменная».

Для начала в качестве наших двух признаков отберем рост и возраст:

В результате выполнения этого примера получим следующую ниже матрицу из трех столбцов:

Наша функция нормального уравнения примет эту новую матрицу без какого-либо дальнейшего изменения:

В результате получим нижеследующие коэффициенты:

Эти три числа соответствуют соответственно пересечению, наклону (угловому коэффициенту) для роста (0.013954) и наклону для возраста (0.002799). В целях установления факта улучшения нашей модели за счет этих новых данных можно рассчитать значение R 2 нашей новой модели и сравнить его с представленным ранее.

Множественный R-квадрат

При расчете R 2 в ранее рассмотренном случае мы увидели, каким образом он выражает объем дисперсии, объясненной моделью:

Учитывая, что дисперсия — это средневзвешенная квадратичная ошибка, мы можем умножить оба члена var(ε) и var(y) на размер выборки и прийти к приведенному ниже альтернативному уравнению для R 2 :

Это попросту сумма квадратичных остатков на сумме квадратичных отклонений от среднего. При помощи функций библиотеки pandas dot функция суммы квадратов имплементируется элементарно, что во многом упрощает имплементацию матричного R-квадрата в исходном коде:

Переменная rss обозначает остаточную сумму квадратов, от англ. residual sum of squares (RSS), переменная ess — объясненную сумму квадратов, от англ. explained sum of squares (ESS). Мы можем вычислить матричный R 2 для нашей новой модели следующим образом:

В результате выполнения этого примера получим значение 0.757. Значение R 2 увеличилось на небольшую величину за счет включения возраста. Учитывая, что мы использовали несколько независимых переменных, R 2 теперь называется коэффициентом множественной детерминации.

Скорректированный матричный R-квадрат

Мотивом для добавления в регрессию больше независимых переменных может быть то, что наше значение R 2 всегда растет. Добавление новых независимых переменных не сделает предсказание зависимой переменной сложнее — если новая объяснительная переменная не имеет объяснительной силы, то ее коэффициент просто будет равен 0, и R 2 останется таким же, каким он был без этой независимой переменной.

Вместе с тем, добавление новой переменной не говорит нам об улучшении или ухудшении модели. Если мы хотим узнать о том, помогает ли новая переменная на самом деле генерировать более качественную подгонку к данным, мы можем воспользоваться скорректированным , нередко записываемым как 2 . В отличие от R 2 , скорректированный 2 будет расти, только если новая независимая переменная увеличивает R 2 больше, чем ожидается вследствие случайности:

Скорректированный 2 зависит от двух дополнительных параметров, n и p, которые относятся соответственно к размеру выборки и числу модельных параметров:

Этот пример возвращает значение 0.756. Оно по-прежнему крупнее изначальной модели, поэтому возраст определенно несет некую объяснительную силу.

Линейная модель в numpy и scipy

Хотя имплементация нашей собственной версии нормального уравнения и 2 предоставляет ценную возможность познакомиться с матричной алгеброй, важно отметить, что библиотеки numpy и scipy предлагают соответственно функции np.linalg.lstsq и stats.linregress , которые делают все то, что мы рассмотрели и даже больше. В прилагаемых к данной серии постов примерах исходного кода имеется пример, в котором продемонстрирована работа этих функций.

К примеру, функция numpy np.linalg.lstsq ожидает вызова с аргументами x и y (в виде последовательностей либо матриц, в случае множественной регрессии). Указанная функция вернет коллекцию x , содержащую решение методом обычных наименьших квадратов, остатки residuals , эффективный ранг матрицы rank и сингулярные значения s . Мы воспользуемся этой функцией для написания простой обертки, которую будем использовать вместо собственной имплементации нормального уравнения. Наша имплементация функции линейной модели будет возвращать только коэффициенты модели и будет использоваться для расчета беты, в частности, в приведенном ниже F-тесте:

F-тест значимости модели

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

Поэтому наши нулевая и альтернативная гипотезы будут следующими:

Здесь j — это некий индекс в векторе параметров за исключением пересечения, т.е. свободного члена. Вычисляемая нами F-статистика представляет собой отношение объясненной дисперсии на необъясненной (остаточной) дисперсии. Она может быть выражена через отношение средневзвешенного квадрата регрессионной модели, от англ. mean squared model (MSM) на средневзвешенной квадратичной ошибке, от англ. mean square error (MSE):

Средневзвешенный квадрат регрессионной модели (MSM) равен объясненной сумме квадратов (ESS) деленной на модельную степень свободы, где модельная степень свободы — это число параметров в модели за исключением свободного члена. Средневзвешенная квадратичная ошибка (MSE) равна остаточной сумме квадратов (RSS) деленной на остаточную степень свободы, где остаточная степень свободы — это размер выборки минус число модельных параметров.

После расчета F-статистики мы отыскиваем ее в F-распределении, параметризованном теми же двумя степенями свободы:

В результате проверки будет получено число 1.11x10e-16. Это ничтожно малое число, и, как следствие, можно быть уверенными в том, что модель значима.

Читайте также:  Как избавиться от личинок мошки

Отметим, что при малых выборках F-тест количественно измеряет увеличивающуюся неопределенность, что линейная модель допустима. В условиях случайной выборки из пяти элементов, например, данные иногда едва показывают какую-либо линейную связь вообще, и F-тест трактует данные, как незначимые даже при 50%-ом интервале уверенности.

Категориальные и фиктивные переменные

Теперь мы могли бы попытаться включить в регрессионный анализ «Пол» в качестве признака, однако мы столкнемся с проблемой. Входные данные выражены не числом, а как «М» или «Ж». Это пример категориальной переменной: переменной, которая может принимать одно из конечного множества неупорядоченных и (обычно) нечисловых значений. Другими примерами категориальных переменных является вид спорта, в котором спортсмен специализируется, или отдельно взятое состязание, в котором он наиболее квалифицирован.

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

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

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

Когда такая категория, как вид спорта, принимает более двух значений, для каждого вида спорта можно внести независимую переменную. При этом создают переменную для плавания и еще одну для тяжелой атлетики и т.д. Значение для плавания будет равно 1 для пловцов и 0 — для остальных.

Поскольку половая принадлежность может оказаться для нашей регрессионной модели полезной объяснительной переменной, давайте преобразуем женский пол в 0 и мужской — в 1 и добавим производный столбец, который будет содержать фиктивную переменную.

Давайте рассчитаем значение 2 , чтобы засвидетельствовать наличие или отсутствие улучшения в этом скорректированном показателе:

В результате выполнения этого примера получим 0.809. С участием таких признаков, как рост, возраст и пол, мы успешно объяснили более 80% дисперсии в весе наших олимпийских пловцов.

Относительная мощность

На этом этапе, возможно, было бы целесообразным поинтересоваться, какой признак играет самую важную роль в объяснении наблюдавшегося веса: возраст, пол или рост? Мы могли бы воспользоваться нашим скорректированным R 2 и взглянуть, насколько его значение изменяется, но это потребовало бы от нас повторно рассчитывать регрессию для каждой переменной, которую мы хотим проверить.

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

Для того чтобы сравнить относительный вклад коэффициентов, можно вычислить стандартизированный коэффициент регрессии, или бета-коэффициент.

В целях вычисления бета-коэффициента мы умножаем каждый коэффициент на отношение стандартных отклонений для связанной независимой переменной к модельной независимой переменной. Это можно имплементировать при помощи следующего ниже исходного кода на Python:

В результате мы получим (округлено до трех десятичных знаков):

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

Коллинеарность

На данном этапе мы могли бы попытаться продолжить добавлять признаки в модель, стараясь увеличить объяснительную силу.

Например, в нашем распоряжении также имеется столбец «Дата рождения», и может возникнуть соблазн попытаться внести и его. Это дата, но мы легко могли бы конвертировать ее в число, подходящее для использования в регрессии. Это можно сделать, попросту взяв год из даты рождения, воспользовавшись для этого библиотечной функцией pandas pd.to_datetime :

Новый признак «Год рождения» имеет бета-коэффициент всего 0.038, меньше веса признака «Возраст», который мы вычислили ранее. Однако, вес признака «Возраст» теперь показывает значение 0.096. Его относительная важность увеличилась более чем на 65%, поскольку мы добавили признак «Год рождения». Тот факт, что добавление нового признака изменило важность существующего признака, указывает на то, что имеется проблема.

Включив дополнительный параметр «Год рождения», мы непреднамеренно нарушили правило регрессионного оценивания. Посмотрим почему:

Приведенный ниже точечный график возраста пловцов (с джиттером) построен в сопоставлении с их годом рождения. Как вы и ожидали, две переменные очень близко коррелируют:

Мультиколлинеарность

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

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

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

Мы уже видели один симптом высокой мультиколлинеарности: коэффициенты регрессии, которые значительно изменяются, когда независимые переменные добавляются либо удаляются из уравнения. Еще один симптом проявляется, когда во множественной регрессии имеется незначительный коэффициент для отдельно взятой независимой переменной, но значительный R 2 для простой регрессионной модели с использованием этой же независимой переменной.

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

Самый верный метод оценить степень мультиколлинеарности состоит в оценке регрессии каждой независимой переменной на всех других независимых переменных. Если любой R 2 из этих уравнений близок к 1.0, то имеется высокая мультиколлинеарность. На деле самый крупный из этих R 2 служит в качестве индикатора степени существующей мультиколлинеарности.

После выявления мультиколлинеарности имеется несколько способов решить эту проблему:

Увеличить размер выборки. Больше данных могут дать более точные оценки параметров с меньшими стандартными ошибками.

Совместить признаки в один признак. Если у вас несколько признаков, которые в сущности измеряют тот же атрибут, то следует найти способ их унификации в один признак.

Отбросить проблемную переменную (или переменные).

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

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

«Возраст» R 2 = 0.1049, тогда как «Год рождения» R 2 = 0.1050.

Как и ожидалось, между двумя переменными практически нет разницы, и каждая из них объясняет порядка 10% дисперсии в весе. Поскольку год рождения объясняет чуть больше дисперсии, мы его оставим и отбросим признак «Возраст».

Примеры исходного кода для этого поста находятся в моем репо на Github. Все исходные данные взяты в репозитории автора книги.

В следующем коротком посте, посте №4, будет рассмотрен процесс предсказания.

Источник

Оцените статью
Избавляемся от вредителей