测试数据集PCA问题

来源:2-6 关于回归和分类

Howiedu

2022-08-10

老师您好。
请问X_train数据集进行PCA之后,X_test数据集也需要进行PCA吗?

当我使用网格搜索,在Pinepline内进行逻辑回归后(内含PCA),直接对测试数据集进行grid_search.best_estimator_.score(X_test,y_test)操作,得到的准确率和我对X_test进行PCA后的准确率不一样。

图片描述

我理解中X_train数据集在PCA之后坐标轴就发生了改变,那么按道理测试数据集也应该进行PCA?但是不是说测试数据集不能改动吗?
有点疑惑,下面贴上代码。

from sklearn.preprocessing import PolynomialFeatures 
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

def PolynomialLogisticRegression(degree = 2,C = 0.1):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('pca',PCA(0.95)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression(C = C)) 
    ])

# 待进行网格搜索的算法    
poly_log_reg = PolynomialLogisticRegression()
 
# 准备待搜索的参数列表
#注意在这个地方有一定的改动,需要使用{$Pipeline中的对象名称}__{$参数名}
#来指向Pipeline中需要修改的参数
C_PARM = [0.1,0.2,0.3,0.4,0.5]
param_grid = [
    {
        'poly__degree': [i for i in range(1, 11)], 
        'log_reg__C': [i for i in C_PARM]
    }
]
 
# 实例化GridSearchCV进行网格搜索
grid_search = GridSearchCV(poly_log_reg, param_grid)
grid_search.fit(X_train,y_train)

grid_search.best_estimator_.score(X_test,y_test)
>>>输出:0.96

pcax = PCA(0.95) 
pcax.fit(X_train)
X_test_down = pcax.transform(X_test)
grid_search.best_estimator_.score(X_test_down,y_test)
>>>输出:0.9
写回答

2回答

liuyubobobo

2022-08-10

1)

X_test数据集也需要进行PCA吗?


需要。


2)

但是不是说测试数据集不能改动吗?


不是测试数据集不能改动,我习惯于说“测试数据集不能动”,这里不能动的意思是,在模型训练阶段,不能使用任何测试集的信息。要把测试数据集放到一边,当这个测试数据集不存在,不能动他。(测试数据集不能参与训练。)

当模型训练结束,报告测试结果的时候,可以使用测试集了,测试,对测试数据集的所有的操作,要和训练集一致。(比如对训练集做标准化了,对测试集也要做。对训练集做某种特征工程了,对测试集也要做。对训练集 PCA 了,对测试集也要做。)


3)

你得到这两个结果的这两版代码,其实都做 PCA 了。但是得到 0.96 的结果是正确的做法。


将 X_test 直接扔给 grid_search.best_estimator_,X_test 就会走一遍训练 grid_search 传入的那个 pipeline。

也就是,整个 X_test 会首先做多项式特征,让后 PCA,然后标准化,最后把得到的数据扔给一个逻辑回归分类器。每一步需要的参数都是你训练过程得到的参数。


但是,你的第二个做法,相当于首先基于 X_train,得到了一个 PCA,用这个 PCA 作用于 X_test,得到了 X_test_down。然后,再对这个 X_test_down 做多项式特征,之后又 PCA,然后标准化,最后给了一个逻辑回归。(这些步骤都隐藏在 grid_search.best_estimator_ 中了)。


所以,这个处理过程和原始对 X_train 的处理过程是不一致的,因此这个结果不可信。



继续加油!:)


1
4
Howiedu
回复
liuyubobobo
老师,已经把截图贴在回复中啦~
2022-08-10
共4条回复

Howiedu

提问者

2022-08-10

//img.mukewang.com/szimg/62f39356095659a407710828.jpg

老师 这是刚刚1问题的截图~

2问题我搜了下您之前给别的同学的解答,已经搞明白啦,感谢!

0
1
liuyubobobo
运行 estimator 的 get_params() 方法将可以看到详细的参数列表。即运行:grid_search.best_estimator_.get_params() 继续加油!:)
2022-08-11
共1条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5904 学习 · 2455 问题

查看课程