我在尝试训练sklearn的 GradientBoostingRegressor 并进行预测时遇到了一种奇怪的行为。我将举例说明在简化数据集上的问题,但问题仍然存在于更大的数据集上。我有以下2个从大数据集改编的小数据集。正如您所看到的,两种情况下目标变量是相同的,但输入变量虽然它们的值彼此接近但是不同。目标变量(Y)位于最后一列。
我有以下代码:
d1 = {'0':[101869.2,102119.9,102138.0,101958.3,101903.7,12384900],
'1':[101809.1,102031.3,102061.7,101930.0,101935.2,11930700],
'2':[101978.0,102208.9,102209.8,101970.0,101878.6,12116700],
'3':[101869.2,102119.9,102138.0,101958.3,101903.7,12301200],
'4':[102125.5,102283.4,102194.0,101884.8,101806.0,10706100],
'5':[102215.5,102351.9,102214.0,101769.3,101693.6,10116900]}
data1 = pd.DataFrame(d1).T
X1 = data1.ix[:,:4]
Y = data1[5]
d2 = {'0':[101876.0,102109.8,102127.6,101937.0,101868.4,12384900],
'1':[101812.9,102021.2,102058.8,101912.9,101896.4,11930700],
'2':[101982.5,102198.0,102195.4,101940.2,101842.5,12116700],
'3':[101876.0,102109.8,102127.6,101937.0,101868.4,12301200],
'4':[102111.3,102254.8,102182.8,101832.7,101719.7,10706100],
'5':[102184.6,102320.2,102188.9,101699.9,101548.1,10116900]}
data2 = pd.DataFrame(d2).T
X2 = data2.ix[:,:4]
Y = data2[5]
re1 = ensemble.GradientBoostingRegressor(n_estimators=40,max_depth=None,random_state=1)
re1.fit(X1,Y)
pred1 = re1.predict(X1)
re2 = ensemble.GradientBoostingRegressor(n_estimators=40,max_depth=None,random_state=3)
re2.fit(X2,Y)
pred2 = re2.predict(X2)
,其中 X1是 pandas DataFrame,对应第一数据集上的第1列到第5列 X2是 pandas DataFrame,对应第二数据集上的第1列到第5列 Y表示目标列。 我面临的问题是我无法解释为什么 pred1 与 pred2 完全相同?只要 X1 和 X2 不一样 pred1 且 pred2 也必须不同,那么它们不是?请帮我找一个错误的假设。
答案 0 :(得分:3)
你所观察到的是完全可以预期的。 您为数据拟合了一个高复杂度的估算器(max_depth = None),因此很容易通过心脏学习所有数据,即完全过度训练数据。 然后,预测将是您为培训提供的任何标签。
请看Peter在这里谈论如何正确调整GradientBoosting: https://www.youtube.com/watch?v=-5l3g91NZfQ
无论如何,你至少应该有一个测试集。
答案 1 :(得分:0)
我的猜测是,因为你将X1和X2拟合到相同的Y,所以pred1和pred2是相似的是合理的。当你的回归量非常强大(可以适应任何东西)或者你的问题太容易了(你的回归量可以完全适合),那么pred1和pred2都将等于Y.