如何交叉验证pca在sklearn管道没有过拟合?



输入的是时间序列数据。我想用PCA分解数据集(我不想先对整个数据集进行PCA,因为那将是过拟合),然后对每个组件使用特征选择(在KNN回归模型上拟合)。

这是我到目前为止的代码:

tscv = TimeSeriesSplit(n_splits=10)
pca = PCA(n_components=.5,svd_solver='full').fit_transform()
knn = KNeighborsRegressor(n_jobs=-1)
sfs = SequentialFeatureSelector(estimator=knn,n_features_to_select='auto',tol=.001,scoring=custom_scorer,n_jobs=-1)
pipe = Pipeline(steps=[("pca", pca), ("sfs", sfs), ("knn", knn)])
cv_score = cross_val_score(estimator=pipe,X=X,y=y,scoring=custom_scorer,cv=tscv,verbose=10)
print(np.average(cv_score),' +/- ',np.std(cv_score))
print(X.columns)

问题是我想确保PCA在计算哪些特征方差时不会查看整个数据集。我也想把它改成合身的,但是行不通。使用以下错误代码:

TypeError: All intermediate steps should be transformers and implement fit and transform or be the string 'passthrough' '<bound method PCA.fit_transform of PCA(svd_solver='full')>' (type <class 'method'>) doesn't

TypeError: fit_transform() missing 1 required positional argument: 'X'

在定义管道时不应该使用pca = PCA(...).fit_transformpca = PCA(...).fit_transform()

应该使用pca = PCA(...)fit_transform方法在模型拟合过程中在管道内自动调用(在cross_val_score中)。

最新更新