Руководство для начинающих по разработке функций

Руководство для начинающих по разработке функций

22 августа 2023 г.

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

Понимание разработки функций

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

Важность тщательного мастерства

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

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

Почему вам следует заботиться о разработке функций?

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

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

Итак, не теряя времени, давайте начнем изучать различные методы разработки функций.

Методы

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

Метод 1: Взаимная информация — извлечение информации из отношений

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

Метод 2. Кластеризация – обнаружение закономерностей посредством группировки

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

Метод 3. Уменьшение размерности PCA – сокращение сложности

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

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

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

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

Код

Импорт пакетов

Сначала импортируем все необходимые пакеты.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.feature_selection import SelectKBest, mutual_info_regression
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder, StandardScaler
import numpy as np

Получение данных

Теперь давайте получим набор данных из kaggle и предварительно обработаем его.

# Load the dataset
data = pd.read_csv('train.csv')

# Data preprocessing
def preprocess_data(df):
    # Handle missing values
    df = df.fillna(df.median())

    # Handle categorical variables
    df = pd.get_dummies(df, drop_first=True)

    return df

data = preprocess_data(data)

# Prepare the data
X = data.drop('SalePrice', axis=1)
y = data['SalePrice']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

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

Базовая модель

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

baseline_model = LinearRegression()
baseline_model.fit(X_train, y_train)
baseline_predictions = baseline_model.predict(X_test)
baseline_rmse = mean_squared_error(y_test, baseline_predictions, squared=False)
print(f"Baseline RMSE: {baseline_rmse}")

# ------------------ OUTPUT ---------------- #
Baseline RMSE: 49204.92

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

Модель взаимной информации

# Method 1: Mutual Information
mi_selector = SelectKBest(score_func=mutual_info_regression, k=10)
X_train_mi = mi_selector.fit_transform(X_train, y_train)
X_test_mi = mi_selector.transform(X_test)
mi_model = LinearRegression()
mi_model.fit(X_train_mi, y_train)
mi_predictions = mi_model.predict(X_test_mi)
mi_rmse = mean_squared_error(y_test, mi_predictions, squared=False)
print(f"Mutual Information RMSE: {mi_rmse}")

# ------------------ OUTPUT ----------------- #
Mutual Information RMSE: 39410.99

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

Модель кластеризации

# Method 2: Clustering
num_clusters = 5
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
X_clustered = X.copy()
X_clustered['Cluster'] = kmeans.fit_predict(X)
X_clustered = pd.get_dummies(X_clustered, columns=['Cluster'], prefix='Cluster')
X_train_clustered, X_test_clustered, _, _ = train_test_split(X_clustered, y, test_size=0.2, random_state=42)
cluster_model = LinearRegression()
cluster_model.fit(X_train_clustered, y_train)
cluster_predictions = cluster_model.predict(X_test_clustered)
cluster_rmse = mean_squared_error(y_test, cluster_predictions, squared=False)
print(f"Clustering RMSE: {cluster_rmse}")

# ------------------- OUTPUT -------------- #
Clustering RMSE: 47715.30

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

PCA — модель уменьшения размерности

# Method 3: PCA Dimensionality Reduction
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
pca = PCA(n_components=10)
X_train_pca = pca.fit_transform(X_scaled)
X_test_pca = pca.transform(scaler.transform(X_test))
pca_model = LinearRegression()
pca_model.fit(X_train_pca, y_train)
pca_predictions = pca_model.predict(X_test_pca)
pca_rmse = mean_squared_error(y_test, pca_predictions, squared=False)
print(f"PCA RMSE: {pca_rmse}")

# --------------- OUTPUT -------------- #
PCA RMSE: 40055.78

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

Модель математических преобразований

# Method 5: Mathematical Transformations
X_train_transformed = X_train.copy()
X_test_transformed = X_test.copy()

# Apply logarithmic transformation
log_columns = ['GrLivArea', 'LotArea']  # Specify columns to apply log transformation
X_train_transformed[log_columns] = np.log1p(X_train_transformed[log_columns])
X_test_transformed[log_columns] = np.log1p(X_test_transformed[log_columns])

# Apply square root transformation
sqrt_columns = ['GarageArea', '1stFlrSF']  # Specify columns to apply square root transformation
X_train_transformed[sqrt_columns] = np.sqrt(X_train_transformed[sqrt_columns])
X_test_transformed[sqrt_columns] = np.sqrt(X_test_transformed[sqrt_columns])

# Apply inverse transformation
inv_columns = ['YearBuilt', 'OverallQual']  # Specify columns to apply inverse transformation
X_train_transformed[inv_columns] = 1 / X_train_transformed[inv_columns]
X_test_transformed[inv_columns] = 1 / X_test_transformed[inv_columns]

math_transform_model = LinearRegression()
math_transform_model.fit(X_train_transformed, y_train)
math_transform_predictions = math_transform_model.predict(X_test_transformed)
math_transform_rmse = mean_squared_error(y_test, math_transform_predictions, squared=False)
print(f"Mathematical Transformations RMSE: {math_transform_rmse}")

# ------------------ OUTPUT --------------- #
Mathematical Transformations RMSE: 47143.21

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

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

Сравнение результатов

  1. Базовое среднеквадратичное отклонение: 49204,92 Это среднеквадратическая ошибка (RMSE) базовой модели, в которой не применялись разработка или преобразование признаков. Модель использует оригинальные функции, как они есть. RMSE 49 204,92 указывает на среднюю ошибку прогноза базовой модели на тестовых данных.

2. RMSE взаимной информации: 39410,99 Это RMSE представляет производительность модели после применения метода выбора признаков взаимной информации. Это значительно ниже базового среднеквадратичного отклонения, что указывает на то, что выбор k лучших объектов на основе их показателей взаимной информации привел к повышению производительности модели.

3. RMSE кластеризации: 47715,30 RMSE здесь соответствует производительности модели после введения новой категориальной функции, основанной на кластеризации. RMSE близок к базовому RMSE, что позволяет предположить, что введение кластеризации не привело к значительному улучшению в этом случае.

4. СКО PCA: 40055,78 Это среднеквадратичное отклонение отражает производительность модели после применения PCA для уменьшения размерности. Это немного выше, чем RMSE взаимной информации, но ниже, чем базовое RMSE. Модель, использующая функции, преобразованные с помощью PCA, работает умеренно хорошо.

5. RMSE кодирования меток: 49204,92 Здесь RMSE показывает производительность модели, когда категориальные переменные кодируются метками. RMSE соответствует базовому RMSE, что указывает на то, что использование функций с кодировкой меток в этом случае не привело к заметному улучшению.

6. RMSE математических преобразований: 47143,21 Этот RMSE представляет производительность модели после применения различных математических преобразований к выбранным столбцам. RMSE ниже базового RMSE, что позволяет предположить, что эти преобразования привели к повышению производительности модели.

Подводя итог:

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

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


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE