前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习算法竞赛实战-竞赛问题建模

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

作者头像
皮大大
发布2023-08-25 12:27:33
2270
发布2023-08-25 12:27:33
举报

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

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

竞赛问题建模

针对具体问题的建模分为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次训练的评价结果的均值或者投票表决
代码语言:javascript
复制
# 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]:

代码语言:javascript
复制
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]:

代码语言:javascript
复制
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

In [3]:

代码语言:javascript
复制
train.head()

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

In [4]:

代码语言:javascript
复制
train.isnull().sum() # 缺失值情况

Out[4]:

代码语言:javascript
复制
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]:

代码语言:javascript
复制
train.dtypes  # 字段类型

Out[5]:

代码语言:javascript
复制
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]:

代码语言:javascript
复制
train.describe()  # 描述统计信息

数据预处理

In [7]:

代码语言:javascript
复制
all_data = pd.concat([train,test])  # 数据合并
all_data = pd.get_dummies(all_data)  # 哑变量处理

In [8]:

代码语言:javascript
复制
# 缺失值均值填充
all_data = all_data.fillna(all_data.mean())

In [9]:

代码语言:javascript
复制
all_data.head()

数据集划分

In [10]:

代码语言:javascript
复制
X_train = all_data[:train.shape[0]]
X_test = all_data[train.shape[0]:]

y = train.SalePrice

模型训练与评估

In [11]:

代码语言:javascript
复制
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
                   )
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-2-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 机器学习算法竞赛实战-竞赛问题建模
  • 竞赛问题建模
  • 赛题理解
  • 样本选择
    • 主要原因
      • 准确方法
        • 应用常景
        • 线下评估策略
        • 实战案例
          • 导入库
            • 加载数据
              • 数据预处理
                • 数据集划分
                  • 模型训练与评估
                  相关产品与服务
                  腾讯云服务器利旧
                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档