Python 在循环中拟合集合回归器会生成重复值

Python 在循环中拟合集合回归器会生成重复值,python,regression,boosting,Python,Regression,Boosting,我正试图使用一个集合回归器来预测基于两个材料测量的产量。我的数据是年度数据,可以追溯到1965年。(由于这是针对使用敏感数据的工作项目而使用的,因此删除了一些细节并使用了随机数据。) 我已经将代码精简到最低限度,但我仍然看到了这个问题: import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor from xgboost.

我正试图使用一个集合回归器来预测基于两个材料测量的产量。我的数据是年度数据,可以追溯到1965年。(由于这是针对使用敏感数据的工作项目而使用的,因此删除了一些细节并使用了随机数据。)

我已经将代码精简到最低限度,但我仍然看到了这个问题:

import pandas as pd
import numpy as np

from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor
from xgboost.sklearn import XGBRegressor

X_past = pd.DataFrame(index = range(1965, 2020), data = dict(
    A = np.random.randint(4170, 19091, size = 55),
    B = np.random.randint(74, 337, size = 55)
))

X_future = pd.DataFrame(index = range(2020, 2023), data = dict(
    A = np.random.randint(4170, 19091, size = 3),
    B = np.random.randint(74, 337, size = 3)
))

y_past = pd.DataFrame(index = range(1965, 2020), data = dict(
    C = np.random.randint(12163, 42580, size = 55)
))

predictions = None
predictions = pd.DataFrame()

i = 0

while i < 10:
    i += 1
    
    reg = None
    y_pred = None
    
    X = X_past.values
    y = y_past.values.ravel()

    #reg = RandomForestRegressor(n_estimators = 300)
    reg = GradientBoostingRegressor(n_estimators = 300)
    #reg = XGBRegressor(n_estimators = 640, silent = True)

    reg.fit(X, y)

    y_pred = reg.predict(np.array(X_future))
    predictions = predictions.append(pd.Series(y_pred), ignore_index = True,)
    

predictions.columns = [2020, 2021, 2022]
predictions['Row-wise Duplicates'] = (predictions[2021] == predictions[2022])

predictions
将熊猫作为pd导入
将numpy作为np导入
从sklearn.employ导入GradientBoostingRegressor,RandomForestRegressor
从xgboost.sklearn导入XGBRegressor
X_过去=局部数据帧(索引=范围(19652020),数据=指令(
A=np.random.randint(417019091,size=55),
B=np.random.randint(74337,大小=55)
))
X_future=pd.DataFrame(指数=范围(2020年、2023年),data=dict(
A=np.random.randint(417019091,大小=3),
B=np.random.randint(74337,大小=3)
))
y_过去=局部数据帧(索引=范围(19652020),数据=指令(
C=np.random.randint(1216342580,大小=55)
))
预测=无
预测=pd.DataFrame()
i=0
当我<10时:
i+=1
reg=无
y_pred=无
X=X_过去的值
y=y_pass.values.ravel()
#reg=随机森林回归器(n_估计值=300)
reg=梯度增强回归器(n_估计值=300)
#reg=XGBRegressor(n_估计值=640,静默值=True)
注册适合度(X,y)
y_pred=reg.predict(np.array(X_future))
预测=预测.append(pd.Series(y\u pred),ignore\u index=True,)
expections.columns=[2020、2021、2022]
预测['Row-wise Duplicates']=(预测[2021]==预测[2022])
预言
产生如下结果:

2020 2021 2022 行复制 13211.008045 29624.483861 34110.523735 假的 13211.008045 29624.483861 33462.196606 假的 13211.008045 29624.483861 33867.781932 假的 13211.008045 29624.483861 33999.203849 假的 13211.008045 29624.483861 33947.950436 假的 13211.008045 29624.483861 33550.338744 假的 13211.008045 29624.483861 34079.297200 假的 13211.008045 29624.483861 33924.349324 假的 13211.008045 29624.483861 33195.847833 假的 13211.008045 29624.483861 33922.391200 假的
您使用的算法,以及您使用的参数,没有随机的内部元素。因此,给它相同的训练集和测试集(就像你在代码中做的那样)将产生相同的结果

您可以使用值小于
1
子样本
参数,使其使用不同的随机子样本来训练每个基础学习者(参见文档)

因此,如果您将线路替换为以下线路:

reg = GradientBoostingRegressor(n_estimators = 300, subsample = 0.9)

该算法将使用90%的随机数据子集来训练每个学习者,每次调用都会得到不同的结果。如果将其与
random_state
参数结合使用,您仍然可以使结果重现。

您至少应该提到从何处导入
GradientBoostingRegressionor
(我想是scikit learn,但我必须猜测吗?:)哦,哇。。。是的,我要学习。XGBoostingRegressionor来自xgboost。您在每次迭代中为算法提供相同的训练输入和相同的测试输入,为什么您期望不同的输出?这是有道理的,但为什么有时每行的输出不同呢?此外,为什么它有时会重复2021和2022列的结果?这些应该从三个不同的特征数组中预测出来。我不知道,根据你问题的输入,它会产生相同的行。但是我只运行了几次,你确定在多次运行脚本时不会产生不同的行吗?因为这是由您创建的随机输入引起的。。。抱歉,如果它是琐碎的,但有时很难看到简单的东西:)