Как связать конвейеры выборки данных и классификатора?
Я хочу выполнить все методы выборки на всех классификаторах и выбрать лучшего исполнителя. Я выполняю рандомизированный поиск по сетке, чтобы выбрать лучшие гиперпараметры.
Разумно ли выполнять только 6 методов выборки для каждого ненастроенного классификатора (Логистическая регрессия l1, Логистическая регрессия l2, случайный лес), а затем приступать к настройке только одного классификатора, который показал наилучшие результаты при каждой методике выборки?
В моей предыдущей реализации я обнаружил, что adasyn лучше всего справляется с логистической регрессией, и это мой текущий победитель. Я реализовал случайный лес с каждым из методов выборки и оценил их, но я хочу выяснить, как правильно упаковать и упростить его.
В основном я использую imblearn и sklearn.
Мой вопрос: как я могу построить конвейер для гиперпараметров, классификации и выборки?
ПОПЫТКА 1
oss= OneSidedSelection(random_state=RANDOM_STATE)
enn= SMOTEENN(random_state=RANDOM_STATE)
smtk= SMOTETomek(random_state=RANDOM_STATE)
ada= ADASYN(random_state=RANDOM_STATE)
ros= RandomOverSampler(random_state=RANDOM_STATE)
smote= SMOTE(random_state=RANDOM_STATE)
l1= make_pipeline(StandardScaler(),
LogisticRegression(random_state=RANDOM_STATE,penalty='l1'))
l2= make_pipeline(StandardScaler(),
LogisticRegression(random_state=RANDOM_STATE, penalty='l2'))
rf= make_pipeline(StandardScaler(),
RandomForestClassifier(random_state=RANDOM_STATE))
l1_pipeline = make_pipeline(oss, enn, smtk, ada, ros, smote, l1)
l2_pipeline = make_pipeline(oss, enn, smtk, ada, ros, smote, l2)
rf_pipeline = make_pipeline(oss, enn, smtk, ada, ros, smote, rf)
l1_pipeline.fit(X_train, y_train)
y_hat = l1_pipeline.predict(X_test)
print(classification_report_imbalanced(y_test, y_hat))
ПОПЫТКА 2
fitted_models = {}
fitted_methods = {}
for name, classification_algorithms in classification_algorithms.items():
oss= OneSidedSelection(random_state=RANDOM_STATE)
enn= SMOTEENN(random_state=RANDOM_STATE)
smtk= SMOTETomek(random_state=RANDOM_STATE)
ada= ADASYN(random_state=RANDOM_STATE)
ros= RandomOverSampler(random_state=RANDOM_STATE)
smote= SMOTE(random_state=RANDOM_STATE)
X_oss, y_oss= oss.fit_sample(X_train,y_train)
X_enn, y_enn= enn.fit_sample(X_train,y_train)
X_smtk, y_smtk= smtk.fit_sample(X_train,y_train)
X_ada, y_ada= ada.fit_sample(X_train,y_train)
X_ros, y_ros= ros.fit_sample(X_train,y_train)
X_smote, y_smote= smote.fit_sample(X_train,y_train)
print('named X, y')
model = RandomizedSearchCV(classification_algorithms,
hyperparameters[name], \
cv=10, n_jobs=-1)
model_oss = model.fit(X_oss, y_oss)
print('One Sided Selection has been fitted.')
model_enn = model.fit(X_enn, y_enn)
print('SMOTE ENN has been fitted.')
model_smtk = model.fit(X_smtk, y_smtk)
print('SMOTE Tomek has been fitted.')
model_ada = model.fit(X_ada, y_ada)
print('ADASYN has been fitted.')
model_ros = model.fit(X_ros, y_ros)
print('Random Over Sampling has been fitted.')
model_smote = model.fit(X_smote, y_smote)
print('SMOTE has been fitted.')
fitted_models[name + model_oss] = model_oss
fitted_models[name + model_enn] = model_enn
fitted_models[name + model_smtk] = model_smtk
fitted_models[name + model_ada] = model_ada
fitted_models[name + model_ros] = model_ros
fitted_models[name + model_smote] = model_smote
print(name, 'has been fitted.')
ГИПЕРПАРАМЕТРЫ И ТРУБОПРОВОД КЛАССИФИКАЦИИ
l1_hyperparameters = {
'logisticregression__C' : np.linspace(1e-3, 1e3, 10),
}
l2_hyperparameters = {
'logisticregression__C' : np.linspace(1e-3, 1e3, 10),
}
rf_hyperparameters = {
'randomforestclassifier__n_estimators': [100, 200],
'randomforestclassifier__max_features': ['auto', 'sqrt', 0.33]
}
hyperparameters = {
'l1' : l1_hyperparameters,
'l2' : l2_hyperparameters,
'rf' : rf_hyperparameters
}
classification_algorithms = {
'l1': make_pipeline(StandardScaler(),
LogisticRegression(random_state=RANDOM_STATE,
penalty='l1')),
'l2': make_pipeline(StandardScaler(),
LogisticRegression(random_state=RANDOM_STATE,
penalty='l2')),
'rf': make_pipeline(StandardScaler(),
RandomForestClassifier(random_state=RANDOM_STATE))
}
НАБОР И ИСПЫТАНИЯ
X = df.drop('Class', axis=1)
y = df.Class
X_train, X_test, y_train, y_test = train_test_split(X, y,
random_state=99)