特征工程:针对不同的发行版进行缩放



我正在尝试理解缩放我的特征的最佳方法,并学习如何使用SciKit包来转换/适合我的预测数据集。

我有两组数据。

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

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

我的问题是

  1. 我可以在我的数据集上使用多个标量来使用RF进行分类问题吗?
  2. 在SciKit中,当我尝试在我的训练数据上使用鲁棒缩放器缩放1个特征时,我得到了这个错误。ValueError:期望的2D数组,得到的是1D数组:我不知道如何阅读这个错误,我可以不缩放只是一个功能?
  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.]])