【问题标题】:SK-Learn preprocessing Pipeline, garbaged outputSKLearn预处理Pipeline,垃圾输出
【发布时间】:2020-04-14 01:34:54
【问题描述】:

我构建了如下预处理管道

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, num_attr),
        ('cat', categorical_transformer, cat_attr)])

我正在尝试在我的 X_train 上安装管道。 X_train如下

icker       SF1            SF2            SF3              SF4              SF5 SF6
$NTAP   -0.628651934     0.98889147    -0.055714478     0.774378771   0.551088847   -1.329228593
$WYNN   1.315785931      1.438754002    0.187327182     0.608933159  -1.153029724   1.85944112
$DRI    -1.141388142    -1.455015677    0.332754543     0.674501682   0.111326137   -0.478596905
$ge     -0.054839437    -1.454148681    -0.162266534    -0.681870355  0.307868519   -0.529986948

我使用下面的块进行预处理

clf_nm = Pipeline(steps=[('preprocessor', preprocessor)])
X_train_nm = pd.DataFrame(clf_nm.fit_transform(X_train))

但是“X_train_nm”,上面的输出有如下垃圾值


0
0   (0, 0)\t0.42994752134634545\n (0, 1)\t0.569...
1   (0, 0)\t-0.47129140614423404\n (0, 1)\t0.13...
2   (0, 0)\t0.6391234497799465\n (0, 1)\t0.2931...
3   (0, 0)\t-2.0106536281536562\n (0, 1)\t-0.92...
4   (0, 0)\t0.9782971304731922\n (0, 1)\t0.6534...
... ...
18899   (0, 0)\t0.7572819165580632\n (0, 1)\t-0.354...
18900   (0, 0)\t-0.3687666927075019\n (0, 1)\t-0.88...
18901   (0, 0)\t-0.7313605840625186\n (0, 1)\t1.146...
18902   (0, 0)\t0.5782862084049006\n (0, 1)\t1.3732...
18903   (0, 0)\t0.4332583276430423\n (0, 1)\t-0.555...
18904 rows × 1 columns

谁能告诉我如何解决它?感谢帮助

【问题讨论】:

  • 您的管道在您提供的数据上运行良好。检查数据框特征的数据类型。

标签: python pandas scikit-learn pipeline


【解决方案1】:

您的 X_train 只有数字特征,而您为分类特征执行转换器。

【讨论】:

  • 也许只是应该设置 num_attr ?也不确定“icker”会发生什么,我认为它是“Ticker”:-)
【解决方案2】:

请注意,Pipeline 的目的是最后一步应该是一个预测器。在这里,您应该将预处理器包装在无效的管道中。您直接拨打preprocessor.fit_transform。在你的情况下,你应该有一些东西:

from sklearn.linear_model import LogisticRegression

pipe = make_pipeline(preprocessor, LogisticRegression()
y_pred = pipe.fit(X_train, y_train).predict(X_test)

所以在您的示例中,X_train 很奇怪,因为您没有分类特征。但是,您专门为这些列做了一个转换器。所以请注意,X_train 应该是几列,其中一些列是数字列,而另一些列是分类列。

最后一点,打印输出会给出奇怪的格式,因为ColumnTransformer 的输出可能是稀疏的(在这种情况下就是这样)。如果您想将表示视为一个 numpy 数组,只需执行print(preprocessor.fit_transform(X).A)。请注意,如果您在预处理期间使用零(例如使用 OneHotEncoder),则稀疏矩阵的内存效率会更高。

【讨论】:

  • 正如您正确指出的那样,我的输出是一个稀疏矩阵。因此,使用“todense()”将其转换为密集矩阵。这个技巧奏效了。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 2014-12-18
  • 1970-01-01
  • 2018-09-12
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多