使用 K 折交叉验证优化逻辑回归模型的正则化惩罚力度
使用 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 折交叉验证来评估每个参数的模型性能。最终,代码会找到具有最高平均召回率的参数,并将其作为最佳参数返回。
代码解释:
- 定义 KFold 对象:
fold = KFold(5, shuffle=False),表示使用 5 折交叉验证,不进行随机打乱。 - 定义惩罚力度范围:
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']),用来存储不同参数下的平均召回率。 - 循环遍历惩罚力度:
for c_param in c_param_range,遍历不同的惩罚力度。 - 循环遍历 K 折:
for iteration, indices in enumerate(fold.split(X_train_data), start=1),遍历每个参数下的 K 折交叉验证。 - 训练模型:
lr = LogisticRegression(C=c_param, penalty='l1', solver='liblinear'),使用当前的惩罚力度和逻辑回归模型来训练模型。 - 评估模型:
recall_acc = recall_score(y_train_data.iloc[indices[1],].values, y_pred_undersample),使用验证集评估模型的召回率。 - 计算平均召回率:
mean_recall_acc = np.mean(recall_accs),计算当前参数下的平均召回率。 - 保存结果:
results_table.loc[j, 'Mean recall score'] = mean_recall_acc,将当前参数下的平均召回率保存到结果表格中。 - 找到最佳参数:
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 折交叉验证来评估模型性能,最终找到具有最高平均召回率的参数。
原文地址: https://www.cveoy.top/t/topic/nRFj 著作权归作者所有。请勿转载和采集!