首页 > 解决方案 > 特征工程:针对不同分布进行缩放

问题描述

我正在尝试了解扩展我的功能的最佳方式,并学习如何使用 SciKit 包来转换/适应我的预测数据集。

我有两组数据。

第一组具有正态分布,所以我只是想使用 minmax 缩放器缩放值(20-100 之间的正值)。

第二组特征有异常值,所以我相信鲁棒缩放器会给出更好的结果。

我的问题是

  1. 我可以在我的数据集上使用多个缩放器来解决使用 RF 的分类问题吗?
  2. 在 SciKit 中,当我尝试在训练数据上使用鲁棒缩放器仅缩放 1 个功能时,我收到了这个错误。ValueError: Expected 2D array, got 1D array instead: 我不确定如何读取这个错误,我不能只缩放一个特征吗?
  3. 如果我对我的数据使用两个缩放器,如果我希望一次进行一行预测,那么实现特征工程的最佳方法是什么?我只使用变换吗?

标签: pythonpandasscikit-learnfeature-selectionfeature-engineering

解决方案


  1. 是的,如果你觉得它有用,你可以。
  2. 您可以缩放单个特征。如果你做这样的事情,你会得到一个错误:
import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.DataFrame({
    "feature1": [1,2,3,4,5],
    "feature2": [100, 200, 300, 400, 500],
    "feature3": [200, 300, 400, 500, 600],
})

scaler = StandardScaler()

scaler.fit_transform(df["feature1"])

# output
ValueError: Expected 2D array, got 1D array instead:

如果这是单列,则需要另外重塑输入:

scaler = StandardScaler()

scaler.fit_transform(df["feature1"].values.reshape(-1, 1))

# output
array([[-1.41421356],
       [-0.70710678],
       [ 0.        ],
       [ 0.70710678],
       [ 1.41421356]])
  1. 您可以使用 ColumnTransformer 进行分支预处理。
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, MinMaxScaler


df = pd.DataFrame({
    "feature1": [1,2,3,4,5],
    "feature2": [100, 200, 300, 400, 500],
    "feature3": [200, 300, 400, 500, 600],
})

transformers = ColumnTransformer(
    transformers=[
        ("scaling1", MinMaxScaler(), ["feature1"]),
        ("scaling2", StandardScaler(), ["feature2", "feature3"])
    ]
)

transformed_df = transformers.fit_transform(df)

transformed

# output
array([[ 0.        , -1.41421356, -1.41421356],
       [ 0.25      , -0.70710678, -0.70710678],
       [ 0.5       ,  0.        ,  0.        ],
       [ 0.75      ,  0.70710678,  0.70710678],
       [ 1.        ,  1.41421356,  1.41421356]])

例如,如果您想使用第一个缩放器 (scaling1) 进行逆变换:

scaler_1 = transformers.named_transformers_["scaling1"]
scaler_1.inverse_transform(transformed[:, 0].reshape(-1, 1))

# output
array([[1.],
       [2.],
       [3.],
       [4.],
       [5.]])

推荐阅读