机器学习之模型评估方法(分类问题)

目录

1.切分数据集

2.交叉验证

3.混淆矩阵

4.阈值对结果的影响

5.ROC曲线


1.切分数据集

平台是jupyter。导入需要的包

import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt

读取数据:从sklearn中下载数据集

每个数字是由宽28个像素点和长28个像素点(28*28=784)组成的,共有70000个样本数量

切分数据集,前六万份为训练集,后一万份为测试集。训练集用于建立模型,测试集用于评估模型

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

因为数据是按照顺序(012345...)进行排列的,具有规律性,为了保证数据间的独立,对数据集进行打乱

2.交叉验证

为了使最终的模型更加准确。再将测试集分出一部分作为验证集去检验模型,就是交叉验证。如下图,通过更换验证集得到五个模型,综合五个模型再得到最终的模型。

先将问题从十分类(0-10分类)变成二分类(这个数字是不是5)。从sklearn中引入梯度下降分类器,迭代次数5次。将训练集x_train按照二分类(是5为true,反之为false)进行训练。

用分类器看看数据集的第35000个是不是5,得到False,可以看出第35000个数字实际为1

sklearn提供了交叉验证的方法(cross_val_score),传入我们的分类器和训练集,它会自动将训练集切分成你指定的cv(cross validation)份,这里切分成3份,也就是产生了三个结果,平均一下就是最终的准确率。

手动实现交叉验证:第一行引入切分数据的包,第二行引入用于克隆分类器的包。切分的每一份的分类器都应该用统一的参数,这里clone分类器比较方便。skflods把训练集切分三份,用for循环分别遍历这三份训练集,前两个folds分别得到每一份训练集的样本值、是否等于5(T/F),这是用来建立模型的,后两个folds得到测试集用来测试模型。

训练好分类器后,用X_test_folds进行预测,与标签(真实值)y_test_folds进行比较,将正确的进行计数,除以总数就得到了最终的验证结果。三次循环得到三个结果,平均一下就是最终结果。

3.混淆矩阵

目标是找出女生,因此女生是正类,男生是负类。tp:正确的判为正类。fp:错误的判为正类。fn:错误的判为负类。tn:正确的判为负类。具体解释如下图:

从sklearn中导入混淆矩阵的计算方法:传入真实值和预测值就能得到混淆矩阵

精度和召回率的计算公式:

sklearn也提供了直接计算它两的方法和调和平均数

4.阈值对结果的影响

实际上,机器判断这个数是不是5是根据每个数据的得分值score进行判断的,这里我们设置得分必须大于t(50000)才能判断这个值是5。Scikit-Learn不允许直接设置阈值,但我们可以设置得分去间接的设置阈值

当阈值设置的越低,就越能够正确判断出5,因此recall(召回率)越高。但其他类似5但不是5的也可能大于这个阈值被判断为5,因此precision(精度)越低。反之,阈值越高,召回率越低,精度越高。

5.ROC曲线

ROC曲线通常用于分类问题。

横轴表示FPR也就是错误率,我们希望错误率越低越好,对于一个二分类而言,比如抛硬币,我们瞎蒙(纯随机)猜对的概率为0.5,因此最差的ROC曲线就是这条虚线,正确错误各一半,越好的ROC曲线越靠近左上角,用其曲线下面积来判断一个分类器的优劣程度。

sklearn也有测量该面积的函数

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值