4 回归: 比赛代码,时间窗口特征

news2024/9/21 11:51:27

        看到了不错的代码我就想收集一下 。  

        这是2024科大讯飞电力需求预测挑战赛的baseline。你可以在AI and competition里获取更多比赛的baseline。本次比赛官网如下:电力需求预测挑战赛。目前该baseline在比赛中相对靠前。

AI-and-competition/202407科大讯飞电力需求预测baseline/2024-baseline-lb-229.ipynb at main · yunsuxiaozi/AI-and-competition · GitHub

1 sin、cos函数有什么用? 周期!

2  历史特征、时间窗口;

3 彩蛋:有可能时间序列模型更好用哦!

import pandas as pd#导入csv文件的库
import numpy as np#矩阵运算与科学计算的库
#model lgb回归模型,日志评估
from  lightgbm import LGBMRegressor,log_evaluation
#KFold是直接分成k折,StratifiedKFold还要考虑每种类别的占比
from sklearn.model_selection import KFold
import gc#垃圾回收模块
import warnings#避免一些可以忽略的报错
warnings.filterwarnings('ignore')#filterwarnings()方法是用于设置警告过滤器的方法,它可以控制警告信息的输出方式和级别。

#config
class Config():
    seed=2024#随机种子
    num_folds=10#K折交叉验证
    TARGET_NAME ='target'#标签
import random#提供了一些用于生成随机数的函数
#设置随机种子,保证模型可以复现
def seed_everything(seed):
    np.random.seed(seed)#numpy的随机种子
    random.seed(seed)#python内置的随机种子
seed_everything(Config.seed)

path='/kaggle/input/kedapower/2407keda/'
train=pd.read_csv(path+"train.csv")
test=pd.read_csv(path+"test.csv")
train.head()

# 先对数据集拼接,根据id和dt排序,根据id排序是因为同一个id是同一个房屋,dt要降序排列是因为dt是距离当前多少天。

total=pd.concat((train,test),axis=0)
#id从小到大,dt从大到小,因为dt是距离现在多少天.
total=total.sort_values(['id','dt'],ascending=[True,False])
print(f"len(total):{len(total)}")
total.head()

print("type feature")
user_type=total['type'].unique()
for t in user_type:
    total[f'type_{t}']=(total['type']==t)
"""
dt:虽然dt是脱敏处理后的天数,但这里还是按照常规的day来处理。7是一周,30是一个月,90是一个季度,180是半年,365是一年,由于这些特征是人类通常表示时间的周期,用sin和cos提取特征。之后提取了差分特征,并提取了常规的dayofweek,month,year特征。
"""

print("dt feature")  
for day in [7,30,90,180,365]:
    total[f'sin_dt_{day}']=np.sin(2*np.pi*total['dt']/day)
    total[f'cos_dt_{day}']=np.cos(2*np.pi*total['dt']/day)
for gap in [2,4,7,15,30,60]:
    for col in ['sin_dt_7','cos_dt_7','sin_dt_30','cos_dt_30','sin_dt_90','cos_dt_90','sin_dt_180','cos_dt_180','sin_dt_365','cos_dt_365']:
        total[f"{col}_shift{gap}"]=total.groupby(total['id'])[col].shift(gap)
        total[f"{col}_gap{gap}"]=total[col]-total[f"{col}_shift{gap}"]
        total.drop([f"{col}_shift{gap}"],axis=1,inplace=True)
total['dt_dayofweek']=total['dt']%7
for d in range(7):
    total[f'dt_dayofweek_{d}']=(total['dt_dayofweek']==d)  
total['dt_month']=total['dt']//30%12
for d in range(12):
    total[f'dt_month_{d}']=(total['dt_month']==d)
total['dt_year']=total['dt']//365

# target:对于target特征的提取有很多,也比较暴力,基本都是groupby的统计特征,自己看吧。

print("target feature")
for gap in [10,13,20]:
    for col in ['target']:
        total[f"{col}_shift{gap}"]=total.groupby(total['id'])[col].shift(gap)    
        for w in [3,6,10]:
            total[f"{col}_gap{gap}_window{w}"]=total.groupby(total['id'])[col].transform(lambda x: x.rolling(w).mean()).shift(gap)

