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

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

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

Необходимость предварительной обработки данных

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

Импорт шагов

Существует 4 основных важных этапа предварительной обработки данных.

  • Разделение набора данных на обучающие и проверочные наборы
  • Забота о недостающих ценностях
  • Забота о категориальных характеристиках
  • Нормализация набора данных
  1. Обучение тестовому сплиту

Train Test Split — один из важных шагов в машинном обучении. Это очень важно, потому что ваша модель должна быть оценена до того, как она будет развернута. и эта оценка должна быть сделана на невидимых данных, потому что, когда он развернут, все входящие данные невидимы.

Основная идея разделения тестов поезда состоит в том, чтобы преобразовать исходный набор данных в 2 части.

  • тренироваться
  • контрольная работа

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

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

Здесь мы передали X и y в качестве аргументов в train_test_split, который разделяет X и y. таким образом, чтобы 20 % данных тестирования и 80 % данных обучения были успешно разделены между X_train, X_test, y_train и y_тест.

2. Работа с отсутствующими значениями

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

Давайте посмотрим пропущенные значения в наборе данных

df.isna().sum()

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

Для этого мы можем использовать SimpleImputer из sklearn.impute.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(fill_value=np.nan, startegy='mean')
X = imputer.fit_transform(df)

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

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

X = pd.DataFrame(X, columns=df.columns)

print(X)

И теперь мы видим, что мы заполнили все пропущенные значения средним значением всех значений.

Мы можем подтвердить это по

X.isna().sum()

и выход

мы можем использовать среднее значение, медиану, моду и т. д. в SimpleImputer

Если количество строк с отсутствующими значениями меньше или наши данные таковы, что не рекомендуется заполнять отсутствующие значения, мы можем удалить отсутствующие строки с помощью dropna в pandas.

dropnaDF = df.dropna()

И здесь мы удалили все строки в фрейме данных и сохранили их в другом фрейме данных.

Теперь у нас есть 0 пустых строк, так как мы их отбросили. мы можем подтвердить это как

dropedDF.isna().sum()

3. Работа с категориальными функциями

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

  1. Кодировка этикетки
  2. Одно горячее кодирование

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

и использование кодировщика меток в столбце страны преобразует Индию в 1 , США в 2 и Китай в 0. Этот метод имеет недостаток, заключающийся в том, что он дает США наивысший приоритет из-за того, что его метка является высокой, а Китай имеет самый низкий приоритет для своей метки. 0, но тем не менее, это помогает много раз

давайте закодируем это

from sklearn.preprocessing import LabelEncoder

l1 = LabelEncoder()

l1.fit(catDf['Country'])

catDf.Country = l1.transform(catDf.Country)

print(catDf)

Здесь мы создали экземпляр объекта LabelEncoder, затем использовали метод fit, чтобы разместить его в нашем столбце категорий, а затем использовали метод transform, чтобы применить его.

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

catDf['Country'] = l1.transform(catDf['Country'])

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

Давайте посмотрим на тот же пример, но немного измененный. Мы добавим еще один категориальный столбец «Континент» с названием континента соответствующей страны. Мы можем сделать это по

catDf['Continent'] = ['Asia', 'North America', 'Asia']

Теперь, поскольку у нас есть 2 категориальных столбца, а именно [[‘Country’, ‘Continent’]], мы можем закодировать их одним горячим способом.

Есть 2 способа сделать это.

1. DataFrame.get_dummies

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

Давай сделаем это.

pd.get_dummies(data=catDf)

Это вернет фрейм данных со всеми категориальными значениями, закодированными в формате прямого вектора.

Здесь мы видим, что он преобразовал уникальные значения столбцов Country в 3 разных столбца: Country_China, Country_India и Country_USA. Точно так же 2 уникальных значения столбца «Континент» были преобразованы в 2 разных столбца с именами «Континент_Азия» и «Континент_Северная Америка».

Поскольку его нет на месте, мы должны либо сохранить его во фрейме данных, т. е.

catDf = pd.get_dummies(data=catDf)

2. OneHotEncoder

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

from sklearn.preprocessing import OneHotEncoder

oh = OneHotEncoder()

s1 = pd.DataFrame(oh.fit_transform(catDf.iloc[:, [0,3]]))

pd.concat([catDf, s1], axis=1)

Здесь мы инициализировали объект OneHotEncoder и использовали его метод fit_transform для нужных столбцов (столбец номер 0 и столбец номер 3) во фрейме данных.

Тип возвращаемого значения fit_transformnumpy.ndarray, поэтому мы преобразуем его в фрейм данных с помощью pd.DataFrame и сохраняем в переменной. Затем, чтобы соединить его с нашим исходным фреймом данных, мы можем использовать pd.concat функцию, которая объединяет 2 разных фрейма данных. Мы использовали axis=1, что означает, что он должен объединяться на основе столбцов, а не строк.

Кроме того, помните, что pd.concat не находится на месте, поэтому нам нужно где-то сохранить возвращаемый фрейм данных.

catDf = pd.concat([catDf, s1], axis=1)

Результирующий кадр данных

Вы можете видеть, что он не очень хорошо читается по сравнению с pd.get_dummies, но если вы сравните последние 5 столбцов, которые мы получили с помощью pd.get_dummies и OneHotEncoder , то все они равны.

Конечно, вы можете изменить имена столбцов по своему выбору в OneHotEncoder,

4. Нормализация набора данных

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

Целью нормализации является приведение значений к общей шкале без искажения разницы между диапазоном значений.

Есть несколько способов сделать это. Я расскажу о двух распространенных способах нормализации набора данных.

Стандартный масштабатор:

Используя эту технику, у нас будет среднее значение 0 и стандартное отклонение 1 в нашем наборе данных. Мы можем сделать это как обычно, комбинируя разные функции в numpy, т.е.

z = (x.values - np.mean(x.values)) / np.std(x.values)

где x — кадр данных со всеми числовыми индексами. Если мы хотим сохранить значения в фрейме данных, мы можем просто удалить .values перед ним.

Дисперсия перед StandardScaler

catDf.var(ddof=0)

Здесь я использовал ddof=0, который по умолчанию равен 1 в pandas.DataFrame.var() и по умолчанию 0 в numpy.ndarray.var( ). Ddof ​​означает дельту степеней свободы, которая является делителем, используемым в вычислениях: N — ddof, где N представляет количество элементов.

ddof=0 обеспечивает оценку максимального правдоподобия дисперсии для нормально распределенных переменных.

Дисперсия после StandardScaler

Еще один хороший способ сделать это — использовать StandardScaler из sklearn.preprocessing. Давайте посмотрим код, а затем посмотрим на дисперсию.

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()

catDf.iloc[:,1:-1] = ss.fit_transform(catDf.iloc[:,1:-1])

print(catDf)

Здесь мы применили StandardScaler ко всем числовым столбцам (от столбца с номером 1 до последнего столбца (не включены)), и теперь вы можете увидеть значения GDP и Площадь.

Теперь мы можем проверить дисперсию набора данных с помощью

catDf.var(ddof=0)

И мы можем видеть значительное уменьшение дисперсии 80 и 13 до 1. В реальных наборах данных обычно улучшение составляет от тысяч до 1.

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

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

Процесс его использования очень прост и похож на StandaradScaler.

from sklearn.preprocessing import Normalizer

norm = Normalizer()

catDf.iloc[:,1:-1] = norm.fit_transform(catDf.iloc[:,1:-1])

catDf

Результаты обучения

  • Разделение набора данных
  • Заполнение пропущенных значений
  • Работа с категориальными данными
  • Нормализация набора данных для улучшения результатов

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