#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)