Непрерывные основные концепции проектирования функций и прикладные примеры в Python: выбросы, отсутствующие значения, кодировщики, масштабирование функций, извлечение функций

Если вы имеете отношение к темам машинного обучения или искусственного интеллекта, вы наверняка слышали о «разработке функций». Я хочу процитировать Томаса С. Редмана, прежде чем я начну писать.

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

Итак, основное правило в CS; что я слышал от моего любимого лектора, показывает себя: Мусор в мусоре!

Я подготовил для этой статьи блокнот Jupyter. Вы можете получить к нему доступ, перейдя по этой ссылке.

Что такое Feature Engineering?

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

Что означает функция в области данных?

Мы говорим о функциях столбцов на стороне разработки функций. Каждая строка - это наблюдение, а каждый столбец - это функция для каждого наблюдения. Например, в приведенном ниже примере столбец Имя представляет имя наблюдения. Используя этот столбец, мы можем создать полностью новую функцию. Я могу создать функцию для поиска заголовков в функции имени, например: Мистер, миссис и т. Д. Затем я могу разделить их на категории «мистер» или «миссис» и т. Д. Это поддомен Feature Engineering. Мы называем это «извлечением признаков».

Мы часто заменяем их друг на друга; столбцы, переменные, особенности.

Это основные темы Feature Engineering:

  • Выбросы
  • Недостающие значения
  • Кодирование
  • Масштабирование функций
  • Извлечение функций
  • Взаимодействие с функциями

Мы увидим некоторые из вышеперечисленных в этой статье.

Выбросы

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

На линейные модели больше влияют выбросы. Кроме того, выбросы могут меньше влиять на модели деревьев.

Мы можем измерить выбросы по следующим параметрам:

  • Сектор / Доменное ноу-хау
  • Подход стандартного отклонения
  • Подход Z-Score
  • Подход коробчатой ​​диаграммы (метод IQR)

И мы можем использовать их для решения проблемы выбросов:

  • Удаление наблюдений, содержащих выбросы, из набора данных. Я обычно не предпочитаю выбирать этот вариант. Это может создать перекос в наборе данных и может плохо повлиять на модели.
  • Переназначение с порогами. В этом варианте мы меняем выбросы с верхним и нижним пределами.

Прикладной пример для выбросов с использованием подхода коробчатой ​​диаграммы (метод IQR)

В этой статье мы увидим именно этот метод измерения выбросов. В этом примере я буду использовать набор данных Titanic.

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

  • Максимальное значение (верхнее) = 3 квартал + (1,5 * IQR)
  • Минимальное значение (нижнее) = Q1 - (1,5 * IQR)

Значение IQR - это межквартильный размах. Это означает значение 75 процентилей минус значение 25 процентилей набора данных. Кроме того, вы можете посетить Академию Хана для получения дополнительной информации о бокс-сюжете и IQR. Мне нравились их объяснения.

Мы можем легко применить эту технику визуализации коробчатой ​​диаграммы в Python с помощью пакета «seaborn».

Я собираюсь создать прикладной пример на Python. Во-первых, мы смотрим на набор данных.

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

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

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

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

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

Анализ выбросов с несколькими переменными: фактор локальных выбросов

Эта методика дает возможность анализировать эффекты свойств одновременно. Итак, функция может не иметь выбросов, если она одиночная. Но при взаимодействии с другими функциями он может создавать выбросы. По сути, он оценивает наблюдения на основе плотности, используя их местоположение. Затем мы можем получить выбросы, используя оценки. Мы используем neigbors.LocalOutlierFactor из sklearn для использования этой техники в Python. Вы можете найти пример этого в блокноте. Я не буду здесь долго объяснять.

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

  • Возраст 17 лет не является исключением, если он является единственным в переменной Age.
  • Число 3 беременных не является выбросом, если оно единственное в переменной "Число беременных".
  • Но; 3-разовая беременность в 17 лет - исключение. Это пример фактора локальных выбросов. Они не выделяются, когда одиноки, но когда вместе, они выделяются.

Недостающие значения

В этом разделе мы поговорим о термине "недостающее значение". Что это такое, это проблема? И как мы можем решить эту проблему.

Термин «пропущенное значение» означает, что некоторые наблюдения содержат пропущенные значения, например: nan, null и т. д. Это может быть проблемой для наших моделей машинного обучения. Также некоторые модели машинного обучения не могут работать с пропущенными значениями. Они могут создавать предвзятость и т. Д.

Мы можем решить эту проблему с помощью следующих методов:

  • Удаление
  • Вменение
  • Прогностические методы (KNN и др.)

Отсутствующие значения в пандах

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

Удаление

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

Мы используем метод dropna для удаления недостающих значений.

df.dropna()

Вменение

Если мы хотим вменять отсутствующие значения, мы можем использовать метод fillna. Этот метод заполняет все отсутствующие значения параметром.

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

Прогнозирующий метод (KNN)

Мы можем использовать методы прогнозирования для вменения пропущенных значений. В этом примере мы будем использовать KNN.

KNN не может различать мужские и женские термины. Он должен использовать 0 и 1. Для этого я собираюсь преобразовать все переменные в двоичные. Для этого мы можем использовать метод pd.get_dummies. Подробности мы увидим позже.

Теперь я масштабирую все переменные от 0 до 1.

И я готов к использованию KNN. Мы можем видеть вмененные значения в столбце age_inputed_knn.

