控EDA實(shí)戰(zhàn):貸款違約預(yù)測(cè)的數(shù)據(jù)分析與特征工程)
上一次聊完了賽題理解和整體建模思路今天正式進(jìn)入數(shù)據(jù)分析階段。天池這場(chǎng)金融風(fēng)控比賽數(shù)據(jù)拿到手第一步不是急著訓(xùn)練模型而是先把數(shù)據(jù)摸透。EDAExploratory Data Analysis在這個(gè)賽題里的地位相當(dāng)關(guān)鍵——它直接決定你后續(xù)特征工程的方向、缺失值處理的策略甚至影響模型選型。我把這次完整的數(shù)據(jù)分析過(guò)程整理出來(lái)包含具體代碼、圖表解讀和踩坑記錄給準(zhǔn)備做貸款違約預(yù)測(cè)或者類似信貸風(fēng)控項(xiàng)目的人一個(gè)參考。這次的分析對(duì)象是某頭部金融平臺(tái)的貸款記錄數(shù)據(jù)訓(xùn)練集約12萬(wàn)條樣本、47個(gè)特征標(biāo)簽是用戶是否違約。字段覆蓋了借款金額、利率、分期數(shù)、收入水平、負(fù)債率、征信歷史、居住地區(qū)等維度還包含十幾個(gè)匿名脫敏特征。整體來(lái)看這是一份非常典型的二分類風(fēng)控?cái)?shù)據(jù)集類別不平衡、缺失值不少、特征類型混雜正是考驗(yàn)數(shù)據(jù)分析基本功的場(chǎng)景。1. 數(shù)據(jù)總覽與環(huán)境準(zhǔn)備先把“體檢報(bào)告”打出來(lái)拿到數(shù)據(jù)別急著畫(huà)圖先把最基礎(chǔ)的結(jié)構(gòu)性信息看清楚。這一步我習(xí)慣用幾個(gè)熟悉的 pandas 方法快速完成基本三分鐘就能對(duì)數(shù)據(jù)形成初步認(rèn)知。import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False train pd.read_csv(train.csv) test pd.read_csv(test.csv) print(訓(xùn)練集形狀:, train.shape) print(測(cè)試集形狀:, test.shape) print(訓(xùn)練集列名:, train.columns.tolist())輸出結(jié)果里訓(xùn)練集是 120000 行 47 列測(cè)試集是 120000 行 46 列比訓(xùn)練集少一列標(biāo)簽 isDefault。列名里既有 loanAmnt、interestRate 這種語(yǔ)義明確的字段也有 n0 到 n14 這種完全匿名的特征這類匿名特征在比賽數(shù)據(jù)里很常見(jiàn)大概率是脫敏后的第三方征信或行為數(shù)據(jù)處理時(shí)要格外小心。接著用 info() 看數(shù)據(jù)類型和內(nèi)存占用用 describe() 看數(shù)值列的統(tǒng)計(jì)量??吹降慕Y(jié)果里有幾個(gè)值得注意的點(diǎn)employmentTitle 和 employmentLength 缺失比較明顯title 字段缺失率接近 5%n 系列匿名特征整體完整但存在少量空值。數(shù)據(jù)類型上大部分是 int64 和 float64只有 term 這種分期數(shù)看起來(lái)是離散整數(shù)issueDate 是字符串類型后面要轉(zhuǎn)成日期格式。這里有一個(gè)我在實(shí)際項(xiàng)目中養(yǎng)成的習(xí)慣讀入數(shù)據(jù)后立刻檢查內(nèi)存。120 萬(wàn)行數(shù)據(jù)其實(shí)不大但如果后面要做特征工程、內(nèi)存頻繁擴(kuò)展初始就把數(shù)據(jù)類型壓縮好能讓整個(gè)分析流程快很多。def reduce_mem_usage(df): for col in df.columns: col_type df[col].dtype if 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) 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) return df train reduce_mem_usage(train)壓縮之后內(nèi)存從原來(lái)的 80MB 左右降到了 30MB 上下后面對(duì)數(shù)據(jù)進(jìn)行 groupby、merge 都會(huì)舒服很多。這種操作在核心內(nèi)存只有 8G 的筆記本上尤其重要比賽后期特征數(shù)量變大時(shí)養(yǎng)成這個(gè)習(xí)慣能幫你避開(kāi)不少內(nèi)存溢出的尷尬。1.1 快速識(shí)別缺失字段和異常字段缺失值分析是數(shù)據(jù)質(zhì)量探查的重頭戲。我一般會(huì)先算一列缺失比例再?zèng)Q定每個(gè)字段的后續(xù)處理方式。missing train.isnull().sum().sort_values(ascendingFalse) missing_pct (missing / len(train)).sort_values(ascendingFalse) missing_info pd.DataFrame({缺失數(shù)量: missing, 缺失比例: missing_pct}) print(missing_info[missing_info[缺失數(shù)量] 0])跑完的結(jié)果顯示缺失字段主要集中在 employmentTitle職位名稱缺失約 2.1%、employmentLength工作年限約 2.4%、postCode郵編約 0.4%、title借款標(biāo)題約 4.8%還有 ficoRangeLow / ficoRangeHighFICO 評(píng)分區(qū)間上下界各約 5.2%。整體缺失率不算高但處理方式各不相同這個(gè)放到后面特征工程部分細(xì)說(shuō)。異常值方面我重點(diǎn)檢查了 annualIncome年收入和 revolBal循環(huán)貸款余額這兩個(gè)連續(xù)變量。annualIncome 的最小值只有 4000最大值超過(guò) 600 萬(wàn)明顯右偏且?guī)в虚L(zhǎng)尾。revolUtil循環(huán)額度使用率出現(xiàn)了超過(guò) 100% 的值這在信貸場(chǎng)景里意味著用戶可能存在超額透支或數(shù)據(jù)報(bào)送口徑問(wèn)題。這種異常值不能直接刪先標(biāo)記出來(lái)后續(xù)可以考慮做截?cái)嗷騿为?dú)構(gòu)造“是否異常”的布爾特征。2. 單變量分布分析每個(gè)字段都在講什么故事清洗檢查做完下面進(jìn)入真正的探索性分析。單變量分布看的是每個(gè)字段自身的形態(tài)這一步能幫你形成對(duì)數(shù)據(jù)的直覺(jué)。2.1 目標(biāo)變量與核心數(shù)值特征的分布畫(huà)像先看標(biāo)簽 isDefault 的分布。訓(xùn)練集里違約樣本為 23914 條占比 19.93%非違約樣本占比 80.07%是一個(gè)接近 1:4 的不平衡二分類問(wèn)題。對(duì)于金融風(fēng)控場(chǎng)景這個(gè)違約率其實(shí)相當(dāng)真實(shí)信用卡或消費(fèi)貸產(chǎn)品的壞賬率通常在 2% 到 10% 之間部分下沉客群的壞賬率會(huì)更高。比賽數(shù)據(jù)直接給到 20% 的違約率說(shuō)明業(yè)務(wù)方有意篩掉了一部分明顯好客戶讓模型需要真正學(xué)習(xí)風(fēng)險(xiǎn)特征。train[isDefault].value_counts(normalizeTrue).plot(kindbar) plt.title(目標(biāo)變量分布) plt.xticks([0, 1], [非違約, 違約], rotation0) plt.show()畫(huà)出來(lái)的柱狀圖配合數(shù)值輸出能明顯感受到類別不平衡的壓迫感。這說(shuō)明后續(xù)建模時(shí)要用 AUC 而不是準(zhǔn)確率作為主要評(píng)估指標(biāo)同時(shí)要考慮樣本不均衡的處理方法比如在 LightGBM 里設(shè)置 scale_pos_weight或者用負(fù)樣本下采樣的方式做訓(xùn)練集構(gòu)建。數(shù)值特征分布我看的是幾個(gè)對(duì)違約預(yù)測(cè)最關(guān)鍵的特征loanAmnt借款金額、interestRate利率、annualIncome年收入、dti負(fù)債收入比、ficoRangeLowFICO 下界。loanAmnt 分布整體在 3000 到 35000 之間波動(dòng)常見(jiàn)區(qū)間集中在 10000 到 20000峰值位置在 10000 和 20000 附近這符合消費(fèi)金融產(chǎn)品的額度設(shè)計(jì)邏輯產(chǎn)品方預(yù)置了幾個(gè)固定額度檔位。interestRate 呈階梯狀分布在 6% 到 24% 區(qū)間內(nèi)出現(xiàn)多個(gè)尖峰。這是信貸產(chǎn)品的定價(jià)特征——不同風(fēng)險(xiǎn)等級(jí)對(duì)應(yīng)不同利率檔位本質(zhì)上利率已經(jīng)是風(fēng)險(xiǎn)等級(jí)的一個(gè)代理變量。annualIncome 右偏明顯大部分客戶年收入在 20 萬(wàn)以下尾部延伸到數(shù)百萬(wàn)。建模時(shí)如果不做處理極端值會(huì)對(duì)樹(shù)模型的分裂點(diǎn)產(chǎn)生干擾。dti 集中在 0 到 30 之間代表月負(fù)債占月收入的比例超過(guò) 40 的客戶明顯遞減超過(guò) 60 的幾乎沒(méi)有。信貸業(yè)務(wù)通常把 dti 大于 50 視為高風(fēng)險(xiǎn)這個(gè)邏輯在數(shù)據(jù)中也有體現(xiàn)。畫(huà)圖的時(shí)候建議用直方圖加核密度曲線的組合方式直方圖看柱狀形態(tài)核密度看平滑的分布趨勢(shì)兩個(gè)一起看對(duì)分布形態(tài)的判斷更準(zhǔn)確。2.2 類別特征的取值結(jié)構(gòu)與編碼思路數(shù)據(jù)里的類別型字段不少term分期數(shù)、grade評(píng)級(jí)、subGrade子評(píng)級(jí)、employmentLength工作年限區(qū)間、homeOwnership房產(chǎn)所有權(quán)、verificationStatus收入驗(yàn)證狀態(tài)、purpose借款用途、initialListStatus初始列表狀態(tài)、applicationType個(gè)人或聯(lián)合申請(qǐng)等。我逐個(gè)看了它們的取值數(shù)量。grade 從 A 到 G 共 7 個(gè)等級(jí)subGrade 從 A1 到 G5 共 35 個(gè)等級(jí)這兩個(gè)字段和利率高度相關(guān)屬于風(fēng)控模型里必須重視的強(qiáng)特征。homeOwnership 取值為 0 到 50 代表租房1 代表按揭2 代表自有其他值代表其他情況。purpose 有 13 個(gè)類別以債務(wù)合并debt_consolidation為主占比超過(guò)一半。這里有一個(gè)重要的編碼建議對(duì) subGrade 這種有序類別特征不要直接用 LabelEncoder 編碼成 1 到 35 的整數(shù)因?yàn)闃?shù)模型雖然能處理這種數(shù)值型編碼但會(huì)把類別間的順序關(guān)系當(dāng)作線性關(guān)系處理容易產(chǎn)生誤導(dǎo)性分裂。更好的方式是保留原始字符串讓 LightGBM 的類別特征處理機(jī)制自動(dòng)處理或者將其映射為等級(jí)對(duì)應(yīng)的風(fēng)險(xiǎn)評(píng)分。train[term].value_counts() train[grade].value_counts().sort_index() train[homeOwnership].value_counts()term 字段有 36 個(gè)月和 60 個(gè)月兩檔60 個(gè)月分期占比不到三成但違約率明顯更高。這一點(diǎn)后面做交叉分析時(shí)再看。employmentLength 雖然是字符串類型但本質(zhì)上是有序的從“ 1 年”到“10 年”共 11 檔可以直接映射為 0 到 10 的整數(shù)。3. 多變量與業(yè)務(wù)洞察誰(shuí)在驅(qū)動(dòng)違約風(fēng)險(xiǎn)單變量分析解決的是“每個(gè)字段長(zhǎng)什么樣”的問(wèn)題多變量分析解決的是“哪些字段和目標(biāo)變量相關(guān)、如何相關(guān)”的問(wèn)題。這是 EDA 的核心產(chǎn)出也是后續(xù)特征工程的主要依據(jù)。3.1 目標(biāo)變量與關(guān)鍵特征的交叉分析對(duì)所有重要特征我做了“特征分箱后計(jì)算各箱違約率”的操作用違約率的走勢(shì)來(lái)判斷特征的方向性和單調(diào)性。以 interestRate 為例把利率從低到高等頻分成 10 箱計(jì)算每箱的違約率結(jié)果呈現(xiàn)出極強(qiáng)的正相關(guān)利率最低的 10% 人群違約率約 8%利率最高的 10% 人群違約率接近 42%。這個(gè)規(guī)律非常清晰說(shuō)明利率本身就是風(fēng)險(xiǎn)定價(jià)的產(chǎn)物高利率對(duì)應(yīng)高風(fēng)險(xiǎn)模型必須充分利用這個(gè)信號(hào)。用同樣的方式看 annualIncome收入從低到高等頻分箱后違約率呈現(xiàn)明顯的負(fù)相關(guān)最低收入組違約率 32%最高收入組違約率只有 12%。收入低的人更需要借貸也更可能還不上錢這個(gè)邏輯在數(shù)據(jù)里完全站得住。還看了幾個(gè)征信相關(guān)的字段delinquency_2years兩年內(nèi)逾期次數(shù)大多數(shù)人為 0但逾期次數(shù)為 1 時(shí)違約率從 18% 跳到 29%逾期 2 次時(shí)跳到 36%邊際遞增效應(yīng)明顯。revolUtil循環(huán)額度使用率使用率低于 30% 的人群違約率約 15%高于 90% 的人群違約率突破 35%信用卡額度幾乎刷爆的人現(xiàn)金流壓力極大。這些交叉分析的代碼不復(fù)雜本質(zhì)就是 pandas 的 groupby 加 meantrain[int_rate_bin] pd.qcut(train[interestRate], 10, labelsFalse) bin_default_rate train.groupby(int_rate_bin)[isDefault].mean() print(bin_default_rate)3.2 相關(guān)性矩陣與共線性檢查數(shù)值特征的皮爾遜相關(guān)性矩陣也值得跑一遍但要注意皮爾遜相關(guān)系數(shù)只能捕捉線性關(guān)系對(duì)樹(shù)模型來(lái)說(shuō)非線性關(guān)聯(lián)也很重要所以相關(guān)性矩陣只是輔助工具不能代替分組違約率的觀察。num_cols train.select_dtypes(include[np.number]).columns corr train[num_cols].corr() mask np.triu(np.ones(corr.shape), k1) sns.heatmap(corr, maskmask, cmapRdBu_r, annotFalse, vmin-1, vmax1) plt.show()從熱力圖里能看出幾個(gè)明顯聚集interestRate 與 grade、subGrade 高度相關(guān)相關(guān)系數(shù)接近 0.9這本身就是業(yè)務(wù)邏輯的體現(xiàn)——評(píng)級(jí)越差利率越高。installment月還款額與 loanAmnt 強(qiáng)相關(guān)相關(guān)系數(shù)超過(guò) 0.9因?yàn)樵逻€款額就是根據(jù)借款金額、利率和期限計(jì)算出來(lái)的這是機(jī)械關(guān)系而非業(yè)務(wù)洞見(jiàn)做特征篩選時(shí)要注意區(qū)分。annualIncome 與 revolBal 呈弱負(fù)相關(guān)收入高的人循環(huán)貸款余額相對(duì)更低。共線性方面grade 和 subGrade 基本是冗余的subGrade 信息量更細(xì)保留 subGrade 就可以。ficoRangeLow 和 ficoRangeHigh 高度相關(guān)保留其中一個(gè)或者取均值即可。這些判斷直接服務(wù)于后續(xù)的特征篩選能幫你減少無(wú)意義的特征。3.3 時(shí)序維度下的數(shù)據(jù)分布觀察issueDate 是放款日期雖然比賽沒(méi)有明確說(shuō)明訓(xùn)練集和測(cè)試集按時(shí)間切分但觀察時(shí)間分布能幫你規(guī)避時(shí)序泄漏問(wèn)題。train[issueDate] pd.to_datetime(train[issueDate]) train[issue_month] train[issueDate].dt.to_period(M) monthly_default train.groupby(issue_month)[isDefault].agg([mean, count])統(tǒng)計(jì)結(jié)果顯示訓(xùn)練集的放款時(shí)間覆蓋了一年半左右每個(gè)月的樣本量在 4000 到 9000 之間波動(dòng)違約率在時(shí)間維度上有小幅起伏但沒(méi)有明顯的單調(diào)趨勢(shì)。這個(gè)結(jié)論很重要——說(shuō)明雖然存在時(shí)間效應(yīng)但短期內(nèi)沒(méi)有劇烈變化直接用分類模型處理不需要過(guò)度擔(dān)心趨勢(shì)漂移。不過(guò)謹(jǐn)慎起見(jiàn)我在后續(xù)交叉驗(yàn)證設(shè)計(jì)時(shí)仍然采用了按時(shí)間順序劃分的時(shí)序 K 折方案而不是隨機(jī) K 折。原因很簡(jiǎn)單如果某個(gè)月的數(shù)據(jù)分布發(fā)生了變化隨機(jī) K 折會(huì)讓模型在訓(xùn)練時(shí)提前“看到”未來(lái)信息評(píng)估結(jié)果會(huì)偏樂(lè)觀。用時(shí)序切分能更真實(shí)地反映上線后模型的表現(xiàn)。4. 分析結(jié)論向特征工程的落地轉(zhuǎn)化EDA 做到這里腦子里已經(jīng)有了一張清晰的風(fēng)險(xiǎn)畫(huà)像。下面把分析結(jié)論整理成具體的特征工程動(dòng)作這才是 EDA 的真正價(jià)值所在。4.1 缺失字段的處理策略針對(duì)每個(gè)有缺失的字段處理方式完全不一樣employmentLength 和 employmentTitle 缺失率只有 2% 左右量不大。employmentLength 缺失可以填充為“未知”或者單獨(dú)建一個(gè)“是否缺失”的標(biāo)記employmentTitle 是高基數(shù)類別特征直接填充眾數(shù)意義不大建議以缺失直接填充為“未知”字符串。postCode 缺失率低但郵編本身是高基數(shù)類別建模時(shí)一般做頻次編碼或直接刪除。我選擇保留頻次編碼因?yàn)榈貐^(qū)信貸風(fēng)險(xiǎn)差異是真實(shí)存在的。title 缺失率 4.8%這個(gè)字段是借款人在申請(qǐng)時(shí)自己填的標(biāo)題和 purpose 含義接近但更嘈雜。缺失的可以直接填充為 purpose 字段的值或者干脆把 title 和 purpose 合并。ficoRangeLow 和 ficoRangeHigh 缺失率約 5%FICO 評(píng)分是強(qiáng)特征不能輕易丟掉。我用 dti、delinquency_2years、interestRate、subGrade 這幾個(gè)相關(guān)字段做了一個(gè)簡(jiǎn)單的回歸模型來(lái)預(yù)測(cè)缺失值雖然沒(méi)有達(dá)到高精度但比直接填充均值的下游模型效果要好一些。匿名特征 n 系列的缺失數(shù)量很少統(tǒng)一填充 0 或者中位數(shù)即可。4.2 基于分布洞察構(gòu)造的新特征從 EDA 中能直接提煉出不少新特征想法收入與借款的匹配度annualIncome / loanAmnt比值衡量借款相對(duì)于收入的重負(fù)程度。這個(gè)特征從交叉分析看區(qū)分度很明顯收入低但借款高的人違約率顯著偏高。利率與評(píng)級(jí)的一致性偏差subGrade 已經(jīng)內(nèi)含利率水平但可以將實(shí)際利率減去該子評(píng)級(jí)下的平均利率得到一個(gè)“定價(jià)偏差”特征捕捉被高估或低估風(fēng)險(xiǎn)的用戶。FICO 評(píng)分區(qū)間的中值取 ficoRangeLow 和 ficoRangeHigh 的均值作為用戶的統(tǒng)一信用評(píng)分。歷史逾期記錄的綜合指標(biāo)delinquency_2years、pubRec、pubRecBankruptcies 這三個(gè)字段可以加總形成“歷史負(fù)面記錄總數(shù)”。申請(qǐng)類型與負(fù)債水平的交互applicationType 如果是聯(lián)合申請(qǐng)要考慮兩個(gè)人的收入負(fù)債合并計(jì)算可以構(gòu)造 appType 與 annualIncome 的交叉特征。循環(huán)使用率極端標(biāo)記revolUtil 超過(guò) 100% 時(shí)設(shè)為 1否則為 0捕捉超額透支的警告信號(hào)。4.3 基于 EDA 結(jié)果的建模選型建議從數(shù)據(jù)分布可以判斷大部分特征和目標(biāo)變量之間是非線性關(guān)系而且存在大量類別特征和缺失值這種情況 LightGBM 或 XGBoost 這種基于直方圖的樹(shù)模型是首選。我計(jì)劃先跑一個(gè) LightGBM 基線把默認(rèn)參數(shù)跑通然后再用 EDA 階段發(fā)現(xiàn)的強(qiáng)特征組合做第二輪迭代。另外由于類別不平衡比例接近 1:4評(píng)估指標(biāo)我堅(jiān)持用 AUC 和 KS 統(tǒng)計(jì)量不參考準(zhǔn)確率。在參數(shù)設(shè)置上LightGBM 的 is_unbalance 參數(shù)和 scale_pos_weight 都需要試驗(yàn)但不要一開(kāi)始就大力度調(diào)樣本權(quán)重先讓模型在原始分布下跑出基線再逐步加權(quán)重觀察驗(yàn)證集 AUC 的變化。5. 踩坑記錄與排查心得數(shù)據(jù)分析階段看著簡(jiǎn)單實(shí)際跑下來(lái)還是有不少坑整理成表格給后面做類似項(xiàng)目的人參考。問(wèn)題現(xiàn)象根因分析解決方案讀入數(shù)據(jù)后內(nèi)存占用過(guò)大運(yùn)行耗時(shí)默認(rèn) int64/float64 類型浪費(fèi)內(nèi)存用 reduce_mem_usage 函數(shù)壓縮為 int32/int16/float32describe 里 annualIncome 最大值異常達(dá)到數(shù)百萬(wàn)長(zhǎng)尾分布存在高凈值客戶或異常錄入先保留后續(xù)特征工程做分位數(shù)截?cái)嗷蛉?duì)數(shù)revolUtil 出現(xiàn)超過(guò) 100% 的數(shù)值報(bào)送口徑或超額透支導(dǎo)致不刪反手構(gòu)造“是否超額使用”布爾特征installment 與 loanAmnt 相關(guān)系數(shù)很高兩個(gè)字段存在機(jī)械計(jì)算關(guān)系不做強(qiáng)相關(guān)去重但在特征重要性解釋時(shí)注意干擾subGrade 直接 LabelEncoder 后樹(shù)模型特征重要性失真類別有序性被當(dāng)作線性關(guān)系處理保留原始字符串讓 LightGBM 自動(dòng)處理或映射為評(píng)分隨機(jī) K 折驗(yàn)證結(jié)果波動(dòng)大數(shù)據(jù)存在時(shí)間效應(yīng)隨機(jī)劃分泄漏未來(lái)信息改用按時(shí)間順序的時(shí)序驗(yàn)證切分title 缺失率 4.8%直接刪掉感覺(jué)可惜高基數(shù)類別缺失填充方式不好選結(jié)合 purpose 字段填充或合并到 purpose 中還有一個(gè)值得單獨(dú)說(shuō)的心得相關(guān)性分析不要只看正負(fù)號(hào)還要看業(yè)務(wù)邏輯。比如 employmentTitle 和 annualIncome 天然相關(guān)但這不說(shuō)明工作職位決定了收入而是職位類型本身和行業(yè)相關(guān)。發(fā)現(xiàn)強(qiáng)關(guān)聯(lián)特征時(shí)先回頭想想這個(gè)關(guān)聯(lián)在業(yè)務(wù)上是否成立不成立大概率是代理特征或數(shù)據(jù)噪聲需要謹(jǐn)慎處理。匿名特征 n0 到 n14 的分布基本都集中在幾個(gè)離散值上這類特征在樹(shù)模型里很容易被用來(lái)做細(xì)微切分但也容易造成過(guò)擬合。我的做法是先用 LightGBM 跑一遍全特征基線通過(guò)特征重要性判斷匿名特征是否有貢獻(xiàn)再?zèng)Q定是否全量保留。有些匿名特征明顯是和用戶行為相關(guān)的計(jì)數(shù)器這類特征在信貸場(chǎng)景里往往有強(qiáng)預(yù)測(cè)力不能因?yàn)椤翱床欢本椭苯觼G掉。6. 復(fù)盤(pán)與后續(xù)迭代思路這次數(shù)據(jù)分析給我最大的感受是EDA 不是一次性工作它是貫穿全程的。第一次分析做到這里我只能形成初步假設(shè)等到模型跑出結(jié)果哪些特征效果不好、哪些誤差集中在一個(gè)特定客群還需要回到數(shù)據(jù)分布里重新檢查。所以在項(xiàng)目初期我會(huì)有意識(shí)地把分析代碼組織成模塊化的函數(shù)讓后面可以隨時(shí)復(fù)用、隨時(shí)重跑。后續(xù)的建模迭代里我計(jì)劃優(yōu)先驗(yàn)證三個(gè)從 EDA 中提煉的假設(shè)第一利率分箱后的違約率單調(diào)性是否能在 LightGBM 分裂中被充分利用如果不能考慮構(gòu)造利率排名特征第二收入和借款金額的交互特征能否顯著提升區(qū)分度第三歷史負(fù)面記錄總數(shù)能否替代三個(gè)單一征信特征。每一個(gè)假設(shè)都在 EDA 里有跡可循而不是憑空猜測(cè)這樣迭代起來(lái)才有方向。做金融風(fēng)控?cái)?shù)據(jù)分析有一個(gè)很深的體會(huì)數(shù)據(jù)探索的深度決定特征工程的上限。模型只是把你在數(shù)據(jù)里發(fā)現(xiàn)的規(guī)律編碼成數(shù)學(xué)表達(dá)式如果你自己都沒(méi)看清數(shù)據(jù)的全貌模型也學(xué)不到更多。這一篇的分析內(nèi)容就到這里下一步我會(huì)基于這些結(jié)論跑第一版 LightGBM 基線模型到時(shí)候再對(duì)比特征工程前后效果看看 EDA 階段花的功夫到底值多少錢。