请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

测试数据集PCA问题

老师您好。
请问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回答

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 回复 有任何疑惑可以回复我~
  • 提问者 Howiedu #1
    原来如此!明白了。
    
    另外还有一个问题老师,我按照您说的方法网格搜索了逻辑回归,但是发现在寻找grid_search.best_estimator_的过程中并没有显示PolynomialFeatures的最佳degree,但是找到了正则化的最佳C=0.5,这个也没有对我后面的操作产生影响,请问这部分是不需要我去管吗?(对不起回复没有办法贴图)
    回复 有任何疑惑可以回复我~ 2022-08-10 16:40:55
  • 提问者 Howiedu #2
    Q2已解决~
    回复 有任何疑惑可以回复我~ 2022-08-10 16:42:57
  • liuyubobobo 回复 提问者 Howiedu #3
    问题 1 你回答一下你的这个问题,再回答中付一下截图(而不是在这里评论)。
    
    问题 2:PCA 应该在多项式特征之后做。多项式特征产生了高维的数据,很多维度可能是冗余的,可以靠 PCA 去除。先升维再降维不是多此一举。因为降维不是简单把升出来的维度扔掉,而是把没用的维度扔掉(这个说法不准确,请再仔细回顾 PCA,理解一下 PCA 降维的原理)。升维可能升出有用的维度,降维只可能降掉没用的维度,升出来的有用的维度对应的信息不会抹掉。(但是,一个很重要的但是,实际上,使用多项式升出特别有用的维度挺少见的。所以在实际中,多项式特征并没有那么常用。但这不改变这个解释。)
    回复 有任何疑惑可以回复我~ 2022-08-10 17:00:02
提问者 Howiedu 2022-08-10 19:16:03

https://img1.sycdn.imooc.com//szimg/62f39356095659a407710828.jpg

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

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

0 回复 有任何疑惑可以回复我~
  • 运行 estimator 的 get_params() 方法将可以看到详细的参数列表。即运行:grid_search.best_estimator_.get_params()
    
    继续加油!:)
    回复 有任何疑惑可以回复我~ 2022-08-11 14:56:59
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信