我希望有一个流程,最终结果能为我提供一系列机器学习模型及其准确性得分,但仅限于该类型模型的最佳参数集。
例如,这里仅展示XGBoost的交叉验证:
数据集:
import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisiris = load_iris()data = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])from sklearn.model_selection import train_test_splitX = data.drop(['target'], axis=1)y = data['target']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
寻找最佳参数的函数:
from sklearn.model_selection import GridSearchCVfrom sklearn.metrics import accuracy_score, make_scoreraccu = make_scorer(accuracy_score) # 将来我会使用f1def predict_for_best_params(alg, X_train, y_train, X_test): params = {'n_estimators': [200, 300, 500]} clf = GridSearchCV(alg, params, scoring = accu, cv=2) clf.fit(X_train, y_train) print(clf.best_estimator_) y_pred = clf.predict(X_test) return y_pred
在一个模型上使用它:
from xgboost import XGBClassifieralg = [XGBClassifier()]y_pred = predict_for_best_params(alg[0], X_train, y_train, X_test)from sklearn.metrics import accuracy_scoreprint(accuracy_score(y_test, y_pred))
我想实现的是类似这样的:
from xgboost import XGBClassifierfrom sklearn.ensemble import RandomForestClassifieralg = [XGBClassifier(), RandomForrest()] # 许多模型的列表alg_params = {'XGBClassifier': [{'n_estimators': [200, 300, 500]}], 'RandomForrest': [{'max_depth ': [1, 2, 3, 4]}]}def predict_for_best_params(alg, X_train, y_train, X_test, params): clf = GridSearchCV(alg, params, scoring = accu, cv=2) clf.fit(X_train, y_train) print(clf.best_estimator_) y_pred = clf.predict(X_test) return y_predfor algo in alg: params = alg_params[str(algo)][0] # 这行不会工作,因为str(algo) <> 例如XGBClassifier()而是XGBClassier(所有默认参数) y_pred = predict_for_best_params(algo, X_train, y_train, X_test, params) print('{} accuracy is: {}'.format(algo, accuracy_score(y_test, y_pred)))
这是实现它的好方法吗?
回答:
如果你只关心如何设置键,你可以使用
params = alg_params[alg.__class__.__name__][0]
这应该只返回alg
对象的类名
对于另一种方法,你可以查看我的其他回答:
那个回答利用了GridSearchCV可以接受参数组合的字典列表的事实,其中每个列表将被单独扩展。但请注意以下几点:
- 如果你使用
n_jobs > 1
(使用多处理),这可能会比你当前的for-loop
更快。 - 然后你可以使用完成的
GridSearchCV
的cv_results_
属性来分析得分。 - 要为单个估计器计算
y_pred
,你可以过滤cv_results_
(可能通过将其导入到pandas DataFrame
中),然后再次用找到的最佳参数拟合估计器,然后计算y_pred。但这应该相当简单。