Сделайте так, чтобы ваша машина лучше понимала данные
В этом цифровом мирекодирование»- это мощное слово, его применение и присутствие распространены во всех аспектах. В целом,кодированиеэто процесс преобразования данных из одной формы в другую требуемую форму. Один из лучших примеров кодирования относится к эпохе, предшествовавшей появлению Интернета, — использованию азбуки Морзе, которая представляла собой схему кодирования символов, которая кодирует текстовые символы в виде стандартизированных последовательностей двух разных длительностей сигнала, называемых точками и тире или точками и тире.
Мир данных также использует кодирование для шифрования, передачи данных и т. Д. Чтобы машина понимала тенденции и близость данных, необходимо, чтобы данные были числовыми. Почти весь алгоритм ML требует данных в числовой форме. В этой истории мы рассмотрим методы кодирования, которые необходимы компьютеру для интерпретации данных (точнее, категориальных данных) и извлечения из них уроков.
Оглавление
- Введение
- LabelEncoder
- OneHotEncoder
- DictVectorizer
- get_dummies
- MultiLabelBinarizer
Итак, начнем,
1. Введение
Даже прежде, чем мы начнем с понимания кодировки и типов кодирования, мы должны классифицировать данные как один из семи типов, чтобы сделать модели быстрее.
- Бесполезно: бесполезно для машинного обучения.
- Номинал: группы без заказа.
- Двоичный код: либо тот, либо этот [(0/1) или (да / нет)].
- Порядковый номер: группы с заказом.
- Количество: количество вхождений.
- Время: циклические числа с временной составляющей.
- Интервал: положительные или отрицательные числа с временной составляющей.
За исключением времени и интервала, все остальное дискретно. В большинстве случаев вы никогда не встретите все типы данных в наборе данных и вряд ли когда-нибудь столкнетесь с более чем 3-4 типами одновременно. Наиболее знакомый тип категориальных данных, с которыми вы столкнетесь, — это Номинальные и Порядковые данные.
Некоторые примеры номинальных данных:Столбцы с названиями городов Индии (например, Мумбаи, Дели, Банглор и др.). Такие данные не имеют внутреннего порядка
Некоторые примеры обычных данных:Размер одежды (например, большой, средний, маленький и т. Д.). Такие данные имеют внутренний порядок
Набор данных, над которым мы будем работать, будет Top Restaurant в Мумбаи, указанный в Zomato. Я очистил данные и готов к методам кодирования.
df.head()
2. Кодировщик этикеток
Кодировщик меток кодирует метки со значением от 0 до n_classes-1, где n — нет. отличных ярлыков.
Давайте закодируем номинальную переменную «Book_Table», используя LabelEncoder.
# import LabelEncoder
from sklearn.preprocessing import LabelEncoder# Instatniate LabelEncoder
le = LabelEncoder()# LabelEncode Book_Tablecolumn of df
df["Book_Table"] = le.fit_transform(df["Book_Table"])# Inspecting encoded df
df.head()
Как видите, столбец Book_Table был закодирован в числовые значения 0/1. Выход изle.fit_transform (DF [ «Book_Table»])является Dataframe / Series в зависимости от нет. столбцов в кодировке.
В основном двоичные столбцы (Book_Table от df) кодируются с использованием Label Encoder. Для Multiclass это даст разные (от 0 до n_classes-1) значения для разных классов, например. 0,1,2,3, …, п-1. которые на самом деле являются категоричными по своему характеру и не имеют какого-либо внутреннего порядка. Если LabelEncoder используется для мультиклассовых столбцов, модель будет неправильно интерпретировать закодированные данные в некотором порядке (0 <1 <2).
Вам может прийти в голову, что это может быть идеальный метод кодирования дляпорядковый категориальныйданные как есть заказ. Но его нельзя использовать и для порядковых данных, потому что LabelEncoder не будет знать, чтобольшойбольше чемсреднийкоторый больше чемМаленькийто есть он не знает внутреннего порядка, которому нужно следовать, и может давать случайные метки.
Как правило, Label Encoder используется вместе с OneHotEncoder, который решает эту проблему. Поэтому наша следующая остановка — One Hot Encoder.
3. Один горячий кодер
Одно горячее кодирование — это процесс, с помощью которого категориальные переменные преобразуются в форму, которая может быть предоставлена алгоритмам ML для лучшей работы в прогнозировании. ПринимаеттолькоЧисловые данныев качестве ввода. Так чтокатегориальные данныечто должно быть закодировано, преобразуется вЧисловой типиспользуяLabelEncoder.
Он принимает столбец с категориальными данными, который был закодирован, а затем разбивает столбец на несколько столбцов. Числа заменяются на 1 и 0 в зависимости от того, какое значение имеет какой столбец.
Дается документация sklearn для одного горячего кодированияВот, Для OneHotEncoding я добавлю порядковый столбец, имеющий 3 класса: «Большой», «Средний», «Маленький».
# import LabelEncoder
from sklearn.preprocessing import LabelEncoder# Instatniate LabelEncoder
le = LabelEncoder()# LabelEncode Class column of df
df["Class_le"] = le.fit_transform(df["Class"])# Inspecting encoded df
df.head()
Class_le — это кодированный столбец. Логически малое значение должно быть закодировано в 0 (наименьшее число), но оно должно быть закодировано в обратном порядке. Вот почему LabelEncoder не используется для порядковых столбцов. Далее, давайте применим OneHotEncoder.
# import OneHotEncoderfrom sklearn.preprocessing import OneHotEncoder# Instatniate One-Hot-Encoderohe = OneHotEncoder(categories = "auto",sparse = False)# One-Hot-Encode Class column of dftemp = ohe.fit_transform(df[["Class"]])
Как вы можете видеть, на выходе выводится ошибка, в отличие от LabelEncoder. Есть три столбца, но логично подумать, если вы знаете один, если один класс присутствует (1), то автоматически два других класса отсутствуют (0) Следовательно, эти два столбца будут сильно коррелированными, что нежелательно. Это называется«Переменная-ловушка».Чтобы решить эту проблему, вы можете использовать параметр drop в OneHotEncoder.
import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder# Instatniate One-Hot-Encoder
ohe = OneHotEncoder(categories = "auto",sparse = False, drop = "first")# One-Hot-Encode Class column of df
temp = ohe.fit_transform(df[["Class"]])
Теперь есть только два столбца и исключена переменная ловушка.
# Converting into dataframe
ohe_column = pd.DataFrame(temp, columns = ["Class_1","Class_2"])#containating ohe column
df = pd.concat([df,ohe_column],axis = 1)
df.head()
Class_1, Class_2 — это столбцы OneHotEncode. Я даже закодировал двоичный столбец Book_Table в «Booking_ohe». Book_Table — это двоичный столбец, поэтому присутствует только один столбец (Booking_ohe).
Этот результат, который мы получили, должен быть LabelEncoded, а затем OneHotEncoded. Но мы можем сделать это за один шаг, используя Dictvectorizer. Итак, следующая остановка — DictVectorizer.
4. DictVectorizer
LabelEncoder и OneHotEncoder должны использоваться вместе как двухэтапный процесс. DictVectorizer делает это за один шаг. Но сначала, как следует из названия, необходимо преобразовать кодируемые столбцы в словарь. Мы можем сделать это, используя «.to_dict ()».
df_dict = df[["Book_Table","Class"]].to_dict(orient = "records")df_dict[:2]
# import DictVectorizer
from sklearn.feature_extraction import DictVectorizer
# Instantiate DictVectorizer
dv = DictVectorizer(sparse = False)
df_array = dv.fit_transform(df_dict)
# Convert into DataFrame
df_encoded = pd.DataFrame(df_array, columns = ["Book_Table_1","Book_Table_2","Class_1","Class_2","Class_3"])
df_encoded.head()
# Adding df_encoded to df
df_1 = pd.concat([df,df_encoded], axis = 1)
df_1.head()
И это закодировано. Вы можете удалить первый столбец каждого класса столбцов, чтобы избежать ловушки переменных (Book_Table_1, Class_1). Это было коротко и просто. У него есть один недостаток, заключающийся в том, что он не работает с категориальными столбцами, имеющими значения типа int, такими как столбец с количеством дверей в автомобиле (2,4). Чтобы применить DictVectorizer, мы можем преобразовать их в (два, четыре), используя функцию map ().
5. get_dummies
Это единственный в этом посте, который находится в модуле панд, а не в модуле scikit-learn. Пандыget_dummiesМетод принимает категориальную особенность в качестве аргумента. Тогда это создаетФиктивная переменнаядля каждой метки в функции, так что каждая фиктивная переменная содержит данные как1
или0.
1
указывает на наличие определенного ярлыка и0
указывает на отсутствие определенного ярлыка. Метод Pandas get_dummies — это очень простая одношаговая процедура, чтобы получить фиктивные переменные для категориальных функций.
df = pd.get_dummies(df, columns = ["Book_Table","Class"] , prefix_sep = "_",drop_first = True)df.head()
prefix_sep ( «_»)используется для записи имени столбца[«Column_Name» + «_» + «Class_Name»]а такжеdrop_first = Trueиспользуется, чтобы избежать ловушки переменных, как объяснено выше, которая также называется мультиколлинеарностью, и поэтому мы видим только 1 столбец Book_Table и 2 столбца столбца Class.
6. MultiLabelBinarizer
MultiLabel Binarizer похож наМетка Бинаризатор. Единственное, MultiLabel Binarizerиспользуется, когда любой столбец имеет несколько меток. Мы применим это наТипколонка. Входные данные для этого преобразователя должны быть массивом целых чисел или строк, обозначающих значения, принимаемые категориальными (дискретными) признаками.
# Creating list of multi-labels
types_list = df.Type.apply(lambda x: list(x.split(", ")))# Converting it into dataframe and working on it seperately
types_df =pd.DataFrame({"Type":types_list})
types_df.head()
# importing MultiLabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer# instantiating MultiLabelBinarizer
mlb = MultiLabelBinarizer()
types_encoded = pd.DataFrame(mlb.fit_transform(types_df["Type"]),columns=mlb.classes_)
types_encoded.head()
columns_ = mlb.classesустановит метки в качестве имен столбцов.
# Concating df and types_encoded
df_1 = pd.concat([df,types_encoded], axis = 1)df_1.head()
df.columns
И все сделано так, как мы ожидали и хотели.
Вывод
Прочитав этот пост, вы,
- Знайте, что такое кодировка и почему это так важно.
- Различные типы кодирования и когда использовать когда.
- Как кодировать мульти-метки.
Один из методов кодирования, который не совсем кодирует, — это использование панд.Надеть (),Это может использоваться в основном для порядкового столбца или столбца, имеющего небольшое количество классов (двоичный). Вы можете попробовать.
Для получения дополнительной записи, как это, вы подключите меня насредний, Продолжайте учиться и продолжайте расти.
Это все на сегодня. Благодарность