Как превратить предварительно обработанные данные из конвейеров в фреймы данных?

#python #pandas #dataframe #scikit-learn

Вопрос:

У меня есть фрагмент кода, представляющий собой файл предварительной обработки моих данных. Все кошерно, пока мне не придется вводить эти предварительно обработанные данные в функцию fit, которая принимает фреймы данных и массивы pandas. Как я могу превратить эти обучающие данные в фрейм данных для подачи? Что касается pipeline.fit() функции, тип данных является преобразователем столбцов, а не df pandas.

Код:

 import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.model_selection import train_test_split  # generate the data data = pd.DataFrame({  'y': [1, 2, 3, 4, 5],  'x1': [6, 7, 8, np.nan, np.nan],  'x2': [9, 10, 11, np.nan, np.nan],  'x3': ['a', 'b', 'c', np.nan, np.nan],  'x4': [np.nan, np.nan, 'd', 'e', 'f'] })  # extract the features and target x = data.drop(labels=['y'], axis=1) y = data['y']  # split the data x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)  # map the features to the corresponding types (numerical or categorical) numerical_features = x_train.select_dtypes(include=['int64', 'float64']).columns.tolist() categorical_features = x_train.select_dtypes(include=['object']).columns.tolist()  # define the numerical features pipeline numerical_transformer = Pipeline(steps=[  ('imputer', SimpleImputer(strategy='median')),  ('scaler', StandardScaler()) ])  # define the categorical features pipeline categorical_transformer = Pipeline(steps=[  ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),  ('onehot', OneHotEncoder(handle_unknown='ignore')) ])  # define the overall pipeline preprocessor_pipeline = ColumnTransformer(transformers=[  ('num', numerical_transformer, numerical_features),  ('cat', categorical_transformer, categorical_features) ])  # fit the pipeline to the training data preprocessor_pipeline.fit(x_train)  # apply the pipeline to the training and test data x_train_ = preprocessor_pipeline.transform(x_train) x_test_ = preprocessor_pipeline.transform(x_test)  

Бонус: Нужно ли мне также предварительно обрабатывать свои метки (y_train)?

Ответ №1:

чтобы преобразовать результаты вашего конвейера в фреймы данных, вам просто понадобится это:

 x_train_df = pd.DataFrame(data=x_train_) x_test_df = pd.DataFrame(data=x_test_)  

Поскольку ваши метки y в большинстве случаев уже числовые, дальнейшая предварительная обработка не требуется. Но это также зависит от модели ML, которую вы хотите использовать на следующем шаге.

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

1. Когда я это делаю, я получаю: raise ValueError(«Конструктор фрейма данных неправильно вызван!») Ошибка значения: неправильно вызван конструктор фрейма данных!

2. @Luleo_Primoc не может воспроизвести ошибку, о которой вы сообщаете; предложенный код работает нормально для меня