第二哈根做交叉验证,把原有的数据集分成5份传进来,第三行代码是正则化惩罚项(当用两种模型对同一数据集进行预测的时候,如果两种模型的召回率相同,选择方差小的,方差小可以防止过拟合,怎么选择第二种模型,进行正则化,本例用的正则化惩罚项,惩罚sita,让其惩罚第一种模型的力度大,惩罚第二种模型的力度小,在目标函数或者损失函数上加上(W的平方)/2(或者加W的绝对值),这样第一种方法的loss就会比第二种方法大很多,设置一个系数,用系数×惩罚项((W的平方)/2(或者加W的绝对值)),代表惩罚力度,系数设为多少惩罚力度会更好一点呢?用交叉验证去评估什么样的模型会达到一个更好的效果。)第三行代码数组里面存放的是惩罚力度的系数,去尝试哪一个系数值比较好,第一个for循环是选择合适的系数,第二个for循环(第二张图的第一个for循环)是进行交叉验证(所平均分的每一段都作为验证集,验证一次)。第二张图的第三行代码的l1是用l1进行惩罚(l1惩罚是(w的平方)/2;l2惩罚是|W|);

第三张图都是打印操作。

惩罚logistics回归 逻辑回归 惩罚项_召回率


惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_02


惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_03


惩罚logistics回归 逻辑回归 惩罚项_数据集_04


看哪一个参数让召回率最高,0.01的时候召回率最高。

惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_05


混淆矩阵,X轴是预测值,Y轴是真实值,正例预测成正例有137个,正例预测成了反例有10个,此时的recall=137/(137+10);精度 =(129+137)/(129+137+10+20)

惩罚logistics回归 逻辑回归 惩罚项_召回率_06


惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_07


(下采样)进行测试的结果,红色框是recall值(135/(12+135))

这里有一个问题,0代表不患癌症,1代表得癌症,误杀了8581人,但是不影响召回率,下采样面临着一个误杀的问题。

惩罚logistics回归 逻辑回归 惩罚项_数据集_08


惩罚logistics回归 逻辑回归 惩罚项_数据集_09


惩罚logistics回归 逻辑回归 惩罚项_召回率_10


如果用原来数据进行测试,不用上采样,也不用下采样。对于样本极度不均衡的数据集,召回率都普遍偏低

惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_11


惩罚logistics回归 逻辑回归 惩罚项_for循环_12


惩罚logistics回归 逻辑回归 惩罚项_数据集_13


惩罚logistics回归 逻辑回归 惩罚项_for循环_14


惩罚logistics回归 逻辑回归 惩罚项_惩罚logistics回归_15


逻辑回归的sigmoid函数默认分割点是0.5,也就是当预测值是0.7的时候认为是1(得癌症),当预测值是0.3的时候认为是0(不得癌症),但是这个分割点是可以调节的,比如说调节成0.7,当预测值是0.8的时候认为是1,当预测值是0.65的时候认为是0.

调节函数是第三行代码的predict_proba函数,第四行矩阵里存储的数字,是调节的分割点。

宁肯错杀一万也不放过一个的时候,recall值很高(=1),但是精度低,在评估一个模型的时候,不能只看召回率,要多角度评估,从实际出发。在本例中0.5比较合适。