特征工程:针对不同分布进行缩放

Feature Engineering: Scaling for different distributions

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

我有2组数据

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

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

我的问题是

  1. 我可以在我的数据集上使用多个缩放器来解决使用 RF 的分类问题吗?
  2. 在 SciKit 中,当我尝试使用 robustscaler 对我的训练数据缩放 1 个特征时,出现此错误。 ValueError:预期的二维数组,得到的是一维数组:我不确定如何解读这个错误,我不能只缩放一个特征吗?
  3. 如果我对我的数据使用两个缩放器,如果我希望一次预测一行,那么实现特征工程的最佳方法是什么?我只使用变换吗?
  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.]])