Привет, друзья! Добро пожаловать в руководство по подготовке данных с использованием Python. поэтому в этом посте мы изучим важную тему науки о данных, а именно предварительную обработку данных.
Предварительная обработка относится к преобразованию, применяемому к нашим данным перед их передачей в алгоритм.
Предварительная обработка данных — это метод, который используется для преобразования необработанных данных в чистый набор данных. другими словами, всякий раз, когда данные собираются из другого источника, они собираются в необработанном формате, что невозможно для анализа.
Необходимость предварительной обработки данных
- Для достижения лучшего результата от применяемой модели в проекте машинного обучения формат данных должен быть надлежащим образом.
- Другой аспект заключается в том, что набор данных должен быть отформатирован таким образом, чтобы более одного алгоритма машинного обучения и глубокого обучения выполнялись в одном наборе данных и выбирался лучший из них.
Импорт шагов
Существует 4 основных важных этапа предварительной обработки данных.
- Разделение набора данных на обучающие и проверочные наборы
- Забота о недостающих ценностях
- Забота о категориальных характеристиках
- Нормализация набора данных
- Обучение тестовому сплиту
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 распространенных способа сделать это.
- Кодировка этикетки
- Одно горячее кодирование
В 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_transform — numpy.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
Результаты обучения
- Разделение набора данных
- Заполнение пропущенных значений
- Работа с категориальными данными
- Нормализация набора данных для улучшения результатов
Надеемся, что все эти методы улучшат ваши общие навыки специалиста по данным или инженера по машинному обучению и улучшат ваши модели машинного обучения.