Как сделать нормализацию python

Обновлено: 02.07.2024

Наиболее распространенными инструментами Data Scientist’а на сегодняшний день являются R и Python. У каждого инструмента есть свои плюсы и минусы, но неплохую позицию по всем параметрам занимает Python. Для Питона есть отлично документированная библиотека Scikit-Learn, в которой реализовано большое количество алгоритмов машинного обучения.

Здесь мы остановимся на алгоритмах Machine Learning. Первичный анализ данных лучше обычно проводится средствами пакета Pandas, разобраться с которым можно самостоятельно. Итак, сосредоточимся на реализации, для определенности полагая, что на входе у нас есть матрица обьект-признак, хранящаяюся в файле с расширением *.csv

Загрузка данных

В первую очередь данные необходимо загрузить в оперативную память, чтобы мы имели возможность работать с ними. Сама библиотека Scikit-Learn использует в своей реализации NumPy массивы, поэтому будем загружать *.csv файлы средствами NumPy. Загрузим один из датасетов из репозитория UCI Machine Learning Repository:

В этом руководстве будет обсуждаться метод нормализации матрицы в Python.

Нормализовать матрицу с помощью метода numpy.linalg.norm() в Python

Библиотека numpy.linalg содержит методы, относящиеся к линейной алгебре на Python. Метод norm() внутри numpy.linalg вычисляет норму матрицы. Затем мы можем использовать эти значения нормы для нормализации матрицы. Следующий пример кода показывает нам, как мы можем нормализовать матрицу с помощью метода norm() внутри библиотеки numpy.linalg .

Сначала мы создали нашу матрицу в виде 2D-массива с помощью метода np.array() . Затем мы вычислили норму и сохранили результаты в массиве norm с norm = np.linalg.norm (matrix) . В итоге мы нормализовали matrix , разделив ее на norms , и распечатали результаты.

Метод norm() выполняет операцию, эквивалентную np.sqrt(1**2 + 2**2) и np.sqrt(3**2 + 4**2) на первом и втором строки нашей матрицы соответственно. Затем он присваивает нашему массиву norm() два значения: [2.23606798 5.0] . Затем матрица нормализуется путем деления каждой строки matrix на каждый элемент norms .

Сопутствующая статья - NumPy Matrix


report this ad

В нашей статье мы будем использовать язык программирования python с сопутствующими ему библиотеки (sklearn, matplotlib, seaborn) и в качестве среды для работы jupyter notebook. Цель текущего поста - показать общие подходы к подготовке данных. То есть, те манипуляции, которые необходимо совершить перед загрузкой данных в модель машинного обучения. В идеальном мире у вас будет абсолютно чистый датасет без выбросов или пропущенных значений. Однако в реальном мире такие наборы данных встречаются крайне редко.
Далее будем рассматривать данные из Kaggle: "Mental Health in Tech Survey".

Первый взгляд на датасет и понимание его специфики

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

Это даст нам первое представление о том, что есть наши данные. Далее посмотрим на размеры наших табличных данных. Выполнив построчно код ниже

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

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

Разделение на обучающую выборку и целевую переменную

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

Обработка пропусков в данных

Зачастую не существует шаблонных подходов к этой задаче, поскольку подходы во многом зависит от контекста и характера данных. Например, являются ли данные случайными пропусками или же есть скрытая связь между пропусками и некоторым другим записями в обучающем примере?
Один из способов простых способов решения этой проблемы - просто игнорировать или удалять строки, в которых отсутствуют данные, выбрасывая их из нашего анализа. Однако этот метод может быть плох из-за потери информации.
Еще один способ — это заполнение пропусков, где мы заменяем отсутствующее значение каким-либо образом. Базовые реализации просто заменят все отсутствующие значения средним, медианным, либо же константой.
Для начала выясним, что делать с пропущенными значениями, найденными в self_employed и work_interfere. В обоих случаях столбец содержит категориальные данные.
Возьмем следующий пример, который представляет собой небольшой набор данных, содержащий три признака (погодное условие, температуру и влажность), чтобы предсказать, могу ли я играть в теннис или нет.

id weather temperature humidity play tennis?
1 cloudy 60 NaN yes
2 rainy 75 80% NaN
3 cloudy NaN 50% no
4 sunny 65 40% yes
Если бы мы удалили все строки с отсутствующими значениями, осталась бы только одна строка, и наш предиктор всегда бы предполагал, что я должен играть в теннис, так как других вариантов, по которым он будет учиться, про не будет. Предположим, мы вместо этого решили заменить нулевое значение температуры в строке 3 средним. В этом случае температура строки 3 искусственно сообщалась бы равной 65. И это уже позволит при каких-то входных параметрах получать от алгоритма отрицательный результат.

