【问题标题】:Feature Engineering: Scaling for different distributions [closed]特征工程:针对不同分布进行缩放[关闭]
【发布时间】:2021-12-11 21:35:32
【问题描述】:

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

我有 2 组数据。

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

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

我的问题是

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

【问题讨论】:

    标签: python pandas scikit-learn feature-selection feature-engineering


    【解决方案1】:
    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.]])
    

    【讨论】:

    • 我认为我没有得到 ColumnTransformer 部分。如果我为我的训练数据集缩放了我的特征,当我希望对我的实时数据(一次一行)进行预测时,我不应该使用我的训练数据集的均值/方差来缩放特征吗?
    • 是的,应该。这就是为什么你应该在训练数据上运行transformers.fit_transform()。之后transformers 将保留训练集的均值/标准,接下来您将使用命令transformers.transform() 将其应用于测试集 - 它将应用在训练集上学到的那些均值/标准,但这次是在测试集上。只需要运行transform 方法而不是fitfit_transform
    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 2019-07-25
    • 2019-03-09
    • 2020-08-15
    • 2016-03-12
    • 2021-05-28
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多