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

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

Блокнот Юпитера

См. Jupyter Notebook для ознакомления с концепциями, которые мы рассмотрим при построении моделей машинного обучения, и мой Medium profile для других статей и руководств по науке о данных.

Прежде всего, нам нужно определить бизнес-задачу. В конце концов, мы не создаем модель машинного обучения наугад, хотя машинное обучение само по себе весело. Мы применяем машинное обучение для решения проблемы; это инструмент для решения бизнес-задач — с проблемы или боли, которую мы хотим решить, мы начинаем свою работу.

Скажем так, сбор набора данных, преобразование переменных, разделение обучающих и тестовых подмножеств, обучение и проверка модели зависят от определения бизнес-задачи. Допустим, мы не определяем проблему и не конкретизируем ее. В этом случае мы просто будем работать случайным образом и создавать случайную модель; после того, как все алгоритмы и методы выбраны в соответствии с набором данных и бизнес-задачей.

Бизнес-проблема: в чем ваша проблема?

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

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

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

Информация о 9 основных атрибутах:

  1. Количество беременностей — X
  2. Концентрация глюкозы в плазме через 2 часа при пероральном приеме глюкозы — X
  3. Диастолическое артериальное давление (мм рт. ст.) — X
  4. Толщина кожной складки трицепса (мм) — X
  5. Инсулин сыворотки за 2 часа (мЕд/мл) — X
  6. Индекс массы тела (вес в кг/(рост в м)²) — X
  7. Родословная функция диабета — X
  8. Возраст (лет) — Х
  9. Переменная класса (0 или 1) — y

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

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

Источник данных

Эти данные могут быть в файле CSV, электронной таблице Excel, файле TXT, в таблице реляционной или нереляционной базы данных, в озере данных, Hadoop; то есть источник данных может быть самым разнообразным! Как правило, инженер данных отвечает за извлечение данных из источника и создание конвейера. Поэтому будет создана процедура для извлечения данных, их хранения, обработки и доставки конечного результата — обычно за этот процесс отвечает дата-инженер. Специалист по данным будет получать эти данные в каком-либо формате, загружать их и манипулировать ими.

Извлечение и загрузка данных

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

# Loading csv file using Pandas (method used use on this notebook)
from pandas import read_csv 
file = 'pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(file, names = columns)

Вместо того, чтобы импортировать весь пакет Pandas, мы импортируем только read_csv из библиотеки Pandas. Этот тип импорта потребляет меньше памяти компьютера.

Исследовательский анализ данных

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

Описательная статистика

Во-первых, давайте посмотрим на первые 20 строк набора:

# Viewing the first 20 lines
data.head(20)

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

Если в файле много столбцов, алгоритм может вызвать проблемы с производительностью из-за высокой размерности. В этом случае мы можем применить уменьшение размерности, если это необходимо. Лучшее решение будет зависеть от каждой ситуации. Помните: обучайте модель на подмножестве более обширного набора данных, а затем применяйте ее к новым данным. То есть нет необходимости использовать весь набор данных. Для обучения алгоритма достаточно использовать репрезентативное подмножество.

Проверьте размеры набора данных.

# Viewing dimensions
data.shape
(768, 9)

Проверьте тип данных

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

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

# Data type of each attribute
data.dtypes
preg       int64
plas       int64
pres       int64
skin       int64
test       int64
mass     float64
pedi     float64
age        int64
class      int64
dtype: object

Статистическая сводка

# Statistical summary
data.describe()

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

Ниже мы видим, что существует очевидная диспропорция между классами 0 (отсутствие диабета) и 1 (наличие диабета).

Мы применяем переменную класса к функции Pandas groupby и измеряем ее размер:

# Class distribution
data.groupby('class').size()
class
0    500
1    268
dtype: int64

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

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

  • Корреляция -1 показывает отрицательную корреляцию, в то время как
  • Корреляция +1 показывает положительную корреляцию.
  • Корреляция 0 указывает на отсутствие взаимосвязи между переменными.

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

Как узнать, требует ли алгоритм модификации? Обратитесь к документации алгоритма, чтобы узнать, что конкретно нужно алгоритму.

