Сохранить pandas структуру данных после SMOTE, передискретизация в python - PullRequest
1 голос
/ 27 февраля 2020

Проблема: При реализации SMOTE (тип избыточной выборки) мой массив данных преобразуется в numpy массив ).

Test_train_split

from sklearn.model_selection import train_test_split
X_train, X_test, y_train_full, y_test_full = train_test_split(X, y, test_size=0.20, random_state=66)
[IN]type(X_train)
[OUT]pandas.core.frame.DataFrame

После SMOTE тип данных X_train изменяется с pandas массив данных на numpy массив

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state = 42)
X_train, y_train = sm.fit_sample(X_train, y_train)
[IN]type(X_train)
[OUT]numpy.ndarray

Ожидаемый результат Я хочу сохранить структуру данных X_train и X_test после SMOTE. Как это сделать?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Я нашел более простой ответ:

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state = 42)
X_train_oversampled, y_train_oversampled = sm.fit_sample(X_train, y_train)
X_train = pd.DataFrame(X_train_oversampled, columns=X_train.columns)

Это помогает сохранить структуру данных после SMOTE

1 голос
/ 27 февраля 2020

Эта функция может вам помочь. df - это X_train и X_test в вашем случае, а output - это имя столбца y в виде строки. SEED - это случайное значение int в случае, если вы хотите установить random_state.

. Вы можете использовать его после разделения или до разделения вашего набора данных, в зависимости от вашего выбора.

def smote_sampler(df, output, SEED=33):
     X = df.drop([output], axis=1)
     y = df[output]
     col_names = pd.concat([X, y], axis=1).columns.tolist()
     smt = SMOTE(random_state=SEED)
     X_smote, y_smote = smt.fit_sample(X, y)
     smote_array = np.concatenate([X_smote, y_smote.reshape(-1, 1)], axis=1)
     df_ = pd.DataFrame(smote_array, columns=col_names)
     smote_cols = df_.columns.tolist()
     org_int_cols = df.dtypes.index[df.dtypes == 'int64'].tolist()
     org_float_cols = df.dtypes.index[df.dtypes == 'float64'].tolist()
     try:
         for col in smote_cols:
             if col in org_float_cols:
                 df_[col] = df_[col].astype('float64')
             elif col in org_int_cols:
                 df_[col] = df_[col].astype('int64')
     except:
         raise ValueError
     return df_
...