逻辑回归C参数选择,利用交叉验证实现

目录

前言

一、C参数

二、交叉验证

1.交叉验证是什么

2.交叉验证的基本原理

3.交叉验证的作用

4.常见的交叉验证方法

三、k折交叉验证

四、C参数和k折交叉验证的关系

五、代码实现

1.导入库

2.k折交叉验证选择C参数

3.建立最优模型

总结


前言

        逻辑回归(Logistic Regression)是一种用于二分类问题的统计模型和机器学习算法,旨在预测事件的概率。它基于一个线性模型,并通过一个逻辑函数(通常是Sigmoid函数)将线性组合的结果转换为概率值。

 

一、C参数

  •  在逻辑回归中,特别是在使用正则化时
    • C参数是控制正则化强度的超参数(超参数是指在训练模型之前需要手动设置的参数)
    • 在正则化过程中起到调整模型复杂度的作用
      • 较小的 C 值增加正则化强度,较大的 C 值减少正则化强度。

 

二、交叉验证

1.交叉验证是什么

  1. 交叉验证是一种用于评估机器学习模型性能的技术。
  2. 它通过将数据集划分为多个子集,训练和测试模型,以获得更稳健和可靠的性能估计。交叉验证的主要作用是帮助我们判断模型在未知数据上的表现,并有效防止过拟合。

 

2.交叉验证的基本原理

  1. 数据划分:交叉验证的核心思想是将原始数据集划分为多个部分(通常称为“折”或“fold”)。最常见的方式是k折交叉验证

  2. 训练与验证:在每一轮中,使用训练集来训练模型,然后用测试集来评估模型的性能。这可以得到不同的数据划分下模型的性能指标(如准确率accuracy、精确率 precision、召回率 recall、F1-score等)。

  3. 性能评估:通过对所有k次测试结果进行求平均值,可以更准确地反映模型在真实数据上的表现。

 

3.交叉验证的作用

  1. 更可靠的性能评估:通过多次训练和验证,可以减少由于数据划分带来的偏差,从而提供更稳定的性能估计。

  2. 避免过拟合:交叉验证能够检测到模型是否对训练数据过拟合,因为它利用了不同的子集进行训练和验证。

  3. 超参数调优:在模型选择和超参数调优过程中,交叉验证可以帮助选择最佳的超参数组合,使得模型在未见数据上表现更好。

  4. 充分利用数据:特别是在数据量较少的情况下,交叉验证可以确保每个样本都能参与训练和测试,提高数据的利用效率。

 

4.常见的交叉验证方法

  • k折交叉验证:将数据集划分为k个折,逐一进行训练和验证。

  • 留一交叉验证:特殊的k折交叉验证,其中k等于数据集的大小,即每次只留一个样本作为测试集,其他作为训练集。

  • 分层k折交叉验证:在k折交叉验证的基础上,保持各类别样本比例的一致性,适用于类别不平衡的数据集。

 

 

三、k折交叉验证

  1. K折交叉验证是一种评估模型性能的技术

  2. 训练集划分成K个部分(或折),k的值可以自己选择

  3. 每次用其中一个部分作为测试集,其余K-1个部分作为训练集

  4. 这个过程重复K次,每次选择不同的部分作为测试集

  5. 每个部分都会参与训练,也会用来测试

  6. 最终,模型的性能指标是K次测试结果的平均值

  7. 测试结果可以是准确率 accuracy、精确率 precision、召回率 recall、F1-score等

  8. 这种方法帮助减少模型对特定数据分割的依赖,提高评估的可靠性,有效防止过拟合

 

 

四、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参数

  1. 利用随机种子和随机函数取出训练集和训练集的结果数据
  2. 建立一个空列表用来储存k折交叉验证的结果
  3. c_param_range里是待选的C参数
  4. 利用for循环,使用每个C参数建立逻辑回归模型
  5. 在每个C参数建立的模型下使用k折交叉验证,获取召回率的平均值
  6. 根据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参数的选择提供了一个系统而可靠的框架,使得模型在面对不同数据时能够保持良好的性能。这种方法不仅提高了模型的泛化能力,还能有效避免过拟合问题。        

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用`GridSearchCV`来选择最优的逻辑回归模型参数,并使用交叉验证来评估模型性能。以下是一个示例代码: ```python from sklearn.model_selection import GridSearchCV, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris # 加载数据集 iris = load_iris() # 定义逻辑回归模型 model = LogisticRegression() # 定义超参数范围 param_grid = {'penalty': ['l1', 'l2'], 'C': [0.1, 1, 10]} # 使用GridSearchCV选择最优的超参数组合 grid_search = GridSearchCV(model, param_grid, cv=5, verbose=0) grid_search.fit(iris.data, iris.target) # 输出最优的超参数组合和对应的模型 print('Best parameters:', grid_search.best_params_) print('Best model:', grid_search.best_estimator_) # 使用交叉验证评估模型性能 scores = cross_val_score(grid_search.best_estimator_, iris.data, iris.target, cv=5) average_score = scores.mean() # 输出模型的平均性能 print("Average score:", average_score) ``` 上面的代码中,我们首先加载了`iris`数据集。然后,我们定义了一个逻辑回归模型,并定义了超参数范围`param_grid`。我们使用`GridSearchCV`来选择最优的超参数组合,其中`cv=5`表示采用5倍交叉验证,`verbose=0`表示不输出详细信息。 然后,我们输出了最优的超参数组合和对应的模型。接着,我们使用交叉验证来评估模型的性能,其中`grid_search.best_estimator_`表示使用最优的超参数组合得到的模型。 最后,我们输出了模型的平均性能。需要注意的是,这里使用了`cross_val_score`函数来对模型进行交叉验证,并得到模型的平均性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃什么芹菜卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值