机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型
目录
- 机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型
- 1 过拟合和欠拟合
- 1.1 过拟合
- 1.2 欠拟合
- 2 正则化惩罚
- 2.1 概念
- 2.2 函数
- 2.3 正则化种类
- 3 K折交叉验证
- 3.1 概念
- 3.2 图片理解
- 3.3 函数导入
- 3.4 参数理解
- 4 训练模型K折交叉验证
- 4.1问题及理解
- 4.2 训练模型调整
1 过拟合和欠拟合
1.1 过拟合
概念:模型对训练数据的拟合程度过高,导致模型在训练集上表现完美,但在验证集或测试集上表现差。
一些方法:
- 减少模型复杂度,减少参数数量。
- 正则化惩罚,限制模型。
1.2 欠拟合
概念:模型对训练数据的拟合程度不高,导致模型在训练集和测试集上的表现都不好。
一些方法:
- 增加模型复杂度,增加参数数量。
- 增加训练时间。
- 增加训练数据量。
在机器学习实践中,通常需要根据模型的表现不断调整,直到找到既不过拟合也不欠拟合的最佳模型状态。
2 正则化惩罚
2.1 概念
通过在损失函数中加入惩罚项,限制模型参数的大小,从而提高模型的泛化能力,用于防止模型过拟合,是在机器学习和深度学习中常用的技术。
2.2 函数
- 逻辑回归损失函数:
- 正则化惩罚:
2.3 正则化种类
L1正则化和L2正则化,主要是损失函数加入惩罚项的不同如下:
LogisticRegression的C参数表示正则化强度,是正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数,越小的数值表示越强的正则化。
3 K折交叉验证
3.1 概念
将原始数据均分成K组,将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为训练模型的性能指标。
3.2 图片理解
如下图显示,均分后,依次作为测试集,求平均数。
3.3 函数导入
from sklearn.model_selection import cross_val_score
3.4 参数理解
lg = LogisticRegression(C=i,penalty='l2',solver='lbfgs',max_iter=1000)
score = cross_val_score(lg,x_tr,y_tr,cv=8,scoring='recall')
- lg为算法
- x_tr,y_tr,参与K折交叉验证的特征数据和结果类别
- cv=8,k折,均分为8组依次测试
- scoring=‘recall’,要求召回率平均数
4 训练模型K折交叉验证
4.1问题及理解
问题:给定数据,预测分类
特征数据:除类别列外,其他有关列
类别标签:类别列
第一列为时间,无关,最后一列为类别给定的数据:
4.2 训练模型调整
通过正则化惩罚和K折交叉验证调整训练模型,可以看到模型更加精准。
代码展示:
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_predict, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.model_selection import cross_val_score
# 标准化处理
scaler = StandardScaler()
data = pd.read_csv('creditcard.csv')
a = data[['Amount']]
b = data['Amount']
# z标准化处理Amount,再存Amount中
data['Amount'] = scaler.fit_transform(data[['Amount']])
# 删除time列
data = data.drop(['Time'],axis=1)
# 特征数据x,删除class列
x_all = data.drop(['Class'],axis=1)
# class为标签结果列
y_all = data.Class
# 训练集特征,测试集特征,训练集结果,测试集结果,test_size抽取的测试集百分比,train_size 抽取的训练集百分比
x_tr,x_te,y_tr,y_te = \train_test_split(x_all, y_all, test_size=0.3,random_state=0)
# 逻辑回归方法引用
lgi = LogisticRegression(C=0.1)
# 训练集训练模型
lgi.fit(x_tr,y_tr)
# 预测测试集结果
re_pr = lgi.predict(x_te)
# 拟合度评分
score0 = lgi.score(x_te,y_te)
print(score0)
# # 分类结果报告
print(metrics.classification_report(y_te, re_pr))
# 交叉验证,选择惩罚因子
scores = []
c_range = [0.01,0.1,1,10,100]
# 循环测试带入因子
for i in c_range:lg = LogisticRegression(C=i,penalty='l2',solver='lbfgs',max_iter=1000)# 模型迭代8次后的所有模型的recall值score = cross_val_score(lg,x_tr,y_tr,cv=8,scoring='recall')# score的平均值,也就是recall的平均值score_m = sum(score)/len(score)# scores列表添加均值recallscores.append(score_m)# print(score_m)
# np.argmax()求括号内的最大值对应的索引,得最大值对应的C值
# print(np.argmax(scores))
print(scores)
best_c = c_range[np.argmax(scores)]
# 根据上面最大判断,建立模型
lg = LogisticRegression(C=best_c,penalty='l2',max_iter=1000)
lg.fit(x_tr,y_tr)
# # 训练集的预测
te_pr = lg.predict(x_te)
# 拟合度
score1 = lg.score(x_te,y_te)
print(score1)
# 制作混淆矩阵,根据训练集的真实结果和预测结果,自测
print(metrics.classification_report(y_te,te_pr))
运行结果: