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.pswp.cn/web/15178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15178.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能的發展現狀,AI將如何改變IT行業,哪些職業將最先失業

文章目錄 一、人工智能的發展現狀1、技術進展與突破2、商業應用與市場3、挑戰與問題4、未來趨勢 二、AI將如何改變IT行業1、工作方式的轉變&#xff1a;2、未來發展的推動&#xff1a;3、用戶服務和體驗的提升&#xff1a;4、創新和轉型的推動&#xff1a;5、融入日常生活和工作…

淺談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…

vscode終端運行pnpm,yarn不成功問題

vscode終端運行pnpm&#xff0c;yarn不成功問題 1.問題描述2.解決辦法 1.問題描述 全局安裝了pnpm后&#xff0c;cmd窗口執行pnpm -v可以查看版本信息&#xff0c;在項目目錄可以執行操作&#xff0c;但是在vscode中無法執行并報錯 2.解決辦法 以管理員身份運行vscode打開vscod…

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello World C語言程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

深入理解ECMAScript:JavaScript的規范與實踐

引言 在當今的Web開發領域&#xff0c;JavaScript幾乎無處不在。它不僅在客戶端編程中占據主導地位&#xff0c;而且在服務器端&#xff08;Node.js&#xff09;和移動應用開發中也越來越受歡迎。然而&#xff0c;JavaScript的核心并非由單一的公司或組織控制&#xff0c;而是…

初識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 命令小結 …

鏈棧的存儲

單向鏈表在棧中的存儲 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //鏈棧初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判斷鏈棧是否為空 Status StackEmpty(LinkStack S) {if (S NU…

將具有傳統IP的設計遷移到Vivado設計套件

將具有傳統IP的設計遷移到Vivado設計套件 概述 AMD Vivado?設計套件允許您從CORE Generator?工具遷移IP設計。你可以 還可以將IP遷移到Vivado Design Suite的最新版本。 重要&#xff01;Vivado集成開發環境&#xff08;IDE&#xff09;要求IP、實例化和 端口名都是小寫的。將…

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;歡迎指正 感謝 目錄 一、…

mysql 拼接兩個字段的值 使用CONCAT的函數

CONCAT()函數拼接兩個不用字段的值&#xff0c;最后在一個字段里面顯示出來&#xff0c;具體實例如下&#xff1a; 下面這個案例就行把SSSHENGBH、SSSBH、SSXBH、SSXZBH字段值拼接到一個字段里面進行顯示 select CONCAT(SSSHENGBH,SSSBH,SSXBH,SSXZBH) FROM BLT_JBXXJLB