1 回归:锂电池温度预测top2 代码部分(一) Tabnet

2024 iFLYTEK A.I.开发者大赛-讯飞开放平台

TabNet: 模型也是我在这个比赛一个意外收获,这个模型在比赛之中可用。但是需要GPU资源,否则运行真的是太慢了。后面针对这个模型我会写出如何使用的方法策略。

        比赛结束后有与其他两位选手聊天,他们都是对数据做了很多分析,有的甚至直接使用Lasso就work了,效果还挺不错的。特征工程无敌呀。        

        真个代码部分,了解下有关特征工程的部分就行了,模型部分可以慢慢消化。当作一个新的知识点学习吧。

直接上代码

import matplotlib.pyplot as plt
import numpy as np
import pandas as pdfrom tqdm import tqdm
from sklearn.model_selection import KFoldfrom pytorch_tabnet.metrics import Metric
from pytorch_tabnet.tab_model import TabNetRegressor
import torch
from torch.optim import Adam, SGD
from torch.optim.lr_scheduler import ReduceLROnPlateau, CosineAnnealingWarmRestarts
from sklearn.metrics import mean_absolute_error
import tracebackimport warningswarnings.filterwarnings("ignore")plt.rcParams['font.sans-serif'] = ['PingFang HK']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 该语句解决图像中的“-”负号的乱码问题
pd.set_option('precision', 10)
pd.set_option('display.max_rows', None)# 时间解析模块
def parse_date(train_df=None):train_df['datetime'] = pd.to_datetime(train_df['时间'])train_df['timestamp'] = train_df['datetime'].astype('int64') / 10000000train_df['year'] = train_df['datetime'].dt.yeartrain_df['month'] = train_df['datetime'].dt.monthtrain_df['day'] = train_df['datetime'].dt.daytrain_df['hour'] = train_df['datetime'].dt.hourtrain_df["minute"] = train_df['datetime'].dt.minutetrain_df['dayofweek'] = train_df['datetime'].dt.dayofweek# train_df['datetime'].dt.dayofmonthreturn train_dfdef same_position_tempture_resid(train_df, index=[]):for i in index:train_df[f'下部温度{i}_resid'] = train_df[f'下部温度{i}'] - train_df[f'下部温度设定{i}']train_df[f'下部温度{i}_dist_4'] = train_df[f'下部温度设定4'] - train_df[f'下部温度设定{i}']train_df[f'下部温度{i}_dist_4_moth_100'] = (train_df[f'下部温度{i}_dist_4'] >= 99) * 1return train_dfdf_train = pd.read_csv("../data/train.csv")
df_test = pd.read_csv("../data/test.csv")
submit = pd.read_csv("../data/submit.csv")
df_train = parse_date(df_train)
df_test = parse_date(df_test)df_train = df_train.sort_values("datetime")
df_train = df_train.reset_index(drop=True)
df_train['train'] = 1df_train.loc[1057, '下部温度9'] = 829df_test = df_test.sort_values("datetime")
df_test = df_test.reset_index(drop=True)
df_test['train'] = 0flow_cols = [col for col in df_train.columns if "流量" in col]
up_temp_sets = [col for col in df_train.columns if "上部温度设定" in col]
down_temp_sets = [col for col in df_train.columns if "下部温度设定" in col]
up_tempture = [col for col in df_train.columns if "上部温度" in col and col not in up_temp_sets]
down_tempture = [col for col in df_train.columns if "下部温度" in col and col not in down_temp_sets]# train_df.columns.tolist()
import resmall_cols = ['下部温度5', '上部温度8', '上部温度9','上部温度10','上部温度11','上部温度12','上部温度13','上部温度14','上部温度15','上部温度16','上部温度17','下部温度3','下部温度4','下部温度6','下部温度7','下部温度8','下部温度9','下部温度10','下部温度11','下部温度12','下部温度13','下部温度14','下部温度15','下部温度16','下部温度17'] + ['上部温度1','上部温度2','上部温度3','上部温度4','上部温度5','上部温度6','上部温度7','下部温度1','下部温度2',]def get_same_temp(test_df, cols):for col in cols:nums = re.findall("\d+", col)num = nums[0]if "上部温度" in col:print(num, col)test_df[col] = test_df[f'上部温度设定{num}']elif "下部温度" in col:test_df[col] = test_df[f'下部温度设定{num}']return test_dfdf_test = get_same_temp(df_test, small_cols)
df = pd.concat([df_train, df_test])
df = df.sort_values(['year', 'month', 'day', 'hour', "minute"])
df = df.reset_index(drop=True)down_label = ['下部温度1', '下部温度2', '下部温度3']
up_label = ['上部温度7', '上部温度1', '上部温度2', '上部温度3', '上部温度4', '上部温度5', '上部温度6']
cat_cols = ['year', 'month', 'day', 'hour', 'minute', 'dayofweek']keep_cols = df_test.columns.tolist()def resid_model(y, y_pred):# residual plotsy_pred = pd.Series(y_pred, index=y.index)resid = y - y_predmean_resid = resid.mean()std_resid = resid.std()z = abs(resid) / (y + 0.01)# print(z)n_outliers = sum(abs(resid) > 10000)outliers = y[(abs(resid) > 10000)].indexprint(outliers)plt.figure(figsize=(15, 5))ax_131 = plt.subplot(1, 3, 1)plt.plot(y, y_pred, '.')plt.xlabel('y')plt.ylabel('y_pred');plt.title('corr = {:.3f}'.format(np.corrcoef(y, y_pred)[0][1]))ax_132 = plt.subplot(1, 3, 2)plt.plot(y, y - y_pred, '.')plt.xlabel('y')plt.ylabel('y - y_pred');plt.title('std resid = {:.3f}'.format(std_resid))ax_133 = plt.subplot(1, 3, 3)z.plot.hist(bins=50, ax=ax_133)plt.xlabel('z')plt.title('{:.0f} samples with z>3'.format(n_outliers))plt.show()# return outliersdef get_down_tempture_sets_resid(df, diffed_col="下部温度设定4",diff_col='下部温度设定1'):distacnce = 0if "上部" in diff_col:print(f"----- {diff_col}_diff_{diffed_col}")df['上部温度设定4_diff_上部温度设定1'] = df['上部温度设定4'] - df['上部温度设定1']df[f'{diffed_col}_diff_{diff_col}'] = df[diffed_col] - df[diff_col]df['上部温度设定4_div_上部温度设定1'] = df['上部温度设定4'] / df['上部温度设定1']df[f'{diffed_col}_div_{diff_col}'] = df[diffed_col] / df[diff_col]df['flag'] = (df['上部温度设定4_diff_上部温度设定1'] > 300) * 1else:df['下部温度设定4_diff_下部温度设定1'] = df['下部温度设定4'] - df['下部温度设定1']df['下部温度设定4_div_下部温度设定1'] = df['下部温度设定4'] / df['下部温度设定1']df[f'{diffed_col}_diff_{diff_col}'] = df[diffed_col] - df[diff_col]df[f'{diffed_col}_div_{diff_col}'] = df[diffed_col] / df[diff_col]distacnce = 300df['flag'] = (df['下部温度设定4_diff_下部温度设定1'] > 300) * 1return dfdef get_same_type_tempure(row, df_train, label, woindows):try:heads = woindowstrain_flag = int(row['train'])hour = row['hour']minute = row['minute']timesamp = row['timestamp']flag = row['flag']nums = re.findall("\d+", label)num = int(nums[0])chars = re.findall("(\w+)(\d+)", label)[0][0]label_map_set_col = f"{chars}设定{num}"set_temps = row[label_map_set_col]# (df_train[label_map_set_col]==set_temps)&df_temp_ = df_train[(df_train[label_map_set_col] == set_temps) & (df_train['flag'] == flag) & (df_train['hour'] == hour) & (df_train['timestamp'] < timesamp)]df_temp = df_temp_.tail(woindows)# df_temp_2 = df_temp_.head(30)if len(df_temp) == 0:return set_temps, set_temps, 0, set_temps, set_temps, set_tempsmin_ = df_temp[label].min()max_ = df_temp[label].max()std_ = df_temp[label].std()mean_ = df_temp[label].mean()median_ = df_temp[label].median()ewm_ = df_temp[label].ewm(span=heads, adjust=False).mean().values[-1]del df_tempreturn min_, max_, std_, mean_, median_, ewm_except Exception as e:print(traceback.format_exc())def predict_result(df, train_df=None, result_df=None, label="下部温度1"):result_cols = result_df.columns.tolist()nums = re.findall("\d+", label)num = nums[0]chars = re.findall("(\w+)(\d+)", label)[0][0]df[f'{label}_new_label'] = (df[label] - df[f"{chars}设定{num}"])label_new = f'{label}_new_label'label_map_set_col = f"{chars}设定{num}"df[f'{label_map_set_col}_ratio'] = df[label_map_set_col].pct_change()# df[f'{label_map_set_col}_ratio']if chars in "下部温度":balance_col = "下部温度设定4"new_cols = [f'{balance_col}_diff_{label_map_set_col}', f'{balance_col}_div_{label_map_set_col}','下部温度设定4_diff_下部温度设定1', '下部温度设定4_div_下部温度设定1']else:balance_col = "上部温度设定4"new_cols = list(set(['上部温度设定4_diff_上部温度设定1', '上部温度设定4_div_上部温度设定1',f'{balance_col}_diff_{label_map_set_col}', f'{balance_col}_div_{label_map_set_col}']))down_df = get_down_tempture_sets_resid(df, balance_col, diff_col=label_map_set_col)train_df = down_df[down_df['train'] == 1].reset_index(drop=True)his_feats = []for wind in [7, 28]:his_feat = [f"{label}_min_{wind}", f"{label}_max_{wind}",f"{label}_std_{wind}", f"{label}_mean_{wind}",f"{label}_median_{wind}", f"{label}_ewm_{wind}"]his_feats.extend(his_feat)down_df[his_feat] = down_df.apply(lambda x: get_same_type_tempure(x, train_df, label, wind), axis=1,result_type="expand")# return down_df# print(down_df[his_feats].isna().sum())down_df = down_df.fillna(-99)for use_flag in [0, 1]:max_epoches = 60if use_flag==1:max_epoches = 100df_train = down_df[(down_df['train'] == 1) & (down_df['flag'] == use_flag)].reset_index(drop=True)# df_train = down_train_dfdf_test = down_df[(down_df['train'] == 0) & (down_df['flag'] == use_flag)].reset_index(drop=True)# print(df_test.unique())print("Nan shape", df_test[his_feats].isna().sum())# print(df_test[df_test[his_feats].isna()].head())print(down_df.shape, df_train.shape, df_test.shape)feats = [f'流量{num}','上部温度设定1','year', 'month', 'day', 'hour','minute', 'dayofweek', ] + new_cols + [f'{label_map_set_col}_ratio'] + his_featsfeats = list(set(feats))cat_cols = ['year', 'month', 'day', 'hour', 'minute', 'dayofweek']cat_idxs = [i for i, f in enumerate(feats) if f in cat_cols]cat_dims = [df_train[i].nunique() for i in cat_cols]# print(df_train[feats].head())# print(cat_idxs)# print(cat_dims)tabnet_params = dict(cat_idxs=[],cat_dims=[],cat_emb_dim=1,n_d=16,n_a=16,n_steps=2,  # 模型获取能力代表gamma=2,n_independent=2,n_shared=2,lambda_sparse=0,optimizer_fn=Adam,optimizer_params=dict(lr=(2e-2)),mask_type="entmax",scheduler_params=dict(T_0=200, T_mult=1, eta_min=1e-4, last_epoch=-1, verbose=False),# 学习速率自动调整scheduler_fn=CosineAnnealingWarmRestarts,seed=42,verbose=10,)split = 5# kf = KFold(n_splits=split, shuffle=False, random_state=2021)folds = KFold(n_splits=split, shuffle=True, random_state=1314)  # 1314oof = np.zeros((len(df_train), 1))importance = 0pred_y = np.zeros(len(df_test))val_all = []# for fold, (train_idx, val_idx) in enumerate(train_splits):for fold, (train_idx, val_idx) in enumerate(folds.split(df_train)):print(f'--------------------------- {len(train_idx)}', fold)val_all.extend(val_idx)print(f'Training fold {fold + 1}')X_train, X_val = df_train.loc[train_idx, feats].values, df_train.loc[val_idx, feats].valuesy_train, y_val = df_train.loc[train_idx, label_new].values.reshape(-1, 1), df_train.loc[val_idx, label_new].values.reshape(-1, 1)model = TabNetRegressor(**tabnet_params)model.fit(X_train, y_train,eval_set=[(X_val, y_val)],max_epochs=max_epoches,patience=50,batch_size=64,virtual_batch_size=32,num_workers=8,drop_last=False,eval_metric=[MYMAE],loss_fn=my_mean)oof[val_idx] = model.predict(X_val)# print(model.predict(df_test[feats].values))pred_y += model.predict(df_test[feats].values).flatten() / split#     if save_model:#         joblib.dump(value=model, filename=f'../model/lgb_5fold_{fold}.m')print(f'labe = {label} use_flag = {use_flag} mae = ',mean_absolute_error(oof.reshape(-1) + df_train[label_map_set_col], df_train[label]))# resid_model(df_train[label_new], oof)result_df = result_df[result_cols]df_test[label + "_add"] = pred_yresult_df = result_df.merge(df_test[cat_cols + [label + "_add"] + his_feats], on=cat_cols, how="left")# print(result_df.head())result_df.loc[~result_df[label + "_add"].isna(), label] = result_df.loc[~result_df[label + "_add"].isna(), label + "_add"] + result_df.loc[~result_df[label + "_add"].isna(), label_map_set_col]return result_df.reset_index(drop=True)[result_cols + his_feats]# df['day'].nunique()
class MYMAE(Metric):def __init__(self):self._name = "mymae"self._maximize = Falsedef __call__(self, y_true, y_score):return mean_absolute_error(y_true, y_score)def my_mean(y_pred, y_true):return torch.mean(torch.abs(y_true - y_pred)).clone()# up_label+down_label
for label in tqdm((down_label + up_label)[5:]):print(f"-------------------{label}")df_test = predict_result(df, df_train, df_test[keep_cols], label)df_test['上部温度1'] = df_test['上部温度1'].clip(upper=410)
x = pd.concat([df_train, df_test]).sort_values(['year', 'month', 'day', 'hour', "minute"]).reset_index(drop=True)
submit = pd.read_csv("../data/submit.csv")
submit_cols = submit.columns.tolist()
df_test[submit_cols].to_csv("../data/tabnet_submit_his_winds_label_last_5.csv",index=False, encoding='utf_8_sig')

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

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

