邏輯迴歸實現客戶逾期分析
阿新 • • 發佈:2018-12-21
一、【 目標】
構建邏輯迴歸模型進行預測使用者是否逾期
二、【 任務】
寫部落格或者寫筆記或者word呈現
- 任務
- 遇到的問題
- 參考資料
- 程式碼
- 完成時間:11.14-11.15
三、【 原始資料】
資料:金融資料
任務:我們要做的是預測貸款使用者是否會逾期,
標籤說明:表格中,status是標籤:0表示未逾期,1表示逾期。
四、【 資料預處理】
一共4754行,89列(除去首行、首列)
- 直接刪除,對模型影響不大的資料及特徵,比如固定的個人資訊
列:custid、trade_no、bank_card_no、id_name
行:刪除很多項特徵缺失的使用者資訊
缺失特徵資料的使用者資料:apply_score等到最後一個特徵全為缺失項的使用者資料 - 特徵轉換:特徵student_feature列的NA轉為0,2轉為0(2只有2個)
- 幾個需考慮的因素
城市:境外0,一線1,二線2,三線3,四線4,NA及其他(共4組資料,刪除) - 現階段不進行處理而直接刪除的列:比如 first_transaction_time,latest_query_time,loans_latest_time
五、【參考連結】
連結:
分析:
- 首先,由於資料中存在缺失值,因此需要對缺失值資料進行預處理。
- 其次,對明顯與模型無關的特徵進行刪除
- 最後,採用邏輯迴歸模型進行模型訓練。
六、【程式碼實現】
1、調包、匯入資料以及資料替換
# coding=utf-8 """1. 導包""" import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import f1_score,r2_score """2. 讀取資料""" dataset = pd.read_csv('./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")
2、填充缺失值
# 填充其他空值 # 使用均值進行填充 # 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)
3、資料劃分
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').
4、資料歸一化
from sklearn.preprocessing import minmax_scale
# 歸一化,縮放到0-1
X_train = minmax_scale(X_train)
X_test = minmax_scale(X_test)
5、模型訓練
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
y_predict = log_reg.predict(X_test)
6、輸出結果
print("predict:",log_reg.score(X_test, y_test))
print("f1_score:",f1_score(y_test, y_predict))
print("r2_score:",r2_score(y_test, y_predict))
最後我們得到的結果如下:
七、【遇到的問題】
1、對特徵工程的分析不夠深入,在特徵選擇上還可以更詳細更優化
2、在用均值填充NAN時,進行歸一化出現了 Input contains NaN, infinity or a value too large for dtype(‘float64’),在使用眾數填充後避免了這個問題。
3、劃分訓練集和測試集時可以選擇不同的比例和次數重複進行幾次,這樣得到的結果更具有統計意義。