《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 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标准化

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

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

# 可视化混淆矩阵,网上都是包装好的,可以直接复制使用
def cm_plot(y, yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

data = pd.read_csv(r'./creditcard.csv')
data.head()  # 默认输出前5行,这里用来提示防止忘记代码了

# 设置字体,用来显示中文
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False

# 同级class列中每个类型的数据个数,(这里的样本极度不均衡)
labels_count = pd.value_counts(data['Class'])
# 可视化上述分类数据的个数
plt.title("正负例样本数")
plt.xlabel('类别')
plt.ylabel('频数')
labels_count.plot(kind='bar')
plt.show()

# 将Amount列的数据进行Z标准化,因为其余列的值有负值,所以不能使用0-1归一化
# 导入库的用法
from sklearn.preprocessing import StandardScaler
# z标准化
scaler = StandardScaler()  # 这是一个类,专门用来处理z标准化,适合处理大量数据的类,还有一种叫scale,适合对小部分数据进行z标准化
a = data[['Amount']]  # 取出Amount整列数据
data['Amount'] = scaler.fit_transform(data[['Amount']])  # 对Amount整列数据进行z标准化后将其传入原data内,覆盖原来的列

# 删除无用的列,Time列,axis=1表示列,axis=0表示行,然后再传入data文件
data = data.drop(['Time'],axis=1)

# 对数据集取出一部分数据用来当做训练集,一部分当做测试集
# 因为银行贷款可能随时间变化而变化,所以不能直接取前一半后一半的这种,需要对整体数据随机取出一部分当做训练和测试数据
from sklearn.model_selection import train_test_split
# 删除列Class后的数据赋值给 x,然后再将Class单独取出赋值给y
x = data.drop('Class',axis=1)
y = data.Class

# 使用train_test_split函数,放入参数 训练集和训练标签,以及需要取出的测试数据的百分比,以及定义一个随机种子,以保证下一次运行代码的结果不变
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)
# 顺序返回四个参数,分别表示训练集特征值,测试集特征值,训练集标签,测试集标签
# test_size表示需要取出的测试集所占数据集百分比
# random_state表示随机种子,如果不设置随机种子,再次运行代码又会重新随机取一部分数据,最后的正确率可能会发生变化
# 设置随机种子后则会定死这些已经取出过的数据,保证最后结果的正确率保持不变

三、train_test_split 随机取数据

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

from sklearn.model_selection import train_test_split

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'来选择正则化方式

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值