Дерево решений не захватывает дисперсию зависимой переменной - PullRequest
0 голосов
/ 07 марта 2019

Я работаю с регрессорами дерева решений. Количество точек данных составляет 15000, с 15 функциями. Проблема, с которой я сталкиваюсь, заключается в том, что даже в условиях высокой перестройки (я сделал глубину = 25, min.samples на листьях = 2), прогнозы имеют гораздо меньшую дисперсию, чем зависимая переменная (то есть она все еще не соответствует). Сначала я подумал, что это может быть проблемой дисперсии смещения, однако среднее значение всех предсказаний и среднее значение зависимой переменной равно 9 знакам после запятой.

т.е. это что-то выглядит так: enter image description here

В результате прогноз и зависимая переменная имеют вид, подобный следующему: enter image description here

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

Может кто-нибудь объяснить, что может быть не так? Любая помощь должна быть оценена по достоинству. Спасибо

1 Ответ

2 голосов
/ 07 марта 2019

За исключением деталей ваших собственных данных, это в принципе не удивительно, если вы понимаете, что на самом деле делает дерево решений под прикрытием.

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

Учитывая это, интуитивно не должно быть такого удивительного, что дисперсия прогнозов ниже, чем фактические значения, детали того, насколько они ниже, зависят от количества терминальных узлов (то есть max_depth) и, конечно, сами данные.

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

enter image description here

Давайте адаптируем код из этого примера, добавив еще несколько выбросов (которые увеличивают проблему):

import numpy as np
from sklearn.tree import DecisionTreeRegressor

# dummy data
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - 5*rng.rand(16)) # modify here - 5*

estimator_1 = DecisionTreeRegressor(max_depth=2)
estimator_1.fit(X, y)

estimator_2 = DecisionTreeRegressor(max_depth=5)
estimator_2.fit(X, y)

y_pred_1 = estimator_1.predict(X)
y_pred_2 = estimator_2.predict(X)

Давайте теперьпроверьте дисперсии:

np.var(y) # true data
# 11.238416688700267

np.var(y_pred_1) # max_depth=2
# 1.7423865989859313

np.var(y_pred_2) # max_depth=5
# 6.1398871265574595

Как и ожидалось, дисперсия прогнозов возрастает с увеличением глубины дерева, но этовсе еще (значительно) ниже, чем один из истинных данных.Хотя, конечно, средние значения всех одинаковы:

np.mean(y)
# -1.2561013675900665

np.mean(y_pred_!)
# -1.2561013675900665

np.mean(y_pred_2)
# -1.2561013675900665

Все это может показаться неожиданным для новичков, особенно если они пытаются "наивно" расширить линейное мышление линейной регрессии;но деревья решений живут в своей собственной области, которая, безусловно, отличается (и довольно далеко) от линейной.

Чтобы вернуться к проблеме дискретизации, с которой я открыл ответ, давайте проверим, сколько уникальных значений мы получаем занаши прогнозы;оставив обсуждение только для y_pred_1 для простоты:

np.unique(y_pred_1)
# array([-11.74901949,  -1.9966201 ,  -0.71895532])

Вот и все; каждый вывод, который вы получите из этого дерева регрессии, будет одним из этих 3 значений, и никогда ничего "между", как -10, -5.82 или [...](т.е. без интерполяции ).Теперь, опять же, по крайней мере, интуитивно говоря, вы должны быть в состоянии убедить себя в том, что дисперсия при таких обстоятельствах неудивительно (намного ...) ниже, чем у фактических данных (по умолчанию прогнозы менее рассеяны) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...