ML算法基础——分类模型评估与调参

2023-11-07

一、分类模型评估

1.准确率

estimator.score()
一般最常见使用的是准确率,即预测结果正确的百分比

2.精确率和召回率

2.1 混淆矩阵

在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
image

2.2 精确率(Precision)与召回率(Recall)

精确率:预测结果为正例样本中真实为正例的比例(查得准)
image
召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
image
其他分类标准,F1-score,反映了模型的稳健型
image

2.3 分类模型评估API

sklearn.metrics.classification_report

  • sklearn.metrics.classification_report(y_true,y_pred,target_names=None)

    • y_true:真实目标值
    • y_pred:估计器预测目标值
    • target_names:目标类别名称
    • return:每个类别精确率与召回率

2.4 贝叶斯模型评估实例

from sklearn.datasets import load_iris, fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import  classification_report

def naviebayes():
    #
    news = fetch_20newsgroups(subset='all')
    #数据分割
    x_train, x_test, y_train, y_test =train_test_split(news.data,news.target,test_size=0.25)
    # 对数据集进行特征抽取
    tf=TfidfVectorizer()
    #以训练集当中的词的列表进行每篇文章重要性分析
    x_train=tf.fit_transform(x_train)
    print(tf.get_feature_names())
    x_test=tf.transform(x_test)
    #进行朴素贝叶斯算法
    mlt=MultinomialNB(alpha=1.0)
    print(x_train.toarray())
    mlt.fit(x_train,y_train)
    y_predict=mlt.predict(x_test)
    print("预测的文章类别为:", y_predict)
    # 得出准确率
    print("准确率为:",mlt.score(x_test,y_test))
    print("每个类别的精确率和召回率为:", classification_report(y_test,y_predict,target_names=news.target_names))

    return None

naviebayes()

结果:

预测的文章类别为: [16 18 17 ... 10 16  9]
准确率为: 0.8495331069609507
每个类别的精确率和召回率为:                           precision    recall  f1-score   support

             alt.atheism       0.84      0.72      0.78       200
           comp.graphics       0.87      0.81      0.84       233
 comp.os.ms-windows.misc       0.84      0.86      0.85       232
comp.sys.ibm.pc.hardware       0.70      0.85      0.77       243
   comp.sys.mac.hardware       0.94      0.74      0.83       262
          comp.windows.x       0.97      0.77      0.86       265
            misc.forsale       0.95      0.73      0.82       252
               rec.autos       0.87      0.92      0.89       246
         rec.motorcycles       0.95      0.97      0.96       236
      rec.sport.baseball       0.96      0.97      0.96       241
        rec.sport.hockey       0.93      0.98      0.95       256
               sci.crypt       0.74      0.97      0.84       240
         sci.electronics       0.85      0.85      0.85       234
                 sci.med       0.97      0.90      0.93       250
               sci.space       0.88      0.97      0.92       237
  soc.religion.christian       0.59      0.97      0.73       259
      talk.politics.guns       0.80      0.97      0.88       235
   talk.politics.mideast       0.88      0.97      0.93       231
      talk.politics.misc       0.97      0.63      0.76       193
      talk.religion.misc       1.00      0.15      0.26       167

               micro avg       0.85      0.85      0.85      4712
               macro avg       0.87      0.84      0.83      4712
            weighted avg       0.87      0.85      0.84      4712

二、模型的选择与调优

1、交叉验证

  • 交叉验证优点:为了让被评估的模型更加准确可信
  • 交叉验证过程
    将拿到的数据,分为训练和验证集。
    以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。
    image

2、网格搜索

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
⽹格搜索:调参数 K-近邻:超参数K
image

若是有两个参数:a [2,3,5,8,10] b [20,70,80] 两两组合 15

2.1 超参数搜索-网格搜索API

sklearn.model_selection.GridSearchCV

  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
    • 对估计器的指定参数值进行详尽搜索
    • estimator:估计器对象
    • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
    • cv:指定几折交叉验证
    • fit:输入训练数据
    • score:准确率
  • 结果分析:
    • best_score_:在交叉验证中测试的最好结果
    • best_estimator_:最好的参数模型
    • cv_results_:每次交叉验证后的测试集准确率结果和训练集准确率结果

2.2 knn实例测试网格搜索

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
import pandas as pd
def knncls():
    #KNN预测用户签到位置
    #(1)读取
    data=pd.read_csv("train.csv")
    #print(data.head(10))
    #(2)处理
    #1.缩小数据,查询数据,筛选
    data= data.query("x>1.0 & x<1.25 & y>2.5 & x<2.75 ")
    #2.处理时间数据
    time_value=pd.to_datetime(data['time'],unit='s')
    #print(time_value)
    #3.把日期格式转换成字典格式
    time_value=pd.DatetimeIndex(time_value)
    #5.构造一些特征,
    data.loc[:,'day']=time_value.day
    data.loc[:,'hour'] = time_value.hour
    data.loc[:,'weekday'] = time_value.weekday

    #6.把时间戳特征删除
    data=data.drop(['time'],axis=1)
    #7.把签到数量小于n个的删除
    place_count= data.groupby('place_id').count()
    tf=place_count[place_count.row_id>5].reset_index()
    data=data[data['place_id'].isin(tf.place_id)]

    #8.取出数据中特征值和目标值
    y=data['place_id']

    x=data.drop(['place_id','row_id'],axis=1)

    #9.数据分割,分割成训练集和测试集
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
    #(3)特征工程
    std=StandardScaler()

    #对测试集和训练集的特征值进行标准化处理
    x_train=std.fit_transform(x_train)

    x_test=std.transform(x_test)

    #(4)进行算法流程
    knn=KNeighborsClassifier()

    #构造一些参数的值进行搜索
    param={"n_neighbors":[3,5,10]}
    #进行网格搜索
    gc=GridSearchCV(knn,param_grid=param,cv=4)
    gc.fit(x_train,y_train)
    #预测准确率
    print("在测试集上的准确率",gc.score(x_test,y_test))
    print("在交叉验证中最好的结果:",gc.best_score_)
    print("选择最好的模型是:", gc.best_estimator_)
    print("每个超参数每次交叉验证的结果:", gc.cv_results_)

    return None

knncls()

结果:

在测试集上的准确率 0.14548372112664162
在交叉验证中最好的结果: 0.1311800773618157
选择最好的模型是: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=10, p=2,
           weights='uniform')
