"Машинное обучение"

Различные подходы к работе с категориальными ценностями

Функциональная инженерия, часть II

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

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

Что такое категориальные данные?

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

Зачем обращаться?

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

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

Типы кодирования

  1. Номинальное кодирование: когда данные не имеют внутреннего порядка
    1.1 Одно горячее кодирование
    1.2 Одно горячее кодирование с множеством функций
    1.3 Среднее кодирование
  2. Порядковое кодирование: когда данные имеют внутренний порядок
    2.1 Кодирование метки
    2.2 Целевое управляемое кодирование
  3. Кодировка счетчика

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

В одном горячем кодировании мы конвертируем все точки данных в 0 и 1 в соответствии с их категориями. Он используется в таких столбцах, как пол, пол, состояние и т. Д. В python мы используем pandas.get_dummies() для преобразования в горячую кодировку
Пример:

SEX         One Hot Representation     
Male            1  1
Female          0  0
Female          0  1
Male            1  0
COUNTRY     One Hot Representation
India          1 0 0 0
USA            0 1 0 0
UK             0 0 1 0
China          0 0 0 1
USA            0 1 0 0

Преимущества
1) Быстрее, чем другие методы кодирования.
2) Очень быстрая обработка данных.

Недостатки
1) Увеличивает размерность для большего количества категорий, что вызывает проблему "Проклятие размерности".

КОД

pd.get_dummies(df['Sex']).head() 
## It will return two columns(female,male)
pd.get_dummies(df['Sex'],drop_first=True).head()
##It will only return on column(male, which saves us from linear dependency

1.2- Одно горячее кодирование со многими категориальными функциями

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

### STEP:1- Find the top 20 most frequent features

top20=[x for x in df['Cabin'].value_counts().sort_values(ascending=False).head(20).index]
print(top20)
### STEP:2- Use Top 20 and apply on the data
import numpy as np
for label in top20:
    df[label]=np.where(df['Cabin']==label,1,0)
df = df.drop("Cabin",axis=1)

1.3- Среднее кодирование

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

### STEP:1- Counting Each Feature value respect to length of column
temp=df['Cabin'].value_counts()/len(df['Cabin'])
### STEP:2- Converting all the data into a dict
mean_encoding=temp.to_dict()
### STEP:3- Finding the most common 5 or 10 mean values
from collections import Counter
Counter(mean_encoding).most_common(5)
### STEP:4- Mapping the most common values with the dataframe
df['mean_encoding']=df['Cabin'].map(mean_encoding)
df[['Cabin','mean_encoding']].head()

2.1- Кодирование меток

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

        Weekday                 Encoding
0        Sunday                   7
1      Saturday                   6     
2        Friday                   5
3      Thursday                   4   
4     Wednesday                   3
5       Tuesday                   2
6        Monday                   1 
7        Sunday                   7
8      Saturday                   6   

Для этого мы сначала создаем словарь кодирования, а затем с помощью map () сопоставляем словарь с набором данных.

### STEP:1- Creating a dictionary of encoding
dict_map = {'male':1,"female":0}
### STEP:2- Mapping dictionary with the columns
df["Sex_num"] = df['Sex'].map(dict_map)
df.head()

2.2 Целевое ориентированное порядковое кодирование

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

### STEP:1- Counting Each Feature value respect to the target column
temp=df.groupby(['Cabin'])['Survived'].mean()
### STEP:2- Converting all the data into a dict
encoding=temp.to_dict()
### STEP:3- Finding the most common 5 or 10 mean values
from collections import Counter
Counter(encoding).most_common(10)
### STEP:4- Mapping the most common values with the dataframe
df['encoded_cabin']=df['Cabin'].map(encoding)
df[['Cabin','encoded_cabin']].head()

3) Кодировка подсчета

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

#### STEP:1- Find the count of features
count = df["Cabin"].value_counts().to_dict()
#### STEP:2- Replace Featues with the count
df["cabin_count"]=df["Cabin"].map(count)
df.head()

об авторе

Я Абхай Парашар, студент-информатик, интересующийся наукой о данных и искусственным интеллектом. Я пишу статьи, связанные с наукой о данных, машинным обучением и искусственным интеллектом. Если хотите, можете связаться со мной в Linkedin.





Ссылки
[1] https://www.youtube.com/user/krishnaik06