相关文章

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景&#xff1a; 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程&#xff0c;没有搞定&#xff0c;于是写下避坑之作。 服务器&#xff1a;腾讯云轻量应用服务器 操作系统&#xff1a; Windows Server 2022 DataCenter 64bit CN apache…

李沐45_SSD实现——自学笔记

主体思路&#xff1a; 1.生成一堆锚框 2.根据真实标签为每个锚框打标(类别、偏移、mask) 3.模型为每个锚框做一个预测(类别、偏移) 4.计算上述二者的差异损失&#xff0c;以更新模型weights 先读取一张图像。 它的高度和宽度分别为561和728像素。 %matplotlib inline import …

Photoshop 2024 (ps) v25.6中文 强大的图像处理软件 mac/win

Photoshop 2024 for Mac是一款强大的图像处理软件&#xff0c;专为Mac用户设计。它继承了Adobe Photoshop一贯的优秀功能&#xff0c;并进一步提升了性能和稳定性。 Mac版Photoshop 2024 (ps)v25.6中文激活版下载 win版Photoshop 2024 (ps)v25.6直装版下载 无论是专业的设计师还…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间&#xff1a;2024年 11月27-29日 召开地点&#xff1a;澳大利亚悉尼 大会官网&#xff1a;CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

m4p转换mp3格式怎么转?3个Mac端应用~

M4P文件格式的诞生伴随着苹果公司引入FairPlay版权管理系统&#xff0c;该系统旨在保护音频的内容。M4P因此而生&#xff0c;成为受到FairPlay系统保护的音频格式&#xff0c;常见于苹果设备的iTunes等平台。 MP3文件格式的多个优点 MP3格式的优点显而易见。首先&#xff0c;其…

k8s之etcd

1.特点&#xff1a; etcd 是云原生架构中重要的基础组件。有如下特点&#xff1a; 简单&#xff1a;安装配置简单&#xff0c;而且提供了 HTTP API 进行交互&#xff0c;使用也很简单键值对存储&#xff1a;将数据存储在分层组织的目录中&#xff0c;如同在标准文件系统中监…

vscode msvc qt环境搭建

自己整了好久都没把环境搞好&#xff0c;后来发现已经有大佬搞好了插件&#xff0c;完全不需要自己整理。 下载如下插件&#xff1a; 第二个qt插件就可以自动帮我们生成工程了。 可惜目前似乎支持win&#xff0c;另外就是debug模式运行后会报qwindowsd.dll插件找不到的错误&a…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

链表OJ - 6(链表分割)

题目描述&#xff08;来源&#xff09; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

ChatGPT:引领未来的语言模型革命?

一、引言 随着人工智能技术的不断发展&#xff0c;Chat GPT作为一种自然语言处理技术&#xff0c;已经逐渐渗透到各个领域&#xff0c;具有广泛的应用前景。本文将从多个角度探讨Chat GPT的应用领域及其未来发展趋势。 ChatGPT的语言处理能力超越了以往任何一款人工智能产品。…

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型&#xff0c;每个人都可以有自己的GTP 第一步&#xff1a;安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…

【小白学机器学习13】一文理解假设检验的反证法,H0如何设计的,什么时候用左侧检验和右侧检验,等各种关于假设检验的基础知识

目录 前言&#xff1a; 目标 1 什么叫 假设检验 1.1 假设检验的定义 1.1.1 来自百度百科 1.1.2 维基百科 1.2 假设检验的最底层逻辑&#xff1a;是反证法思想 1.3 假设检验的底层构造&#xff1a;小概率反证法思想 2 什么叫反证法 2.1 反证法的概念 2.1.1 来自百度…