【环境空气质量评价挑战赛】baseline——使用lightgbm+特征工程。

2023-11-11

赛题

一、赛事背景

随着工业化和城镇化的快速发展,环境问题日益突出。空气污染是全球最重要的环境问题之一,影响着人们的健康、生产和生活。为了改善空气质量,我国加大监测和环保力度,增加空气质量监测站点,实施蓝天保卫战,并将空气质量水平与污染治理水平纳入部门工作考核。科学有效地评价空气质量,能够为预防和治理空气污染提供科学依据,有利于交通或环境管理部门实施污染控制,降低空气污染的影响,改善人类福祉。由于大气环境是受污染源、气象、人为因素的影响,因此需要客观综合地评价空气质量。

二、赛事任务

每日环境空气质量评价需要综合各污染物的影响,本次大赛提供了每日AQI数据和主要污染物浓度数据,参赛选手需构建空气质量评价模型,根据提供的样本评价样本之间的相对污染程度。

三、评审规则

1.数据说明
本次比赛为参赛选手提供了大气污染数据,包括一氧化碳、细颗粒物、可吸入颗粒物、臭氧、二氧化氮、二氧化硫。此次比赛分为初赛和复赛两个阶段,两个阶段的区别是所提供样本的量级和样本城市有所不同,其他的设置均相同。

特别说明,空气质量评价本身是一个不确定性问题,主要采用不确定性方法来构建模型,如模糊数学,灰色理论,证据理论,神经网络等统计分析方法。
在这里插入图片描述

2.评估指标
本模型依据提交的结果文件,利用均方根误差(RMSE)评价模型。

(1) 样本的相对综合污染系数 IPRC,用于判断样本之间的相对污染程度。

(2) 基于IPRC,计算RMSE. 其中m为样本数,y为IPRC真实值,y_pred为IPRC预测值。

在这里插入图片描述

3.评测及排行
1、初赛和复赛均提供下载数据,选手在本地进行算法调试,在比赛页面提交结果。

2、每支团队每天最多提交3次。

3、排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。

四、作品提交要求

1.文件格式:按照csv格式提交
2.文件大小:无要求
3.提交次数限制:每支队伍每天最多3次
4.文件详细说明:

  1. 以csv格式提交,编码为UTF-8,第一行为表头;

  2. 提交格式见样例

5.不需要上传其他文件

赛题分析

首先分析这个比赛是解决什么问题?从评估指标RMSE我们可以得出这个比赛是回归问题,是预测IPRC的值,所以IPRC是y值,是我们要预测的值。

数据分析

初赛的数据集是保定2016年的空气质量数据,测试集是国际庄2016到2017年的空气质量数据。回想2016年,那时候整个河北的污染还是比较严重的,经常看不到太阳,一年没有几天是好天气。先查看训练集前5行的数据:
执行代码:

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler, MinMaxScaler
train = pd.read_csv('data/train/train.csv')
print(train.head(5))

运行结果:

日期 AQI 质量等级 PM2.5 PM10 SO2 CO NO2 O3_8h IPRC
2016/1/1 293 重度污染 243 324 122 6.1 149 12 2.088378
2016/1/2 430 严重污染 395 517 138 7.5 180 18 3.316942
2016/1/3 332 严重污染 282 405 72 6.3 130 10 2.516425
2016/1/4 204 重度污染 154 237 73 3.5 72 34 1.505693
2016/1/5 169 中度污染 128 186 99 3.2 66 39 1.210233
第一列是时间,对经历过那段时间的人来说,时间肯定是有用的,北方冬天取暖,空气质量差很多。春季和秋季刮风的时候多,好天气自然多一些,夏天有时下雨,下雨了空气的质量就能有所改善,空气质量和季节的相关系比较密切。对于时间的处理,我是采用将年月日分别3列。代码如下:
data["year"] = pd.to_datetime(data["日期"]).dt.year
data["month"] = pd.to_datetime(data["日期"]).dt.month
# 获取日
data["day"] = pd.to_datetime(data["日期"]).dt.day

第二列AQI和PM2.5、PM10、SO2、CO、NO2、O3_8h,这里列的处理方式类似,都采用MinMaxScaler(feature_range=(0, 1)),代码如下:

