目录
前言
逻辑回归(Logistic Regression)是一种用于二分类问题的统计模型和机器学习算法,旨在预测事件的概率。它基于一个线性模型,并通过一个逻辑函数(通常是Sigmoid函数)将线性组合的结果转换为概率值。
一、C参数
- 在逻辑回归中,特别是在使用正则化时
- C参数是控制正则化强度的超参数(超参数是指在训练模型之前需要手动设置的参数)
- 在正则化过程中起到调整模型复杂度的作用
- 较小的
C
值增加正则化强度,较大的C
值减少正则化强度。
- 较小的
二、交叉验证
1.交叉验证是什么
- 交叉验证是一种用于评估机器学习模型性能的技术。
- 它通过将数据集划分为多个子集,训练和测试模型,以获得更稳健和可靠的性能估计。交叉验证的主要作用是帮助我们判断模型在未知数据上的表现,并有效防止过拟合。
2.交叉验证的基本原理
-
数据划分:交叉验证的核心思想是将原始数据集划分为多个部分(通常称为“折”或“fold”)。最常见的方式是k折交叉验证
-
训练与验证:在每一轮中,使用训练集来训练模型,然后用测试集来评估模型的性能。这可以得到不同的数据划分下模型的性能指标(如准确率accuracy、精确率 precision、召回率 recall、F1-score等)。
-
性能评估:通过对所有k次测试结果进行求平均值,可以更准确地反映模型在真实数据上的表现。
3.交叉验证的作用
-
更可靠的性能评估:通过多次训练和验证,可以减少由于数据划分带来的偏差,从而提供更稳定的性能估计。
-
避免过拟合:交叉验证能够检测到模型是否对训练数据过拟合,因为它利用了不同的子集进行训练和验证。
-
超参数调优:在模型选择和超参数调优过程中,交叉验证可以帮助选择最佳的超参数组合,使得模型在未见数据上表现更好。
-
充分利用数据:特别是在数据量较少的情况下,交叉验证可以确保每个样本都能参与训练和测试,提高数据的利用效率。
4.常见的交叉验证方法
-
k折交叉验证:将数据集划分为k个折,逐一进行训练和验证。
-
留一交叉验证:特殊的k折交叉验证,其中k等于数据集的大小,即每次只留一个样本作为测试集,其他作为训练集。
-
分层k折交叉验证:在k折交叉验证的基础上,保持各类别样本比例的一致性,适用于类别不平衡的数据集。
三、k折交叉验证
-
K折交叉验证是一种评估模型性能的技术
-
将训练集划分成K个部分(或折),k的值可以自己选择
-
每次用其中一个部分作为测试集,其余K-1个部分作为训练集
-
这个过程重复K次,每次选择不同的部分作为测试集。
-
每个部分都会参与训练,也会用来测试
-
最终,模型的性能指标是K次测试结果的平均值
-
测试结果可以是准确率 accuracy、精确率 precision、召回率 recall、F1-score等
-
这种方法帮助减少模型对特定数据分割的依赖,提高评估的可靠性,有效防止过拟合
四、C参数和k折交叉验证的关系
- C参数的选择一般通过交叉验证的结果来进行选择和调整
五、代码实现
# 交叉验证选择较优惩罚因子 λ
from sklearn.model_selection import cross_val_score # 交叉验证的函数
from sklearn.linear_model import LogisticRegression
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100] # 待选C参数
for i in c_param_range:
lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000) # 创建逻辑回归模型 lbfgs 拟牛顿法
score = cross_val_score(lr, x_train, y_train, cv=8, scoring='recall') # k折交叉验证 比较召回率
score_mean = sum(score) / len(score)
scores.append(score_mean)
# print(score_mean)
# 寻找到scores中最大值的对应的C参数
best_c = c_param_range[np.argmax(scores)]
# 建立最优模型
lr = LogisticRegression(C=best_c, penalty='l2', max_iter=1000)
1.导入库
from sklearn.model_selection import cross_val_score # 交叉验证的函数
from sklearn.linear_model import LogisticRegression # 逻辑回归类
2.k折交叉验证选择C参数
- 利用随机种子和随机函数取出训练集和训练集的结果数据
- 建立一个空列表用来储存k折交叉验证的结果
- c_param_range里是待选的C参数
- 利用for循环,使用每个C参数建立逻辑回归模型
- 在每个C参数建立的模型下使用k折交叉验证,获取召回率的平均值
- 根据scores里最大值的索引来定位最佳的C参数
代码:
# 利用随机种子取数据
from sklearn.model_selection import train_test_split
x = data.drop('Class', axis=1)
y = data.Class
x_train, x_test, y_train, y_test = \
train_test_split(x, y, test_size=0.3, random_state=0) # 随机取数据
# k折交叉验证选择C参数
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100] # 待选C参数
for i in c_param_range:
lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000) # 创建逻辑回归模型 lbfgs 拟牛顿法
score = cross_val_score(lr, x_train, y_train, cv=8, scoring='recall') # k折交叉验证 比较召回率
score_mean = sum(score) / len(score)
scores.append(score_mean)
# print(score_mean)
# 寻找到scores中最大值的对应的C参数
best_c = c_param_range[np.argmax(scores)]
输出:
0.5825845665961945
0.608615221987315
0.6173361522198731
0.6173361522198731
0.6173361522198731
最优惩罚因子为:1
3.建立最优模型
- 利用k折交叉验证的得到的最佳C参数值建立最优模型
# 建立最优模型
lr = LogisticRegression(C=best_c, penalty='l2', max_iter=1000)
总结
C参数与K折交叉验证密切相关,K折交叉验证为C参数的选择提供了一个系统而可靠的框架,使得模型在面对不同数据时能够保持良好的性能。这种方法不仅提高了模型的泛化能力,还能有效避免过拟合问题。
标签:逻辑,交叉,模型,验证,score,参数,scores From: https://blog.csdn.net/weixin_65047977/article/details/141335944