Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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/8/perl/10.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 如何在使用带有TimeSeriesSplit的GridSearchCV时正确使用定标器_Python_Machine Learning_Scikit Learn_Cross Validation_Grid Search - Fatal编程技术网

Python 如何在使用带有TimeSeriesSplit的GridSearchCV时正确使用定标器

Python 如何在使用带有TimeSeriesSplit的GridSearchCV时正确使用定标器,python,machine-learning,scikit-learn,cross-validation,grid-search,Python,Machine Learning,Scikit Learn,Cross Validation,Grid Search,我目前正在使用GridSearchCV和TimeSeriesSplit这样,以便将我的数据拆分为5个CV拆分 X = data.iloc[:, 0:8] y = data.iloc[:, 8:9] SVR_parameters = [{'kernel': ['rbf'], 'gamma': [.01,.001,1], 'C': [1,100]}] gsc = GridSearchCV(SVR(), param_grid=SVR_pa

我目前正在使用
GridSearchCV
TimeSeriesSplit
这样,以便将我的数据拆分为5个CV拆分

X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]

SVR_parameters = [{'kernel': ['rbf'],
               'gamma': [.01,.001,1],
               'C': [1,100]}]

gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
                cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)
gsc.fit(X, y)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)
我的理解是,在使用定标器时,您希望仅在训练集上安装定标器,并使用该定标器对象转换测试集,以防止数据泄漏,因此基本上如下所示:

            scaler_X = StandardScalar()
            scaler_y = StandardScalar()
            scaler_X.fit(X_train)
            scaler_y.fit(y_train)
            X_train, X_test = scaler_X.transform(X_train), scaler_X.transform(X_test)
            y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)
我的问题是: 如果我执行这种类型的缩放操作,我将如何使
GridSearchCV
在整个数据集上进行分割?如果我只是将
gsc
对象中的
X
变量替换为
X\u列
,它将省略
X\u测试
,对吗

我想知道在
GridSearchCV

我希望我解释得足够清楚。如果你需要澄清什么,请告诉我


更新:

添加完整代码以帮助更好地解释

X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, shuffle=False)

test_index = X_test.index.values.tolist()

scaler_x = StandardScaler()
scaler_y = StandardScaler()
scaler_x.fit(X_train)
scaler_y.fit(y_train)

X_train, X_test = scaler_x.transform(X_train), scaler_x.transform(X_test)
y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)




SVR_parameters = [{'kernel': ['rbf'],
               'gamma': [.1, .01, .001],
               'C': [100,500,1000]}]

gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
   cv=TimeSeriesSplit(n_splits=5).split(X_train),verbose=10, n_jobs=-1, refit=True)

gsc.fit(X_train, y_train)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)
y_pred = gsc.predict(X_test)
y_pred = scaler_y.inverse_transform(y_pred)
y_test = scaler_y.inverse_transform(y_test)
mae = round(metrics.mean_absolute_error(y_test,y_pred),2)
mse = round(metrics.mean_squared_error(y_test, y_pred),2)
y_df = pd.DataFrame(index=pd.to_datetime(test_index))
y_pred = y_pred.reshape(len(y_pred), )
y_test = y_test.reshape(len(y_test), )
y_df['Model'] = y_pred
y_df['Actual'] = y_test
y_df.plot(title='{}'.format(gsc.cv_results_['params'][gsc.best_index_]))

使用管道() :


另请参见本帖的幕后步骤:

我实际上在那篇帖子上发布了一条回复,却没有意识到你就是回复我帖子的人。我的后续问题是,如果我像你建议的那样使用管道,我是否会失去使用单独的Scaler对象来分别适应X和y数据集以避免“数据泄漏”的能力,就像我在第二篇代码中概述的那样?如果我使用管道,我甚至不确定@serafeimAlso是否需要额外的步骤。然后是否可以访问StandardScalar的逆变换方法以将我的数据恢复到原始格式,或者您是否可以只使用管道的逆变换方法来撤消所有转换步骤?对于第一个问题,您不需要在
y
上应用
StandardScalar
y
是要预测的变量。按照我的答案使用代码,并且没有数据泄漏的问题(我在这里一步一步地解释了它是如何工作的:),因此如果我的X是8列不同范围的所有数字,那么我应用StandardScalar。它将逐个检查每一列,并计算每一列的平均值/标准偏差,然后在GridSearchCV步骤中预测y值。如果y始终是一个介于60-100之间的数字,则预测值将始终以缩放项(数字介于-1和1之间)表示,对吗?所以,当我在预测值上应用逆_变换,以原始y的60-100比例将其可视化时,我不需要y_比例来实现吗?我添加了我的实际代码块b/c,关于为什么我需要y_比例器的问题可能太复杂了。我的逻辑有问题吗?基本上,我只是喜欢在相同的比例,所以我可以画它更容易。
pipe = Pipeline([
        ('scale', StandardScaler()),
        ('clf', SVR())])

param_grid = dict(clf__gamma = [.01,.001,1],
                  clf__C = [1,100],
                  clf__kernel = ['rbf','linear'])

gsc = GridSearchCV(pipe, param_grid = param_grid, scoring='neg_mean_squared_error',
            cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)

gsc.fit(X,y)
print(gsc.best_estimator_)