一、混淆矩阵
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'来选择正则化方式