当前位置:   article > 正文

《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 No.6

《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 No.6

一、混淆矩阵

1、什么是混淆矩阵?

        混淆矩阵是用于评估分类模型在不同类别上的预测准确性的工具。它提供了模型预测结果与真实结果之间的对应关系,帮助我们分析和理解模型的分类性能。

假设,要对15个人预测是否患病,使用1表示患病,0表示正常,预测结果如下:

        此时,预测患病并且预测对了的人数为5个,可以表示为TP,预测错了的为4个,可以表示为FP,而预测正常且预测对了的人数有2个,可以表示为TN,预测错了的为4个,可以表示为FN

        T 表示 True,表示预测结果为正确的,

        F 表示 False,表示预测结果为正确的

        P 表示 Positive,表示预测的为患病的

        N 表示 Negative,表示预测的为正常的   

由此我们可以将这四个数据转化成如下图的形式:

有了这些数据,我们可以得到以下参数计算结果:

1)Accuracy 准确率

        Accuracy = (TP+TN)/(TP+TN+FP+FN)

        表示预测成功的概率

 

2) Precision 精确率

        Precision = TP / ( TP + FP )

        表示预测患病情况下的预测成功率

 

3)Recall 召回率

        Recall = TP / ( TP + FP )

        表示患病情况下预测正确的概率

 

4)F1-score F1值

        用于衡量模型在预测1类样本时的准确性和覆盖率,其取值范围是0到1,值越接近1表示模型的性能越好,值越接近0表示模型的性能越差

可以使用上节课代码输出结果来看:

metrix.classfication_report(train_y,train_predict)

二、银行贷款案例

        有如下文件,共284808条数据,有31个特征值,第一个Time为贷款时间,倒数第二个Amount为用户年工资,Class为分类,银行可以贷款为0,不可以贷款为1

已进行过脱敏处理

Amount 对应值与前面28列特征值相差太大,需要对其进行 Z标准化

        现在的目的是,有人去银行贷款,输入特征值后得到预测的值,表示银行可以贷款给用户的资金额度。

接下来直接看部分代码(这里只写到创建随机种子):

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from pylab import mpl
  5. # 可视化混淆矩阵,网上都是包装好的,可以直接复制使用
  6. def cm_plot(y, yp):
  7. from sklearn.metrics import confusion_matrix
  8. import matplotlib.pyplot as plt
  9. cm = confusion_matrix(y, yp)
  10. plt.matshow(cm, cmap=plt.cm.Blues)
  11. plt.colorbar()
  12. for x in range(len(cm)):
  13. for y in range(len(cm)):
  14. plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')
  15. plt.ylabel('True label')
  16. plt.xlabel('Predicted label')
  17. return plt
  18. data = pd.read_csv(r'./creditcard.csv')
  19. data.head() # 默认输出前5行,这里用来提示防止忘记代码了
  20. # 设置字体,用来显示中文
  21. mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
  22. mpl.rcParams['axes.unicode_minus'] = False
  23. # 同级class列中每个类型的数据个数,(这里的样本极度不均衡)
  24. labels_count = pd.value_counts(data['Class'])
  25. # 可视化上述分类数据的个数
  26. plt.title("正负例样本数")
  27. plt.xlabel('类别')
  28. plt.ylabel('频数')
  29. labels_count.plot(kind='bar')
  30. plt.show()
  31. # 将Amount列的数据进行Z标准化,因为其余列的值有负值,所以不能使用0-1归一化
  32. # 导入库的用法
  33. from sklearn.preprocessing import StandardScaler
  34. # z标准化
  35. scaler = StandardScaler() # 这是一个类,专门用来处理z标准化,适合处理大量数据的类,还有一种叫scale,适合对小部分数据进行z标准化
  36. a = data[['Amount']] # 取出Amount整列数据
  37. data['Amount'] = scaler.fit_transform(data[['Amount']]) # 对Amount整列数据进行z标准化后将其传入原data内,覆盖原来的列
  38. # 删除无用的列,Time列,axis=1表示列,axis=0表示行,然后再传入data文件
  39. data = data.drop(['Time'],axis=1)
  40. # 对数据集取出一部分数据用来当做训练集,一部分当做测试集
  41. # 因为银行贷款可能随时间变化而变化,所以不能直接取前一半后一半的这种,需要对整体数据随机取出一部分当做训练和测试数据
  42. from sklearn.model_selection import train_test_split
  43. # 删除列Class后的数据赋值给 x,然后再将Class单独取出赋值给y
  44. x = data.drop('Class',axis=1)
  45. y = data.Class
  46. # 使用train_test_split函数,放入参数 训练集和训练标签,以及需要取出的测试数据的百分比,以及定义一个随机种子,以保证下一次运行代码的结果不变
  47. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)
  48. # 顺序返回四个参数,分别表示训练集特征值,测试集特征值,训练集标签,测试集标签
  49. # test_size表示需要取出的测试集所占数据集百分比
  50. # random_state表示随机种子,如果不设置随机种子,再次运行代码又会重新随机取一部分数据,最后的正确率可能会发生变化
  51. # 设置随机种子后则会定死这些已经取出过的数据,保证最后结果的正确率保持不变