for col in [['id'],['type'],['dt_dayofweek'],['dt_month'],
            ['id','type'],['id','dt_dayofweek'],['id','dt_month'],
            ['type','dt_dayofweek'],['type','dt_month']
           ]:
    print(f"col:{col}")
    if len(col)>1:
        colname='_'.join(col)
    else:
        colname=col[0]
    total[f"{colname}_target_min"]=total.groupby(col)['target'].transform('min')
    total[f"{colname}_target_max"]=total.groupby(col)['target'].transform('max')
    total[f"{colname}_target_mean"]=total.groupby(col)['target'].transform('mean')
    total[f"{colname}_target_median"]=total.groupby(col)['target'].transform('median')
    total[f"{colname}_target_std"]=total.groupby(col)['target'].transform('std')
    total[f"{colname}_target_skew"]=total.groupby(col)['target'].transform('skew')
    total[f"{colname}_target_last"]=total.groupby(col)['target'].transform('last')
    total[f"{colname}_target_first"]=total.groupby(col)['target'].transform('first')
    total[f"{colname}_target_nunique"]=total.groupby(col)['target'].transform('nunique')
    
    total[f"{colname}_target_ptp"]=total[f"{colname}_target_max"]-total[f"{colname}_target_min"]
    total[f"{colname}_target_max/min"]=total[f"{colname}_target_max"]/(total[f"{colname}_target_min"]+1e-15)
    total[f"{colname}_target_mean/std"]=total[f"{colname}_target_mean"]/(total[f"{colname}_target_std"]+1e-15)

"""
这里也根据模型的特征重要性筛选了一些特征,特征重要性小于10就drop。这里选择dt<=500的训练数据进行训练是因为一方面shift特征的构造中会有一些缺失值,另一方面时间上距离0太远的数据可能也没什么用。
"""
#根据模型的特征重要性筛选的特征
useless_cols=['cos_dt_30_gap30', 'cos_dt_30_gap60', 'type_16', 'cos_dt_7_gap7','sin_dt_30_gap30', 'type_5','sin_dt_30_gap60', 'type_0', 'type_1', 'type_10', 'type_11', 'sin_dt_7_gap7']
total.drop(useless_cols,axis=1,inplace=True)
train=total[~total['target'].isna()]
train=train[train['dt']<=500]
test=total[total['target'].isna()]
del total
gc.collect()
print(f"features_count:{len(test.columns)}")
train.head()
#遍历表格df的所有列修改数据类型减少内存使用
def reduce_mem_usage(df, float16_as32=True):
    #memory_usage()是df每列的内存使用量,sum是对它们求和, B->KB->MB
    start_mem = df.memory_usage().sum() / 1024**2
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:#遍历每列的列名
        col_type = df[col].dtype#列名的type
        if col_type != object and str(col_type)!='category':#不是object也就是说这里处理的是数值类型的变量
            c_min,c_max = df[col].min(),df[col].max() #求出这列的最大值和最小值
            if str(col_type)[:3] == 'int':#如果是int类型的变量,不管是int8,int16,int32还是int64
                #如果这列的取值范围是在int8的取值范围内,那就对类型进行转换 (-128 到 127)
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                #如果这列的取值范围是在int16的取值范围内,那就对类型进行转换(-32,768 到 32,767)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                #如果这列的取值范围是在int32的取值范围内,那就对类型进行转换(-2,147,483,648到2,147,483,647)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                #如果这列的取值范围是在int64的取值范围内,那就对类型进行转换(-9,223,372,036,854,775,808到9,223,372,036,854,775,807)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:#如果是浮点数类型.
                #如果数值在float16的取值范围内,如果觉得需要更高精度可以考虑float32
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    if float16_as32:#如果数据需要更高的精度可以选择float32
                        df[col] = df[col].astype(np.float32)
                    else:
                        df[col] = df[col].astype(np.float16)  
                #如果数值在float32的取值范围内,对它进行类型转换
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                #如果数值在float64的取值范围内,对它进行类型转换
                else:
                    df[col] = df[col].astype(np.float64)
    #计算一下结束后的内存
    end_mem = df.memory_usage().sum() / 1024**2
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    #相比一开始的内存减少了百分之多少
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df
train=reduce_mem_usage(train, float16_as32=False)
test=reduce_mem_usage(test, float16_as32=False)
choose_cols=[ col for col in test.drop(['id','dt','target','dt_dayofweek','dt_month'],axis=1).columns]

