首页 > 解决方案 > StandardScaler , OneHotEncoder 在以不同顺序使用时显示不同的分数

问题描述

我有一个包含多行的桌面输入数据框,如下所示:

    Company TypeName   Ram  Weight Touch Ips    ppi         Cpu            HDD  SSD Gpu     os
0   Apple   Ultrabook   8   1.37    0    1      226.983005  Intel Core i5   0   128 Intel   Mac
1   Apple   Ultrabook   8   1.34    0    0      127.677940  Intel Core i5   0   0   Intel   Mac
2   HP      Notebook    8   1.86    0    0      141.211998  Intel Core i5   0   256 Intel   Win
.
.

最后有一个价格列成为目标列。我正在尝试应用简单的线性回归模型(具有多项式特征),但我看到 r2_score 有很多差异!

问题 1. 为什么以下两个代码的 r2_scores 差异如此之大?

//一个。StandardScaler 然后 OneHotEncoder:

kf = KFold(n_splits=3, shuffle=True, random_state=2)
ss = StandardScaler()
scale = ColumnTransformer(transformers=[
    ('scale',StandardScaler(),[2,3,4,5,6,8,9])
],remainder='passthrough')

col_tnf = ColumnTransformer(transformers=[
    ('col_tnf',OneHotEncoder(sparse=False,drop='first'),[7,8,9,10,11])
],remainder='passthrough')

pf = PolynomialFeatures(degree=2)
lr = LinearRegression()

pipe = Pipeline([
    ('scale', scale),
    ('col_tnf',col_tnf),
    ('pf', pf),
    ('lr',lr)
])
r2_score(y, cross_val_predict(pipe, X,y, cv=kf))  # gives output as -2.7004063755764876e+21

//b。OneHotEncoder 然后是 StandardScaler:

kf = KFold(n_splits=3, shuffle=True, random_state=2)
ss = StandardScaler()
col_tnf = ColumnTransformer(transformers=[
    ('col_tnf',OneHotEncoder(sparse=False,drop='first'),[0,1,7,10,11])
],remainder='passthrough')

std_scaler = ColumnTransformer(transformers=[
    ('std_scaler',StandardScaler(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37])
],remainder='passthrough')

pf = PolynomialFeatures(degree=2)
lr = LinearRegression()
pipe = Pipeline([
    ('col_tnf',col_tnf),
    ('pf', pf),
    ('std_scaler', std_scaler),
    ('lr',lr)
])
r2_score(y, cross_val_predict(pipe, X,y, cv=kf)) # gives r2_score as 0.6137227291296413

问题 2. 如何干净地为“std_scaler”提供从 0 到 37 的全范围列,而不是提及每一列?

问题 3. 如果我设置: kf = KFold(n_splits=3),第一个代码没有随机播放。上面,它总是抛出异常,如:在转换过程中在第 0 列中找到未知类别 ['Huawei']

我究竟做错了什么!非常感谢任何指示。

标签: machine-learninglinear-regressionpipelinek-fold

解决方案


推荐阅读