gpt4 book ai didi

python - 微调超参数不会提高分类器的分数

转载 作者:行者123 更新时间:2023-12-04 08:41:37 24 4
gpt4 key购买 nike

我遇到了一个问题,即使用 GridSearchCV 微调超参数并不能真正改善我的分类器。我认为改进应该比这更大。我使用当前代码获得的分类器的最大改进约为 +-0.03。我有一个包含八列和不平衡二进制结果的数据集。对于评分,我使用 f1,我使用 KFold 和 10 个分割。我希望有人能发现什么东西坏了,我应该看看吗?谢谢!
我使用以下代码:

model_parameters = {
"GaussianNB": {
},
"DecisionTreeClassifier": {
'min_samples_leaf': range(5, 9),
'max_depth': [None, 0, 1, 2, 3, 4]
},
"KNeighborsClassifier": {
'n_neighbors': range(1, 10),
'weights': ["distance", "uniform"]
},
"SVM": {
'kernel': ["poly"],
'C': np.linspace(0, 15, 30)
},
"LogisticRegression": {
'C': np.linspace(0, 15, 30),
'penalty': ["l1", "l2", "elasticnet", "none"]
}
}

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
n_splits = 10
scoring_method = make_scorer(lambda true_target, prediction: f1_score(true_target, prediction, average="micro"))
cv = KFold(n_splits=n_splits, random_state=random_state, shuffle=True)

for model_name, parameters in model_parameters.items():

# Models is a dict with 5 classifiers
model = models[model_name]
grid_search = GridSearchCV(model, parameters, cv=cv, n_jobs=-1, scoring=scoring_method, verbose=False).fit(X_train, y_train)

cvScore = cross_val_score(grid_search.best_estimator_, X_test, y_test, cv=cv, scoring='f1').mean()
classDict[model_name] = cvScore

最佳答案

如果你的类(class)不平衡,当你做 Kfold 时,你应该保持两个目标之间的比例。
折叠不平衡会导致非常糟糕的结果
检查 Stratified K-Folds cross-validator

Provides train/test indices to split data in train/test sets.

This cross-validation object is a variation of KFold that returnsstratified folds. The folds are made by preserving the percentage ofsamples for each class.


还有很多技术可以处理不平衡的数据集。基于上下文:
  • 对少数类进行上采样(例如使用 resample from sklearn )
  • 对多数类进行欠采样(还有这个 lib 有一些有用的工具可以同时进行欠\向上采样)
  • 使用您的特定 ML 模型处理不平衡

  • 例如,在 SVC 中,创建模型时有一个参数, class_weight='balanced'
    clf_3 = SVC(kernel='linear', 
    class_weight='balanced', # penalize
    probability=True)
    这将惩罚更多的少数类错误。
    您可以像这样更改配置:
    "SVM": {
    'kernel': ["poly"],
    'C': np.linspace(0, 15, 30),
    'class_weight': 'balanced'

    }
    对于 LogisticRegression,您可以设置权重,以反射(reflect)您的类的比例
    LogisticRegression(class_weight={0:1, 1:10}) # if problem is a binary one
    以这种方式更改网格搜索字典:
    "LogisticRegression": {
    'C': np.linspace(0, 15, 30),
    'penalty': ["l1", "l2", "elasticnet", "none"],
    'class_weight':{0:1, 1:10}
    }
    无论如何,该方法取决于使用的模型。例如,对于神经网络,您可以更改损失函数以通过加权计算来惩罚少数类(与逻辑回归相同)

    关于python - 微调超参数不会提高分类器的分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64542349/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com