🤔 Как решить задачу, где присутствует одновременно два target - один categorical другой continuous?



Решение задачи, в которой одновременно присутствуют два целевых признака (один категориальный и один непрерывный), можно реализовать через подход многозадачного обучения (multi-task learning). Это подход, при котором одна модель или несколько связанных моделей обучаются одновременно решать несколько задач. Вот пошаговое объяснение, как можно это сделать.



🚩 Определение задач:



🟠 Категориальный признак (classification target): Например, предсказание категории продукта (класс A, класс B, класс C).

🟠Непрерывный признак (regression target):Например, предсказание стоимости продукта.



🚩 Подходы к решению:



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

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



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

import pandas as pd

import numpy as np

from tensorflow.keras.models import Model

from tensorflow.keras.layers import Input, Dense



# Пример данных

data = pd.DataFrame({

'feature1': np.random.rand(100),

'feature2': np.random.rand(100),

'categorical_target': np.random.randint(0, 3, 100), # 3 класса

'continuous_target': np.random.rand(100) * 1000

})



# Разделение признаков и целевых переменных

X = data[['feature1', 'feature2']].values

y_class = data['categorical_target'].values

y_reg = data['continuous_target'].values



# Определение входного слоя

input_layer = Input(shape=(X.shape[1],))



# Общие слои для извлечения признаков

common_layer = Dense(64, activation='relu')(input_layer)

common_layer = Dense(32, activation='relu')(common_layer)



# Отдельный выходной слой для классификации

classification_output = Dense(3, activation='softmax', name='classification_output')(common_layer)



# Отдельный выходной слой для регрессии

regression_output = Dense(1, activation='linear', name='regression_output')(common_layer)



# Создание модели

model = Model(inputs=input_layer, outputs=[classification_output, regression_output])



# Компиляция модели с различными функциями потерь для каждой задачи

model.compile(optimizer='adam',

loss={'classification_output': 'sparse_categorical_crossentropy', 'regression_output': 'mse'},

metrics={'classification_output': 'accuracy', 'regression_output': 'mse'})



# Обучение модели

model.fit(X, {'classification_output': y_class, 'regression_output': y_reg}, epochs=50, batch_size=16)




Объяснение кода:

🟠Определение входного слоя: Определяем входной слой, принимающий признаки.

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

🟠Отдельные выходные слои:Создаем два выходных слоя, один для классификации (с функцией активации softmax) и один для регрессии (с линейной функцией активации).

🟠Создание и компиляция модели: Компилируем модель, указав разные функции потерь для каждой задачи (cross-entropy для классификации и MSE для регрессии).

🟠Обучение модели: Обучаем модель, передавая одновременно два целевых признака.



Ставь 👍 и забирай 📚 Базу знаний