我正在使用不平衡的类(比率为1:10)进行二进制分类。我尝试了KNN,RF和XGB分类器。我从XGB分类器中获得了最佳的精度调用折衷和F1得分(可能是因为数据集的大小非常小-(1900,19)

因此,在检查了XGB的错误图后,我决定从sklearn获取RandomizedSearchCV()进行XGB分类器的参数调整。根据关于stackexchange的另一个答案,这是我的代码:

from xgboost import XGBClassifier
from sklearn.model_selection import RandomizedSearchCV, StratifiedKFold
score_arr = []
clf_xgb = XGBClassifier(objective = 'binary:logistic')
param_dist = {'n_estimators': [50, 120, 180, 240, 400],
              'learning_rate': [0.01, 0.03, 0.05],
              'subsample': [0.5, 0.7],
              'max_depth': [3, 4, 5],
              'min_child_weight': [1, 2, 3],
              'scale_pos_weight' : [9]
            }
clf = RandomizedSearchCV(clf_xgb, param_distributions = param_dist, n_iter = 25, scoring = 'precision', error_score = 0, verbose = 3, n_jobs = -1)
print(clf)
numFolds = 6
folds = StratifiedKFold(n_splits = numFolds, shuffle = True)

estimators = []
results = np.zeros(len(X))
score = 0.0
for train_index, test_index in folds.split(X_train, y_train):
    print(train_index)
    print(test_index)
    _X_train, _X_test = X.iloc[train_index,:], X.iloc[test_index,:]
    _y_train, _y_test = y.iloc[train_index].values.ravel(), y.iloc[test_index].values.ravel()
    clf.fit(_X_train, _y_train, eval_metric="error", verbose=True)

    estimators.append(clf.best_estimator_)
    results[test_index] = clf.predict(_X_test)
    score_arr.append(f1_score(_y_test, results[test_index]))
    score += f1_score(_y_test, results[test_index])
score /= numFolds


因此,RandomizedSearchCV实际上选择分类器,然后以k折叠为单位进行拟合并在验证集上预测结果。请注意,我在kfolds拆分中给出了X_trainy_train,因此我有一个单独的test数据集用于测试最终算法。

现在的问题是,如果您实际上在每个kfold迭代中都查看f1-score,则就像这样score_arr = [0.5416666666666667, 0.4, 0.41379310344827586, 0.5, 0.44, 0.43478260869565216]

但是,当我测试clf.best_estimator_作为模型时,在我的test数据集上,它给出f1-score0.80且具有{'precision': 0.8688524590163934, 'recall': 0.7571428571428571}精度和召回率。

验证低时我的成绩如何?测试集现在发生了什么?我的模特是正确的还是我错过了什么?

附言-取clf.best_estimator_的参数,我使用xgb.cv将它们分别拟合到我的训练数据上,然后f1-score也在0.55附近。我认为这可能是由于RandomizedSearchCVxgb.cv的训练方法之间的差异。请告诉我是否需要情节或更多信息。

更新:我将为生成的模型附加训练和测试aucprclassification accuracy的误差图。通过仅运行一次model.fit()(调整score_arr的值)即可生成该图。
machine-learning - sklearn.model_selection.RandomizedSearchCV如何工作?-LMLPHP

最佳答案

对超参数的随机搜索。

虽然使用参数设置网格是当前最广泛用于参数优化的方法,但其他搜索方法具有更有利的属性。 RandomizedSearchCV实现对参数的随机搜索,其中每个设置都是从​​可能的参数值的分布中采样的。与详尽搜索相比,这有两个主要优点:

A budget can be chosen independently of the number of parameters and possible values.

Adding parameters that do not influence the performance does not decrease efficiency.


如果所有参数均以列表形式显示,则将执行不替换的采样。如果给定至少一个参数作为分布,则使用替换抽样。强烈建议对连续参数使用连续分布。

更多信息(参考):SKLEARN documentation for RandomizedSearchCV

08-25 00:49