我有一個包含 17 個特征 (x) 和二元分類結果 (y) 的資料集。我已經準備好資料集并對其進行train_test_split()了操作。我正在使用以下腳本在資料集上運行不同的 ML 演算法以在它們之間進行比較:
def run_exps(X_train: pd.DataFrame , y_train: pd.DataFrame, X_test: pd.DataFrame, y_test: pd.DataFrame) -> pd.DataFrame:
# Lightweight script to test many models and find winners
# :param X_train: training split
# :param y_train: training target vector
# :param X_test: test split
# :param y_test: test target vector
# :return: DataFrame of predictions
models = [
('LogReg', LogisticRegression()),
('RF', RandomForestClassifier()),
('KNN - Euclidean', KNeighborsClassifier(metric='euclidean')),
('SVM', SVC()),
('XGB', XGBClassifier(use_label_encoder =False, eval_metric='error'))
]
names = []
scoring = ['accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc']
# For Loop that takes each model and perform training, cross validation, prediction and evaluation
for name, model in models:
# Making pipleline that normalize, oversmaple the dataset
pipe = Pipeline([
('normalization', MinMaxScaler()),
('oversampling', SMOTE())
])
kfold = StratifiedKFold(n_splits=5)
# How can I call the pipeline inside the cross_validate() Function ?
cv_results = cross_validate(model, X_train, y_train, cv=kfold, scoring=scoring, verbose=3)
clf = model.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print('''
{}
{}
{}
''' .format(name, classification_report(y_test, y_pred), confusion_matrix(y_test, y_pred)))
names.append(name)
我注意到在運行腳本之前,我使用的資料需要進行標準化和過采樣。
但是,由于我cross_validate()在腳本中使用函式,因此我需要對每個折疊執行歸一化和過采樣。
為了做到這一點,我在 for 回圈中創建了一個管道(對資料集進行標準化和過采樣)(它采用每個模型并執行訓練、交叉驗證、預測和評估),但我不知道如何呼叫管道,因為該estimator引數cross_validate()已經取model變數進行基于它的預測。
在這種情況下我該怎么辦?
uj5u.com熱心網友回復:
您可以將模型集成到管道中,然后cross_validate按如下方式呼叫管道:
pipe = Pipeline([
('normalization', MinMaxScaler()),
('oversampling', SMOTE()),
('name', model)
])
cv_results = cross_validate(pipe, X_train, y_train, cv=kfold, scoring=scoring, verbose=3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/388058.html
