使用 K 折交叉验证优化逻辑回归模型的正则化惩罚力度

本代码展示了如何使用 K 折交叉验证来优化逻辑回归模型的正则化惩罚力度。

def printing_kfold_scores(X_train_data, y_train_data):
    fold = KFold(5, shuffle=False)
    c_param_range = [0.01, 0.1, 1, 10, 100]
    results_table = pd.DataFrame(index=range(len(c_param_range)), columns=['C_parameter', 'Mean recall score'])
    results_table['C_parameter'] = c_param_range
    recall_accs = []  # 外部定义
    j = 0
    for c_param in c_param_range:
        print('-----------------------------------')
        print('正则化惩罚力度:', c_param)
        print('-----------------------------------')
        print('')
        recall_accs = []  # 内部定义
        for iteration, indices in enumerate(fold.split(X_train_data), start=1):
            lr = LogisticRegression(C=c_param, penalty='l1', solver='liblinear')
            lr.fit(X_train_data.iloc[indices[0],], y_train_data.iloc[indices[0],].values.ravel())
            y_pred_undersample = lr.predict(X_train_data.iloc[indices[1],].values)
            recall_acc = recall_score(y_train_data.iloc[indices[1],].values, y_pred_undersample)
            recall_accs.append(recall_acc)
            print('Iteration', iteration, ': 召回率 = ', recall_acc)
        mean_recall_acc = np.mean(recall_accs)  # 计算平均召回率
        results_table.loc[j, 'Mean recall score'] = mean_recall_acc
        j += 1
        print('')
        print('平均召回率', mean_recall_acc)
        print('')
    print('**********************************************************')
    print('效果最好的模型所选参数 = ', results_table.loc[results_table['Mean recall score'].astype('float').idxmax()]['C_parameter'])
    print(results_table)
    return results_table.loc[results_table['Mean recall score'].astype('float').idxmax()]['C_parameter']

best_c = printing_kfold_scores(Xtrain_undersampled, ytrain_undersampled)

代码中,KFold(5, shuffle=False) 表示将数据集划分为 5 折,不进行随机打乱。c_param_range 定义了要尝试的正则化惩罚力度,results_table 用来存储不同参数下的平均召回率。代码通过循环遍历不同的惩罚力度,并使用 K 折交叉验证来评估每个参数的模型性能。最终,代码会找到具有最高平均召回率的参数,并将其作为最佳参数返回。

代码解释:

  1. 定义 KFold 对象fold = KFold(5, shuffle=False),表示使用 5 折交叉验证,不进行随机打乱。
  2. 定义惩罚力度范围c_param_range = [0.01, 0.1, 1, 10, 100],定义了要尝试的正则化惩罚力度。
  3. 定义结果表格results_table = pd.DataFrame(index=range(len(c_param_range)), columns=['C_parameter', 'Mean recall score']),用来存储不同参数下的平均召回率。
  4. 循环遍历惩罚力度for c_param in c_param_range,遍历不同的惩罚力度。
  5. 循环遍历 K 折for iteration, indices in enumerate(fold.split(X_train_data), start=1),遍历每个参数下的 K 折交叉验证。
  6. 训练模型lr = LogisticRegression(C=c_param, penalty='l1', solver='liblinear'),使用当前的惩罚力度和逻辑回归模型来训练模型。
  7. 评估模型recall_acc = recall_score(y_train_data.iloc[indices[1],].values, y_pred_undersample),使用验证集评估模型的召回率。
  8. 计算平均召回率mean_recall_acc = np.mean(recall_accs),计算当前参数下的平均召回率。
  9. 保存结果results_table.loc[j, 'Mean recall score'] = mean_recall_acc,将当前参数下的平均召回率保存到结果表格中。
  10. 找到最佳参数results_table.loc[results_table['Mean recall score'].astype('float').idxmax()]['C_parameter'],找到具有最高平均召回率的参数。

注意:

  • 代码中使用 recall_score 来评估模型的性能,可以根据实际情况选择其他指标,例如精度、F1 分数等。
  • 代码中使用 LogisticRegression(C=c_param, penalty='l1', solver='liblinear') 来训练模型,可以根据实际情况选择其他参数,例如 penalty='l2'solver='saga' 等。

总结:

该代码展示了如何使用 K 折交叉验证来优化逻辑回归模型的正则化惩罚力度,通过遍历不同的惩罚力度,并使用 K 折交叉验证来评估模型性能,最终找到具有最高平均召回率的参数。

使用 K 折交叉验证优化逻辑回归模型的正则化惩罚力度

原文地址: https://www.cveoy.top/t/topic/nRFj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录