Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在sklearn中实施前向测试?_Python_Scikit Learn_Time Series_Cross Validation - Fatal编程技术网

Python 如何在sklearn中实施前向测试?

Python 如何在sklearn中实施前向测试?,python,scikit-learn,time-series,cross-validation,Python,Scikit Learn,Time Series,Cross Validation,在sklearn中,GridSearchCV可以将管道作为参数,通过交叉验证找到最佳估计量。但是,通常的交叉验证是这样的: 为了交叉验证时间序列数据,训练和测试数据通常按如下方式进行分割: 也就是说,测试数据应始终领先于训练数据 我的想法是: 编写我自己的k-fold版本类并将其传递给GridSearchCV,这样我就可以享受管道的便利。问题在于,让GridSearchCV使用指定的训练和测试数据索引似乎很困难 编写一个新类GridSearchWalkForwardTest,它类似于GridS

在sklearn中,GridSearchCV可以将管道作为参数,通过交叉验证找到最佳估计量。但是,通常的交叉验证是这样的:

为了交叉验证时间序列数据,训练和测试数据通常按如下方式进行分割:

也就是说,测试数据应始终领先于训练数据

我的想法是:

  • 编写我自己的k-fold版本类并将其传递给GridSearchCV,这样我就可以享受管道的便利。问题在于,让GridSearchCV使用指定的训练和测试数据索引似乎很困难

  • 编写一个新类GridSearchWalkForwardTest,它类似于GridSearchCV,我正在研究源代码grid_search.py,发现它有点复杂


  • 欢迎任何建议。

    我的意见是,您应该尝试实施自己的GridSearchWalkForwardTest。我曾经使用GridSearch进行过培训,并且自己实现了相同的GridSearch,但我没有得到相同的结果,尽管我应该这样做

    我最后做的是使用我自己的函数。您可以更好地控制培训和测试集,也可以更好地控制培训的参数

    我认为您可以使用一个方法来代替您自己的实现,或者作为实现CV方法的基础,这正是您所描述的


    在仔细研究了一下之后,似乎有人在TimeSeriesSplit中添加了一个max_train_尺寸,它似乎可以满足您的需求。

    几个月前,我做了一些关于这一切的工作

    您可以在以下问题/答案中查看:


    我写了一些代码,希望能对别人有所帮助

    “序列”是时间序列的周期。我正在训练一个序列模型,最多40个,预测41个,然后训练最多41个,预测42个,以此类推……直到最大“数量”成为目标变量。然后我所有错误的平均值将作为我的评估指标

    for sequence in range(40, df.sequence.max() + 1):
            train = df[df['sequence'] < sequence]
            test = df[df['sequence'] == sequence]
            X_train, X_test = train.drop(['quantity'], axis=1), test.drop(['quantity'], axis=1)
            y_train, y_test = train['quantity'].values, test['quantity'].values
        
            mdl = LinearRegression()
            mdl.fit(X_train, y_train)
            y_pred = mdl.predict(X_test) 
            error = sklearn.metrics.mean_squared_error(test['quantity'].values, y_pred)
            RMSE.append(error)
    print('Mean RMSE = %.5f' % np.mean(RMSE))
        
    
    用于范围内的序列(40,df.sequence.max()+1):
    列车=df[df[‘顺序’]<顺序]
    测试=df[df['sequence']==序列]
    X_系列,X_测试=系列下降(['数量'],轴=1),测试下降(['数量'],轴=1)
    y_列,y_测试=列['quantity']。值,测试['quantity']。值
    mdl=线性回归()
    mdl.fit(X_系列、y_系列)
    y_pred=mdl.预测(X_检验)
    误差=sklearn.metrics.mean_squared_误差(测试['quantity']值,y_pred)
    RMSE.append(错误)
    打印('Mean RMSE=%.5f'%np.Mean(RMSE))
    
    利用sktime TimeSeriesSplit,定义列车和测试尺寸固定滚动窗口。注:第一个培训窗口可能包括额外的多余数据(宁可保留也不要剪辑):

    def tscv(X,列车尺寸,测试尺寸):
    折叠=数学地板(透镜(X)/测试尺寸)
    tscv=时间序列分裂(n\u分裂=折叠,测试大小=测试大小)
    拆分=[]
    对于列车索引,在tscv.split(X)中测试列车索引:
    如果len(列车索引)<列车尺寸:
    持续
    elif len(列车索引)-列车大小<测试列车大小,len(列车索引)-列车大小>0:
    通过
    其他:
    列车索引=列车索引[-列车大小:]
    拆分.追加([列索引,测试索引])
    返回拆分
    
    看来你是对的,向前走交叉验证是sci kit learn的TimeSeriesPlit算法。但是,在诸如LassoCV和ElasticNetCV的cv估计中,如何选择它作为“cv”对象的选择呢?KFold、LeaveOneOut、train_test_split和其他算法属于sklearn的交叉验证模块,我们可以从中为这些估计器选择一个“cv”对象。然而,TimeSeriesSplit属于sklearn的model_选择模块,目前还不是一个选择。
    def tscv(X, train_size, test_size):
        folds = math.floor(len(X) / test_size)
        tscv = TimeSeriesSplit(n_splits=folds, test_size=test_size)
        splits = []
        for train_index, test_index in tscv.split(X):
            if len(train_index) < train_size:
                continue
            elif len(train_index) - train_size < test_size and len(train_index) - train_size > 0:
                pass
            else:
                train_index = train_index[-train_size:]
            splits.append([train_index, test_index])
        return splits