За исключением деталей ваших собственных данных, это в принципе не удивительно, если вы понимаете, что на самом деле делает дерево решений под прикрытием.
То, что дерево регрессии на самом деле возвращает в качестве результата, является среднее значение зависимой переменной y
обучающих выборок, которые попадают в соответствующие конечные узлы (листья).Практически это означает, что выходные данные по умолчанию дискретизированы : значения, которые вы получаете на выходе, относятся к конечному набору значений в конечных узлах без какой-либо интерполяции между ними.
Учитывая это, интуитивно не должно быть такого удивительного, что дисперсия прогнозов ниже, чем фактические значения, детали того, насколько они ниже, зависят от количества терминальных узлов (то есть max_depth
) и, конечно, сами данные.
Следующий график из документации должен помочь визуализировать идею - должно быть интуитивно понятно, что дисперсия данных действительно выше, чем одно из (дискретных) предсказаний:
Давайте адаптируем код из этого примера, добавив еще несколько выбросов (которые увеличивают проблему):
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
или [...](т.е. без интерполяции ).Теперь, опять же, по крайней мере, интуитивно говоря, вы должны быть в состоянии убедить себя в том, что дисперсия при таких обстоятельствах неудивительно (намного ...) ниже, чем у фактических данных (по умолчанию прогнозы менее рассеяны) ...