数据帧列表上的 MinMax 缩放器
MinMax scaler on list of dataframes
我有数据框列表(所有数据框都有相同的数字列,代表同一测试的不同结果。我想将它们分开)。
我想训练 scikit MinMaxScalar,它将考虑 all 数据帧中每一列的最小值和最大值。
有人可以解决这个问题吗?
谢谢,
马克
查看 MinMaxScaler 的方法说明,例如在
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
fit(X[, y]) Compute the minimum and maximum to be used for later scaling.
transform(X) Scaling features of X according to feature_range.
因此,假设您的 DataFrame 列表在 dfList
中,您可能应该:
- 根据以下结果调用
fit(pd.concat(dfList))
设置 min/max 值
所有 个实验。
- 然后在每个 DataFrame 上调用
transform(...)
。
请注意,没有明确创建任何临时 table 持有
所有实验的串联结果。
您想执行以下操作:
- 创建一个临时 DataFrame
tmp
作为列表中所有 DF 的串联
- 将
MinMaxScaler
对象安装到 tmp
DF
- 使用合适的
MinMaxScaler
对象缩放(转换)列表中的所有 DF
更新:
May you have a suggestion for training without creating temp
dataframe?
我们可以利用 .partial_fit()
方法迭代地拟合来自所有 DF 的数据:
正在创建样本 DF 列表:
In [100]: dfs = [pd.DataFrame(np.random.rand(3,3)*100 - 50) for _ in range(3)]
In [101]: dfs[0]
Out[101]:
0 1 2
0 45.473162 42.366712 41.395652
1 -35.476703 43.777850 -36.363200
2 0.479528 14.861075 4.196630
In [102]: dfs[2]
Out[102]:
0 1 2
0 6.888876 -24.454986 -39.794309
1 -8.988094 -34.426252 -24.760782
2 34.317689 -43.644643 44.243769
缩放:
In [103]: from sklearn.preprocessing import MinMaxScaler
In [104]: mms = MinMaxScaler()
In [105]: _ = [mms.partial_fit(df) for df in dfs]
In [106]: scaled = [mms.transform(df) for df in dfs]
结果:
In [107]: scaled[0]
Out[107]:
array([[1. , 0.9838584 , 0.91065751],
[0.07130264, 1. , 0.03848462],
[0.48381052, 0.66922958, 0.49341912]])
In [108]: scaled[1]
Out[108]:
array([[0.53340314, 0.8729412 , 0.62360548],
[0. , 0.39480025, 1. ],
[0.04767918, 0.10412712, 0.95859434]])
In [109]: scaled[2]
Out[109]:
array([[0.55734177, 0.2195048 , 0. ],
[0.37519322, 0.10544644, 0.16862177],
[0.87201883, 0. , 0.94260309]])
我有数据框列表(所有数据框都有相同的数字列,代表同一测试的不同结果。我想将它们分开)。 我想训练 scikit MinMaxScalar,它将考虑 all 数据帧中每一列的最小值和最大值。 有人可以解决这个问题吗?
谢谢,
马克
查看 MinMaxScaler 的方法说明,例如在 https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
fit(X[, y]) Compute the minimum and maximum to be used for later scaling.
transform(X) Scaling features of X according to feature_range.
因此,假设您的 DataFrame 列表在 dfList
中,您可能应该:
- 根据以下结果调用
fit(pd.concat(dfList))
设置 min/max 值 所有 个实验。 - 然后在每个 DataFrame 上调用
transform(...)
。
请注意,没有明确创建任何临时 table 持有 所有实验的串联结果。
您想执行以下操作:
- 创建一个临时 DataFrame
tmp
作为列表中所有 DF 的串联 - 将
MinMaxScaler
对象安装到tmp
DF - 使用合适的
MinMaxScaler
对象缩放(转换)列表中的所有 DF
更新:
May you have a suggestion for training without creating temp dataframe?
我们可以利用 .partial_fit()
方法迭代地拟合来自所有 DF 的数据:
正在创建样本 DF 列表:
In [100]: dfs = [pd.DataFrame(np.random.rand(3,3)*100 - 50) for _ in range(3)]
In [101]: dfs[0]
Out[101]:
0 1 2
0 45.473162 42.366712 41.395652
1 -35.476703 43.777850 -36.363200
2 0.479528 14.861075 4.196630
In [102]: dfs[2]
Out[102]:
0 1 2
0 6.888876 -24.454986 -39.794309
1 -8.988094 -34.426252 -24.760782
2 34.317689 -43.644643 44.243769
缩放:
In [103]: from sklearn.preprocessing import MinMaxScaler
In [104]: mms = MinMaxScaler()
In [105]: _ = [mms.partial_fit(df) for df in dfs]
In [106]: scaled = [mms.transform(df) for df in dfs]
结果:
In [107]: scaled[0]
Out[107]:
array([[1. , 0.9838584 , 0.91065751],
[0.07130264, 1. , 0.03848462],
[0.48381052, 0.66922958, 0.49341912]])
In [108]: scaled[1]
Out[108]:
array([[0.53340314, 0.8729412 , 0.62360548],
[0. , 0.39480025, 1. ],
[0.04767918, 0.10412712, 0.95859434]])
In [109]: scaled[2]
Out[109]:
array([[0.55734177, 0.2195048 , 0. ],
[0.37519322, 0.10544644, 0.16862177],
[0.87201883, 0. , 0.94260309]])