Искаженные данные - обычное дело в науке о данных; перекос - это степень искажения нормального распределения. Например, ниже приведен график цен на жилье из Kaggle's House Price Competition, который искажен вправо, что означает, что существует меньшинство очень больших значений.

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

Мы можем объективно определить, искажена ли переменная, используя тест Шапиро-Уилкса. Нулевая гипотеза для этого теста состоит в том, что данные являются выборкой из нормального распределения, поэтому значение p меньше 0,05 указывает на значительную асимметрию. Мы применим тест к переменной ответа «Цена продажи», помеченной выше как «resp», с помощью Scipy.stats в Python.

Неудивительно, что значение p меньше 0,05, поэтому мы можем сделать вывод, что переменная искажена. Более удобный способ оценки асимметрии - это метод pandas «.skew». Он вычисляет стандартизированный коэффициент момента Фишера – Пирсона для всех столбцов в кадре данных. Мы можем рассчитать его для всех функций в наборе данных Kaggle Home Value (помеченных как «df») одновременно с помощью следующего кода.

Некоторые переменные, такие как Pool Area, сильно смещены вправо из-за большого количества нулей, это нормально. Некоторые модели, такие как деревья решений, довольно устойчивы к искаженным функциям.

Мы можем устранить перекос переменных, преобразовав их (т. Е. Применив одну и ту же функцию к каждому значению). Общие преобразования включают квадратный корень (sqrt (x)), логарифмический (log (x)) и обратный (1 / x). Мы применим каждый из них в Python к переменной, имеющей наклон вправо. Цена продажи.

Преобразование квадратного корня

После преобразования данные определенно менее искажены, но все же остается длинный правый хвост.

Взаимное преобразование

Все же не очень хорошо, это распределение не совсем симметрично.

Преобразование журнала

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

Трансформация Бокс-Кокса

Альтернативой попыткам различных преобразований вручную является преобразование Бокса Кокса. Для каждой переменной преобразование Бокса-Кокса оценивает значение лямбда от -5 до 5, что максимизирует нормальность данных, используя приведенное ниже уравнение.

Для отрицательных значений лямбда преобразование выполняет вариант, обратный переменной. Если лямбда равна нулю, переменная преобразуется в логарифм, а для положительных значений лямбда переменная преобразуется в степень лямбда. Мы можем применить «boxcox» ко всем искаженным переменным в фрейме данных «df», используя Scipy.stats.

Асимметрия немного уменьшилась! Однако преобразование коробчатого Кокса не является панацеей от перекоса; некоторые переменные не могут быть преобразованы в нормально распределенные.

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

Оригинальный пост здесь.

Прочтите больше статей по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от новичка до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.