机器学习——模型评估

目录

模型评估方法概述

一.数据集的划分


模型评估方法概述

机器学习模型评估是评估模型性能的过程,是机器学习的核心环节之一。其主要目的是通过使用某些评估指标来评估模型的预测能力,并且确定哪个模型最适合特定的数据集。

机器其学习中常见的两类问题有分类问题和回归问题,其中,分类问题主要使用精确率,召回率,F分数等进行评估,回归问题主要使用平均绝对误差,均方误差等方法。

1.数据集的划分

在机器学习中将数据集分为训练集和测试集,其中训练集用来训练模型,测试集用来验证模型性能,两者之比一般为8/2或者7/3.

划分数据集的一般方法有留出法,交叉验证法,和自助法等等。

2.常见评估指标

首先我们补充一些关于混淆矩阵的知识。混淆矩阵通过计算各种分类度量,指导模型的评估。

正例(Actual)负例(Actual)
正例(Predicted)TPFP
负例(Predicted)FNTN

真阳性(True Positive,TP):指被分类器正确分类的正例数据

真阴性(True Negative,TN):指被分类器正确分类的负例数据

假阳性(False Positive,FP):被错误地标记为正例数据的负例数据

假阴性(False Negative,FN):被错误地标记为负例数据的正例数据

2.1准确率(Accuray)

准确率是指模型中正确分类的样本数与检测样本总数的比值,是分类问题中常用的评估指标。准确率越高,证明模型越好。

公式:Accuray=(TP+TN)/(P+N)

2.2召回率(Recall)

召回率(敏感度,真实例率)是指模型中正元组中被预测准确的比例,可用于评估模型的完整性。

公式:Recal=TP/P

2.3精确率(Precision)

精确率是指在预测结果的正元组里真实正元组的比例。主要用于评估模型的准确性

公式:Precision=TP/(TP+FP)

2.4F1(F1 sorce)

F1是精确率和召回率的加权平均值。它是一个综合指标,可以同时评估模型的准确性和完整性。

F1=2*(Precision*Recall)/(Precision+Recall)

2.5AUC值(Area Under the ROC Curve)

AUC值是用于评估二分类模型性能的指标。它是ROC曲线下的面积,可以衡量模型预测正例和负例的能力。

其中ROC曲线是以横坐标为 FPR ,以纵坐标为 TPR ,画出的一条曲线。 ROC曲线越靠拢(0,1)点,越偏离45度对角线越好。描述分类器的True Positive Rate与False Positive Rate之间的变化关系。

AUC的取值在0.5~1之间,AUC取值越大表示这个模型的效果越好。当AUC等于0.5时表示这个模型没有任何价值,当AUC取值为1时表示这个模型已经趋近完美。

曲线绘制代码:

import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc# y_test:实际的标签, dataset_pred:预测的概率值。fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)roc_auc = auc(fpr, tpr)  #画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来  plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))plt.xlabel(\"FPR (False Positive Rate)\")plt.ylabel(\"TPR (True Positive Rate)\")plt.title(\"Receiver Operating Characteristic, ROC(AUC = %0.2f)\"% (roc_auc))plt.show()

3.过拟合与欠拟合

3.1欠拟合

欠拟合是机器学习模型不能在训练集上获得足够小的误差,即训练误差太大,模型在训练集中没有训练好

根本原因:欠拟合的根本原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大,训练不充分。

解决方法:1.可以通过增加数据维度,即为增加对数据集的训练

                  2.增加参数的大小

3.2过拟合

在训练集上误差低,在测试集上误差高

根本原因:模型将训练数据学习的太彻底的,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,模型泛化能力太差。

解决方法:1.减少特征维度。

                   2.正则化。即为保留特征,但是减少参数的大小

                   3.扩大数据集

3.3实例

3.4.偏差与方差

偏差:预计值的期望与真实值之间的差距;

方差:预测值的离散程度,也就是离其期望值的距离;

我们知道欠拟合是模型在训练集上误差过高,过拟合模型是在训练集上误差低,在测试集误差高,那么模型误差的来源是什么呢?其实,模型在训练集上的误差来源主要是偏差,在测试集上误差来源主要是方差。

欠拟合是一种高偏差的情况,过拟合是一种低偏差,高方差的情况

4.实战

4.1导入相关库


import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml

plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings

warnings.filterwarnings('ignore')
np.random.seed(42)

4.2数据集准备和划分

本次准备的是一个关于糖尿病的数据集,数据集如下所示

进行数据预处理

将数据集划分为测试集和训练集

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)

print(X_train.shape)

print(X_test.shape)

print(y_train.shape)

print(y_test.shape)

结果如下

 

4.3引入knn模型训练

n_neighbors:就是选取最近的点的个数k
p=2,metric='euclidean':使用欧几里得计算距离

classifier = KNeighborsClassifier(n_neighbors=11,p=2,metric='euclidean')

对测试集进行模型的训练

classifier.fit(X_train,y_train)

4.4交叉验证

交叉验证就是可以解决机器模型需要考试的问题,即为将训练集中的一部分数据作为验证集对机器学习进行验证,起到考试的作用。

本次实验我们调用了sklearn的库进行交叉验证

from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

# K折抽取数据的对象
skflods = StratifiedKFold(n_splits=3, random_state=520 , shuffle= True)

for train_index, test_index in skflods.split(X_train, y_train_5):
    # 将模型克隆一份
    clone_clf = clone(sgd_clf)
    # 将训练集划分为更小的训练集和验证集
    X_train_folds = X_train.iloc[train_index]
    y_train_folds = y_train_5.iloc[train_index]
    X_test_folds = X_train.iloc[test_index]
    y_test_folds = y_train_5.iloc[test_index]


    # 训练克隆的模型
    clone_clf.fit(X_train_folds, y_train_folds)
    # 进行预测
    y_pred = clone_clf.predict(X_test_folds)
    # 计算当前交叉验证的预测正确的样本数
    n_correct = sum(y_pred==y_test_folds)
    # 输出当前交叉验证的准确率
    print(n_correct / len(y_pred))

输出结果:0.97914411656667
           0.97828506704218
           0.98228494459070

这证明机器学习自己考试的效果很好

4.5模型评估

混淆矩阵

from sklearn.model_selection import cross_val_predict

y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv = 3)

print(y_train_pred.shape)
print(X_train.shape)

from sklearn.metrics import confusion_matrix

confusion_matrix(y_train_5,y_train_pred)

 

评估

from sklearn.metrics import precision_score,recall_score
# 准确率
print("precision_score:",precision_score(y_train_5,y_train_pred))
# 召回率
print("recall_score:",recall_score(y_train_5,y_train_pred))
# F1分数
print("f1_score:",f1_score(y_train_5,y_train_pred))

 

输出:precision_score: 0.858335295502
recall_score: 0.794928698752
f1_score: 0.75673319977

4.6总结

模型评估的指标多种多样,例如ROC曲线主要用于评估分类模型性能,因此我们在不同的场景下需要选取不同的模型评估指标。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值