Многоцелевая, имеющая зависимые переменные как классификация, так и регрессия?
У меня есть два входа в качестве моих независимых переменных, и я хочу предсказать 3 зависимые переменные на основе этого.
Мои 3 зависимые переменные имеют 2 мультикатегориальных класса и 1 имеет непрерывные значения. Ниже мои целевые переменные.
typeid_encoded
, reporttype_encoded
, log_count
typeid_encoded
а также reporttype_encoded
имеют категориальный тип, где каждая переменная имеет минимум 5 различных категорий.
log_count
является непрерывной переменной.
Я много гуглил, нашел только две разные модели. Но я не смог найти ни одного примера для этого. пожалуйста, опубликуйте пример, чтобы он мне помог?
или есть какой-то другой подход к использованию нейронных сетей, это возможно сделать в одной модели?
Мне нужен пример использования sci-kit learn. Заранее спасибо!
1 ответ
Там нет ничего в sklearn
это разработано для этого, но есть несколько маленьких уловок, которые вы могли бы использовать, чтобы сделать классификаторы как это.
Слово предостережения, они не обязательно идеально подходят для вашей проблемы, очень трудно догадаться, что будет работать для ваших данных.
Два первых, которые пришли мне в голову, были Knn и Random Forests, но вы можете существенно адаптировать любой алгоритм регрессии с несколькими выходами для этих целей.
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import NearestNeighbors
# Create some data to look like yours
n_samples = 100
n_features = 5
X = np.random.random((n_samples, n_features))
y_classifcation = np.random.random((n_samples, 2)).round()
y_regression = np.random.random((n_samples))
y = np.hstack((y_classifcation, y_regression[:, np.newaxis]))
Теперь у меня есть набор данных с двумя двоичными переменными и одной непрерывной
Начните с Knn, вы можете сделать это с KNeighborsRegressor
но я чувствовал, что это лучше иллюстрирует решение
# use an odd number to prevent tie-breaks
nn = NearestNeighbors(n_neighbors=5)
nn.fit(X, y)
idxs = nn.kneighbors(X, return_distance=False)
# take the average of the nearest neighbours to get the predictions
y_pred = y[idxs].mean(axis=1)
# all predictions will be continous so just round the continous ones
y_pred[:, 2] = y_pred[:, 2].round()
Теперь наш y_pred
является вектором предсказаний как для классификации, так и для регрессии. Итак, теперь давайте посмотрим на Случайный Лес.
# use an odd number of trees to prevent predictions of 0.5
rf = RandomForestRegressor(n_estimators=11)
rf.fit(X, y)
y_pred = rf.predict(X)
# all predictions will be continous so just round the continous ones
y_pred[:, 2] = y_pred[:, 2].round()
Я бы сказал, что эти "хаки" довольно разумны, потому что они не слишком далеки от того, как работают настройки классификации этих алгоритмов.
Если у вас есть проблема мультикласса, которая у вас есть горячим кодированием, то вместо округления вероятности до бинарного класса, как я делал выше, вам нужно будет выбрать класс с наибольшей вероятностью. Вы можете сделать это довольно просто, используя что-то вроде этого
n_classes_class1 = 3
n_classes_class2 = 4
y_pred_class1 = np.argmax(y_pred[:, :n_classes_class1], axis=1)
y_pred_class2 = np.argmax(y_pred[:, n_classes_class1:-1], axis=1)