深圳网站制作公司资讯商务网站建设找哪家
2026/1/12 3:07:25 网站建设 项目流程
深圳网站制作公司资讯,商务网站建设找哪家,萧县哪有做网站的,17做网站 一件代发在上一篇博客中我们建立的逻辑回归模型解决了银行贷款的二分类问题#xff0c;但是不知道大家有没有注意到我们当时的召回率是非常低的#xff0c;只有百分之百#xff0c;这一次#xff0c;我们就来学习如何进行逻辑回归的调优。、 1、参数调整 原理 在逻辑回归的参数调…在上一篇博客中我们建立的逻辑回归模型解决了银行贷款的二分类问题但是不知道大家有没有注意到我们当时的召回率是非常低的只有百分之百这一次我们就来学习如何进行逻辑回归的调优。、1、参数调整原理在逻辑回归的参数调整中核心调优目标其实是正则化因子C——其他参数多为模型结构的选择项而C的取值直接决定模型性能。那么正则化因子到底是什么我们又该如何精准调整你且听我娓娓道来。我们之前提到为了防止模型过拟合正则化惩罚是关键手段。过拟合的本质是模型在训练集上过度学习甚至“死记硬背”了数据中的噪声导致决策边界出现局部异常陡峭的划分。要知道逻辑回归处理的二分类任务中两类样本通常存在相对清晰的区分规律这种过度贴合局部噪声的划分方式显然会让模型在新数据上的泛化能力大打折扣。这种“局部异常变化”反映在数学层面就是模型求解出的参数权重绝对值过大。因此正则化惩罚的核心思路就是在损失函数中加入一个与参数相关的正向项——通过这种“惩罚”机制压缩参数的大小从根源上避免参数过大导致的过拟合问题。而正则化因子C正是调控这份“惩罚力度”的关键旋钮。这里需要明确一个核心逻辑C的数值与惩罚强度呈正相关C越大意味着对参数过大的惩罚越严厉模型越难出现过拟合反之C越小惩罚力度越弱模型则更容易陷入过拟合。但问题来了——到底多大的C才能让模型达到最优准确率其实并没有固定公式可以直接计算实践中最可靠的方法是“遍历测试交叉验证”。我们可以构建一个包含常见C值的候选集合比如0.01、0.1、1、10、100这类数量级递增的数值通过循环结构逐一测试同时结合交叉验证如5折或10折交叉验证减少随机误差最终筛选出在验证集上指标最优的C值。案例实现“遍历测试交叉验证”我们依旧以银行贷款的项目为例来讲解具体如何进行“遍历测试交叉验证”。实现代码scores [] # 不同的c参数在验证集下的评分 c_param_range [0.01, 0.1, 1, 10, 100] # 参数 for i in c_param_range: # 第1次循环的时候C0.015个逻辑回归模型 lr LogisticRegression(Ci, penaltyl2, solverlbfgs, max_iter1000) score cross_val_score(lr, x_train, y_train, cv8, scoringrecall) # 交叉验证 # scoring:可选accuracy精度、recall召回率、roc_aucroc值、neg_mean_square score_mean sum(score)/len(score) # 交叉验证后的值召回率 scores.append(score_mean) # 里面保存了所有的交叉验证召回率 print(score_mean) # 将不同的c参数分别传入模型分别看看哪个模型效果更好我们选c best_c c_param_range[np.argmax(scores)] # 寻找到scores中最大值的对应的C参数 print(f最好的正则化因子C:{best_c})原理拆解交叉验证的核心逻辑是利用训练集的特征和标签计算当前正则化因子C对应的模型得分。它之所以能提升评估可靠性关键在于解决了“数据排序偏见”问题——比如银行数据可能因不同时间段的营销活动呈现明显差异若简单划分训练集和验证集很可能让验证集集中包含某类特殊数据导致评估结果失真。具体操作时我们会把原始训练集拆分为若干组比如8组每次选取其中1组作为验证集剩余7组作为新的训练集。用新训练集训练模型后在验证集上计算得分重复这个过程8次让每组数据都担任过一次验证集最终取8次得分的平均值作为该正则化因子C的最终性能得分。通过对比所有候选C值的得分就能清晰定位到最优参数。下面附上完整的项目代码其实仅仅是中间加入了for循环使用价差验证的方法获取最优的正则化因子C。import pandas as pd from sklearn.preprocessing import StandardScaler, MinMaxScaler datepd.read_csv(creditcard.csv) scaler_z StandardScaler() #初始化类 date[Amount]scaler_z.fit_transform(date[[Amount]]) #实现标准化注意.fit_transform方法需要二维数据因此使用双括号 date.drop(columnsTime,inplaceTrue)#删除列后面参数表示直接在原表格中删除 from sklearn.model_selection import train_test_split X date.drop(Class, axis1) # 特征集二维DataFrame y date[Class] # 标签集一维Series x_train, x_test, y_train, y_test train_test_split( X, # 特征集 y, # 标签集 test_size0.3, # 测试集占比如0.2表示20%测试集80%训练集 random_state42 # 随机种子固定值可让每次切分结果一致 ) #在测试集中进行分成八份的交叉验证找到最好的正则化惩罚的C即最好的限制过拟合 import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score scores [] # 不同的c参数在验证集下的评分 c_param_range [0.01, 0.1, 1, 10, 100] # 参数 for i in c_param_range: # 第1次循环的时候C0.015个逻辑回归模型 lr LogisticRegression(Ci, penaltyl2, solverlbfgs, max_iter1000) score cross_val_score(lr, x_train, y_train, cv8, scoringrecall) # 交叉验证 # scoring:可选accuracy精度、recall召回率、roc_aucroc值、neg_mean_square score_mean sum(score)/len(score) # 交叉验证后的值召回率 scores.append(score_mean) # 里面保存了所有的交叉验证召回率 print(score_mean) # 将不同的c参数分别传入模型分别看看哪个模型效果更好我们选c best_c c_param_range[np.argmax(scores)] # 寻找到scores中最大值的对应的C参数 print(f最好的正则化因子C:{best_c}) lr LogisticRegression(Cbest_c, penaltyl2, solverlbfgs, max_iter1000) lr.fit(x_train,y_train) #自测检测欠拟合 y_pre1lr.predict(x_train) print(lr.score(x_train,y_train)) from sklearn import metrics print(metrics.classification_report(y_train, y_pre1,digits6)) #测试 y_prelr.predict(x_test) print(lr.score(x_test,y_test)) from sklearn import metrics print(metrics.classification_report(y_test, y_pre,digits6))参数说明逻辑回归中penaltyl2表示使用L2正则化也是逻辑回归的默认正则化方式对应 Ridge 回归的惩罚逻辑能有效压缩参数但不会使参数归零solverlbfgs是适用于L2正则化的优化求解器在中大型数据集上表现更高效max_iter1000则是为了避免模型在复杂数据上因迭代次数不足导致不收敛根据实际数据情况可灵活调整。执行结果这里我们先用训练集做了一个自测目的是防止欠拟合。如果测试集的结果比自测还要低就说明我们的模型欠拟合了。可以看到我们通过找到最优的正则化因子C的确是提高了我们要求的召回率之前是0.5左右。2、阈值设定原理刚才调整正则化参数的方法本质是通过压缩模型参数让分类边界更平滑避免过拟合。但我们的核心目标是提升召回率以银行贷款项目为例要尽可能识别出所有高风险用户—— 那有没有更直接的方式比如逻辑回归的分类边界本质是一条划分两类样本的线我们能不能直接把这条线 “往某一类样本的方向偏一偏”但这种 “人为偏移分类线” 的方法其实是 “拆东墙补西墙”看似提升了某一类的识别率却会让另一类的错误率大幅上升在实际项目中很少用。具体操作回到逻辑回归的分类原理模型会把样本映射到 sigmoid 函数上默认以 0.5 为分界点sigmoid 输出≥0.5 则预测为正类否则为负类。而 “阈值设定” 的核心就是把这个默认的 0.5 分界点替换成其他数值比如 0.1、0.2、0.3—— 通过调整 sigmoid 函数的划分界限直接改变模型对 “正类 / 负类” 的判定标准从而针对性优化召回率等指标。案例代码实现修改逻辑回归中的阈值以最优模型为例 #设定阈值 thresholds [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9] recalls [] for i in thresholds: y_predict_proba lr.predict_proba(X_test) y_predict_proba pd.DataFrame(y_predict_proba) y_predict_proba y_predict_proba.drop([0],axis1) y_predict_proba[y_predict_proba[1] i] 1 #当预测的概率大于i0.10.2预测的标签设置1 y_predict_proba[y_predict_proba[1] i] 0 #当预测的概率小于等于i 预测的标签设置为0 # cm_plot(y_test, y_predict_proba[1]).show() recall metrics.recall_score(y_test, y_predict_proba[1]) recalls.append(recall) print({} Recall metric in the testing dataset: {:.3f}.format(i,recall))这里是显示不同阈值的代码主体部分和之前的代码没有区别可自行完成。运行结果3、数据集平衡虽然上面这两种方法确实实现了模型的优化但我不知道大家一直以来有没有注意到一个最基本的问题。事实上我们的数据是极度不均衡的基于这种不均衡的数据集训练出来的模型肯定容易产生偏差我们现在学习两种处理数据集的方法。欠采集原理从大量的0类数据中选出和1类数据相同数量的样本来训练模型。代码实现from sklearn.model_selection import train_test_split X date.drop(Class, axis1) # 特征集二维DataFrame y date[Class] # 标签集一维Series x_train, x_test, y_train, y_test train_test_split( X, # 特征集 y, # 标签集 test_size0.3, # 测试集占比如0.2表示20%测试集80%训练集 random_state42 # 随机种子固定值可让每次切分结果一致 ) #######欠采样处理数据均衡各类样本 x_train[class]y_train #合并 # 1. 假设你已有的样本1的行 df_1 x_train[x_train[class] 1] # 2. 获取样本1的数量 n_samples len(df_1) # 3. 筛选样本0的所有行 df_0 x_train[x_train[class] 0] # 4. 随机抽取相同数量的0样本 df_0_sample df_0.sample(nn_samples, random_state42) # 5. 合并得到平衡数据集可选 df_balanced pd.concat([df_1, df_0_sample], axis0).reset_index(dropTrue) x_traindf_balanced.drop(class, axis1) y_traindf_balanced[class]这里是欠采集数据处理部分的代码其他代码不变。运行结果可以看到我们的召回率显著提高。这说明了数据集的重要性。过采集原理造出更多的0类数据代码实现from sklearn.model_selection import train_test_split X date.drop(Class, axis1) # 特征集二维DataFrame y date[Class] # 标签集一维Series x_train, x_test, y_train, y_test train_test_split( X, # 特征集 y, # 标签集 test_size0.3, # 测试集占比如0.2表示20%测试集80%训练集 random_state42 # 随机种子固定值可让每次切分结果一致 ) #######过采样处理数据均衡各类样本 # 导入SMOTE过采样工具 from imblearn.over_sampling import SMOTE # 初始化SMOTE对象设置随机种子保证结果可复现 smote SMOTE(random_state0) # 对训练集进行SMOTE过采样生成平衡后的特征和标签 os_x_train, os_y_train smote.fit_resample(x_train, y_train)这里使用了imlearn第三方库需要自行安装。执行结果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询