Как создать масштабатор, применяя преобразование журнала и MinMaxScaler в sklearnPython

Программы на Python
Ответить
Anonymous
 Как создать масштабатор, применяя преобразование журнала и MinMaxScaler в sklearn

Сообщение Anonymous »

Я хочу применить log() к моему DataFrame и MinMaxScaler() вместе.
Я хочу, чтобы выходные данные представляли собой DataFrame() pandas с индексами и столбцами из исходных данных .
Я хочу использовать параметры, используемые для fit_transform(), для inverse_transform(), что приведет к созданию нового кадра данных. Итак, его нужно создать внутри FunctionTransformer.
Что я пробовал:

Код: Выделить всё

from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np

# Initialize MinMaxScaler with range (0, 1)
scaler_logMinMax = MinMaxScaler(feature_range=(0, 1))

# Log transformation function
def log_and_scale(X, scaler=scaler_logMinMax, shift=1e-9):
X_log = np.log(X + shift)  # Apply log transformation with a small shift
return pd.DataFrame(scaler.fit_transform(X_log))  # Scale the log-transformed data

# Inverse transformation: first unscale, then inverse log transform
def inv_log_and_scale(X, scaler=scaler_logMinMax, shift=1e-9):
X_unscaled = scaler.inverse_transform(X)  # Inverse scaling
return np.exp(X_unscaled) - shift  # Inverse of log transformation

# Create FunctionTransformer for the log and scale transformation
log_and_scale_transformer = FunctionTransformer(func=log_and_scale, inverse_func=inv_log_and_scale, validate=True)
df_subset = pd.DataFrame(
{
1: [135.2342984, 83.17136704, 23.41329775, 3.574450787],
2: [59.31328422, 18.15285711, 11.1736562, 4.788951527],
3: [45.0087282, 4.094515245, 106.536704, 527.0962651],
}
)
df_subset.columns = [1, 2, 3]
df_subset.index = ["201001", "201002", "201003", "201004"]
df_subset.index.name = "Date"
df_subset.columns.name = "id"
cols_to_apply_scaler = [1, 2]
df_subset

id  1           2           3
Date
201001  135.234298  59.313284   45.008728
201002  83.171367   18.152857   4.094515
201003  23.413298   11.173656   106.536704
201004  3.574451    4.788952    527.096265

Код: Выделить всё

# Transforming
df_subset[cols_to_apply_scaler] = pd.DataFrame(log_and_scale_transformer.fit_transform(df_subset[cols_to_apply_scaler]))
df_subset

id  1   2   3
Date
201001  NaN NaN 45.008728
201002  NaN NaN 4.094515
201003  NaN NaN 106.536704
201004  NaN NaN 527.096265
# The way that I expect to apply the inverse transformer.
# df_subset[cols_to_apply_scaler] = log_and_scale_transformer.inverse_transform(df_subset[cols_to_apply_scaler])
Вопросы:
  • The pd.DataFrame(log_and_scale_transformer.fit_transform(df_subset[cols_to_apply_scaler) ])) работает, но его нельзя назначить исходному DataFrame, поскольку имена столбцов меняются. Как это исправить?
  • Как значения Scaler_logMinMax из fit_transform() переносились через inverse_transform?
Я также попробовал log_and_scale_transformer = log_and_scale_transformer.set_output(transform="pandas") после создания кадра данных, но это не помогло работает.
Мне нужно отфильтровать столбцы перед применением функции.
Я также хочу придерживаться FunctionTransformer, потому что я использую другие преобразователи с такой же структурой. Например:

Код: Выделить всё

# Define the inverse transformation function with a shift
def inv_y(X, shift=0.5):
return 1 / (X + shift)

# Define the inverse inverse transformation to revert to original values
def inv_inv_y(X, shift=0.5):
return (1 - X * shift) / X

# Create the FunctionTransformer
inverse_transformer = FunctionTransformer(func=inv_y, inverse_func=inv_inv_y, validate=False, check_inverse=True)
Подводя итог, я не могу одновременно применить функцию и масштабатор.

Это работает на другом простом примере:

Код: Выделить всё

# DataFrame Example
X = np.array([[0, 1, 2], [2, 3, 4], [5, 7, 9]])
cols = ["A", "B", "C"]
cols_to_apply_scaler = cols[:-1]
X = pd.DataFrame(X, columns=cols, index=[0,1,2])
X

A   B   C
0   0   1   2
1   2   3   4
2   5   7   9

# Transforming
X[cols_to_apply_scaler] = pd.DataFrame(log_and_scale_transformer.fit_transform(X[cols_to_apply_scaler]))

A           B           C
0   0.000000    0.000000    2
1   0.958971    0.564575    4
2   1.000000    1.000000    9

/home/guilherme/anaconda3/envs/time_series/lib/python3.11/site-packages/sklearn/base.py:493: UserWarning: X does not have valid feature names, but FunctionTransformer was fitted with feature names
warnings.warn(

# Inverse
X[cols_to_apply_scaler] = log_and_scale_transformer.inverse_transform(X[cols_to_apply_scaler])
X

A               B   C
0   6.203855e-25    1.0 2
1   2.000000e+00    3.0 4
2   5.000000e+00    7.0 9
Но я не понял предупреждения. Могу ли я это исправить?


Подробнее здесь: https://stackoverflow.com/questions/791 ... in-sklearn
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»