机器学习-5.模型评估、选择与验证

EduCoder:机器学习—模型评估、选择与验证

第1关:为什么要有训练集与测试集

11

第2关:欠拟合与过拟合

在这里插入图片描述

第3关:偏差与方差

在这里插入图片描述

第4关:验证集与交叉验证

在这里插入图片描述

第5关:衡量回归的性能指标

在这里插入图片描述

第6关:准确度的陷阱与混淆矩阵

编程要求:

根据提示,在 Begin-End 区域填写 python 代码,完成 confusion_matrix 函数实现二分类混淆矩阵的构建。

confusion_matrix 函数中的参数:

  • y_true:数据的真实类别,类型为 ndarray;

  • y_predict:模型预测的类别,类型为 ndarray。

测试说明:

平台会对你编写的代码进行测试,期望您的代码根据输入来输出正确的混淆矩阵,以下为其中一个测试用例(y_true 表示真实类别,y_predict 表示预测类别):

测试输入:
{‘y_true’:[1, 0, 0, 1, 0, 1, 0], ‘y_predict’:[0, 1, 0, 1, 0, 1, 0]}

预期输出:

[[3 1]
[1 2]]

代码如下:

import numpy as np

def confusion_matrix(y_true, y_predict):
    '''
    构建二分类的混淆矩阵,并将其返回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: shape为(2, 2)的ndarray
    '''

    #********* Begin *********#
    def TN(y_true,y_predict):
        return np.sum((y_true==0) &  (y_predict==0))
    def FP(y_true,y_predict):
        return np.sum((y_true==0) & (y_predict==1))
    def FN (y_true,y_predict):
        return np.sum((y_true==1)&   (y_predict==0))
    def TP(y_true,y_predict):
        return np.sum((y_true==1)&  (y_predict==1))
    return np.array([
        [TN(y_true,y_predict),FP(y_true,y_predict)],
        [FN(y_true,y_predict),TP(y_true,y_predict)]
    ])
    #********* End *********#


第7关:精准率与召回率

编程要求:

根据提示,在 Begin-End 区域填写 python 代码,完成 precision_score 函数和 recall_score 函数分别实现计算精准率和召回率。

precision_score函数中的参数:

  • y_true :数据的真实类别,类型为 ndarray;

  • y_predict :模型预测的类别,类型为 ndarray。

  • recall_score 函数中的参数:

  • y_true:数据的真实类别,类型为 ndarray;

  • y_predict:模型预测的类别,类型为 ndarray

测试说明:

平台会对你编写的代码进行测试,期望您的代码根据输入来输出正确的精准率和召回率,以下为其中一个测试用例( y_true 表示真实类别,y_predict 表示预测类别):

测试输入:
{‘y_true’:[1, 0, 0, 1, 0, 1, 0], ‘y_predict’:[0, 1, 0, 1, 0, 1, 0]}

预期输出:
0.666667, 0.666667

代码如下:

import numpy as np

def precision_score(y_true, y_predict):
    '''
    计算精准率并返回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: 精准率,类型为float
    '''

    #********* Begin *********#
    def TN(y_true,y_predict):
        return np.sum((y_true==0) & (y_predict==0))
    def FP(y_true,y_predict):
        return np.sum((y_true==0)& (y_predict==1))
    def FN(y_true,y_predict):
        return np.sum((y_true==1) & (y_predict==0))
    def TP(y_true,y_predict):
        return np.sum((y_true==1)&  (y_predict==1))
    return TP(y_true,y_predict)/(TP(y_true,y_predict)+FP(y_true,y_predict))
    #********* End *********#


def recall_score(y_true, y_predict):
    '''
    计算召回率并召回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: 召回率,类型为float
    '''

    #********* Begin *********#
    def TP(y_true,y_predict):
        return np.sum((y_true==1) & (y_predict==1))
    def FN(y_true,y_predict):
        return np.sum((y_true==1)& (y_predict==0))
    tp=TP(y_true,y_predict)
    fn=FN(y_true,y_predict)
    try:
        return tp/(tp+fn)
    except:
        return 0.0
    #********* End *********#

第8关:F1 Score

编程要求:

根据提示,在 Begin-End 区域填写 python 代码,完成 f1_score 函数实现计算 F1 Score。

f1_score 函数中的参数:

  • precision:模型的精准率,类型为 float;

  • recall:模型的召回率,类型为 float 。

