Эта функция может вам помочь. 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_