web-dev-qa-db-fra.com

Comment mettre à l'échelle les trames de données de manière cohérente MinMaxScaler () sklearn

J'ai trois trames de données qui sont chacune mises à l'échelle individuellement avec MinMaxScaler ().

def scale_dataframe(values_to_be_scaled)
    values = values_to_be_scaled.astype('float64')
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled = scaler.fit_transform(values)

    return scaled

scaled_values = []
for i in range(0,num_df):
    scaled_values.append(scale_dataframe(df[i].values))

Le problème que j'ai est que chaque trame de données est mise à l'échelle en fonction de son propre ensemble individuel de valeurs min et max de colonne. J'ai besoin que tous mes cadres de données évoluent aux mêmes valeurs que s'ils partageaient tous le même ensemble de valeurs min et max de colonne pour l'ensemble des données. Existe-t-il un moyen d'accomplir cela avec MinMaxScaler ()? Une option serait de créer une grande trame de données, puis de mettre à l'échelle la trame de données avant le partitionnement, mais ce ne serait pas idéal.

9
xjtc55

Découvrez l'excellent docs de sklearn.

Comme vous le voyez, il existe un support pour partial_fit()! Cela permet la mise à l'échelle en ligne/la mise à l'échelle du mini-lot et vous pouvez contrôler les mini-lots!

Exemple:

import numpy as np
from sklearn.preprocessing import MinMaxScaler

a = np.array([[1,2,3]])
b = np.array([[10,20,30]])
c = np.array([[5, 10, 15]])

""" Scale on all datasets together in one batch """
offline_scaler = MinMaxScaler()
offline_scaler.fit(np.vstack((a, b, c)))                # fit on whole data at once
a_offline_scaled = offline_scaler.transform(a)
b_offline_scaled = offline_scaler.transform(b)
c_offline_scaled = offline_scaler.transform(c)
print('Offline scaled')
print(a_offline_scaled)
print(b_offline_scaled)
print(c_offline_scaled)

""" Scale on all datasets together in minibatches """
online_scaler = MinMaxScaler()
online_scaler.partial_fit(a)                            # partial fit 1
online_scaler.partial_fit(b)                            # partial fit 2
online_scaler.partial_fit(c)                            # partial fit 3
a_online_scaled = online_scaler.transform(a)
b_online_scaled = online_scaler.transform(b)
c_online_scaled = online_scaler.transform(c)
print('Online scaled')
print(a_online_scaled)
print(b_online_scaled)
print(c_online_scaled)

Production:

Offline scaled
[[ 0.  0.  0.]]
[[ 1.  1.  1.]]
[[ 0.44444444  0.44444444  0.44444444]]
Online scaled
[[ 0.  0.  0.]]
[[ 1.  1.  1.]]
[[ 0.44444444  0.44444444  0.44444444]]
10
sascha