ПУТЕШЕСТВИЕ В НАУКЕ ДАННЫХ

5 важных методов предварительной обработки, которые следует учитывать перед применением алгоритмов машинного обучения

Данные скоро станут самым ценным активом в мире.

Обзор

Благодаря новым технологическим усовершенствованиям количество публикуемых данных значительно увеличилось. У нас есть много данных от здравоохранения до экономики, от окружающей среды до космоса. И все они ждут, чтобы их поняли. Осмысление этих данных может стать решением многих вопросов, на которые все еще ждут ответа сегодня. Однако увеличение объема данных привело к сложности. Традиционные подходы, такие как статистика, не подходят для решения этой сложной и зашумленной информации. Сегодня методы машинного обучения часто используются во всех областях для преодоления этих трудностей. У нас есть куча надежных алгоритмов практически для каждого типа реальных жизненных задач. Тем не менее, помимо мощности алгоритма, данные, которые должны быть переданы в этот алгоритм, также должны быть подходящими. Хотя шагам машинного обучения часто не придается необходимого значения, предварительная обработка является основным шагом, который способствует решению проблемы и играет важную роль в повышении эффективности. Поэтому, прежде чем использовать алгоритмы машинного обучения, мы должны точно проанализировать данные и применить необходимые шаги предварительной обработки.

Каждый тип данных, собранных из повседневной жизни, уникален. Соответственно, может потребоваться множество различных методов предварительной обработки для адаптации алгоритма и увеличения успеха. Тем не менее, существуют такие методы предварительной обработки, что их необходимо использовать практически для всех типов данных. В этом посте мы хотим поделиться пятью наиболее важными из них, которые вы можете использовать для своих собственных данных. Если хотите, давайте взглянем на эти методы, не теряя больше времени. Мы будем кодировать с помощью Python 3 и анализировать данные о ценах на именованные бриллианты kaggle. Для доступа к данным перейдите по ссылке ниже: https://www.kaggle.com/datasets/nancyalaswad90/diamonds-prices

1. Обработка пропущенных значений

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

import pandas as pd
data = pd.read_csv("DiamondsPrices.csv")
data.head()

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

data.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   carat    53939 non-null  float64
 1   cut      53940 non-null  object 
 2   color    53940 non-null  object 
 3   clarity  53940 non-null  object 
 4   depth    53940 non-null  float64
 5   table    53940 non-null  float64
 6   price    53940 non-null  int64  
 7   x        53939 non-null  float64
 8   y        53940 non-null  float64
 9   z        53939 non-null  float64
dtypes: float64(6), int64(1), object(3)
memory usage: 4.1+ MB
"""

data.loc[(data["carat"].isnull())|(data["x"].isnull())|(data["z"].isnull())]

Как вы можете видеть, некоторые функции (карат, x и z) имеют значение менее 53940.

Мы собираемся использовать библиотеку из «sklearn» (sci-kit-1.1.3) для вменения пропущенных значений. Метод в библиотеке вычисляет среднее значение каждого столбца и помещает среднее значение в отсутствующие точки. Конечно, мы также можем использовать другие стратегии для заполнения таких значений, как медиана, константа и т. д.

https://gist.github.com/drmehmetbilen/a1c169809f80cb3d024e555401645986

2. Кодирование

Часть кодирования состоит из нескольких шагов. Одним из них являются вербальные данные. Как видно из данных, огранка, цвет и четкость включают текст. Мы можем присвоить каждому отдельному тексту номер, но, поскольку эти числа не представляют числовой размер, они могут ввести в заблуждение наш алгоритм. Фиктивное кодирование — отличный способ пройти через это. Мы собираемся создать новый столбец для каждого другого текста функции. И мы собираемся поместить 1 в этот столбец, если образцы имеют эту функцию, а если нет, просто поставить 0. У Pandas есть простой метод с именем get_dummies для выполнения этого.

cToDummy = ["cut","color","clarity"]
data = pd.get_dummies(data, columns  = cToDummy)
data.head()
print(data.columns)

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

3. Нормализация

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

Икс ′ знак равно ( Икс - Максимум ) / ( Максимум - Мин )

Мы также можем воспользоваться помощью библиотеки «sklearn». Он имеет метод MinMaxScaler.

from sklearn.preprocessing import MinMaxScaler
cToNormalize = ["carat","depth","table","price","x","y","z"]
for i in cToNormalize:
  mms = MinMaxScaler()
  data[i] = mms.fit_transform(data[i].values.reshape(-1,1))

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

4. Выбор функции

Каждая функция в наборе данных может не служить цели должным образом, и поэтому эти функции будут избыточными. И успех, и время работы модели, которую мы разработаем, напрямую зависят от сложности, создаваемой ненужными значениями нашего набора данных. Мы должны избавиться от них, но как мы собираемся решить, какой из них необходим или нет? Эвристические подходы Хотя эвристические методы хорошо работают в этом отношении, статистические методы, такие как «Фишер, прирост информации, хи-квадрат», также широко используются благодаря их простой и быстрой структуре. Мы собираемся анализировать наши данные с помощью взаимного сбора информации. Как всегда, у «sklearn» есть хороший метод для этого.

from sklearn.feature_selection import mutual_info_regression
y = data.pop("price")
x = data
importances = mutual_info_regression(x,y)
iColumns = pd.Series(importances,data.columns)
iColumns.sort_values().plot(kind="barh")

x = data[["carat","y","z","x","clarity_SI1","color_E"]].values

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

5. Проверка

Представьте, что вы знаете все вопросы и ответы перед экзаменом. Было бы здорово, не так ли? Как насчет модели, которая знает их все до тестирования? Если мы дадим все образцы в процессе обучения, мы не можем полагаться на производительность модели. Он может достичь 100% успеха, но мы не будем уверены, обучен он или переоборудован. В литературе мы можем видеть некоторые подходы к выходу из этой ситуации. Разделение данных — один из широко используемых методов предотвращения переобучения. Подход следует следующим шагам;

  1. Произвольное разделение данных (% 80 для поезда, % 20 для теста)
  2. Обучите свою модель, используя только данные для обучения
  3. Проверьте производительность модели, используя только данные для тестирования

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

Для первого шага мы можем снова воспользоваться помощью sklearn. Метод train_test_split служит для разделения и смешивания данных с заданной скоростью обучения/тестирования.

from sklearn.model_selection import train_test_split
trainData,testData = train_test_split(data,test_size=0.20,shuffle=True)

Краткое содержание

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