def fit_and_predict(train_feats=train,test_feats=test,model=None,num_folds=10,seed=2024,name='lgb'):
    X=train_feats[choose_cols].copy()
    y=train_feats[Config.TARGET_NAME].copy()
    test_X=test_feats[choose_cols].copy()
    test_pred_pro=np.zeros((num_folds,len(test_X)))
    del train_feats,test_feats
    gc.collect()
    
    #10折交叉验证
    kf = KFold(n_splits=num_folds,shuffle=True,random_state=seed)
    for fold, (train_index, valid_index) in (enumerate(kf.split(X))):
        print(f"name {name},fold:{fold}")

        X_train, X_valid = X.iloc[train_index], X.iloc[valid_index]
        y_train, y_valid = y.iloc[train_index], y.iloc[valid_index]
        
        model.fit(X_train,y_train,eval_set=[(X_valid, y_valid)],
                      callbacks=[log_evaluation(100)],
                     )
        if fold==0:
            useless_cols=[]
            feature_importance=list(model.feature_importances_)
            for i in range(len(choose_cols)):
                if (feature_importance[i]<10):
                    useless_cols.append(choose_cols[i])
            print(f"useless_cols:{list(set(useless_cols))}")
        valid_pred=model.predict(X_valid)
        test_pred_pro[fold]=model.predict(test_X)
        del X_train,X_valid,y_train,y_valid
        gc.collect()
    test_preds=test_pred_pro.mean(axis=0)
    return test_preds

lgb_params = { "boosting_type": "gbdt","objective": "regression","metric": "mse",       
               'random_state': 2024, 'n_estimators': 1000,
                'reg_alpha': 0.1, 'reg_lambda': 10, 
                'colsample_bytree': 0.8, 'subsample': 0.8,
                'learning_rate': 0.05, 'num_leaves': 64, 'min_child_samples': 62,
                'max_bin':255, "extra_trees": True,
                'device':'gpu','gpu_use_dp':True,#这行GPU环境的参数,想在CPU环境下运行注释这行代码
             }

test_preds=fit_and_predict(model=LGBMRegressor(**lgb_params),num_folds=Config.num_folds,seed=2024,name='lgb')
print(test_preds.shape)
submission=test[['id','dt']]
submission['target']=test_preds
submission=submission.sort_values(['id','dt'])
submission.to_csv("yunbase.csv",index=None)
submission.head()

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

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

相关文章

数据防泄密软件精选|6款好用的数据防泄漏软件强推

某科技公司会议室&#xff0c;CEO张总、CIO李总、信息安全主管王经理正围绕最近发生的一起数据泄露事件展开讨论。 张总&#xff08;忧虑&#xff09;: 大家&#xff0c;这次的数据泄露事件对我们来说是个沉重的打击。客户信息的外泄不仅损害了我们的信誉&#xff0c;还可能面…

自动化测试高级控件交互方法:TouchAction、触屏操作、点按,双击,滑动,手势解锁!

在自动化测试领域中&#xff0c;TouchAction 是一种非常强大的工具&#xff0c;它允许我们模拟用户在设备屏幕上的各种触摸事件。这种模拟不仅限于简单的点击操作&#xff0c;还包括滑动、长按、多点触控等复杂的手势。 点按与双击 点按和双击是触屏设备上最基本的操作之一。…

ViewPager

作用 实现翻页的效果。 1、在activity_main.xml中创建ViewPager <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

产品经理-的职业发展(9)

找一份好工作&#xff0c;就是为了获得更好的职业发展&#xff0c;下面分别给大家介绍下大、中、小型公司的职业发展路径 中小型公司 中小型公司的规模往往相对不大&#xff0c;又处于飞速发展过程中&#xff0c;培养体系和晋升标准都不够成熟&#xff0c;所以实际的职业发展路…

如何将heic转jpg格式?四种图片格式转换方法【附教程】

如何把heic转jpg格式&#xff1f;heic是用于存储静态图像和图形的压缩格式&#xff0c;旨在以更小的文件大小保持高质量的图像。HEIC格式自iOS 11和macOS High Sierra&#xff08;10.13&#xff09;内测开始&#xff0c;被苹果设置为图片存储的默认格式&#xff0c;广泛应用于i…

