文章目录一、 数据集划分训练集与评估集二、 K 折交叉验证提升评估可靠性1. 基本原理1.1. K折交叉验证基本原理1.2. 逻辑回归算法与L22. 基于K折交叉验证L2算法三、弃一交叉验证Leave-One-Out1、基本原理2、代码实现四、ShuffleSplit交叉验证1、基本原理2、为什么能降低方差3、代码测试五、 选择建议在机器学习中评估算法的核心目标是衡量模型在“未知数据”上的表现而不是仅仅追求训练集上的高分。只有通过科学的评估方法我们才能判断模型是否具备良好的泛化能力避免“过拟合”陷阱。因此合理划分数据集并选择合适的评估策略是每一个机器学习项目的基础环节。一、 数据集划分训练集与评估集常见做法是将原始数据集分为训练集和评估集也称测试集常用比例为67%训练33%评估。这种划分方式简单高效适合数据量较大的场景。frompandasimportread_csvfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegression# 导入数据filenamepima_data.csvnames[preg,plas,pres,skin,test,mass,pedi,age,class]dataread_csv(filename,namesnames)# 将数据分为输入数据和输出结果arraydata.values Xarray[:,0:8]Yarray[:,8]test_size0.33seed4# 将数据随机分离X_train,X_test,Y_traing,Y_testtrain_test_split(X,Y,test_sizetest_size,random_stateseed)modelLogisticRegression()# 初始化逻辑回归模型。model.fit(X_train,Y_traing)# 模型进行训练resultmodel.score(X_test,Y_test)print(算法评估结果%.3f%%%(result*100))算法评估结果80.709%test_size0.33指定33%数据作为评估集。random_state42设置随机种子保证每次划分结果一致便于复现实验。注意评估结果如准确率只能代表模型在未见过数据上的表现不能用训练集直接评估否则会高估模型能力。二、 K 折交叉验证提升评估可靠性1. 基本原理1.1. K折交叉验证基本原理当数据量有限时单次划分可能导致评估结果不稳定。K 折交叉验证K-Fold Cross Validation通过多次划分和训练有效提升评估的稳健性。原理简述将数据分为 K 份每次用 K-1 份训练剩下1份评估。重复 K 次每份都做一次评估最后取平均分。1.2. 逻辑回归算法与L2逻辑回归是一种用于二分类问题的机器学习算法。它通过一个特殊的函数sigmoid函数将线性组合转换为0到1之间的概率值。P ( y 1 ) 1 / ( 1 e ( − z ) ) P(y1) 1 / (1 e^{(-z)})P(y1)1/(1e(−z))其中 z w₁x₁ w₂x₂ … wₙxₙ b这里的权重w₁, w₂, ..., wₙ决定了每个特征的重要性。当某个特征的权重很大时这个特征对预测结果的影响就很大。而L2正则化是防止它过拟合的关键技术。当特征很多或数据量较小时逻辑回归容易过拟合。模型可能学习到一些噪声模式导致在训练集上表现很好但在新数据上表现很差。这是因为模型记住了训练数据中的随机波动而不是学习到真正的规律。L2正则化通过惩罚大的权重值来防止过拟合。总损失 交叉熵损失 λ × Σ ( 权 重 2 ) 总损失 交叉熵损失 λ × Σ(权重²)总损失交叉熵损失λ×Σ(权重2)λ × Σ(权重²)衡量所有权重的平方和。交叉熵损失 − Σ [ y × l o g ( p ) ( 1 − y ) × l o g ( 1 − p ) ] 交叉熵损失 -Σ[y × log(p) (1-y) × log(1-p)]交叉熵损失−Σ[y×log(p)(1−y)×log(1−p)]y 是真实标签0或1p 是模型预测的概率现在举例说明L2原理假设模型有如下4个权重现在对不同模型引入惩罚系数# 模型A权重较大权重_A[5.0,-4.0,6.0,-5.0]预测准确率95%交叉熵损失0.1L2惩罚项0.1×(25163625)0.1×10210.2总损失0.110.210.3# 模型B权重较小权重_B[2.0,-1.5,2.5,-2.0]预测准确率94%交叉熵损失0.15L2惩罚项0.1×(42.256.254)0.1×16.51.65总损失0.151.651.8结果分析L2正则化的目标是最小化总损失而不是最大化预测准确率。虽然模型A的预测准确率更高95% vs 94%但它的总损失更大10.3 vs 1.8。那为什么总损失更重要过拟合风险模型A的权重很大说明它可能记住了训练数据中的噪声而不是学习到真正的规律。虽然现在预测准确但在新数据上可能表现很差。泛化能力模型B的权重较小说明它更保守不会过分依赖某些特征。虽然准确率稍低但更稳定在新数据上表现更好。所以L2正则化选择总损失更小的模型即使它的预测准确率稍低。这是因为较小的权重意味着模型更稳定泛化能力更强不容易过拟合。这就是为什么模型B虽然准确率94%但总损失1.8比模型A的10.3更优。2. 基于K折交叉验证L2算法frompandasimportread_csvfromsklearn.model_selectionimportKFoldfromsklearn.model_selectionimportcross_val_scorefromsklearn.linear_modelimportLogisticRegression 。。。数据集划分见上# 创建K折交叉验证对象# n_splitsnum_folds: 将数据集分成num_folds份进行num_folds次训练和验证# random_stateseed: 设置随机种子确保每次运行结果一致# shuffleTrue: 在分割前先打乱数据避免数据顺序对结果的影响kfoldKFold(n_splitsnum_folds,random_stateseed,shuffleTrue)# 创建逻辑回归模型# LogisticRegression(): 默认使用L2正则化适用于二分类问题# 可以通过参数调整正则化强度、求解器等modelLogisticRegression()# 使用交叉验证评估模型性能# cross_val_score(): 自动进行K折交叉验证返回每折的得分# model: 要评估的模型# X: 特征矩阵# Y: 目标变量# cvkfold: 使用上面定义的K折交叉验证策略resultcross_val_score(model,X,Y,cvkfold)# 输出评估结果print(算法评估结果%.3f%% (%.3f%%)%(result.mean()*100,result.std()*100))算法评估结果77.864%(4.735%)优缺点优点充分利用数据评估更稳健。缺点计算量较大尤其是K值较高时。三、弃一交叉验证Leave-One-Out1、基本原理弃一交叉验证LOOCV是一种特殊的交叉验证方法专门用于极小数据集。它的核心思想很简单每次只留一个样本做测试其余全部用于训练这样循环N次N为样本总数。当数据集很小时传统的K折交叉验证可能不够可靠。比如只有10个样本分成5折意味着每折只有2个样本这样的评估结果波动很大不够稳定。LOOCV通过最大化训练数据来解决这个问题。每次训练时模型都能使用N-1个样本这在小数据集上是非常宝贵的。同时每个样本都会被用作测试集一次确保了评估的全面性。2、代码实现fromsklearn.model_selectionimportLeaveOneOut# 创建弃一交叉验证对象# loocv自动实现每次留一个样本的验证策略# 如果数据集有N个样本会进行N次训练和测试loocvLeaveOneOut()# 使用弃一交叉验证评估模型性能# cross_val_score自动进行N次训练和测试返回每次的得分# model要评估的模型如逻辑回归、随机森林等# X特征矩阵# Y目标变量# cvloocv使用弃一交叉验证策略resultcross_val_score(model,X,Y,cvloocv)# 输出评估结果# result.mean()计算所有N次评估的平均得分# result.std()计算所有N次评估的标准差衡量模型稳定性print(算法评估结果%.3f%% (%.3f%%)%(result.mean()*100,result.std()*100))弃一交叉验证是极小数据集上最可靠的评估方法。它通过最大化训练数据利用为每个样本提供最全面的评估从而获得最稳定的性能指标。虽然计算成本高但在数据稀缺的情况下这种奢侈是值得的。四、ShuffleSplit交叉验证1、基本原理传统的K折交叉验证虽然有效但在某些情况下可能不够灵活。比如当数据分布不均匀(某折训练集某些特征数据很少)或者我们希望获得更稳健的评估结果时需要一种更灵活的验证方法。ShuffleSplit通过随机划分数据来解决这个问题。每次随机选择一部分数据作为测试集其余作为训练集然后重复这个过程多次。这样既保证了评估的随机性又通过多次重复降低了结果的方差。假设设置10次划分测试集比例为33%第1次随机选择33%数据做测试67%做训练第2次重新随机选择33%数据做测试67%做训练第3次再次重新随机选择……重复10次2、为什么能降低方差1. 减少偶然性传统K折使用固定划分如果某折恰好包含异常数据整个评估结果就会受影响。而ShuffleSplit通过多次随机划分将异常数据的影响分散到不同次评估中从而降低了单次异常对整体结果的影响。2. 更全面的评估传统K折中每个样本只在固定的某折中测试一次而ShuffleSplit中每个样本可能在不同次评估中被测试获得更全面的性能评估。这种随机性确保了评估结果更加客观和全面。3. 统计稳定性传统K折通常只进行5次评估结果可能波动很大。而ShuffleSplit可以进行10次或更多次评估通过增加评估次数来提高统计稳定性使结果更加可靠。nbsp3、代码测试fromsklearn.model_selectionimportShuffleSplit# 创建ShuffleSplit对象# n_splits10重复10次划分获得10个评估结果# test_size0.33每次33%数据做测试67%数据做训练# random_state7设置随机种子确保结果可重现kfoldShuffleSplit(n_splits10,test_size0.33,random_state7)# 使用ShuffleSplit评估模型性能# cross_val_score自动进行10次训练和测试返回每次的得分# model要评估的模型如逻辑回归、随机森林等# X特征矩阵# Y目标变量# cvkfold使用ShuffleSplit验证策略resultcross_val_score(model,X,Y,cvkfold)# 输出评估结果# result.mean()计算10次评估的平均得分# result.std()计算10次评估的标准差衡量模型稳定性# *100将小数转换为百分比显示# %.3f保留3位小数print(算法评估结果%.3f%% (%.3f%%)%(result.mean()*100,result.std()*100))优缺点分析优点通过多次随机划分降低方差提高评估结果的稳定性同时具有很高的灵活性可以自由设置划分次数和测试集比例适应各种数据分布情况。缺点需要多次训练模型计算成本较高不同次划分的测试集可能有重叠影响评估的独立性。ShuffleSplit通过随机重复划分的方式在保持计算效率的同时显著降低了评估结果的方差。它特别适合需要稳健评估结果的场景是传统交叉验证方法的有益补充。五、 选择建议数据规模推荐方法说明数据量大67%/33%分割或K折K3、5、10均可数据量小弃一交叉或ShuffleSplit最大化数据利用降低方差需最终评估K折K10行业“黄金准则”最佳实践每次划分都要设置random_state保证实验可复现。评估指标要与业务目标一致如类别不平衡时优先关注AUC等。不要用训练集直接评估模型。
阅读完成 · 觉得有帮助?