每个超参数每次交叉验证的结果: {'mean_fit_time': array([4.45146149, 4.44196486, 4.11655921]), 'std_fit_time': array([1.03164362, 0.27887817, 0.82325426]), 'mean_score_time': array([7.91340411, 9.79840308, 9.37138796]), 'std_score_time': array([1.20371498, 1.11789183, 0.34117932]), 'param_n_neighbors': masked_array(data=[3, 5, 10],
             mask=[False, False, False],
       fill_value='?',
            dtype=object), 'params': [{'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 10}], 'split0_test_score': array([0.11439086, 0.12198176, 0.12945183]), 'split1_test_score': array([0.11406997, 0.12397793, 0.13036728]), 'split2_test_score': array([0.11594878, 0.12543602, 0.1317419 ]), 'split3_test_score': array([0.1179383 , 0.1270673 , 0.13326486]), 'mean_test_score': array([0.11556132, 0.12458124, 0.13118008]), 'std_test_score': array([0.00152546, 0.00187404, 0.00143886]), 'rank_test_score': array([3, 2, 1]), 'split0_train_score': array([0.440091  , 0.35226585, 0.27819626]), 'split1_train_score': array([0.43980955, 0.35193647, 0.27779743]), 'split2_train_score': array([0.43872216, 0.35040288, 0.2768066 ]), 'split3_train_score': array([0.43867638, 0.35147282, 0.27770352]), 'mean_train_score': array([0.43932477, 0.3515195 , 0.27762595]), 'std_train_score': array([0.00063357, 0.00070355, 0.00050794])}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ML算法基础——分类模型评估与调参 的相关文章

  • 如何将base64字符串直接解码为二进制音频格式

    音频文件通过 API 发送给我们 该文件是 Base64 编码的 PCM 格式 我需要将其转换为 PCM 然后再转换为 WAV 进行处理 我能够使用以下代码解码 gt 保存到 pcm gt 从 pcm 读取 gt 保存为 wav decod
  • xlrd.biffh.XLRDError:Excel xlsx 文件;不支持[重复]

    这个问题在这里已经有答案了 我正在尝试使用读取启用宏的 Excel 工作表pandas read excel与 xlrd 库 它在本地运行良好 但是当我尝试将其推送到 PCF 时 我收到此错误 2020 12 11T21 09 53 441
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 检测 IDLE 的存在/如何判断 __file__ 是否未设置

    我有一个脚本需要使用 file 所以我了解到 IDLE 没有设置这个 有没有办法从我的脚本中检测到 IDLE 的存在 if file not in globals file is not set 如果你想做一些特别的事情 file 未设置
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name

随机推荐

  • 单目标应用:基于成长优化算法(Growth Optimizer,GO)的微电网优化调度MATLAB

    一 微网系统运行优化模型 微电网是由分布式电源 储能装置和能量转换装置等组成的小型发配电系统 具有成本低 电压低 污染小等特点 由于环保和能源压力 清洁可再生能源和分布式能源工业发展潜力巨大 微电网控制器可实现对电网的集中控制 采用分布式电
  • 使用 FasterTransformer 和 Triton 推理服务器部署 GPT-J 和 T5

    使用 FasterTransformer 和 Triton 推理服务器部署 GPT J 和 T5 文章目录 使用 FasterTransformer 和 Triton 推理服务器部署 GPT J 和 T5 简介 主要步骤概述 第 1 步 从
  • 点云从入门到精通技术详解100篇-定子装配过程中基于深度学习的易变形材料的点云分割

    目录 前言 易变形导线装配过程及问题 国内外相关研究现状 三维视觉的研究现状
  • Windows中Lua环境配置记录

    之前在Mac环境下配置了Lua的环境 因为装的是双系统 Mac有点不稳定 所以更多的时候我是在用Windows系统 所以就想在windows上也将环境配置好 一开始感觉windows应该很好配置 网上的教程应该有很多 可是当自己查起来的时候
  • 2022第十一届中国创新创业大赛全国总决赛在深圳举办

    为深入贯彻党的二十大精神和创新驱动发展战略 强化企业科技创新主体地位 支持企业融合创新 推进科技型创新型企业遴选和培育 加大金融对硬科技企业的支持力度 营造有利于科技型中小微企业成长的环境 推动创新链产业链资金链人才链深度融合 第十一届中国
  • 如何给信号加噪声,matlab

    Matlab信号上叠加噪声和信噪比的计算 http www ilovematlab cn thread 54155 1 1 html 出处 MATLAB中文论坛 在信号处理中经常需要把噪声叠加到信号上去 在叠加噪声时往往需要满足一定的信噪比
  • 深度学习模型学习笔记

    我作为新手的一些学习笔记 backbone 主干网络 主干网络大多时候指的是提取特征的网络 其作用就是提取图片中的信息 供后面的网络使用 这些网络经常使用的是Resnet VGG等 而不是我们自己设计的网络 因为这些网络已经证明了在分类等问
  • Centos LVS DR模式详细搭建过程

    目录 前言 1 1 LVS环境组网 2 2 ipvsadm安装前准备 2 3 httpd与ipvsadm下载 3 4 LVS负载均衡配置 4 5 真实WEB服务器配置及arp抑制 5 6 LVS负载均衡测试 6 7 附 arp抑制参数 7
  • Unity 鼠标拖拽控制旋转物体

    Unity 鼠标拖拽控制旋转物体 需求 鼠标左键拖拽 控制物体旋转 摄像机固定不动 可以使用下面的代码 但是当摄像机移动到物体背后时 出现拖拽旋转方向与摄像机在正面时相反的问题 gameObj transform Rotate transf
  • FISCO BCOS 区块链(一)

    目录 一 搭建 FISCO BCOS 链 1 安装 openssl curl 依赖 2 安装 build chain 脚本 二 配置控制台 1 下载java jdk 2 安装控制台 3 拷贝配置文件以及证书 4 启动控制台 三 Java S
  • linux crontab 文件位置和日志位置

    一 文件位置 位置一般在 var spool cron 下 如果你是root用户 那下面有个root文件 建议日常备份 避免误删除导致crontab 文件丢失 二 日志文件位置 默认情况下 crontab中执行的日志写在 var log下
  • python 使用 with open() as 读写文件的操作方法

    读文件 要以读文件的模式打开一个文件对象 使用Python内置的open 函数 传入文件名和标示符 1 gt gt gt f open E python python test txt r 标示符 r 表示读 这样 我们就成功地打开了一个文
  • R语言倾向性评分:加权

    之前已经介绍过倾向性评分匹配 propensity score matching 倾向性评分回归和分层 R语言倾向性评分 回归和分层 R语言倾向性评分 匹配 今天继续介绍倾向性评分最后一个重要的部分 倾向性评分加权 主要介绍两种加权方法 逆
  • Anaconda环境下配置GPU版本pytorch和tensorflow、安装pycharm较全教程,避免踩坑

    一 安装Anaconda 1 安装anaconda的教程 1条消息 Anaconda的下载及安装 详细图文教程 伏城无嗔的博客 CSDN博客 anaconda如何下载https blog csdn net qq 45281807 artic
  • Linux开发板ping通WSL2并且能够通过无线网连接外网(虚拟机同样适用)

    Linux开发板ping通WSL2并且能够通过无线网连接外网 虚拟机同样适用 前言 安装Hyper V 创建虚拟网卡 将WSL的网络桥接 共享WIFI 修改共享网段的IP VMWare虚拟机 参考 前言 由于笔者入手了一块linux开发板
  • Linux下tty驱动框架

    在Linux下编写串口驱动程序 需要使用Linux提供的tty和serial驱动模块 以下是一个简单的tty串口驱动程序示例 使用C语言编写 include
  • 生成子集——位向量法

    生成0 n序列的子集 对于0 n的每一个值在集合中都有存在和不存在两种状态 所以递归每个值的存在状态即可生成子集 include
  • pyspark环境搭建,连接hive

    pyspark环境搭建 连接hive 一 环境搭建 1 1环境 1 1 1 集群环境 1 1 2 系统环境配置 1 1 3 host文件配置 1 1 4hive hadoop的配置文件 1 1 5 pyspark安装 2 1环境测试 二 项
  • 从windows下切换到Linux

    想从windows下切换到Linux 感觉好难 虽然早有这个想法 但是真正做起来后感觉还是有点难度 主要是命令行的界面感觉不习惯 感觉没有了鼠标就什么都不会干了 尤其是在vi下的时候 连上下左右都不会了 但是换了vim tiny后感觉我又会
  • ML算法基础——分类模型评估与调参

    文章目录 一 分类模型评估 1 准确率 2 精确率和召回率 2 1 混淆矩阵 2 2 精确率 Precision 与召回率 Recall 2 3 分类模型评估API 2 4 贝叶斯模型评估实例 二 模型的选择与调优 1 交叉验证 2 网格搜