测试说明:

平台会对你编写的代码进行测试,期望您的代码根据输入来返回正确的 F1 Score ,以下为其中一个测试用例(列表中的第一个数字表示精准率,第二个数字表示召回率):

测试输入:
[0.7, 0.2]

预期输出:
0.311111
代码如下:

import numpy as np

def f1_score(precision, recall):
    '''
    计算f1 score并返回
    :param precision: 模型的精准率,类型为float
    :param recall: 模型的召回率,类型为float
    :return: 模型的f1 score,类型为float
    '''
    #********* Begin *********#
    score=(2*precision*recall)/(precision+recall)
    return score
    #********* End ***********#

第9关:ROC曲线与AUC

编程要求:

根据提示,在 Begin-End 区域填写 python 代码,完成 calAUC 函数实现计算 AUC 并返回。

calAUC 函数中的参数:

  • prob:模型预测样本为 Positive 的概率列表,类型为 ndarray;

  • labels:样本的真实类别列表,其中 1 表示 Positive ,0 表示 Negtive ,类型为 ndarray 。

测试说明:

平台会对你编写的代码进行测试,期望您的代码根据输入来返回正确的 AUC,以下为其中一个测试用例(字典中的 probs 部分代表模型认为样本是 Positive 的概率,labels 部分代表样本的真实类别,1 表示 Positive, 0 表示 Negtive ):

测试输入:
{‘probs’:[0.1, 0.4, 0.3, 0.8], ‘labels’:[0, 0, 1, 1]}

预期输出:
0.75

代码如下:

import numpy as np

def calAUC(prob, labels):
    '''
    计算AUC并返回
    :param prob: 模型预测样本为Positive的概率列表,类型为ndarray
    :param labels: 样本的真实类别列表,其中1表示Positive,0表示Negtive,类型为ndarray
    :return: AUC,类型为float
    '''

    #********* Begin *********#
    f=list(zip(prob,labels))
    rank=[values2 for values1,values2 in sorted(f,key=lambda x:x[0])]
    rankList=[i+1 for  i in range(len(rank)) if rank[i]==1]
    posNum=0
    negNum=0
    for i in range(len(labels)):
        if(labels[i]==1):
            posNum+=1
        else:
            negNum+=1
    auc=(sum(rankList)-(posNum*(posNum+1))/2)/(posNum*negNum)
    return auc
    #********* End *********#

第10关:sklearn中的分类性能指标

编程要求:

在 Begin-End 区域填写classification_performance(y_true, y_pred, y_prob)函数分别计算模型的准确度、精准率、召回率、F1-Score 和 AUC 并将其返回,其中:

  • y_true :样本的真实类别,类型为 ndarray;
  • y_pred :模型预测出的类别,类型为 ndarray;
  • y_prob :模型预测样本为 Positive 的概率,类型为 ndarray。

测试说明:

平台会对你编写的代码进行测试,期望您的代码根据输入来按顺序返回正确的准确度、精准率、召回率、 F1-Score 和 AUC,以下为其中一个测试用例(字典中的 y_prob 部分代表模型认为样本是 Positive 的概率;y_true 部分代表样本的真实类别,1 表示 Positive, 0 表示 Negtive;y_pred 部分代表模型预测的类别):

测试输入:

{‘y_prob’:[0.7, 0.2, 0.9, 0.8],‘y_true’:[0, 0, 1, 1],‘y_pred’:[1, 0, 1, 1]}

预期输出:

0.750000, 0.666667, 1.000000, 0.800000, 1.000000

代码如下:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

def classification_performance(y_true, y_pred, y_prob):
    '''
    返回准确度、精准率、召回率、f1 Score和AUC
    :param y_true:样本的真实类别,类型为`ndarray`
    :param y_pred:模型预测出的类别,类型为`ndarray`
    :param y_prob:模型预测样本为`Positive`的概率,类型为`ndarray`
    :return:
    '''

    #********* Begin *********#
    a=accuracy_score(y_true,y_pred)
    b=precision_score(y_true,y_pred)
    c=recall_score(y_true,y_pred)
    d=f1_score(y_true,y_pred)
    e=roc_auc_score(y_true,y_prob)
    return (a,b,c,d,e)
    #********* End *********#
    
  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业五 以西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练集训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pretend ^^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值