Scikit-learn предоставляет реализацию для обработки пропусков

Поиск неявных дубликатов

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

Обнаружение выбросов

Как уже упоминалось ранее, оказалось, что для Age существуют значения, которые кажутся ошибочными. Такие как отрицательный возраст или чрезвычайно большие целые числа, могут негативно повлиять на результат работы алгоритма машинного обучения, и нам нужно будет их устранить.
Для этого возьмем нашу эвристическую оценку, в каком возрасте могут работать люди: от 14 до 100 лет. И все величины, не попадающие в этот диапазон, преобразуем в формат Not-a-Number.

Эти нулевые значения затем могут быть обработаны с использованием описанного выше sklearn Imputer.
После определения диапазона для работающего человека, визуализируем распределение возраста, присутствующего в этом наборе данных.

Кодирование данных

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

Который возвращает следующие значения

Для кодирования этих данных, сопоставим каждое значение с числом.

Этот процесс известен как Label Encoding и sklearn может сделать это за нас.

Общим решением для кодирования номинальных данных является one-hot-encoding.

Вместо того, чтобы заменять категориальное значение на числовое значение (кодирование меток), как показано ниже

id type numerical
1 cat 1
2 dog 2
3 snake 3
4 cat 1
5 dog 2
6 turtle 4
7 dog 2

Вместо этого мы создаем столбец для каждого значения и используем 1 и 0 для обозначения выражения каждого значения. Эти новые столбцы часто называются фиктивными переменными.

id type is_cat is_dog is_snake is_turtle
1 cat 1 0 0 0
2 dog 0 1 0 0
3 snake 0 0 1 0
4 cat 1 0 0 0
5 dog 0 1 0 0
6 turle 0 0 0 1
7 dog 0 1 0 0

Вы можете выполнить one-hot-encoding непосредственно в Pandas или использовать sklearn, хотя sklearn немного более прозрачен, поскольку one-hot-encoding из него работает только для целых значений. В нашем примере (где входные данные представляют собой строки) нам нужно сначала выполнить кодировку меток, а затем one-hot-encoding.

Нормализация тренировочных данных

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

ML алгоритмы, которые требуют нормализации данных:

  • Логистическая регрессия
  • Метод опорных векторов
  • Нейронная сеть
  • PCA
  • Деревья принятия решений (и случайные леса)
  • Градиентный бустинг
  • Наивный Байес

Примечание: приведенные выше списки ни в коем случае не являются исчерпывающими, а просто служат примером.

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

  • Температура: от 270 K до 305 K
  • Влажность: от 0 до 1 (т. е. Влажность 30%, равная 0,3)
  • День года: от 0 до 365

Когда вы смотрите на эти значения, вы интуитивно нормализуете значения. Например, вы знаете, что увеличение на 0,5 (=50%) для влажности намного более значимо, чем увеличение на 0,5 для температуры. И если мы не будем нормализовать эти данные, наш алгоритм может научиться использовать температуру в качестве основного предиктора просто потому, что масштаб является наибольшим (и, следовательно, изменения в значениях температуры наиболее значительны для алгоритма). Нормализация данных позволяет всем признакам вносить одинаковый вклад (или, что более точно, позволяет добавлять признаки в зависимости от их важности, а не их масштаба).

Алгоритм нормализации

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

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



Существует несколько различных методов нормализации данных, самые популярные из них:

Нормализация Min-max устанавливает наименьшее наблюдаемое значение равным 0, а наибольшее наблюдаемое значение — 1.



Для выполнения нормализации мы можем использовать функции в sklearn.

Несколько замечаний по этой реализации:
На практике вы можете выбрать только определенные столбцы. Например, вам не нужно нормализовать фиктивные переменные из one-hot-encoding.

Разделение данных для обучения и тестирования

Разделение данных на две подвыборки

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

Разделение данных на три подвыборки


23.09.2020 | Егор Козин, г. Воронеж | 0

Нормализация текста – это приведение каждого слова текста к его словарной форме: в именительном падеже, единственном числе (если есть) или в инфинитив для глаголов.

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

Для начала нам нужно добавить несколько библиотек для работы:

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

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

Для извлечения нужных нам слов, мы должны объединить два сборника (стоп-слова и пунктуацию) в один, чтобы сравнить наши элементы с ним для получения слов (без предлогов, знаком препинания и др.)

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

В дальнейшем добавляем наш итог в dataframe №2 для просмотра результатов нашей работы.

А также в разрезе каждого элемента dataframe, основываясь на словах после проделанных ранее действий, мы можем подсчитать частоту каждого слова. Это даст нам возможность создания на их основе другими методами – меток.

Читайте также: