机器学习算法竞赛实战:如何看到机器学习竞赛问题?

news2024/11/24 4:42:46

机器学习算法竞赛实战-竞赛问题建模

更新《机器学习算法竞赛实战》一书的阅读笔记,更多详细的内容请阅读原书。本文的主要内容包含:

  • 竞赛问题的3个主要部分
  • -如何理解竞赛问题
  • 机器学习的样本选择
  • 如何线下评估模型
  • 实战案例

公众号:尤而小屋
作者:Peter
编辑:Peter

竞赛问题建模

针对具体问题的建模分为3个部分:

  • 赛题理解
  • 样本选择
  • 线下评估策略

赛题理解

  1. 业务背景:深入业务、明确目标
  2. 数据理解:数据基础层、数据描述层;前者关注:字段来源、取数逻辑、计算逻辑、生产过程等,后者关注:数据字段的统计量,便于进行统计分析和概括描述。
  3. 评价指标:
  4. 分类模型:错误率、精度、准确率(查准率precision)、召回率(recall,查全率)、F1_score、ROC曲线、AUC和对数损失(logloss)
  5. 回归模型:平均绝对误差MAE、均方误差MSE、均方根误差RMSE、平均百分比误差MAPE

样本选择

主要原因

影响数据质量的4个原因:

  1. 数据集过大(侧重数据量)
  2. 存在噪声和异常值
  3. 样本数据冗余(侧重数据特征的冗余),一般进行特征筛选(降维)
  4. 正负样本不均衡:使用欠采样或者过采样来解决

准确方法

解决数据集过大或者正负样本不均衡的方法:

  1. 简单随机抽样:有放回和无放回
  2. 分层采样:评分加权处理(对不同的类别进行加权)、欠采样(随机欠采样、Tomek Links)、过采样(随机过采样、SMOTE算法)

应用常景

什么场景下需要处理样本不均衡问题?

  • 对召回率有特别要求:即对正样本的预测比负样本重要,如果不处理的话,很难取得较好的建模结果。
  • 如果评价指标是AUC:处理或不处理差别不大
  • 如果正负样本同等重要,无需多做处理

线下评估策略

  1. 强时序性问题:将数据按照时间的先后顺序进行排序,选择最近时间的数据作为测试集
  2. 弱时序性问题:K折交叉验证
    • K=2,2折交叉验证:将数据分为训练集和测试集,受数据划分方式影响大
    • K=N,N折交叉验证(留一验证 leave-one-out Validation),N-1个训练集,1个测试集;训练过程计算量大
    • K=5或者10,折中办法:比如K=5表示取其中4份作为训练集,1份作为验证集,循环5次,取5次训练的评价结果的均值或者投票表决
# 10折交叉验证

from sklearn.model_selection import KFold
NFOLDS = 10   # 控制折数

folds = KFold(n_splits=NFOLDS, shuffle=True, random_state=2023)

for trn_index, val_index in folds.split(X_train, y_train):
    train_df, train_label = X_train.iloc[trn_index,:], y_train[trn_index]  # 根据对应的索引号来取数
    valid_df, valid_label = X_train.iloc[val_index,:], y_train[val_index]

实战案例

导入库

In [1]:

import pandas as pd
import numpy as np

from sklearn.model_selection import KFold  # K折交叉验证
from sklearn.metrics import mean_squared_error  #评价指标mse
from sklearn.preprocessing import OneHotEncoder  # 独热码

import lightgbm as lgb   # lgb模型

import warnings
warnings.filterwarnings("ignore")

加载数据

In [2]:

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

In [3]:

train.head()

查看数据的基本信息情况:

In [4]:

train.isnull().sum() # 缺失值情况

Out[4]:

Id                 0
MSSubClass         0
MSZoning           0
LotFrontage      259
LotArea            0
                ... 
MoSold             0
YrSold             0
SaleType           0
SaleCondition      0
SalePrice          0
Length: 81, dtype: int64

In [5]:

train.dtypes  # 字段类型

Out[5]:

Id                 int64
MSSubClass         int64
MSZoning          object
LotFrontage      float64
LotArea            int64
                  ...   
MoSold             int64
YrSold             int64
SaleType          object
SaleCondition     object
SalePrice          int64
Length: 81, dtype: object

In [6]:

train.describe()  # 描述统计信息

数据预处理

In [7]:

all_data = pd.concat([train,test])  # 数据合并
all_data = pd.get_dummies(all_data)  # 哑变量处理

In [8]:

# 缺失值均值填充
all_data = all_data.fillna(all_data.mean())

In [9]:

all_data.head()

数据集划分

In [10]:

X_train = all_data[:train.shape[0]]
X_test = all_data[train.shape[0]:]

y = train.SalePrice

模型训练与评估

In [11]:

from sklearn.model_selection import KFold
NFOLDS = 5   # 控制折数
folds = KFold(n_splits=NFOLDS, shuffle=True, random_state=2023)

params = {"num_leaves":63,
         "min_child_samples":50,
         "objective":"regression",
         "learning_rate":0.01,
         "boosting_type":"gbdt",
         "metric":"rmse"
         }

for trn_index, val_index in folds.split(X_train, y):
    train_df, train_label = X_train.iloc[trn_index,:], y[trn_index]  # 根据对应的索引号来取数
    valid_df, valid_label = X_train.iloc[val_index,:], y[val_index]
    
    dtrn = lgb.Dataset(train_df, label=train_label)
    dval = lgb.Dataset(valid_df, label=valid_label)
    
    dst = lgb.train(params, 
                    dtrn,
                    num_boost_round=1000,
                    valid_sets=[dtrn, dval],  # 验证集数据
                    early_stopping_rounds=100,
                    verbose_eval=100
                   )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scheduling Request(SR)

