Как я могу преобразовать преобразование StandardScaler () обратно в dataframe?

#python #pandas #dataframe #scikit-learn #sklearn-pandas

#python #панды #dataframe #scikit-learn #sklearn-pandas

Вопрос:

Я работаю с моделью, и после разделения на train и test я хочу применить StandardScaler() . Однако это преобразование преобразует мои данные в массив, и я хочу сохранить формат, который у меня был раньше. Как я могу это сделать?

В принципе, у меня есть:

 from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

X = df[features]
y = df[["target"]]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=0.7, random_state=42
)

sc = StandardScaler()
X_train_sc = sc.fit_transform(X_train)
X_test_sc = sc.transform(X_test)
  

Как я могу X_train_sc вернуться к тому формату, который X_train имел?

Обновление: я не хочу возвращаться X_train_sc назад до масштабирования. Я просто хочу X_train_sc быть dataframe самым простым из возможных способов.

Комментарии:

1. Для этого должен быть inverse_transform метод Standard_Scaler , который возвращает вас обратно.

2. Функция inverse_transform возвращает данные обратно перед масштабированием. Я не хочу этого, я просто хочу, чтобы X_train_sc был в том же формате, что и X_train

3. Что вы подразумеваете под тем же форматом ?

4. После применения StandardScaler() я теряю имя переменных. Он становится массивом без имен столбцов. Мне просто нужен dataframe, как это было X_train

5. Следует понимать, что X_train это еще не масштабировано. Вы используете fit_transform это, чтобы выполнить две задачи для данных за один шаг. Вы должны использовать fit отдельно для отслеживания переменных, а затем применять transform на другом шаге.

Ответ №1:

Как вы упомянули, применение результатов масштабирования в массиве numpy, чтобы получить dataframe, вы можете инициализировать новый:

 import pandas as pd

cols = X_train.columns
sc = StandardScaler()
X_train_sc = pd.DataFrame(sc.fit_transform(X_train), columns=cols)
X_test_sc = pd.DataFrame(sc.transform(X_test), columns=cols)
  

Обновление 2022

Начиная с версии scikit-learn 1.2.0, можно использовать set_output API для настройки трансформаторов для вывода фреймов данных pandas (см. Пример документа)

Приведенный выше пример упростился бы следующим образом:

 import pandas as pd

cols = X_train.columns
sc = StandardScaler().set_output(transform="pandas")
X_train_sc = sc.fit_transform(X_train)
X_test_sc = sc.transform(X_test)