# Apply Pearson's correlation between all variables in the dataset data.corr(method = 'pearson')

Мы вызываем функцию corr и метод Пирсона. Теперь у нас есть корреляция каждой переменной со всеми другими переменными.

Что важно в возврате корреляции, так это наблюдение за значением переменных-предикторов, касающихся цели. Пример: Возраст x Целевой показатель — положительная корреляция: по мере взросления у вас больше шансов заболеть диабетом.

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

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

# Checking each attribute's skew
data.skew()
preg     0.901674
plas     0.173754
pres    -1.843608
skin     0.109372
test     2.272251
mass    -0.428982
pedi     1.919911
age      1.129597
class    0.635017
dtype: float64

Здесь выше у нас есть индекс симметрии для каждой из переменных. Мы можем понять, как распределяются переменные, и решить, будем ли мы применять какой-либо метод нормализации, чтобы поместить переменную в стандартный формат распределения.

Визуализация Matplotlib

Мы можем привлечь к процессу исследовательского анализа графические инструменты, предлагаемые языком Python: matplotlib и seaborn.

Во-первых, нам нужно импортировать matplotlib, в частности, pyplot. Встроенная библиотека matplotlib предназначена для того, чтобы мы могли генерировать графику в окне Jupyter Notebook.

# It may be more interesting to generate the charts in a separate window 
import matplotlib.pyplot as plt
%matplotlib inline

Если мы хотим просмотреть гистограмму более широко в другом окне, нам нужно сбросить Jupyter Notebook и удалить встроенный %matplotlib.

С помощью гистограммы мы можем быстро оценить распределение каждого атрибута. Гистограммы группируют данные по бинам и подсчитывают количество наблюдений в каждом бине.

Мы можем быстро проверить симметрию данных с помощью гистограммы и определить, находятся ли они в нормальном распределении. Это поможет определить выбросы.

# Univariate Histogram
data.hist()
plt.show()

Мы видим, что атрибуты age, order и test имеют экспоненциальное распределение. Мы видим, что столбцы массы и пресса имеют нормальное распределение.

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

Одномерный график плотности

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

Может быть проще определить распределение данных, используя график плотности. Кажется, что у класса есть два пика, потому что есть два класса — 0|1.

# Density Plot Univariate 'Density'
data.plot(kind = 'density', 
          subplots = True,  
          layout = (3,3), 
          sharex = False)
plt.show()

Коробчатые участки

# Box and Whisker Plots
data.plot(kind = 'box',
          subplots = True, 
          layout = (3,3),
          sharex = False, 
          sharey = False)
plt.show()

С помощью коробчатых диаграмм мы также можем просмотреть распределение данных для каждого атрибута. Блочная диаграмма помогает получить представление о разбросе данных и быстро выявляет выбросы: значения, которые сильно отклоняются от среднего значения данных. Если вы оставите выброс в наборе данных, это может повлиять на прогнозную модель.

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

# Box and Whisker Plots
data.plot(kind = 'box', 
        subplots = True, 
        layout = (3,3), 
        sharex = False, 
        sharey = False)
plt.show()

Давайте создадим корреляционную матрицу с именами переменных для удобства визуализации. Объект корреляций получит все корреляции в дате через функцию corr().

Затем мы вызываем библиотеку NumPy и plt.figure для создания фигуры. Мы добавляем сюжет; затем мы применяем метод matshow, чтобы показать корреляции между переменными в диапазоне от -1 до +1. После этого мы используем цвет с помощью fig.colorbar, создаем галочки с помощью np.arange, чтобы установить размер квадрата равным 9 (у нас девять столбцов), и дорабатываем, внося коррективы в галочки и метки.

# Correlation matrix with variable names
correlations = data.corr()
import numpy as np       
fig = plt.figure()       
ax = fig.add_subplot(111)    
cax = ax.matshow (correlations, vmin = -1, vmax = 1) 
fig.colorbar(cax)     
#The array defines the size of the 9x9 square to be plotted
ticks = np.arange(0, 9, 1) 
# Take the size of "ticks" and place it on the x axis
ax.set_xticks(ticks) 
# Take the size of "ticks" and place it on the
ax.set_yticks(ticks) axis
# Apply the columns listed at the beginning as labels
ax.set_xticklabels(columns) 
# Applies the columns listed at the beginning as labels
ax.set_yticklabels(columns) 
plt.show() # Plot

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

Мы по-прежнему можем создать общую корреляционную матрицу, где та же процедура выполняется ранее, без применения меток. Таким образом, мы можем подразумевать создание корреляционной матрицы.

# Simplified generic correlation matrix
# It is the same procedure as before without establishing label
correlations = data.corr()
# Plot
fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(correlations, vmin = -1, vmax = 1)
fig.colorbar(cax)
plt.show()

Точечная диаграмма

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

# Scatter Matrix
from pandas.plotting import scatter_matrix
scatter_matrix(data)
plt.show()

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

Сиборн

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

import seaborn as sns
# Pairplot
sns.pairplot(data)

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

Сюжет Seaborn

sns.boxplot(data = data, orient = "v")

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

участок Сиборн

Наконец, у нас есть distplot, вызывающий только одну переменную из набора данных и использующий параметр fit модуля Stats библиотеки SciPy.

from scipy import stats
sns.distplot(data.pedi, fit = stats.norm);

Если вы посмотрите правильно, у нас есть три графика на одном графике. У нас есть гистограмма с экспоненциальным распределением и несколько линий, которые помогают нам ставить статистические сводки.

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

Подготовка данных для машинного обучения

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

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

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

Нормализация — Метод 1 (Масштаб)

Нормализация, бинаризация и стандартизация — это методы, применяемые исключительно к количественным переменным. Нормализация изменяет масштаб данных, и в scikit-learn у нас есть два метода. В то же время стандартизация не меняет распределения данных; он только помещает распределение в гауссовский формат. То есть, если данные уже находятся в нормальном распределении, мы можем их только стандартизировать. И у нас еще есть бинаризация, которая ставит данные со значением 0 или 1 по заданному нами правилу.

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

Нормализация полезна для оптимизации, поскольку используется в основе алгоритмов машинного обучения, таких как градиентный спуск. Это помогает алгоритмам, таким как регрессия и нейронные сети, а также алгоритмам, использующим измерения расстояния, таким как KNN. В Scikit-learn есть функция для этого шага, называемая MinMaxScaler().

# Normalization (between 0 and 1)
from pandas import read_csv
from sklearn.preprocessing import MinMaxScaler
file = 'pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv (file, names = columns)
array = data.values 
X = array [:, 0: 8]
Y = array[:, 8]
scaler = MinMaxScaler (feature_range = (0, 1))
rescaledX = scaler.fit_transform (X)
print ("Original Data:", data.values)
print (" Standardized Data:", rescaledX [0: 5 ,:])

Здесь мы преобразуем данные в тот же масштаб. Мы импортируем функцию MinMaxScaler для нормализации и функцию read_csv для чтения набора данных. Затем мы определяем имена столбцов, передаем значения данных в массив, применяем срезы в подмножествах, тогда как первые восемь столбцов являются предикторами X, а последний столбец — целевой переменной y.

С помощью параметра feature_range функции MinMaxScaler мы указываем масштаб от 0 до 1. После создания объекта масштабатора мы используем процесс подгонки, чтобы применить масштабатор к набору данных предиктора X — нам не нужно нормализовать выходную переменную y. в этом случае. То есть мы используем нормализацию только для количественных предикторов.

Нормализация — Метод 2 (Масштаб)

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

Поэтому здесь мы использовали метод с функцией Normalizer вместо MinMaxScaler для нормализации переменных:

# Normalization (length equal to 1)
from pandas import read_csv
from sklearn.preprocessing import Normalizer
file = 'data/pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(file, names = columns)
array = data.values
X = array[:,0:8]
Y = array[:,8]
print("Original data: \n\n", data.values)
print("\nNormalized data: \n\n", normalizedX[0:5,:])

Стандартизация (стандартное распространение)

Стандартизация — это метод преобразования атрибутов с распределением Гаусса и различными средними значениями и стандартными отклонениями в стандартное распределение Гаусса со средним значением, равным 0, и стандартным отклонением, равным 1.

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

Стандартизация помогает алгоритмам, которые ожидают, что данные будут иметь гауссово распределение, таким как линейная регрессия, логистическая регрессия и линейный дискриминантный анализ. Хорошо работает, когда данные уже находятся в одном масштабе. В scikit-learn для этого шага есть функция StandardScaler().

# Standardizing(0 for the mean, 1 for the standard deviation)
from pandas import read_csv
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X) 
standardX = scaler.transform(X)  
print("Original Data: nn", data.values)

Эти данные по-прежнему представляют ту же информацию, но теперь распределение данных соответствует стандартному нормальному распределению.

Бинаризация (преобразование данных в 1 или 0)

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

Бинаризация полезна, когда у нас есть вероятности и мы хотим превратить данные во что-то более осмысленное. В scikit-learn есть функция для этого шага, называемая Binarizer().

# Binarization
from pandas import read_csv
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold = 0.2).fit(X)
binaryX = binarizer.transform(X)
print("Original Data:", data.values)
print("Binarized Data:", binaryX[0:5,:])

Таким образом, мы рассмотрели основные стандартные методы передачи данных: нормализация, стандартизация и бинаризация.

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

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

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

Однако у нас есть противоположная проблема, когда у нас есть две переменные, представляющие одну и ту же информацию, которые мы называем коллинеарными атрибутами, которые также могут ухудшить обучение алгоритма. В Scikit-learn есть функции, которые автоматизируют работу по извлечению и выбору переменных.

Шаг выбора признаков заключается в выборе атрибутов (переменных), которые будут лучшими кандидатами в качестве переменных-предикторов. Выбор функций помогает нам уменьшить переоснащение (когда алгоритм учится очень сильно), повышает точность модели и сокращает время обучения. Идея состоит в том, чтобы создать обобщающую модель, которая использует обучающие данные и предполагает любой набор данных.

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

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

Одномерные статистические тесты для выбора признаков

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

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

Статистические тесты могут выбирать атрибуты, которые имеют сильную связь с выходной переменной (y — класс), которую мы пытаемся предсказать.

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

Scikit-learn предоставляет функцию SelectKBest(), используемую с различными статистическими тестами для выбора оптимальных атрибутов (переменных-предикторов — X). Давайте воспользуемся статистическим критерием хи-квадрат и выберем четыре лучших признака, используемых в качестве предикторов.

В документации Scikit-learn есть список всех статистических тестов, предлагаемых функцией SelectKBest().

# Extraction of Variables with Statistical Tests (Chi-Square Test)
from pandas import read_csv
from sklearn.feature_selection import SelectKBest 
from sklearn.feature_selection import chi2 
best_var = SelectKBest (score_func = chi2, k = 4)
fit = best_var.fit(X, Y)
features = fit.transform(X)
print('Original number of features:', X.shape[1])
print('Reduced number of features:', features.shape[1])
print('Features: nn', features)

Сначала мы импортируем функцию SelectKBest и статистический метод chi2 модуля feature_selection. Затем мы загружаем и разделяем данные на X и Y, а затем создаем функцию для выбора лучших переменных.

Затем мы вызываем функцию SelectKbest. Настраиваем параметр score_func. Пунктуационной функцией будет chi2, и эта функция вернет четыре наиболее важных атрибута восьми уже имеющихся предикторов. Затем мы применяем подгонку, чтобы установить наиболее подходящие отношения наборов X и y.

Когда подгонка готова, у нас есть окончательный объект подгонки, и мы преобразуем его в X. То есть теперь подгоночный объект представляет четыре наилучшие переменные через отношение X и y. После этого усовершенствования функция преобразования будет извлекать только наиболее релевантные переменные предиктора X, и мы будем размещать их в объекте признаков. Затем распечатываются результаты.

Модель еще не создана, но мы уже знаем, какие переменные наиболее важны для этого метода.

Рекурсивное устранение атрибутов (RFE)

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

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

В приведенном ниже примере используется метод рекурсивного исключения атрибутов с алгоритмом логистической регрессии для выбора трех лучших переменных-предикторов. RFE выбрал переменные «preg», «mass» и «pedi», которые помечены как «Истина» в «Выбранных атрибутах» и со значением 1 в «Рейтинге атрибутов».

# Recursive Elimination of Variables
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
file = 'data/pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(file, names = columns)
array = data.values
X = array[:,0:8]
Y = array[:,8]
model = LogisticRegression()
rfe = RFE(model, 3) 
fit = rfe.fit(X, Y)
print("Predictor Variables:", data.columns[0:8])
print("Selected Variables: %s" % fit.support_)
print("Attribute Ranking: %s" % fit.ranking_)
print("Number of Best Attributes: %d" % fit.n_features_)

Здесь мы импортируем функцию RFE модуля feature_selecion из библиотеки scikit-learn, чтобы применить технологию выбора переменных, и импортируем алгоритм логистической регрессии из linear_model.

Выше мы загружаем данные, создаем набор данных среза для предиктора и целевых переменных и создаем экземпляр модели логистической регрессии. После создания экземпляра, которому принадлежит имя модели, мы применяем функцию RFE; то есть мы хотим извлечь 3 переменные, которые в наибольшей степени способствуют точности этой прогностической модели для объекта rfe. Мы генерируем связь наборов X и y с подгонкой и печатаем результат.

Классификатор дополнительных деревьев (ETC)

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

Рассматриваемый алгоритм представляет собой классификатор дополнительных деревьев, то есть набор деревьев решений. ETC может выбрать несколько деревьев, поместить их в пакет и, в конце концов, иметь ансамблевый метод для работы с сортировкой — очень похоже на Random Forest.

Пакетированные деревья решений, такие как алгоритм RandomForest (они называются методами ансамбля), могут использоваться для оценки важности каждого атрибута. Этот метод возвращает оценку для каждой функции. Чем выше оценка, тем выше важность атрибута.

# Importance of attribute with Extra Trees Classifier 
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier 
file = 'data/pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv (file, names = columns)
array = data.values
X = array[:,0:8]
Y = array[:,8]
model = ExtraTreesClassifier() 
modelo.fit(X, Y) 
print(data.columns[0:8])
print(model.feature_importances_)

Мы создали модель ExtraTreesClassifier() и связали наборы X и y с методом подгонки, процессом обучения. Мы берем алгоритм ExtraTreesClassifier, у которого уже есть параметры по умолчанию, и представляем ему данные. Как только это будет сделано, мы создадим модель, обучим ее и перечислим наиболее релевантные атрибуты.

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

Уменьшение размерности

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

Хотя мы используем наиболее релевантные атрибуты, мы отбрасываем атрибуты, которые могут нести некоторую информацию. Это может быть неуместно, но это все же информация; мы можем потерять что-то немалое. Метод выбора переменных имеет свои преимущества, но также может вызвать проблемы.

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

На графике слева у нас есть переменные Gene1, Gene2 и Gene3. Мы можем применить алгоритм PCA для обучения без учителя; то есть мы не знаем, что на выходе — PCA определит шаблоны и сгруппирует данные.

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

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

# Extraction Feature
from pandas import read_csv
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA 
file = 'data/pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv (file, names = columns)
array = data.values
X = array[:,0:8] # Predictors
Y = array[:,8] # Target
# Normalizing data
scaler = MinMaxScaler(feature_range = (0, 1))
rescaledX = scaler.fit_transform(X) 
# Attribute Selection
pca = PCA(n_components = 4) # Create PCA 4k of similires variances
fit = pca.fit (rescaledX)
print("Variance: %s" % fit.explained_variance_ratio_)
print(fit.components_)

Вызовем функцию MinMaxScaler модуля предварительной обработки для нормализации данных и алгоритм PCA модуля декомпозиции для уменьшения размерности. Мы загружаем данные, разделяем наборы X и Y, выполняем нормализацию с помощью MinMaxScaler, устанавливая диапазон от 0 до 1, и применяем обучение к набору X.

После нормализации мы создали PCA, установив четыре компонента, которые мы применяем к нормализованным данным. У нас есть четыре компонента, первый компонент — это компонент с атрибутами более значительной дисперсии, второй компонент — вторая по величине дисперсия и так далее.

Когда мы собираемся обучать алгоритм, мы не собираемся вводить алгоритм в переменные набора данных, а в компоненты. Таким образом, мы смогли передать всю информацию в наборе, чтобы алгоритм смог достичь высокой точности. Имея многомерные наборы данных с более чем 300 переменными, мы можем сократить все это до 150, 80 или 50 компонентов, чтобы облегчить обучение алгоритму машинного обучения. Следовательно, уменьшение размерности PCA является ценным методом предварительной обработки, используемым в соответствии с бизнес-задачей.

Выборка

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

Мы делаем это, потому что у нас уже есть набор исторических данных. Мы собираем в прошлом данные о пациентах, у которых развился или не развился диабет. У нас есть несколько предикторов и выходная переменная; то есть мы уже знаем пациентов, у которых развилось заболевание или нет. Теперь мы хотим научить алгоритм обнаруживать это для нас в будущем.

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

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

# Evaluation using training and test data
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression 
file = 'data/pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv (file, names = columns)
array = data.values
X = array[:,0:8] 
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = test_size, random_state = seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
result = model.score(X_test, Y_test)
print("Accuracy in Test Data: %.3f%%" % (result * 100.0))

Чтобы разделить наборы, мы импортируем функцию train_test_split модуля model_selection и импортируем модель LogisticRegression, чтобы создать модель машинного обучения, а затем оценим производительность модели.

Как только это будет сделано, мы загрузим данные; мы разделяем его с нарезкой набора, который мы сделали до этого момента, мы определяем test_size со значением 0,33 и указываем начальное число для воспроизведения ожидаемого результата.

Затем мы вызываем функцию train_test_split scikit-learn, передаем X и y в качестве параметра, применяем test_size, который уже был определен только что, и random_state, равный начальному набору. Эта функция train_test_split возвращает четыре значения, поэтому нам нужны четыре переменные.

Мы создаем экземпляр модели с помощью алгоритма LogisticRegression и проводим обучение с данными обучения, сгенерированными train_test_split. Затем мы вызываем функцию оценки, чтобы измерить производительность модели, вычислить ее оценку и вернуться к точности. Точность модели составила 75%.

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

Перекрестная проверка — лучшие результаты производительности

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

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

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

См. столбец fold1, представляющий обучение x тестирование. Учитывая, что в нашем наборе данных 100 строк, мы возьмем 80% для обучения и 20% для тестирования.

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

После всего стандартного процесса до составления наборов X и y мы определим количество кратностей в 10. В приведенной выше схеме-примере деление было в 5 крат — единого мнения относительно значения k (количества складки); то есть это будет зависеть от задачи и набора. Если количество сгибов не дает ожидаемого значения, мы меняем только до тех пор, пока не достигнем удовлетворительного результата.

# Cross Validation
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
file = 'pima-data.csv'
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(file, names = columns)
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10 
seed = 7
kfold = KFold(num_folds, True, random_state = seed)
model = LogisticRegression()
result = cross_val_score(model, X, Y, cv = kfold)
print("Final accuracy: %.3f%%" % (result.mean() * 100.0))

Точность этого кода составила 77%. Эта процедура немного отличается от статической команды train_test_split, в результате которой результат составил 75%; единственным дополнительным фактором было применение KFold, что увеличило точность на 1% — это может быть довольно значительным, если учесть обширный набор данных.

Кроме того, в train_test_split мы обучаем алгоритм с помощью обучающих данных и проверяем результат с помощью тестового подмножества. При кросс-валидации в этом нет необходимости, она делает это автоматически путем обучения и тестирования, а в конце мы применяем среднее значение точности результата cross_val_score.

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

Заключение

Здесь мы завершили этап предварительной обработки данных. До сих пор мы работали над задачами предварительной обработки: преобразование, выборка, уменьшение размерности и выборка.

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

Спасибо, что нашли время, чтобы прочитать его. 🐼

Леонардо Анелло
in/anello92