欢迎关注同名微信公众号“modem协议笔记”。 UE上报BSR,期望网络参照BSR,下发UL grant给UE以便发送UL data,正常情况下,整个过程都会比较顺利。但是世事难料,网络难免有自己的小脾气或者发送BSR不太顺畅,导…

通过Buildroot自制根文件系统

前言根文件系统是Linux内核启动之后读取的一个文件系统,并从这个文件系统中加载第一个init应用程序并启动,就是Linux上俗称的root进程、根进程制作它的方式有很多,例如busybox、yocto,但是这两个方式有缺点,第一个是bu…

JVM级别内存屏障如何禁止指令重排序的

承接上文证明CPU指令是乱序执行的当多个cpu访问同一份数据的时候怎么保证数据的一致性?在最底层级别的控制有好多种:第一种叫关中断,就是访问任何数据的时候必须有一个中断信号量的存在。很多传统的cpu就是靠它实现的,从内存读东西…

高速风筒的IPM模块解决方案

高速吹风筒是利用高转速产生的大风量来快速吹干头发,同时,高转速也使得电机与叶轮的体积缩小,便于设计出灵巧便携的外形。12万转的高速风筒的整体解决方案,满足高速吹风筒的所有应用场景,让客户用芯能的功率器件能更快…

PMP认证的PDU是什么?

PDU(Professional Development Units)即专业发展单元,是指您获取认证后,就项目管理专业进行学习、授课、或提供志愿服务的累积时间,以小时为单位,1小时即累积1个PDU。自证书获取日起,以三年为A周…

Ansible 多机自动化工具 初学笔记

此文档仅张聪明同学个人笔记;新负责KTH-RPL Cluster GPU的漫漫学习长路 English Docs: official https://docs.ansible.com/ansible/latest/index.html 中文相关文档: https://ansible.leops.cn/basic/Quickstart/https://blog.csdn.net/xinshuzhan/a…

java基础学习 day44(多态的优点和劣势)

1. 多态的优势 在多态形式下,右边对象可以实现解耦合(即之后的代码与右边的子类对象不绑定,在更改子类对象后,之后的代码仍可以使用),便于扩展和维护在定义方法的时候,使用父类型作为参数&…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

TCP/IP体系结构、Socket、进程PID、端口Port

计算机网络小结 一、TCP/IP体系结构 首先OSI参考模型,OSI将网络分为七层,自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP体系结构则将网络分为四层,自下而上分别是网络接口层、网络层、传输层、应用…

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,实现二级回复的入库操作 1.1 两个子组件(comment-item和comment-frame)与父组件reply之间的属性传值 comment-item: props: {item: {type: Object,default () {return {}}}},comment-frame: props: {commentObj: {…

LoRaWAN模块在车辆跟踪定位中的应用

目前 GPS已经在资产的管理中得到了越来越多的运用,如车辆跟踪、车队跟踪、资产监控等;人员跟踪,宠物跟踪,等等。在所有追踪装置中,最重要的是它的电池期望和监视距离。鉴于 LoRaWAN的功率消耗很小,而且能在…

Allegro如何快速检查走线是否跨分割操作指导

Allegro如何快速检查走线是否跨分割操作指导 在做PCB设计的时候,信号线跨分割的情况需要尽量避免,尤其是信号速率较高的情况,Allegro可以快速的检查PCB上哪个位置跨分割了,并且以高亮的形式报出来,类似下图 TOP层走线跨了L2层参考层空洞, 如何检查,具体操作步骤如下 点…

ArkUI实战,自定义饼状图组件PieChart

本节笔者带领读者实现一个饼状图 PieChart 组件,该组件是根据笔者之前封装的 MiniCanvas 实现的, PieChart 的最终演示效果如下图所示: 饼状图实现的拆分 根据上图的样式效果,实现一个饼状图,实质就是绘制一个个的实…

如何保护 IP 地址的隐私问题

是不是只有运营商才能查到某个人的住址信息呢?在大数据时代的今天,各种互联网应用收集了大量的数据信息,它们其实也可以根据这些信息,推断出某个人的大致地址位置。例如百度地图会一直用 App SDK 以及网页的方式记录 IP 和地址位置…

MySQL-redo log和undo log

什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败 举个最常见的例子,你早上出去买早餐,支付…

位运算(C/C++)

1. 基础知识 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二…

Python概述 基础语法 判断 循环

Python概述常用快捷键第二章-Python基础语法01-字面量02-注释03-变量04-数据类型05-数据类型转换06-标识符07-运算符08-字符串的三种定义方式09-字符串的拼接10-字符串格式化11-字符串格式化的精度控制 12-字符串格式化-快速写法13-对表达式进行格式化14-字符串格式化练习题讲解…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值,来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量,也可以是从前面接口请求中提取到需要的数据,然后进行遍历循环。 二、ForEach控制器相关…

【概念辨析】二维数组传参的几种可能性

一、二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针。 问题复现代码如下&#xf…

深度卷积对抗神经网络 进阶 第三部分 GANs Unpaired Translation with Cycle GAN 模型

非配对的图像转换应用 Unpaired Image-to-Image Translation Unpaired image-to-image translation 主要用于学习两组图像之间的对应关系,检查和寻找两堆数据中的共同内容(content)以及每堆独有的特点(style)。而这个…