C++进阶-二叉树进阶(二叉搜索树)

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1.若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值2.若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于…

代码随想录(day1)二分法

if语句的基本语法 if 要判断的条件: 条件成立的时候&#xff0c;要做的事举例&#xff1a; if nums[middle]<target:leftmiddle1 while语句的基本语法&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)举例&#xff1a; while left<right:midd…

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时&#xff0c;惊讶的发现&#xff0c;自己进行打印后端传递的对象&#xff0c;一直显示未[object,object]&#xff0c;如下图所示&#xff1a; 感觉很奇怪&#xff0c;于是我猜测是不是自己获取的返回数据的问题&#xff0c;在进行添加了datat…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-4.EBS不同架构性能提升思路

3.1 平均延迟与长尾延迟 虚拟磁盘&#xff08;VD&#xff09;的延迟是由其底层架构决定的&#xff0c;具体而言&#xff0c;取决于请求所经历的路径。以EBS2为例&#xff0c;VD的延迟受制于两跳网络&#xff08;从BlockClient到BlockServer&#xff0c;再至ChunkServer&#x…

顾客排队购买蛋挞问题(算法与数据结构设计)

课题内容和要求 顾客排队买蛋挞问题。有N个顾客排队&#xff0c;每人最多买M个。烘焙员每次烘焙1到K个蛋挞放入盘中&#xff0c;顾客只能购买盘中的蛋挞&#xff0c;未达到M个需重新排队。输出每个顾客购买情况和完成顺序。 例如—— 输入&#xff1a;N9&#xff0c;K5&#x…

游戏软件缺少d3dx9_42.dll怎么修复?五种方法助你轻松解决

D3DX9_42.dll的丢失是一种常见的操作系统异常问题&#xff0c;由于日常使用电脑时的不当操作&#xff0c;可能会导致一些dll文件的丢失&#xff0c;D3DX9_42.dll就是其中之一。对于这种情况&#xff0c;我们可以通过谨慎的修复来解决。以下是一种科学的解决D3DX9_42.dll丢失的方…

【面试题】串联探针和旁挂探针有什么区别?

在网络安全领域中&#xff0c;串联探针和旁挂探针&#xff08;通常也被称为旁路探针&#xff09;是两种不同部署方式的监控设备&#xff0c;它们各自具有独特的特性和应用场景。以下是它们之间的主要区别&#xff1a; 部署方式 串联探针&#xff1a;串联探针一般通过网关或者…

刷题(day01)

1、leetcode485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3.…

Linux环境部署Python Web服务

“姑娘&#xff0c;再见面就要靠运气了&#xff0c;可别装作不认识&#xff0c;那句“好久不见”可干万别打颤…” 将使用 Python 编写的后端 API 部署到 Linux 环境中&#xff0c;可以按照以下详细步骤操作。本文将涵盖环境准备、API 编写、使用 Gunicorn 作为 WSGI 服务器、配…

C#反射基本应用

1、反射 反射是.NET Framework的一个特性&#xff0c;它允许在运行时获取类型的信息以及动态创建对象&#xff0c;调用方法&#xff0c;以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…

运维锅总详解系统设计原则

本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例&#xff0c;希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助&#xff01; 一、CAP、BASE、ACID简介 以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例&am…

【小鸡案例】表单focus和blur事件用法

input中有2个属性&#xff0c;一个是focus获取焦点&#xff0c;一个是blur失去焦点。获取焦点就是我们点击输入框时输入框被选中&#xff1b;失去焦点即点击输入框以外的区域&#xff0c;今天就用这两种属性做一个点击输入框的动画效果。 先写个输入框&#xff0c;代码如下&am…

如何使用 pytorch 创建一个神经网络

我已发布在&#xff1a;如何使用 pytorch 创建一个神经网络 SapientialM.Github.io 构建神经网络 1 导入所需包 import os import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets, transforms2 检查GPU是否可用 dev…

Nacos 进阶篇---集群:选举心跳健康检查劳动者(九)

一、引言 本章将是我们第二阶段&#xff0c;开始学习集群模式下&#xff0c;Nacos 是怎么去操作的 &#xff1f; 本章重点&#xff1a; 在Nacos服务端当中&#xff0c;会去开启健康心跳检查定时任务。如果是在Nacos集群下&#xff0c;大家思考一下&#xff0c;有没有必要所有的…