1. 程式人生 > >使用Xgboost和lightgbm實現對貸款使用者逾期預測

使用Xgboost和lightgbm實現對貸款使用者逾期預測

一、背景及目標

根據提供的金融資料,分別使用xgboost和lightgbm兩種演算法預測貸款使用者是否會逾期。

二、任務分析

  1. 匯入資料後,首先,由於資料中存在缺失值,因此需要對缺失值資料進行預處理。
  2. 其次,對明顯與模型無關的特徵進行刪除。
  3. 最後,分別採用xgboost和lightgbm進行模型訓練,預測結果以及輸出評分。

三、資料預處理

一共4754行,89列(除去首行、首列)

  1. 直接刪除,對模型影響不大的資料及特徵,比如固定的個人資訊
    列:custid、trade_no、bank_card_no、id_name
    行:刪除很多項特徵缺失的使用者資訊
    缺失特徵資料的使用者資料:apply_score等到最後一個特徵全為缺失項的使用者資料
  2. 特徵轉換:特徵student_feature列的NA轉為0,2轉為0(2只有2個)
  3. 幾個需考慮的因素
    城市:境外0,一線1,二線2,三線3,四線4,NA及其他(共4組資料,刪除)
    現階段不進行處理而直接刪除的列:比如 first_transaction_time,latest_query_time,loans_latest_time

四、程式碼實現

程式碼實現與zuolinye一起完成。首先是資料處理,包括刪除不要資訊、缺失值填充、對映替換以及資料歸一化。

"""1. 導包"""
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score,r2_score

"""2. 讀取資料"""
dataset = pd.read_csv('F:\AI\mission_data\mission_data\data.csv',encoding='gbk')

"""3. 資料處理"""
# 刪除固定資訊列
dataset = dataset.drop(["custid","trade_no","bank_card_no","id_name","first_transaction_time","latest_query_time","loans_latest_time","source"],axis=1)
# 對於sstudent_feature列,我們進行NAN轉成0,2轉為0
# 缺失值填充
dataset["student_feature"] = dataset["student_feature"].fillna(0)
# 2替換為0
dataset["student_feature"] = dataset["student_feature"].replace([2],[0])

# 針對城市列'reg_preference_for_trad',進行資料替換
dataset["reg_preference_for_trad"] = dataset["reg_preference_for_trad"].replace("一線城市", "1")
dataset["reg_preference_for_trad"] = dataset["reg_preference_for_trad"].replace("二線城市", "2")
dataset["reg_preference_for_trad"] = dataset["reg_preference_for_trad"].replace("三線城市", "3")
dataset["reg_preference_for_trad"] = dataset["reg_preference_for_trad"].replace("其他城市", "4")
dataset["reg_preference_for_trad"] = dataset["reg_preference_for_trad"].replace("境外", "0")

# 填充其他空值
# 使用均值進行填充
# dataset.fillna(dataset.mean(), inplace=True)
# 使用眾數進行填充
dataset = dataset.fillna(0) # 使用 0 替換所有 NaN 的值
col = dataset.columns.tolist()[1:]

def missing(df, columns):
    """
    使用眾數填充缺失值
    df[i].mode()[0] 獲取眾數第一個值
    """
    col = columns
    for i in col:
        df[i].fillna(df[i].mode()[0], inplace=True)
        df[i] = df[i].astype('float')


missing(dataset, col)

# 將object型別轉成folat
dataset = dataset.convert_objects(convert_numeric=True)

"""4. 資料劃分"""
X = dataset.drop(["status"],axis=1)
Y = dataset["status"]

# 資料按正常的2、8劃分
X_train, X_test, y_train, y_test = train_test_split(X, Y,test_size=0.2, random_state=666)
# not enough values to unpack (expected 4, got 2)

from sklearn.preprocessing import minmax_scale # minmax_scale歸一化,縮放到0-1
X_train = minmax_scale(X_train)
X_test =  minmax_scale(X_test)
# Input contains NaN, infinity or a value too large for dtype('float64').

"""5. 資料歸一化"""
from sklearn.preprocessing import minmax_scale
# 歸一化,縮放到0-1
X_train = minmax_scale(X_train)
X_test =  minmax_scale(X_test)

使用xgboost進行預測,我這裡使用的是XGBClassifier ,是xgboost的sklearn包。

"""6. 模型訓練"""
from xgboost.sklearn import XGBClassifier

xgbClassifier = XGBClassifier()
xgbClassifier.fit(X_train, y_train)
xgbClassifier_predict = xgbClassifier.predict(X_test)


"""7. 輸出結果"""
print("predict:",xgbClassifier.score(X_test, y_test))
print("f1_score:",f1_score(y_test, xgbClassifier_predict))
print("r2_score:",r2_score(y_test, xgbClassifier_predict))

得到結果如下:
在這裡插入圖片描述

使用lightgbm進行預測

"""6. 模型訓練"""

from lightgbm.sklearn import LGBMClassifier

lgbmClassifier = LGBMClassifier()
lgbmClassifier.fit(X_train, y_train)
lgbm_predict = lgbmClassifier.predict(X_test)


"""7. 輸出結果"""
print("predict:",lgbmClassifier.score(X_test, y_test))
print("f1_score:",f1_score(y_test, lgbm_predict))

得到結果如下
在這裡插入圖片描述

五、存在的問題

  1. 使用xgboost和lightgbm演算法時,是很簡單的直接呼叫其sklearn進行預測,未進行交叉驗證和引數調優,需要在後續的學習中跟進。
  2. 還可以直接呼叫xgboost庫和lightgbm庫進行預測,只是在輸入資料時需要注意是不同的資料型別。
  3. 兩種演算法的一些細節還需要加深理解,比如優缺點對比和調參時候的區別。