【发布时间】:2021-06-03 09:07:51
【问题描述】:
作为一般经验法则,需要在数据集上运行基线模型。我知道H2O- AutoML 和其他 AUtoML 包可以做到这一点。但我想尝试使用 Scikit-learn Pipeline,
这是我到目前为止所做的,
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import BernoulliNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import Pipeline
from xgboost import XGBClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import f1_score, make_scorer
import os
rs = {'random_state': 42}
X_train, X_test, y_train, y_test = train_test_split(features, target, train_size=0.6, **rs)
X_val, X_test, y_val, y_test, = train_test_split(X_test, y_test, train_size=0.5, **rs)
# Classification - Model Pipeline
def train_models(X_train, X_val, X_test, y_train, y_val, y_test):
log_reg = LogisticRegression(**rs)
nb = BernoulliNB()
knn = KNeighborsClassifier()
svm = SVC(**rs)
mlp = MLPClassifier(max_iter=5000, **rs)
dt = DecisionTreeClassifier(**rs)
et = ExtraTreesClassifier(**rs)
rf = RandomForestClassifier(**rs)
xgb = XGBClassifier(**rs, verbosity=0)
scorer = make_scorer(f1_score)
clfs = [('Logistic Regression', log_reg), ('Naive Bayes', nb),
('K-Nearest Neighbors', knn), ('SVM', svm),
('MLP', mlp), ('Decision Tree', dt), ('Extra Trees', et),
('Random Forest', rf), ('XGBoost', xgb)]
pipelines = []
scores_df = pd.DataFrame(columns=['Model', 'Val_Score', 'F1_Score'])
test_scores = []
for clf_name, clf in clfs:
pipeline = Pipeline(steps=[
('scaler', StandardScaler()),
('classifier', clf)])
pipeline.fit(X_train, y_train)
val_score = cross_val_score(pipeline, X_val, y_val, scoring=scorer, cv=3).mean()
print(f'{clf_name}\n{"-" * 30}\nModel Val-Score: {val_score:.4f}')
test_score = f1_score(y_test, pipeline.predict(X_test))
print(f'Model F1-Score: {test_score:.4f}\n\n')
pipelines.append(pipeline)
scores_df = scores_df.append({'Model': clf_name,
'Val_Score': val_score,
'F1_Score': test_score}, ignore_index=True)
return pipelines, scores_df
我只是想通过讨论事情从有经验的程序员那里获得一点知识。我只是期待一个建议/参考或有效的方法/方法来做到这一点。
为机器学习分类问题制作流水线的有效方法是什么?
【问题讨论】:
-
你看过 bagging 策略
-
不,你能给我提供任何参考链接吗?
-
Bagging 是一种提高准确性的方法。挑战在于从错误或新数据中学习,而不是过度拟合或学习分类器中的偏差。
-
检查差异。高方差模型会导致过度拟合。模型复杂度与方差和偏差之间存在权衡,模型越复杂,方差和偏差越小。高方差和低偏差意味着该函数超出了拾取噪声的目标
-
我包含了一个投票分类器。它选择最好的分类器并使用它的结果。
标签: python machine-learning scikit-learn classification pipeline