scikit 学习回归决策树的意外结果

数据挖掘 机器学习 scikit-学习 回归 决策树
2021-09-24 12:58:46

为这个新手问题道歉。DecisionTreeRegressor我有一个带有多变量输出的 scikit learn 。如果输出格式为 [ output_var1, output_var2 ],其中每个变量都是连续数字而不是整数,为什么结果是 [1, 1] 而不是 [1.5, 1.5] ?在这个模型中需要改变什么才能得到 [1.5, 1.5] ?

from sklearn.tree import DecisionTreeRegressor

X = [ [1,1], [2,2], [3,3] ]
y = [ [1,1], [2,2], [3,3] ]

print('X:' , X)
print('-----------------------------')
print('y:' , y)
print('-----------------------------')

regr = DecisionTreeRegressor()
regr.fit(X, y)

X_test = [ [1.5, 1.5] ]
print('X_test:' , X_test)
print('-----------------------------')

y_result = regr.predict(X_test)
print('y_result:' , y_result )

结果:

X: [[1, 1], [2, 2], [3, 3]]
-----------------------------
y: [[1, 1], [2, 2], [3, 3]]
-----------------------------
X_test: [[1.5, 1.5]]
-----------------------------
y_result: [[1. 1.]]
3个回答

这是您的数据中归纳树的可视化:

回归器

如您所见,它永远无法预测[[1.5, 1.5]]您的数据太纯了,归纳树将完全适合它,所有叶节点都只有一个样本。如果叶节点中有多个样本,则预测值是这些样本的 y 值的平均值。

此外,树不是引入恒等函数的最佳模型(y=f(x)=x)。树通过创建规则和正交划分特征空间(即特征空间中只有垂直或水平线)来工作。

换句话说,您的模型没有学习到这一点,f(1.5, 1.5) = (1.5, 1.5)因为 a) 没有足够的数据,b) 无论如何,树都不擅长这样做。

数据被模型过度拟合,模型正在记忆训练数据。鉴于训练样本很少,决策树无法学习一般模式。如果给模型更多的变化更大的训练数据,它可以学习一般模式。

一种方法是不改变模型,而是改变数据。您可以模拟大量随机数据并获得大致正确的结果:

from sklearn.tree import DecisionTreeRegressor
import numpy as np

nums = np.random.random(size=100_000)*3
X = list(zip(nums, nums))
y = list(zip(nums, nums))
regr = DecisionTreeRegressor()
regr.fit(X, y)
X_test = [ [1.5, 1.5] ]
y_result = regr.predict(X_test)
assert np.isclose(y_result, X_test, atol=.001)