特征工程:针对不同分布进行缩放
Feature Engineering: Scaling for different distributions
我正在尝试了解扩展我的功能的最佳方式,并学习如何使用 SciKit 包 transform/fit 我的预测数据集。
我有2组数据
第一组具有正态分布,所以我只想使用 minmax 缩放器缩放值(20-100 之间的正值)。
第二组特征有异常值,所以我相信 robustscaler 会给出更好的结果。
我的问题是
- 我可以在我的数据集上使用多个缩放器来解决使用 RF 的分类问题吗?
- 在 SciKit 中,当我尝试使用 robustscaler 对我的训练数据缩放 1 个特征时,出现此错误。 ValueError:预期的二维数组,得到的是一维数组:我不确定如何解读这个错误,我不能只缩放一个特征吗?
- 如果我对我的数据使用两个缩放器,如果我希望一次预测一行,那么实现特征工程的最佳方法是什么?我只使用变换吗?
- 是的,如果你觉得它有用,你可以。
- 您可以缩放单个特征。
如果你这样做,你会得到一个错误:
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]])
- 您可以使用 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.]])
我正在尝试了解扩展我的功能的最佳方式,并学习如何使用 SciKit 包 transform/fit 我的预测数据集。
我有2组数据
第一组具有正态分布,所以我只想使用 minmax 缩放器缩放值(20-100 之间的正值)。
第二组特征有异常值,所以我相信 robustscaler 会给出更好的结果。
我的问题是
- 我可以在我的数据集上使用多个缩放器来解决使用 RF 的分类问题吗?
- 在 SciKit 中,当我尝试使用 robustscaler 对我的训练数据缩放 1 个特征时,出现此错误。 ValueError:预期的二维数组,得到的是一维数组:我不确定如何解读这个错误,我不能只缩放一个特征吗?
- 如果我对我的数据使用两个缩放器,如果我希望一次预测一行,那么实现特征工程的最佳方法是什么?我只使用变换吗?
- 是的,如果你觉得它有用,你可以。
- 您可以缩放单个特征。 如果你这样做,你会得到一个错误:
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]])
- 您可以使用 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.]])