выборка данных и алгоритм конвейера python - PullRequest
0 голосов
/ 05 ноября 2018

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

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

Разумно ли выполнять только 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)

1 Ответ

0 голосов
/ 06 ноября 2018

Лично я не стал бы пытаться применить технику выборки в конвейере, объект конвейера задуман как надежный, сквозной метод для перемещения объектов с одного конца и получения прогнозов с другого, в первую очередь для * 1001. * обобщение вашей модели на новые данные .

Поскольку вы не собираетесь подвергать чрезмерной или недостаточной выборке или перекрестной проверке новые невидимые точки данных, следует выполнить избыточную / недостаточную выборку, перекрестную проверку и т. Д. до , чтобы решить, что Вы хотите, чтобы ваш трубопровод был похож.

В вашем случае кажется, что вы проделали хорошую работу заранее, вы сказали, что выяснили, что ADASYN и LogistRegression дали вам лучшие результаты, поэтому ваш (псевдо) конвейер будет тогда

Out-of-pipe:
oversampled_X,y = Adasyn(X, y)

Pipeline:
{scaling/normalization if necessary,
 logisticregression with selected hyperparams}

pipeline.fit(oversampled_X,y) (or fit_transform(oversampled_X,y))

pipeline.predict(new_X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...