#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 не может воспроизвести ошибку, о которой вы сообщаете; предложенный код работает нормально для меня