三、train_test_split 随机取数据

使用train_test_split类来取出训练集和测试集,调用方法和使用方法如下:

  1. from sklearn.model_selection import train_test_split
  2. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)

        其中x表示数据集的特征值,y表示数据集的标签,接下来要从x和y中随机取出测试集和训练集的数据

        test_size :表示需要随机取出的测试集所占数据集的百分比,

        random_state: 表示定义了一个随机种子,因为通过test_size取出的数据是随机的,而每次运行代码都会重新再随机取出数据,使得每次的训练集数据和测试集数据不同,导致最终结果的准确率发生改变,这个准确率可能高可能低,所以这里使用了一个随机种子来固定随机取出的数据,使得下一次运行代码时随机取出的数据不会再发生改变,从而使正确率不会再发生改变。

四、梯度下降

目标函数:也叫损失函数

        这里的 yi 表示真实值,βT Xi表示预测值,他们两个相减则表示误差,因为他们的值可能是负数,所以对其平方再求和,最后的目标是使这个求和的值越小则表示这个线越拟合数据点。

实例:

        有下列一幅图,表示一副可视化的三维图形,其类似于山峦的结构,当你处于山峰上想要下来到最低点的时候,此时看不见山的结构,只能看见周围给定距离(步长/学习率)的画面,只能以给定的步长行走,此时对自己当前位置的山峰以θ0和θ1方向的切开,得到两个曲面,而自己所在位置的点,对应在两个曲面的切线,将曲面切线合并的方向就是梯度方向(类似于向量相加),这个梯度方向则是自己要走下山的方向。如下图所示:

        因为受步长(学习率)的限制,只能以固定的步长向山下走去,但是当走到最下面的时候最接近谷底的时候,最接近谷底的距离少于自己的步长,导致自己又走到了对面的山上,然后再网谷底的方向走,就这样反复来回的在谷底两端徘徊,所以此时则可以去设置参数来调整参数步长的大小,步长太大则导致误差太大,步长太小则导致运行的时间太长。

五、正则化惩罚

        正则化惩罚通过在模型的损失函数中引入一个正则化项,对模型的复杂度进行约束,以防止模型过拟合。这个正则化项一般是模型参数的范数,如L1范数或L2范数。正则化惩罚会对模型的参数进行约束,使得模型更加简单或稀疏,从而减少模型的复杂度。

1、欠拟合

        模型没有训练好,即拟合的程度太差,就拿过来使用,具体展示如下所示,蓝色的线则表示训练好的模型

2、过拟合

        对训练数据训练的特别好,但是也只对训练数据训练的好,但是放入测试数据的准确率就会很差,就相当于学生对一道不会的题目,让他背答案的结果,针对这一题可以直接完美的写完,但是如果稍微更改一点点就不会写了

3、正常状态

4、再看损失函数

        对于上图,如果你的位置在不同的山上,所对应的山脚的位置就不同,这就导致不同的数据所对应的最小值就可能不同,也就说明上述公式的β值就可能有好几种

此时则需要增加一个正则化项来约束模型的复杂度

损失函数:

正则化惩罚:

5、正则化惩罚的两种形式

1)L1正则化

        L1 = 1/2 * λ |θ|   λ叫正则化系数,为上述惩罚中的1/2 θ**2 的倍数

2)L2正则化

        L2 = 1/2 * λ (θ)**2  (用的最多)

在使用参数时选择penalty='l1'或penalty='l2'来选择正则化方式

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/1005659
推荐阅读
相关标签
  

闽ICP备14008679号