我正在尝试理解缩放我的特征的最佳方法,并学习如何使用SciKit包来转换/适合我的预测数据集。
我有两组数据。
第一组是正态分布,所以我只是想用minmax缩放值(20-100之间的正值)。
第二组特征有离群值,所以我相信robustscaler会给出更好的结果。
我的问题是
- 我可以在我的数据集上使用多个标量来使用RF进行分类问题吗?
- 在SciKit中,当我尝试在我的训练数据上使用鲁棒缩放器缩放1个特征时,我得到了这个错误。ValueError:期望的2D数组,得到的是1D数组:我不知道如何阅读这个错误,我可以不缩放只是一个功能?
- 如果我使用两个标量为我的数据,什么是最好的方法来实现的特征工程,如果我想做预测一行的时间?我只用变换吗?
- 如果你觉得有用,你可以。
- 您可以扩展单个功能。如果你这样做,你会有一个错误:
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.]])