Пользовательский критерий для DecisionTreeRegressor в sklearn

#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

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

Поэтому для настройки вам может потребоваться взломать много кода, в том числе:

  1. взлом функции подгонки для принятия 2D массива весовhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_classes.py#L142

  2. Обход проверки (в противном случае продолжайте взламывать …)

  3. Измените построитель дерева, чтобы разрешить весаhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx#L111 Это ужасно, есть много связанных переменных, вы должны изменить double на double*

  4. Измените класс критерия, чтобы он принимал 2-мерный массив весовhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_criterion.pyx#L976

  5. При инициализации, сбросе и обновлении вы должны сохранять атрибуты, такие как self .weighted_n_node_samples, специфичный для выходных данных (задач).

TBH, я думаю, что это действительно сложно реализовать. Возможно, нам нужно поднять вопрос для scikit-learn group.