【发布时间】:2019-04-09 02:07:24
【问题描述】:
如何将数据采样和分类器管道链接在一起?
我想对所有分类器执行所有抽样技术并选择表现最佳的分类器。我正在执行随机网格搜索以选择最佳超参数。
只对每个未调整的分类器(Logistic Regression l1、Logistic Regression l2、随机森林)执行 6 种抽样技术,然后只调整每种抽样技术表现最佳的一个分类器是否合理?
在我之前的实现中,我发现 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)
【问题讨论】:
标签: python scikit-learn pipeline