第6章 模型评价与优化:欠拟合under fit、过拟合over fit,数据分离、误差矩阵 Confusion Matrix,模型优化,实战1,实战2


目录


目前,已掌握了机器学习中的一些主流的技术。

一、本章内容

1.1 6个任务

二、欠拟合与过拟合

2.1 对于回归任务

右图:二项式回归。good fit

相对于上图中的good fit,下图中:

  • 左边的是under fit:线性回归(一项式回归),准确率很低。
  • 右边的是over fit:五项式回归。对旧训练数据的拟合极精准,但是对新测试数据很不准确。(甚至不符合实际规律,因为真实的酶的活性,会随着温度升高逐渐增强,达到一个peak后,会逐渐减弱。)

2.2 对于分类任务

数据的维度:2维。

2.3 欠拟合 under fit、过拟合 over fit

一般,欠拟合,容易发现:因为训练数据时就能发现了。

但是,比较难发现的是:过拟合。因为训练数据时,是不能发现的。

我的理解:

训练数据的准确率,并不是绝对的越高越好。

2.4 如何解决过拟合问题:简化模型、PCA降维、增加正则项

1.三个办法

2.数据PCA处理,解决过拟合问题:

3.增加正则项,来解决过拟合问题

线性回归的目标:

是最小化损失函数。即,预测数据点,与实际数据点,的距离之和,是最小化的。

下图是逻辑回归的损失函数:

图示:

我的问题:

这里的的具体含义是什么。

是不是它的本质,也是跟方式二的PCA一样降低维度?因为正则项是二项式(平方)。

2.5 知识巩固

不正确。

因为我们机器学习建立模型的目的,不是让训练数据的模拟有多么的准确,而是要让新的测试数据的预测更加准确。

有一种情况是:你输入了所有的属性进行训练,训练数据的准确度很准,但是训练数据却意外的不准、出现很多的误判。这种常见的现象,就是过拟合over fit。

三、数据分离、误差矩阵 Confusion Matrix

3.1 机器学习的核心目的:不是对训练数据的高准确率,而是对新测试数据的预测的高准确率

机器学习的核心目的:不是对训练数据的高准确率,而是对新测试数据的预测的高准确率。

3.2 数据分离:解决没有新的测试数据的问题

3.3 使用准确率进行模型评估的局限性(重):无法反映细节信息:体现不出数据预测的实际分布、错误预测的类型

3.4 误差矩阵 Confusion Matrix

3.5 更丰富的模型评估指标:+4个:召回率 Recall、特异度 Specificity 、精确率 Precision、F1分数 F1 Score

1.

2.

举个例子:

下图这个表,不太会填写?

异常交易的检测:

特点是:只要有一个异常交易,那么银行就会损失惨重。输不起。

基于这个特点,就推出:一定要把所有的异常交易给找出来。即使误判(错杀),即允许正常交易,被误判为异常交易。

即正常交易中,不能有异常交易。即特异度要尽可能的高。

3.6 课后题

四、模型优化

4.1 拿到训练数据时,会有的三个问题

大家都做机器学习,那么你能不能做的比别人好?

区别是:提高模型表现。即相同的数据下,你的模型训练的更好。

4.2 提高模型表现:数据的质量,决定模型表现的上限

  • 比如说,身体质量指数,只需要身高、体重两个参数即可。那么,其他的数据,比如姓名等数据,就是没有必要的。

具体的操作为:

  • 前三项:是针对数据本身
  • 后一项:确定了数据之后,针对的是模型

4.3 拿到数据的第一时间,考虑的四个问题

拿到数据的第一时间,可以考虑以下几个问题:

1.是否需要删除异常数据?

2.数据的量级差异如何?

两个数据的范围:是差不多的。所以,可以直接拿来用 。不用再归一化。

3.数据维度,是否可以减少?

4.尝试不同的模型

尝试了三个不同的模型,其效果都还可以。那就使用knn k近邻模型,来举例。

4.4 模型优化:三个方面

其中:

尝试不同的 n_neighbors值:

