Учебники

Машинное обучение — подготовка данных

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

Это делает подготовку данных наиболее важным шагом в процессе ОД. Подготовка данных может быть определена как процедура, которая делает наш набор данных более подходящим для процесса ML.

Почему предварительная обработка данных?

После выбора необработанных данных для обучения ОД наиболее важной задачей является предварительная обработка данных. В широком смысле, предварительная обработка данных преобразует выбранные данные в форму, с которой мы можем работать или можем передавать алгоритмы ML. Нам всегда нужно предварительно обрабатывать наши данные, чтобы они могли соответствовать алгоритму машинного обучения.

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

У нас есть следующие методы предварительной обработки данных, которые можно применять к набору данных для получения данных для алгоритмов ML —

пересчет

Скорее всего, наш набор данных состоит из атрибутов с различным масштабом, но мы не можем предоставить такие данные алгоритму ML, поэтому он требует масштабирования. Масштабирование данных гарантирует, что атрибуты имеют одинаковый масштаб. Обычно атрибуты масштабируются в диапазоне от 0 до 1. Алгоритмы ML, такие как градиентный спуск и k-ближайших соседей, требуют масштабированных данных. Мы можем изменить масштаб данных с помощью класса Python библиотеки Scikit-Learn MinMaxScaler .

пример

В этом примере мы будем масштабировать данные набора данных диабета индейцев Пима, которые мы использовали ранее. Сначала будут загружены данные CSV (как это делалось в предыдущих главах), а затем с помощью класса MinMaxScaler они будут масштабироваться в диапазоне от 0 до 1.

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

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Теперь мы можем использовать класс MinMaxScaler для изменения масштаба данных в диапазоне от 0 до 1.

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

Мы также можем суммировать данные для вывода по нашему выбору. Здесь мы устанавливаем точность в 1 и показываем первые 10 строк в выводе.

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])

Выход

Scaled data:
[[0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
[0.1  0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
[0.5  0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
[0.1  0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
[0.   0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
[0.3  0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
[0.2  0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
[0.6  0.6 0.  0.  0.  0.5 0.  0.1 0. ]
[0.1  1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
[0.5  0.6 0.8 0.  0.  0.  0.1 0.6 1. ]]

Из вышеприведенного вывода все данные были перераспределены в диапазоне от 0 до 1.

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

Еще одним полезным методом предварительной обработки данных является нормализация. Это используется для изменения масштаба каждой строки данных, чтобы иметь длину 1. Это в основном полезно в наборе разреженных данных, где у нас много нулей. Мы можем изменить масштаб данных с помощью класса Normalizer библиотеки Python scikit-learn .

Типы нормализации

В машинном обучении существует два типа методов предварительной обработки нормализации:

бинаризации

Как следует из названия, это метод, с помощью которого мы можем сделать наши данные двоичными. Мы можем использовать двоичный порог для того, чтобы сделать наши данные двоичными. Значения выше этого порогового значения будут преобразованы в 1, а ниже этого порогового значения будут преобразованы в 0.

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

Мы можем преобразовать данные в двоичную форму с помощью класса Python библиотеки Scinit-learn Binarizer.

пример

В этом примере мы будем масштабировать данные набора данных диабета индейцев Пима, которые мы использовали ранее. Сначала будут загружены данные CSV, а затем с помощью класса Binarizer они будут преобразованы в двоичные значения, то есть 0 и 1, в зависимости от порогового значения. Мы берем 0,5 в качестве порогового значения.

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

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Теперь мы можем использовать класс Binarize для преобразования данных в двоичные значения.

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

Здесь мы показываем первые 5 строк в выводе.

print ("\nBinary data:\n", Data_binarized [0:5])

Выход

Binary data:
[[1. 1. 1. 1. 0. 1. 1. 1. 1.]
[1.  1. 1. 1. 0. 1. 0. 1. 0.]
[1.  1. 1. 0. 0. 1. 1. 1. 1.]
[1.  1. 1. 1. 1. 1. 0. 1. 0.]
[0.  1. 1. 1. 1. 1. 1. 1. 1.]]

Стандартизация

Еще один полезный метод предварительной обработки данных, который в основном используется для преобразования атрибутов данных с гауссовым распределением. Он отличает среднее значение и SD (стандартное отклонение) от стандартного гауссовского распределения со средним значением 0 и SD от 1. Этот метод полезен в алгоритмах ML, таких как линейная регрессия, логистическая регрессия, которая предполагает гауссовское распределение во входном наборе данных и производит лучше результаты с измененными данными. Мы можем стандартизировать данные (среднее = 0 и SD = 1) с помощью StandardScaler класса библиотеки Python scikit-learn .

пример

В этом примере мы будем масштабировать данные набора данных диабета индейцев Пима, которые мы использовали ранее. Сначала будут загружены данные CSV, а затем с помощью класса StandardScaler они будут преобразованы в гауссово распределение со средним значением = 0 и SD = 1.

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

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Теперь мы можем использовать класс StandardScaler для изменения масштаба данных.

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

Мы также можем суммировать данные для вывода по нашему выбору. Здесь мы устанавливаем точность до 2 и показываем первые 5 строк в выводе.

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])

Выход

Rescaled data:
[[ 0.64 0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
[-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
[ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
[-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
[-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]]

Маркировка данных

Мы обсудили важность хороших данных для алгоритмов ML, а также некоторые методы предварительной обработки данных перед их отправкой в ​​алгоритмы ML. Еще один аспект в этом отношении — маркировка данных. Также очень важно отправлять данные в алгоритмы ML с надлежащей маркировкой. Например, в случае проблем с классификацией в данных имеется множество меток в виде слов, цифр и т. Д.

Что такое кодирование меток?

Большинство функций sklearn ожидают, что данные с числовыми метками, а не надписями слов. Следовательно, нам необходимо преобразовать такие метки в числовые метки. Этот процесс называется кодированием меток. Мы можем выполнить кодирование меток данных с помощью функции LabelEncoder () библиотеки Python scikit-learn .

пример

В следующем примере скрипт Python выполнит кодирование метки.

Сначала импортируйте необходимые библиотеки Python следующим образом:

import numpy as np
from sklearn import preprocessing

Теперь нам нужно указать следующие метки ввода:

input_labels = ['red','black','red','green','black','yellow','white']

Следующая строка кода создаст кодировщик меток и обучит его.

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

Следующие строки скрипта будут проверять производительность путем кодирования случайного упорядоченного списка —

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

Мы можем получить список закодированных значений с помощью следующего скрипта Python —

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))

Выход