cols = ["PM2.5", "PM10", "SO2", "CO", "NO2", "O3_8h","day","month","year"]
scaler = MinMaxScaler(feature_range=(0, 1))
for clo in cols:
    data[clo] = scaler.fit_transform(data[clo].values.reshape(-1, 1))

第三列 质量等级,共5个等级,这个毫无疑问用OneHot编码做,我使用pandas 自带的方法实现OneHot编码,编码完成后把质量等级和日期列删除,代码如下:

df = pd.DataFrame({'质量等级': ['重度污染', '良', '中度污染', '轻度污染', '严重污染']})
ff = pd.get_dummies(data['质量等级'].values)
data['重度污染'] = ff['重度污染']
data['良'] = ff['良']
data['中度污染'] = ff['中度污染']
data['轻度污染'] = ff['轻度污染']
data['严重污染'] = ff['严重污染']
del data['质量等级']
del data['日期']
print(data)

运行结果:
在这里插入图片描述
标签数据处理 标签采用MinMaxScaler(feature_range=(0, 1)),把标签缩放到0-1之间,方便预测,代码如下:

scaler_y = MinMaxScaler(feature_range=(0, 1))
train['IPRC'] = scaler_y.fit_transform(train['IPRC'].values.reshape(-1, 1))
target = train['IPRC']

数据分析的完整代码如下:

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler, MinMaxScaler
train = pd.read_csv('data/train/train.csv')
print(train.head(5))
test = pd.read_csv('data/test/test.csv')
smb = test['日期'].values
scaler_y = MinMaxScaler(feature_range=(0, 1))
train['IPRC'] = scaler_y.fit_transform(train['IPRC'].values.reshape(-1, 1))
target = train['IPRC']
del train['IPRC']
data = pd.concat([train, test], axis=0, ignore_index=True)
data = data.fillna(0)
data["year"] = pd.to_datetime(data["日期"]).dt.year
data["month"] = pd.to_datetime(data["日期"]).dt.month
# 获取日
data["day"] = pd.to_datetime(data["日期"]).dt.day

df = pd.DataFrame({'质量等级': ['重度污染', '良', '中度污染', '轻度污染', '严重污染']})
ff = pd.get_dummies(data['质量等级'].values)
data['重度污染'] = ff['重度污染']
data['良'] = ff['良']
data['中度污染'] = ff['中度污染']
data['轻度污染'] = ff['轻度污染']
data['严重污染'] = ff['严重污染']
del data['质量等级']
del data['日期']
print(data)
cols = ["PM2.5", "PM10", "SO2", "CO", "NO2", "O3_8h","day","month","year"]
scaler = MinMaxScaler(feature_range=(0, 1))
for clo in cols:
    data[clo] = scaler.fit_transform(data[clo].values.reshape(-1, 1))
train = data[:train.shape[0]]
test = data[train.shape[0]:]
# print(X_train)
X_train = train.values
y_train = target.values
X_test = test.values

构建模型

模型选用lightgbm ,lightgbm 是曾经的刷分神器,在kaggle的各种大赛盛极一时。今天我们就讲解如何是用lightgbm 实现回归算法。
第一步 配置参数。
常用的参数有学习力,l2 正则,叶子的节点等等,下面的代码列出了常用的参数配置:

param = {'num_leaves': 600,
         'min_data_in_leaf': 30,
         'objective': 'rmse',
         'max_depth': -1,
         'learning_rate': 0.001,
         "min_child_samples": 30,
         "boosting": "gbdt",
         "feature_fraction": 0.9,
         "bagging_freq": 1,
         "bagging_fraction": 0.9,
         "bagging_seed": 12,
         "metric": 'mse',
         "lambda_l2": 0.1,
         'is_unbalance': True,
         "verbosity": -1}

为了防止数据不均匀,提高模型的精确度,减轻过拟合,我们采用10折交叉验证。代码如下:

# 五折交叉验证
folds = KFold(n_splits=10, shuffle=True, random_state=42)
oof = np.zeros(len(train))
predictions = np.zeros(len(test))

然后开始训练和测试,设置迭代次数为100000,设置earlystop为1000,如果迭代1000次,loss没有发生变化则终止迭代,代码如下:

for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):
    print("fold n°{}".format(fold_ + 1))
    trn_data = lgb.Dataset(X_train[trn_idx], y_train[trn_idx])
    val_data = lgb.Dataset(X_train[val_idx], y_train[val_idx])

    num_round = 100000
    clf = lgb.train(param,
                    trn_data,
                    num_round,
                    valid_sets=[trn_data, val_data],
                    verbose_eval=2000,
                    early_stopping_rounds=1000)
    oof[val_idx] = clf.predict(X_train[val_idx], num_iteration=clf.best_iteration)
    b = [round(i, 3) for i in oof]
    predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / folds.n_splits

保存结果

将预测的结果,按照缩放的比例还原,然后将测试结果保存到csv文件中。

inv_y = scaler_y.inverse_transform(predictions.reshape(1, -1))
inv_y = inv_y[0]
print(inv_y)
print("CV score: {:<8.5f}".format(mean_squared_error(oof, target)))
# 提交结果
resuktend = []
for (i1) in zip(inv_y):
    resuktend.append(i1)
dataframe = pd.DataFrame({'date': smb, 'class': resuktend})
# 将DataFrame存储为csv,index表示是否显示行名,default=True
dataframe.to_csv("test_estimator.csv", index=False, sep=',')

测试结果如下:
在这里插入图片描述
但是提交到竞赛平台上的得分只有0.2左右,过拟合还是很严重的。

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

【环境空气质量评价挑战赛】baseline——使用lightgbm+特征工程。 的相关文章

  • Sklearn CountVectorizer:将表情符号保留为单词

    我正在使用 SklearnCountVectorizer在字符串上但是CountVectorizer丢弃文本中的所有表情符号 例如 Welcome应该给我们 xf0 x9f x91 x8b welcome 但是 运行时 vect Count
  • 从复杂(混合)句子中提取简单句子的算法?

    有没有一种算法可以用来从段落中提取简单的句子 我的最终目标是稍后对生成的简单句子运行另一个算法来确定作者的情绪 我已经从 Chae Deug Park 等来源对此进行了研究 但没有讨论准备简单的句子作为训练数据 提前致谢 看一眼Apache
  • 在 NLTK 3.0 中使用 Wordnet 从 Synset 中提取单词

    前段时间 SO上有人问如何检索给定同义词集的单词列表 https stackoverflow com questions 24664250 how do i print out just the word itself in a wordn
  • 创建向量空间

    我有一个问题 我有很多文档 每一行都是由某种模式构建的 当然 我有这一系列的图案 我想创建一些向量空间 然后通过某种规则来向量这个模式 我还不知道这个规则是什么 即使这个模式像我的向量空间的 质心 然后向量当前文档的每一行 再次按照此规则
  • 训练新的 AutoTokenizer 拥抱脸部

    收到此错误 AttributeError GPT2Tokenizer 对象没有 属性 train new from iterator 与拥抱面部文档非常相似 我更改了输入 就是这样 不应该影响它 有一次就成功了 2小时后回来查看 发现并没有
  • browserify :- 未捕获类型错误:fs.readFileSync 不是函数

    我试图在我的代码中使用natural js 在客户端使用它 我使用browserify 但它给出了一个错误 Uncaught TypeError fs readFileSync is not a function at loadDictio
  • 我应该如何使用 scikit learn 对以下列表进行矢量化?

    我想用 scikit 进行矢量化学习一个有列表的列表 我转到有训练文本的路径 我阅读了它们 然后我得到如下内容 corpus this is spam SPAM this is ham HAM this is nothing NOTHING
  • AttributeError:使用 CRF 时“Tensor”对象没有属性“_keras_history”

    我知道关于这个问题有很多问题 我已经阅读了其中的一些问题 但没有一个对我有用 I am trying to build a model with the following architecture 代码如下 token inputs In
  • 使用 Hadoop MapReduce 的计算语言学项目构想

    我需要做一个关于计算语言学课程的项目 是否有任何有趣的 语言 问题 其数据密集程度足以使用 Hadoop MapReduce 来解决 解决方案或算法应尝试分析并提供 语言 领域的一些见解 但是它应该适用于大型数据集 以便我可以使用 hado
  • 在非单一维度 1 处,张量 a (2) 的大小必须与张量 b (39) 的大小匹配

    这是我第一次从事文本分类工作 我正在使用 CamemBert 进行二进制文本分类 使用 fast bert 库 该库主要受到 fastai 的启发 当我运行下面的代码时 from fast bert data cls import Bert
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • 在Python或Sklearn中用整数值对具有字符串值的列变量进行编码

    如何用整数值对数据表中字符串类型的列值进行编码 例如 我有两个特征变量 颜色 可能的字符串值 R G 和 B 和技能 可能的字符串值 C Java SQL 和 Python 给定数据表有两列 Color gt R G B B G R B G
  • IOB 准确度和精密度之间的差异

    我正在使用命名实体识别和分块器对 NLTK 进行一些工作 我使用重新训练了分类器nltk chunk named entity py为此 我采取了以下措施 ChunkParse score IOB Accuracy 96 5 Precisi
  • 如何计算两个文本文档之间的相似度?

    我正在考虑使用任何编程语言 尽管我更喜欢 Python 来从事 NLP 项目 我想获取两个文档并确定它们的相似程度 常见的方法是将文档转换为 TF IDF 向量 然后计算它们之间的余弦相似度 任何有关信息检索 IR 的教科书都涵盖了这一点
  • 这个 NLP 问题层次结构描述中的最大池化是什么类型

    我正在尝试实现这个描述以及我所做的 我生成了形状的 uni gram bi gram tri gram 15 512 使用填充 然后对于每个单词 我连接三个特征向量 3 512 然后我向他们申请 Globalmaxpooling1D 我不知
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 生成易于记忆的随机标识符

    与所有开发人员一样 我们在日常工作中不断处理某种标识符 大多数时候 它与错误或支持票有关 我们的软件在检测到错误后 会创建一个包 该包的名称由时间戳和版本号格式化 这是创建合理唯一标识符以避免混淆包的一种廉价方法 例子 错误报告 20101
  • 如何提取数字(以及比较形容词或范围)

    我正在用 Python 开发两个 NLP 项目 它们都有类似的任务提取数值和比较运算符来自句子 如下所示 greater than 10 weight not more than 200lbs height in 5 7 feets fas
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant

随机推荐

  • 3. Zipkin 持久化

    Zipkin 持久化 其实 我们仔细想想也可以总结出这种方式的几种缺陷 缺陷1 zipkin客户端向zipkin server程序发送数据使用的是http的方式通信 每次发送的时候涉及到连接和发送过程 缺陷2 当我们的zipkin serv
  • AIGC发展研究(1.0版)

    该图谱由中国信息通信研究院 中国通信标准化协会大数据技术标准推进委员会 CCSA TC601 共同发起 旨在梳理数据治理产业上下游相关企业 产品 服务的分布情况 掌握数据治理市场现状 洞察数据治理产业发展趋势 图谱1 0收录了来自98家企业
  • Qt支持https请求

    Qt支持https请求需要配置openssl环境 Qt默认是不支持SSl认证的 检测Qt支持的协议 QNetworkAccessManager manager new QNetworkAccessManager this qDebug lt
  • 毕业两年后的经历总结——一个奋斗中的前端蜂鸟

    转眼间 已经毕业两年了 不得不感叹时间过的真快啊 学生时代的美好 终于只能永久停留在记忆长河中不再复返 韶光易逝 但唯一不变的 是变化 回望过去 有过困惑 有过迷茫 也有过焦虑 刚开始工作时 也遇到了很多很多的困难 这时的我对未来比较迷茫
  • 二进制数字(2ASK)载波调制解调仿真设计(matlab仿真)

    一 实验目的 了解二进制数字信号2ASK波形特点 掌握2ASK调制解调系统的构成 基带信号 载波和2ASK已调信号之间的关系 掌握利用matlab对2ASK进行仿真的分析方法 二 实验任务 利用matlab实现对2ASK信号调制与解调的仿真
  • 微服务架构设计的12个要点

    一 负载均衡 二 API网关 三 无状态化与独立有状态集群 四 异步处理机制 五 数据集群 分库分表 六 缓存 七 服务拆分与服务发现 八 服务编排与弹性伸缩 九 统一配置中心 十 统一日志中心 十一 熔断 限流 降级 十二 全方位的监控
  • 微信小程序获取用户信息(getUserProfile接口回收后)——通过头像昵称填写获取用户头像和昵称

    背景 最近在用uniapp写微信小程序授权登录的时候 发现项目在微信开发者工具中调试是正常的 但是在真机运行时 返回的用户数据中昵称变成了微信用户 头像变成了默认的灰底头像 接着去百度了一下发现出现这个问题的原因是getUserProfil
  • Delphi XE10实现移动端支付宝支付接口(含源码)

    Demo下载地址 https pan baidu com s 14i84u 加入支付宝开发者平台 https open alipay com 签约移动支付服务 访问https b alipay com order productSet ht
  • TensorFlow(Python

    回归任务旨在从输入训练数据中预测连续变量 而分类任务旨在将输入数据分为两个或多个类别 例如 预测某一天是否会下雨的模型是一项分类任务 因为模型的结果将分为两类 下雨或不下雨 然而 预测给定日期的降雨量的模型将是回归任务的一个示例 因为模型的
  • 服务器上传excel文件并读取数据,ASP.NET中上传并读取Excel文件数据示例

    在CSDN中 经常有人问如何打开Excel数据库文件 本文通过一个简单的例子 实现读取Excel数据文件 首先 创建一个Web应用程序项目 在Web页中添加一个DataGrid控件 一个文件控件和一个按钮控件 在代码视图中首先导入OleDb
  • Appium自动化框架从0到1之 框架结构组成

    从0到1搭框架 框架背景 框架功能 框架视图 框架背景 可能会利用一周的时间 我们来写一个Appium自动化框架的搭建 从0到1 跟着小鱼一起 完善Android 的自动化框架体系 框架模式 PO 语言 python3 7 Appium 1
  • mac 利器

    mac 利器 攒了很久的钱 环境彻底迁移到mac os 下 总结下自己使用的一些工具 从win到mac的一些工具迁移可以看老的文章 win下的mac利器替代品 这一篇主要集中在mac下的工具体会和使用心得距离上一次更新 应该很久了 上一次是
  • Flutter之修改AppBar的高度

    全局 设置AppBar的主题中的toolbarHeight override Widget build BuildContext context return GetMaterialApp title Flutter Demo debugS
  • <vulnhub>-记一次实验Load of The Root

    Load of The Root 一 信息收集 1 主机探测 探测到主机IP 192 168 88 159 2 端口扫描 扫描到端口只开放了一个22端口 尝试使用SSH连接 Easy as 1 2 3 端口碰撞 端口上的防火墙通过产生一组预
  • MyBatis-Plus-Generator代码生成器(Version 3.5.1+)使用

    这几天研究了一下MyBatis Plus Generator新版本3 5 1 的使用 做个笔记方便自己使用 maven配置
  • C/C++数字字符串与数字之间的相互转化

    目录 1 数字字符串转化为数字 1 1 C语言方法 1 2 C 方法 2 数字转化为数字字符串 2 1 C语言方法 2 2 C 方法 1 数字字符串转化为数字 1 1 C语言方法 1 sscanf sscanf读取格式化的字符串中的数据 s
  • libcublas.so.9.2: cannot open shared object file: No such file...问题原因及解决方法

    sudo ldconfig usr local cuda 9 0 lib64
  • late_initcall()与module_init()

    内核初始化的模块 当它们静态链接到内核时 的init例程被包装在一个initcall 宏中 该宏指示应该在启动顺序中运行它们的时间 请参阅包含文件 include linux init h以获取宏列表及其排序
  • Windows子系统for Linux Ubuntu安装位置转移

    默认情况下 Windows安装了Linux子系统后 以Ubuntu18 04为例 安装位置是在C Users XXXXXXXX AppData Local Packages CanonicalGroupLimited Ubuntu18 04
  • 【环境空气质量评价挑战赛】baseline——使用lightgbm+特征工程。

    赛题 一 赛事背景 随着工业化和城镇化的快速发展 环境问题日益突出 空气污染是全球最重要的环境问题之一 影响着人们的健康 生产和生活 为了改善空气质量 我国加大监测和环保力度 增加空气质量监测站点 实施蓝天保卫战 并将空气质量水平与污染治理