Home Credit - Credit Risk Model Stability

本篇是对Kaggle上Home Credit - Credit Risk Model Stability竞赛中的开源代码VotingClassifier Home Credit的解读。原链接在VotingClassifier Home Credit (kaggle.com)。

%%writefile script.py
import sys
from pathlib import Path
import subprocess
import os
import gc
from glob import globimport numpy as np
import pandas as pd
import polars as pl
from datetime import datetime
import seaborn as sns
import matplotlib.pyplot as plt
import joblib
import warnings
warnings.filterwarnings('ignore')ROOT = '/kaggle/input/home-credit-credit-risk-model-stability'from sklearn.model_selection import TimeSeriesSplit, GroupKFold, StratifiedGroupKFold
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.metrics import roc_auc_score
import lightgbm as lgbclass Pipeline:def set_table_dtypes(df):for col in df.columns:if col in ["case_id", "WEEK_NUM", "num_group1", "num_group2"]:df = df.with_columns(pl.col(col).cast(pl.Int64))elif col in ["date_decision"]:df = df.with_columns(pl.col(col).cast(pl.Date))elif col[-1] in ("P", "A"):df = df.with_columns(pl.col(col).cast(pl.Float64))elif col[-1] in ("M",):df = df.with_columns(pl.col(col).cast(pl.String))elif col[-1] in ("D",):df = df.with_columns(pl.col(col).cast(pl.Date))return dfdef handle_dates(df):for col in df.columns:if col[-1] in ("D",):df = df.with_columns(pl.col(col) - pl.col("date_decision"))  #!!?df = df.with_columns(pl.col(col).dt.total_days()) # t - t-1df = df.drop("date_decision", "MONTH")return dfdef filter_cols(df):for col in df.columns:if (col not in ["target", "case_id", "WEEK_NUM"]) & (df[col].dtype == pl.String):freq = df[col].n_unique()if (freq == 1) | (freq > 200):df = df.drop(col)return dfclass Aggregator:#Please add or subtract features yourself, be aware that too many features will take up too much space.def num_expr(df):cols = [col for col in df.columns if col[-1] in ("P", "A")]expr_max = [pl.max(col).alias(f"max_{col}") for col in cols]return expr_maxdef date_expr(df):cols = [col for col in df.columns if col[-1] in ("D")]expr_max = [pl.max(col).alias(f"max_{col}") for col in cols]return  expr_maxdef str_expr(df):cols = [col for col in df.columns if col[-1] in ("M",)]expr_max = [pl.max(col).alias(f"max_{col}") for col in cols]return  expr_maxdef other_expr(df):cols = [col for col in df.columns if col[-1] in ("T", "L")]expr_max = [pl.max(col).alias(f"max_{col}") for col in cols]return  expr_max def count_expr(df):cols = [col for col in df.columns if "num_group" in col]expr_max = [pl.max(col).alias(f"max_{col}") for col in cols] return  expr_maxdef get_exprs(df):exprs = Aggregator.num_expr(df) + \Aggregator.date_expr(df) + \Aggregator.str_expr(df) + \Aggregator.other_expr(df) + \Aggregator.count_expr(df)return exprsdef read_file(path, depth=None):df = pl.read_parquet(path)df = df.pipe(Pipeline.set_table_dtypes)if depth in [1,2]:df = df.group_by("case_id").agg(Aggregator.get_exprs(df)) return dfdef read_files(regex_path, depth=None):chunks = []for path in glob(str(regex_path)):df = pl.read_parquet(path)df = df.pipe(Pipeline.set_table_dtypes)if depth in [1, 2]:df = df.group_by("case_id").agg(Aggregator.get_exprs(df))chunks.append(df)df = pl.concat(chunks, how="vertical_relaxed")df = df.unique(subset=["case_id"])return dfdef feature_eng(df_base, depth_0, depth_1, depth_2):df_base = (df_base.with_columns(month_decision = pl.col("date_decision").dt.month(),weekday_decision = pl.col("date_decision").dt.weekday(),))for i, df in enumerate(depth_0 + depth_1 + depth_2):df_base = df_base.join(df, how="left", on="case_id", suffix=f"_{i}")df_base = df_base.pipe(Pipeline.handle_dates)return df_basedef to_pandas(df_data, cat_cols=None):df_data = df_data.to_pandas()if cat_cols is None:cat_cols = list(df_data.select_dtypes("object").columns)df_data[cat_cols] = df_data[cat_cols].astype("category")return df_data, cat_colsdef reduce_mem_usage(df):""" iterate through all the columns of a dataframe and modify the data typeto reduce memory usage.        """start_mem = df.memory_usage().sum() / 1024**2for col in df.columns:col_type = df[col].dtypeif str(col_type)=="category":continueif col_type != object:c_min = df[col].min()c_max = df[col].max()if str(col_type)[:3] == 'int':if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:df[col] = df[col].astype(np.int8)elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:df[col] = df[col].astype(np.int16)elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:df[col] = df[col].astype(np.int32)elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:df[col] = df[col].astype(np.int64)  else:if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:df[col] = df[col].astype(np.float16)elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:df[col] = df[col].astype(np.float32)else:df[col] = df[col].astype(np.float64)else:continueend_mem = df.memory_usage().sum() / 1024**2    return dfROOT            = Path("/kaggle/input/home-credit-credit-risk-model-stability")TRAIN_DIR       = ROOT / "parquet_files" / "train"
TEST_DIR        = ROOT / "parquet_files" / "test"data_store = {"df_base": read_file(TRAIN_DIR / "train_base.parquet"),"depth_0": [read_file(TRAIN_DIR / "train_static_cb_0.parquet"),read_files(TRAIN_DIR / "train_static_0_*.parquet"),],"depth_1": [read_files(TRAIN_DIR / "train_applprev_1_*.parquet", 1),read_file(TRAIN_DIR / "train_tax_registry_a_1.parquet", 1),read_file(TRAIN_DIR / "train_tax_registry_b_1.parquet", 1),read_file(TRAIN_DIR / "train_tax_registry_c_1.parquet", 1),read_files(TRAIN_DIR / "train_credit_bureau_a_1_*.parquet", 1),read_file(TRAIN_DIR / "train_credit_bureau_b_1.parquet", 1),read_file(TRAIN_DIR / "train_other_1.parquet", 1),read_file(TRAIN_DIR / "train_person_1.parquet", 1),read_file(TRAIN_DIR / "train_deposit_1.parquet", 1),read_file(TRAIN_DIR / "train_debitcard_1.parquet", 1),],"depth_2": [read_file(TRAIN_DIR / "train_credit_bureau_b_2.parquet", 2),]
}df_train = feature_eng(**data_store)
del data_store
gc.collect()
df_train = df_train.pipe(Pipeline.filter_cols)
df_train, cat_cols = to_pandas(df_train)
df_train = reduce_mem_usage(df_train)
nums=df_train.select_dtypes(exclude='category').columns
from itertools import combinations, permutations
nans_df = df_train[nums].isna()
nans_groups={}
for col in nums:cur_group = nans_df[col].sum()try:nans_groups[cur_group].append(col)except:nans_groups[cur_group]=[col]
del nans_df; x=gc.collect()def reduce_group(grps):use = []for g in grps:mx = 0; vx = g[0]for gg in g:n = df_train[gg].nunique()if n>mx:mx = nvx = gguse.append(vx)return usedef group_columns_by_correlation(matrix, threshold=0.8):correlation_matrix = matrix.corr()groups = []remaining_cols = list(matrix.columns)while remaining_cols:col = remaining_cols.pop(0)group = [col]correlated_cols = [col]for c in remaining_cols:if correlation_matrix.loc[col, c] >= threshold:group.append(c)correlated_cols.append(c)groups.append(group)remaining_cols = [c for c in remaining_cols if c not in correlated_cols]return groupsuses=[]
for k,v in nans_groups.items():if len(v)>1:Vs = nans_groups[k]grps= group_columns_by_correlation(df_train[Vs], threshold=0.8)use=reduce_group(grps)uses=uses+useelse:uses=uses+v
df_train=df_train[uses]data_store = {"df_base": read_file(TEST_DIR / "test_base.parquet"),"depth_0": [read_file(TEST_DIR / "test_static_cb_0.parquet"),read_files(TEST_DIR / "test_static_0_*.parquet"),],"depth_1": [read_files(TEST_DIR / "test_applprev_1_*.parquet", 1),read_file(TEST_DIR / "test_tax_registry_a_1.parquet", 1),read_file(TEST_DIR / "test_tax_registry_b_1.parquet", 1),read_file(TEST_DIR / "test_tax_registry_c_1.parquet", 1),read_files(TEST_DIR / "test_credit_bureau_a_1_*.parquet", 1),read_file(TEST_DIR / "test_credit_bureau_b_1.parquet", 1),read_file(TEST_DIR / "test_other_1.parquet", 1),read_file(TEST_DIR / "test_person_1.parquet", 1),read_file(TEST_DIR / "test_deposit_1.parquet", 1),read_file(TEST_DIR / "test_debitcard_1.parquet", 1),],"depth_2": [read_file(TEST_DIR / "test_credit_bureau_b_2.parquet", 2),]
}df_test = feature_eng(**data_store)
del data_store
gc.collect()
df_test = df_test.select([col for col in df_train.columns if col != "target"])
df_test, cat_cols = to_pandas(df_test)
df_test = reduce_mem_usage(df_test)
gc.collect()df_train['target']=0
df_test['target']=1df_train=pd.concat([df_train,df_test])
df_train=reduce_mem_usage(df_train)y = df_train["target"]
df_train= df_train.drop(columns=["target", "case_id", "WEEK_NUM"])joblib.dump((df_train,y,df_test),'data.pkl')

导入必要的库:代码开始部分导入了多个Python库,包括用于数据处理的NumPy、Pandas、Polars,以及用于可视化的Seaborn、Matplotlib等。

设置警告过滤器:使用warnings.filterwarnings('ignore')来忽略警告信息,这在处理大型数据集时很常见。

 定义数据路径:设置ROOT变量,指向包含输入数据的目录。

定义Pipeline类:这个类包含几个静态方法,用于设置数据类型、处理日期列和过滤列。

定义Aggregator类:这个类包含多个静态方法,用于聚合数据,如计算最大值等。

定义数据读取函数read_fileread_files函数用于读取Parquet格式的文件,并将它们转换为Polars DataFrame。

特征工程feature_eng函数用于添加新特征,如决策月份和星期几等。

转换为Pandas DataFrameto_pandas函数用于将Polars DataFrame转换为Pandas DataFrame,并优化内存使用。

内存优化reduce_mem_usage函数用于减少DataFrame的内存占用,通过将数据类型转换为更小的类型。

读取和处理训练数据:代码读取训练数据文件,应用特征工程,并进行内存优化。代码通过分析缺失值的模式,决定哪些列是有用的,并据此过滤列。

基于相关性分组列group_columns_by_correlation函数用于基于列之间的相关性将它们分组。

读取、处理和保存测试数据:类似地,读取测试数据文件,应用特征工程,并进行内存优化。设置目标变量,并将训练数据和测试数据合并。最后,使用joblib.dump将处理后的训练数据、测试数据和目标变量保存到一个文件中。

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

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

相关文章

浅谈JMeter运行原理

浅谈JMeter运行原理 JMeter架构基础 JMeter基于Java平台开发&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上。这意味着它可以在任何支持JVM的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。其核心架构设计围绕着多线程执行机制&#xff0c;这使得它…

AI大模型探索之路-实战篇6: Function Calling技术调研之详细流程剖析

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;DB-GPT数据应用开发框架调研实践 AI大模型探索之路-实战篇5&#xff1a; Open Interpreter开放代码解释器调研实践 目录 系列篇章&#x1f4a5;一、前言二、Function Calling详细流程剖析1、创建OpenAI客户端2、定…

PCL 法向量加权的RANSAC拟合分割平面

目录 一、算法原理1、原理概述2、主要函数二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、原理概述

鸿蒙布局List简介

鸿蒙布局List简介 List--常见的布局容器List 创建方式创建方式一&#xff0c;通过Listitem创建方式二&#xff0c;通过ForEach和Listitem创建方式三&#xff0c;通过ListItemGroup List–常见的布局容器 List是在app开发中最常见的一种布局方式&#xff0c;例如通讯录、新闻列…

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

域内攻击 ----->约束非约束委派攻击

在域中&#xff0c;除了我们常见的横向移动以外&#xff0c;还有很多攻击&#xff0c;像什么kerberoasting&#xff0c;委派攻击&#xff0c;NTLMrelay啊...... 还有很多&#xff08;暂时只知道这些&#xff09; 以前在一篇公众号看到的一个笑话也荟萃了网安的一些攻击手法&am…

《拯救大学生课设不挂科第二期之Windows11下安装VC6.0(VC++6.0)与跑通Hello World C语言程序教程》【官方笔记】

背景与目标人群&#xff1a; 大学第一次学C语言的时候&#xff0c;大部分老师会选择VC6这个编辑器。 但由于很多人是新手&#xff0c;第一次上大学学C语言。 老师要求VC6.0&#xff08;VC6.0&#xff09;写C语言跑程序可能很多人还是第一次接触电脑。 需要安装VC6这个编辑器…

初识Java--开启我的Java学习之旅

目录 一、JAVA语言概述二、JAVA语言的重要性2.1语言使用广泛程度2.2工作领域2.3在校招岗位的需求2.4 java语言发展简史2.5Java语言特性 三、初识java的main方法四、运行java程序五、【面试题】JDK、JRE、JVM之间的关系&#xff1f; 一、JAVA语言概述 Java是一种优秀的程序设计…

【Apache Doris】周FAQ集锦:第 4 期

【Apache Doris】周FAQ集锦&#xff1a;第 4 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

Redis常见数据类型(6)-set, zset

目录 Set 命令小结 内部编码 使用场景 用户画像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ​编辑 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小结 …

Spring 模拟管理Web应用程序

MVC&#xff1a;Model View Controller 1&#xff09;controller&#xff1a;控制层&#xff08;Servlet是运行服务器端&#xff0c;处理请求响应java语言编写技术&#xff09; 2&#xff09;service&#xff1a;业务层&#xff08;事务&#xff0c;异常&#xff09; 3&#xf…

视频号小店的保证金是多少钱?2024最新收费标准,一篇了解!

哈喽~我是电商月月 现实社会&#xff0c;干什么都需要交钱&#xff0c;就连上班&#xff0c;路费也得掏钱 想要入驻视频号小店&#xff0c;在视频号里卖货赚钱&#xff0c;就要缴纳类目保证金 那到底要缴多少钱呢&#xff1f; 今天&#xff0c;月月就把最新的收费标准分享给…

轻松拿捏C语言——【字符串函数】的使用及模拟实现

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f389;创作不易&#xff0c;请多多支持&#x1f389; &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录 一、…

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成 文章目录 0论文工作1论文方法2效果 0论文工作 **分数蒸馏采样&#xff08;SDS&#xff09;**通过提取预先训练好的大规模文本到图像扩散模型&#xff0c;在文本到3d生成方面显示出了巨大的前景&#xff0…

Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库

今天接到一个学生C语言访问SQLite数据库的的需求: 第一步,SQLite Download Page下载 sqlite3.dll 库 下载解压,发现只有两个文件: 于是使用x64 Native Tools Command Prompt 终端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…

广告圈策划大师课:活动策划到品牌企划的深度解析

对于刚接触营销策划的新人来说&#xff0c;在这个知识密集型行业里生存&#xff0c;要学习非常多各种意思相近的概念&#xff0c;常常让人感到头疼&#xff0c;难以区分。 这里对这些策划概念进行深入解析&#xff0c;帮助您轻松理清各自的含义和区别。 1. 活动策划&#xff…

截图工具PixPin(比Snipaste更强大)

PixPin官网链接&#xff1a;https://pixpinapp.com/ 最近新出的一款截图工具PixPin&#xff0c;比Snipaste功能多一些。在Snipaste功能基础上&#xff0c;还支持长截图&#xff0c;截动图&#xff0c;文本识别。

618好物推荐,省心省力省钱包!

一年一度的“618”购物狂欢节又来啦&#xff01;大家都心动了吧&#xff0c;购物车也早就堆满了心仪的好物。别急&#xff0c;别急&#xff0c;让我给你们推荐几款真正值得入手的宝贝&#xff0c;让你们省心、省力还省钱包&#xff01;不管是给自己添置点新装备&#xff0c;还是…