Я не особо разбирался в том, что такое KNN. Собственно, это не тема данной статьи. Просто для простой информации: фрагмент кода scaler.inverse_transform(dff) возвращает нам исходные данные до преобразования.

Если вы хотите получить более подробную информацию о KNN, вы можете проверить следующее:

Кодирование

Кодирование изменяет стиль представления переменных. У нас есть 3 типа кодирования.

  • Кодировка метки
  • Одно горячее кодирование
  • Редкое кодирование

Кодировка метки

Мы преобразуем категориальные переменные в числовые значения с помощью кодирования меток. Если переменная, которую мы преобразуем, имеет всего 2 класса, например, пол, беременность, диабет и т. Д., Кодировка является двоичной.

Ниже мы видим пример двоичного кодирования. Переменная SEX преобразована в двоичную переменную: IS_FEMALE. Если наблюдение женское, то значение равно 1, иначе 0. Мы можем понять, что если значение 0 в переменной IS_FEMALE, это мужское наблюдение.

Тут важный момент. Мы должны пометить кодирующие порядковые переменные или двоичные переменные. Если переменная номинальная, кодировать метку не следует. Это самая горячая тема кодирования. Мы можем увидеть еще один пример кодирования метки для порядковой переменной ниже.

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

Одно горячее кодирование

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

Мы можем применить это, используя метод get_dummies в Pandas.

Но есть еще один важный момент. Нам нужно обратить внимание на фиктивные переменные.

Опасность переменной-пустышки

Фиктивная переменная - это опасная ситуация, возникающая в результате создания переменных друг из друга. Например, предположим, что у нас есть переменная «пол». Если мы быстро закодируем эту переменную, у нас появятся 2 новые переменные: мужская и женская. В этом случае эти переменные будут дополнять друг друга. Итак, если самец равен 0, то определенно самка должна быть 1 или наоборот. Это опасность фиктивной переменной. Как этого избежать?

Мы можем отфильтровать класс из переменной, которую мы будем горячо кодировать. Затем мы можем понять, что если все переменные класса, которые мы создали из переменной, равны 0, ее значение - это то, что мы уже отфильтровали. Мы можем увидеть пример ниже. Значение последнего наблюдения - 0. Итак, сегодня четверг. Мы можем передать drop_first аргумент в метод get_dummies, чтобы избежать фиктивных переменных.

Редкое кодирование

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

Мы бы не хотели создавать новые закодированные переменные для этих классов (D, E, G и т. Д.). Это основная цель редкого кодирования: не создавайте новые закодированные переменные для классов с низкой частотой. На этот случай я установил предел. Если частота ниже 20, соберите их под класс RARE. Затем сразу закодируйте эту переменную. Таким образом, мы не получим лишних переменных.

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

def rare_analyser(dataframe, target, cat_cols):
    for col in cat_cols:
        print(col, ":", len(dataframe[col].value_counts()))
        print(pd.DataFrame({"COUNT": dataframe[col].value_counts(),
                            "RATIO": dataframe[col].value_counts() / len(dataframe),
                            "TARGET_MEAN": dataframe.groupby(col)[target].mean()}), end="\n\n\n")
def rare_encoder(dataframe, cat_cols, rare_perc):
    temp_df = dataframe.copy()
    rare_columns = [col for col in cat_cols if (temp_df[col].value_counts() / len(temp_df) < 0.01).sum() > 1]
for col in rare_columns:
        tmp = temp_df[col].value_counts() / len(temp_df)
        rare_labels = tmp[tmp < rare_perc].index
        temp_df[col] = np.where(temp_df[col].isin(rare_labels), 'Rare', temp_df[col])
return temp_df

Масштабирование функций

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

Как правило, мы используем следующие методы масштабирования:

  • Стандартный скалер
  • Надежный скалер
  • Мин-Макс Скалер
  • Логарифмическая шкала

Стандартный скалер

Он известен как стандартный.

z = (x - u) / s

Мы можем сделать это с помощью StandardScaler из sklearn.preprocessing в Python.

Надежный скалер

Эта техника устойчива к выбросам. Минус медиана и разделить на IQR. Мы можем сделать это с помощью RobustScaler из sklearn.preprocessing в Python.

Мин-Макс Скалер

Этот метод преобразует переменную между минимальным и максимальным значениями, которые мы передали функции масштабирования. Мы можем сделать это с помощью MinMaxScaler из sklearn.preprocessing в Python.

Извлечение функций

Значение этого термина - извлечение новых переменных из необработанных данных.

Предположим, например, что у нас нет переменной пола, и нам нужно знать, что наши пассажиры - мужчины или женщины. Я создам новую переменную из переменной Name. Если в нем есть «Мистер», я помечу его как «Мужской». Если в нем есть «миссис» или «мисс», я помечу его как «женский». Можно сказать извлечение признаков для этого процесса.

Наконец-то

В настоящее время я вижу так много своих друзей, они работают с моделями машинного обучения, но не знают, что делают. Машина учится, а они - нет! Я не хочу использовать модели машинного обучения в качестве черных ящиков. Поэтому сначала я начал с изучения ключевых концепций машинного обучения. Мне понравилось, когда я писал. Надеюсь, вам тоже понравилось. Я старался изо всех сил. Пункты, которые мы объяснили, относятся к основным темам ML. Как упоминалось выше, если наши данные беспорядочные или плохие, наши модели машинного обучения введут нас в заблуждение. Мы должны помнить об этих концепциях перед тем, как приступить к созданию моделей машинного обучения.

С уважением.

Наборы данных: