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

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

Информация может быть извлечена из данных так же, как энергия может быть извлечена из нефти. - Адеола Адезина

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

Прочитав эту статью, вы узнаете:

  • Что такое разработка функций и выбор функций.
  • Различные методы обработки недостающих данных в вашем наборе данных.
  • Различные методы обработки непрерывных объектов.
  • Различные методы обработки категориальных признаков.
  • Различные методы выбора функций.

Приступим.

Что такое Feature Engineering?

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

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

Мучите данные, и он во всем признается. - Рональд Коуз

Разработка функций преследует две цели:

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

Согласно опросу 80 специалистов по данным, проведенному CrowdFlower, специалисты по анализу данных тратят 60% своего времени на очистку и систематизацию данных. Вот почему очень важно иметь навыки проектирования и отбора функций.

«В конце концов, некоторые проекты машинного обучения успешны, а некоторые - нет. В чем разница? Несомненно, наиболее важным фактором являются используемые функции. »- профессор Педро Домингос из Вашингтонского университета.

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

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

Как работать с отсутствующими данными

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

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

  • N/A
  • нулевой
  • Пустой
  • ?
  • никто
  • пустой
  • -
  • NaN

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

Удаление переменной

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

Единственный случай, когда может иметь смысл удалить переменную, - это когда ее отсутствующие значения составляют более 60% наблюдений.

# import packages
import numpy as np 
import pandas as pd 

# read dataset 
data = pd.read_csv('path/to/data')

#set threshold
threshold = 0.7

# dropping columns with missing value rate higher than threshold
data = data[data.columns[data.isnull().mean() < threshold]]

В приведенном выше фрагменте кода вы можете увидеть, как я использую NumPy и pandas для загрузки набора данных и устанавливаю порог 0,7. Это означает, что любой столбец, в котором отсутствуют значения более 70% наблюдений, будет удален из набора данных.

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

Среднее или медианное вменение

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

# filling missing values with medians of the columns
data = data.fillna(data.median())

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

Наиболее частое значение

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

# filling missing values with medians of the columns
data['column_name'].fillna(data['column_name'].value_counts().idxmax(). inplace=True)

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

Как работать с непрерывными функциями

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

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

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

Вот несколько распространенных методов обработки непрерывных функций:

Мин-макс нормализация

Для каждого значения в элементе нормализация Min-Max вычитает минимальное значение в элементе, а затем делит его на его диапазон. Диапазон - это разница между исходным максимумом и исходным минимумом.

Наконец, он масштабирует все значения в фиксированном диапазоне от 0 до 1.

Вы можете использовать метод MinMaxScaler из Scikit-learn, который преобразует функции, масштабируя каждую функцию до заданного диапазона:

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[4, 6], [11, 34], [10, 17], [1, 5]])

# create scaler method
scaler = MinMaxScaler(feature_range=(0,1))

# fit and transform the data
scaled_data = scaler.fit_transform(data)

print(scaled_data)

# [[0.3        0.03448276]
#  [1.         1.        ] 
#  [0.9        0.4137931 ] 
#  [0.         0.        ]]

Как видите, наши данные были преобразованы, и диапазон находится в диапазоне от 0 до 1.

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

Стандартизация гарантирует, что каждая функция имеет среднее значение 0 и стандартное отклонение 1, в результате чего все функции имеют одинаковую величину.

Если стандартное отклонение функций отличается, их диапазон также будет отличаться.

Вы можете использовать метод StandardScaler из Scikit-learn для стандартизации функций путем удаления среднего и масштабирования до стандартного отклонения 1:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[4, 1], [11, 1], [10, 4], [1, 11]])

# create scaler method 
scaler = StandardScaler()

# fit and transform the data
scaled_data = scaler.fit_transform(data)

print(scaled_data)

# [[-0.60192927 -0.79558708]
#  [ 1.08347268 -0.79558708] 
#  [ 0.84270097 -0.06119901] 
#  [-1.32424438  1.65237317]]

Убедимся, что среднее значение каждого признака (столбца) равно 0:

print(scaled_data.mean(axis=0))

[0. 0.]

И что стандартное отклонение каждой функции (столбца) составляет 1:

print(scaled_data.std(axis=0))

[1. 1.]

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

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

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

Распространенные методы обработки категориальных характеристик:

Кодировка метки

Кодирование метки - это просто преобразование каждого категориального значения в столбце в число.

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

В следующем примере вы узнаете, как использовать LableEncoder из Scikit-learn для преобразования категориальных значений в двоичные:

# import packages
import numpy as np 
import pandas as pd 
from sklearn.preprocessing import LabelEncoder

# intialise data of lists.
data = {'Gender':['male', 'female', 'female', 'male','male'],
        'Country':['Tanzania','Kenya', 'Tanzania', 'Tanzania','Kenya']}
  
# Create DataFrame
data = pd.DataFrame(data)


# create label encoder object
le = LabelEncoder()
  
data['Gender']= le.fit_transform(data['Gender'])
data['Country']= le.fit_transform(data['Country'])

print(data)

Одно горячее кодирование

Безусловно, наиболее распространенным способом представления категориальных переменных является использование методов однократного кодирования или кодирования «один из N», также известных как фиктивные переменные.

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

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

# import packages 
import numpy as np 
from sklearn.preprocessing import OneHotEncoder, LabelEncoder


# define example
data = np.array(['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot'])

# integer encode
label_encoder = LabelEncoder()

#fit and transform the data
integer_encoded = label_encoder.fit_transform(data)
print(integer_encoded)

# one-hot encode
onehot_encoder = OneHotEncoder(sparse=False)

#reshape the data
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)

#fit and transform the data
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)

print(onehot_encoded)

Это результат выполнения integer_encoded методом LabelEncoder:

[0 0 2 0 1 1 2 0 2 1]

Это результат выполнения onehot_encoded методом OneHotEncoder:

[[1. 0. 0.] 
 [1. 0. 0.] 
 [0. 0. 1.] 
 [1. 0. 0.] 
 [0. 1. 0.] 
 [0. 1. 0.] 
 [0. 0. 1.] 
 [1. 0. 0.] 
 [0. 0. 1.] 
 [0. 1. 0.]]

Что такое выбор функций?

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

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

Основные причины использовать выбор функций:

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

«Я подготовил модель, выбрав все функции, и я получил точность около 65%, что не очень хорошо для прогнозной модели, и после выбора некоторых функций и разработки функций без каких-либо действий логические изменения в моем коде модели, моя точность подскочила до 81%, что весьма впечатляет »- Рахил Шейх

Распространенные методы выбора функций:

Одномерный выбор

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

Библиотека Scikit-learn предоставляет класс SelectKBest, который можно использовать с набором различных статистических тестов для выбора определенного количества функций.

В следующем примере мы используем класс SelectKBest с критерием хи-квадрат, чтобы найти лучшую функцию для набора данных Iris:

# Load packages
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
  
# Load iris data
iris_dataset = load_iris()
  
# Create features and target
X = iris_dataset.data
y = iris_dataset.target
  
# Convert to categorical data by converting data to integers
X = X.astype(int)
  
# Two features with highest chi-squared statistics are selected
chi2_features = SelectKBest(chi2, k = 2)
X_kbest_features = chi2_features.fit_transform(X, y)
  
# Reduced features
print('Original feature number:', X.shape[1])
print('Reduced feature number:', X_kbest_features.shape[1])

Исходный номер функции: 4
Сокращенный номер функции: 2

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

Вы можете узнать больше о тесте хи-квадрат здесь: Нежное введение в тест хи-квадрат для машинного обучения.

Важность функции

Важность функции дает вам оценку для каждой функции ваших данных. Чем выше оценка, тем важнее или релевантнее эта функция для вашей целевой функции.

Важность функции - это встроенный класс, который поставляется с древовидными классификаторами, такими как:

  • Случайные лесные классификаторы
  • Классификаторы Extra Tree

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

# Load libraries
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.ensemble import ExtraTreesClassifier

# Load iris data
iris_dataset = load_iris()
  
# Create features and target
X = iris_dataset.data
y = iris_dataset.target
  
# Convert to categorical data by converting data to integers
X = X.astype(int)
 
 # Building the model
extra_tree_forest = ExtraTreesClassifier(n_estimators = 5,
                                        criterion ='entropy', max_features = 2)
  
# Training the model
extra_tree_forest.fit(X, y)
  
# Computing the importance of each feature
feature_importance = extra_tree_forest.feature_importances_
  
# Normalizing the individual importances
feature_importance_normalized = np.std([tree.feature_importances_ for tree in 
                                        extra_tree_forest.estimators_],
                                        axis = 0)

# Plotting a Bar Graph to compare the models
plt.bar(iris_dataset.feature_names, feature_importance_normalized)
plt.xlabel('Feature Labels')
plt.ylabel('Feature Importances')
plt.title('Comparison of different Feature Importances')
plt.show()

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

Тепловая карта корреляционной матрицы

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

Корреляция может быть положительной (увеличение одного значения признака увеличивает значение целевой переменной) или отрицательной (увеличение одного значения признака уменьшает значение целевой переменной).

В следующем примере мы будем использовать набор данных о ценах на жилье в Бостоне из библиотеки Scikit-learn и метод corr () из pandas, чтобы найти попарную корреляцию всех функций во фрейме данных:

# Load libraries
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
import seaborn as sns


# load boston data
boston_dataset = load_boston()

# create a daframe for boston data
boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
  
# Convert to categorical data by converting data to integers
#X = X.astype(int)
 
#ploting the heatmap for correlation
ax = sns.heatmap(boston.corr().round(2), annot=True)

Коэффициент корреляции варьируется от -1 до 1. Если значение близко к 1, это означает, что существует сильная положительная корреляция между двумя функциями. Когда он близок к -1, признаки имеют сильную отрицательную корреляцию.

На рисунке выше вы можете видеть, что функции НАЛОГ и RAD имеют столь же правильную положительную корреляцию и DIS и NOX имеют сильную отрицательную корреляцию.

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

Подробнее об этом можно прочитать здесь: Почему при обучении с учителем плохо иметь коррелированные функции?

Заключение

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

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

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

Если вы узнали что-то новое или вам понравилось читать эту статью, поделитесь ею, чтобы другие могли ее увидеть. А пока до встречи в следующем посте!

Вы также можете найти меня в Twitter @Davis_McDavid.

Эта статья была впервые опубликована на Freecodecamp.