knn模型,对于n_neighbors ,从大往小看(即从右往左看):

  • 训练数据,是越来越准确。------------------- 单调递增
  • 测试数据,是越来越准确再不准确。--------递增再递减

4.5 课后题

五、实战准备

5.1 实战1:酶的活性预测,核心代码

  • 原始数据的x轴,是比较稀疏的、不会遍历上所有的点的。所以,需要自己生成一个这样的数据集:x轴。

reshape(-1, 1)指的是,调整为若干行、1列的数组。

  • 这里就不是线性回归了,而是多(二)项式回归。Polynomial指的是多项式。
  • degree指的是生成的最高次项是几次的。这里的最高次项是2次方。
  • fit_transform只需要用一次即可。后续用transform就会调用相同的转换方式。(这个我不太理解)

5.2 实战2:芯片的质量好坏的预测,核心代码

1.数据分离

  • random_state指的是随机的排序。每次取的时候,是一样的顺序。
  • test_size指的是训练数据集与测试数据集的比例。假设是10个样本,那么测试数据就是4个样本。

2.如何形成橙蓝边界:

  • 以前,分类的方式是求解这个边界曲线的方程。根据每个x,就能得到对应的y的数值。
  • 现在,更方便的方式:先建立模型,训练完。然后遍历输入数据里的所有的组合。然后,将这些组合,都放进模型中进行预测。根据这个预测结果,来判断这个分类是0还是1。然后根据这个0还是1,就画在上面。一些密密麻麻的点,肉眼看不见,但是能看到是一些区域。这样,就能形成一个可视化分类的效果了。
  • 200行*200列,的矩阵,即数据点云。然后,将其转换成array的格式。最终,生成整个区域的数据。
  • 接着,就是生成橙蓝边界:蓝色是bad_knn,橙色是good_knn。

3.误差矩阵

六、实战1:酶的活性预测,回归任务

6.1 任务:4个

酶活性预测实战task:
1.基于T-R-train.csv数据集,建立线性回归模型,计算其在T-R-test.csv数据集上的r2分数,可视化模型预测结果。
2.加入多项式特征(2次、5次),建立回归模型。
3.计算多项式回归模型对测试数据进行预测的r2分数,判断哪个模型的预测的更准确
4.可视化这个多项式回归模型的数据预测结果,判断哪个模型的预测更准确

6.2 task1: 基于T-R-train.csv数据集,建立线性回归模型,计算其在T-R-test.csv数据集上的r2分数,可视化模型预测结果

1.

已存放在电脑本地目录:

在电脑本地目录里找到,并用Excel软件查看下该csv文件:

2.对于训练数据

原数据的分布情况,即散点图,原来长这样:

将Pandas库中的series序列,----- 跟dataframe一样,本质上是对表格数据的处理。---- 能用于散点图等可视化图

转换为Numpy库中的array。------ 是一个数学库,用于处理数组形式的数学运算。------- 能用于模型训练。

我的问题:
这里的y_train也是一个pandas库中的series数据结构。难道它不需要向左边的自变量一样,通过转换成array来调整维度吗?

3.对于测试数据

看一下r2分数:与1不接近,甚至距离很远。说明模型的效果很差。

可视化验证下:

确实是一条直线:

6.3 task2: 加入多项式特征(2次、5次),建立回归模型

6.4 task3: 计算多项式回归模型对测试数据进行预测的r2分数,判断哪个模型的预测的更准确

6.5 task4: 可视化这个多项式回归模型的数据预测结果,判断哪个模型的预测更准确

(一)二项式的特征

1.generate new features(本质就是一些abc系数的数据集)

发现:以前的X_train是一列。

但是,这里的多项式特征数据:X_2_train是三列:因为有个常数项、x的一次方、x的二次方这三个。

2.train the model

3.make prediction on the training data and testing data

4.generate new data

结果:r2分数,非常好。因为非常接近1.

5.visualize

上图中,最小值是40,最大值是90,一共生成300个点。然后,再转换成300行、1列的array。(方便模型训练、可视化图)

可视化验证下:效果特别好。

我的问题:

为什么在原始数据得到的散点图之外,拟合的回归曲线,也能同时在该图上一起显示呢?

因为拟合的回归曲线,在自变量设置时,就已考虑了原散点图自变量的范围,他俩是一致的。

即上面的X_2_range变量。

(二)五项式的特征

再编写以下多项式(5次)的。

自定义一个多项式特征的对象,最高次项为5:

fit_transform只需要在第一次调用的时候使用即可,因为它会自动的进行一次fit,来得到对应的转换关系。第二次就不再需要了。

lr5模型的入参是:经过多项式特征对象,改造后的自变量X_5_train

结果:

训练集,准确度非常高,但是测试集却只有0.54,比较低。

可视化验证下:

确实是对橙色的测试集,预测不准确。

七、实战2:芯片的质量好坏的预测,分类任务

7.1 任务:6个

7.2 task1: 基于data_class_raw.csv数据集,根据高斯分布概率密度函数,寻找异常点并剔除

任务:
1.基于data_class_raw.csv数据集,根据高斯分布概率密度函数,寻找异常点并剔除
2.基于data_class_processed.csv数据集,进行pca分析,确定重要数据维度及成分
3.完成数据分离,数据分离参数:random_state = 4, test_size = 0.4
4.建立KNN模型完成分类,n_neighbors取10, 计算分类准确率,可视化分类边界
5.计算测试数据集,对应的混淆矩阵,计算准确率、召回率、特异度、精确率、F1分数
6.尝试不同的n_neighbors(1-20),计算其在训练数据集、测试数据集上的准确率,并做图

1.

数据集如下:

2.

最终,找到这些异常点之后,直接在excel中对其进行删除即可;

7.3 task2: 基于data_class_processed.csv数据集,进行pca分析,确定重要数据维度及成分

1.

这是已经处理过异常点之后的数据集:

2.

标准差:这两个都算比较大。

可视化检验下:

确实这两个维度的都很大,都是主成分。是没有必要再去降维的。

7.4 task3: 完成数据分离,数据分离参数:random_state = 4, test_size = 0.4

原始数据,就被拆分成了两个部分:训练集、测试集。其中,测试集的占比是40%。

7.5 task4: 建立KNN模型完成分类,n_neighbors取10, 计算分类准确率,可视化分类边界

之前,做过了KNN模型。但是,可视化分类边界,比较重要需要练习下。

1.

针对训练数据集,建立knn模型。

查看下准确率,结果:

  • 训练数据,95%左右,很准。
  • 但是,测试数据,只有64%,比较不准。

2.

查看下原来的数据范围,是从0-10之间。所以:

x、y轴两个方向,都自定义这个区间;

这里的40000,指的是200*200:

这里的预测,指的是所有区域的所有点的情况,都已预测完成:

3.

结果:

红色、绿色,是原来的好数据、坏数据。

蓝色橙色边界,其实是决策边界。

7.6 task5: 计算测试数据集,对应的混淆矩阵,计算准确率、召回率、特异度、精确率、F1分数

1.准备

2.

准确率:整体样本中,预测正确样本数的比例。

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

灵敏度(召回率):正样本中,预测正确的比例。

  • Sensitivity = Recall = (TP)/(TP + FN)

这两个指标,差不了太多。说明,样本的代表性,比较好。

3.

特异度:负样本中,预测正确的比例

  • Specificity = TN/(TN + FP)

精确率:预测结果为正的样本中,预测正确的比例。

  • Precision = (TP)/(TP + FP)

F1分数:综合Precision和Recall的一个判断指标

  • F1 Score = 2 Precision Recall / (Precision + Recall)

发现,上述的这些指标,大都在60%-70%之间。还是比较均匀的。

7.7 task6: 尝试不同的n_neighbors(1-20),计算其在训练数据集、测试数据集上的准确率,并做图

1.

遍历不同的k数值,建立对应的knn模型:

2.

结果:

发现这个n数值,并不是越大越好。而是一个中间合适的数值。比如6-12之间。

7.8 小结

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 第6章 模型评价与优化:欠拟合under fit、过拟合over fit,数据分离、误差矩阵 Confusion Matrix,模型优化,实战1,实战2


Follow excellence, and success will chase you.