#python #machine-learning #scikit-learn #regression #decision-tree
#python #машинное обучение #scikit-учиться #регрессия #дерево решений
Вопрос:
Я хочу использовать DecisionTreeRegressor для регрессии с несколькими выходами, но я хочу использовать другой вес «важности» для каждого вывода (например, точное предсказание y1 в два раза важнее, чем предсказание y2).
Есть ли способ включить эти веса непосредственно в DecisionTreeRegressor sklearn? Если нет, то как я могу создать пользовательский критерий MSE с разными весами для каждого вывода в sklearn?
Ответ №1:
Я боюсь, что вы можете предоставить только один набор веса, когда вы подходитеhttps://scikit-learn.org/stable/modules/generated/sklearn.tree .DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor.fit
И что еще более разочаровывает, так это то, что, поскольку разрешен только один набор весов, все алгоритмы в sklearn основаны на одном наборе весов.
Что касается пользовательского критерия:
Аналогичная проблема существует в scikit-learnhttps://github.com/scikit-learn/scikit-learn/issues/17436
Потенциальным решением является создание класса критериев, имитирующего существующий (например, MAE) вhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_criterion.pyx#L976
Однако, если вы посмотрите код в деталях, вы обнаружите, что все переменные, касающиеся весов, являются «одним набором весов», что не является специфичным для задач.
Поэтому для настройки вам может потребоваться взломать много кода, в том числе:
-
взлом функции подгонки для принятия 2D массива весовhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_classes.py#L142
-
Обход проверки (в противном случае продолжайте взламывать …)
-
Измените построитель дерева, чтобы разрешить весаhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx#L111 Это ужасно, есть много связанных переменных, вы должны изменить double на double*
-
Измените класс критерия, чтобы он принимал 2-мерный массив весовhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_criterion.pyx#L976
-
При инициализации, сбросе и обновлении вы должны сохранять атрибуты, такие как self .weighted_n_node_samples, специфичный для выходных данных (задач).
TBH, я думаю, что это действительно сложно реализовать. Возможно, нам нужно поднять вопрос для scikit-learn group.