1. 程式人生 > >客戶貸款逾期預測[2]-svm和決策樹模型

客戶貸款逾期預測[2]-svm和決策樹模型

任務

        本次以信用貸款資料作為練習資料,目的是學會使用常用的機器學習模型,用它們預測貸款客戶是否會逾期,給到的資料已經包含了標籤,列名是status,有0和1兩種值,0表示未逾期,1表示逾期,所以這是一個二分類的問題。

資料處理

        在拿到資料之後,首先我們需要探索資料的構成和分佈情況以及缺失情況。對於缺失值處理常用眾數或者中位數、平均數填補。為了處理方便,一開始可以先將資料的數值型特徵和非數值型特徵分開,根據對資料的理解挑選特徵,比如在本次任務中,用於識別客戶身份的特徵對於預測結果沒有影響,所以可以將使用者名稱、卡號等特徵去除。如果有非序關係的多分類變數可以將其轉換為啞變數,比如本次任務中的reg_preference_for_trad特徵。reg特徵有{‘一線城市’,‘二線城市’,‘三線城市’,‘境外’}等,可能有人會想用數字代替字元,但是這樣的話在特徵空間中會產生距離關係,而特徵本身是沒有序關係的,所以才將之轉換為啞變數。

實現

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 15 13:02:11 2018

@author: keepi
"""

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import f1_score
from sklearn.svm import LinearSVC
pd.set_option('display.max_row',1000)

#匯入資料
data = pd.read_csv('data.csv',encoding='gb18030')
print("data.shape:",data.shape)
#資料處理
miss_rate = data.isnull().sum() / len(data)
print("缺失率:",miss_rate.sort_values(ascending=False))
X_num = data.select_dtypes('number').copy()
X_num.fillna(X_num.mean(),inplace=True)
print("數值型特徵的shape:",X_num.shape)
print(X_num.columns)
X_num.drop(['Unnamed: 0','status'],axis=1,inplace=True)

X_str = data.select_dtypes(exclude='number').copy()
X_str.fillna(0,inplace=True)
print("非數值型特徵:",X_str.columns)
print(X_str.head())

X_dummy = pd.get_dummies(X_str['reg_preference_for_trad'])
X = pd.concat([X_num,X_dummy],axis=1,sort=False)
y = data['status']

#劃分訓練集、測試集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1117)

#歸一化
ss = StandardScaler()
X_train_std = ss.fit_transform(X_train)
X_test_std = ss.transform(X_test)

print("f1_score:")
#邏輯迴歸模型
lr = LogisticRegression()
lr.fit(X_train_std,y_train)
test_lr_pred = lr.predict(X_test_std)
print("邏輯迴歸模型:",f1_score(y_test,test_lr_pred,average='macro'))

#svm模型
lsvc = LinearSVC()
lsvc.fit(X_train_std,y_train)
test_lsvc_pred = lsvc.predict(X_test_std)
print("svm模型:",f1_score(y_test,test_lsvc_pred,average='macro'))

#決策樹模型
dt = DecisionTreeClassifier()
dt.fit(X_train_std,y_train)
test_dt_pred = dt.predict(X_test_std)
print("決策樹模型:",f1_score(y_test,test_dt_pred))

結果

遇到的問題

        1.在沒有對資料進行歸一化處理時訓練模型會出現預測結果全為一類的情況,可能是因為不同的特徵之間在數量上相差太大,沒有被同等程度地看待。