客户贷款逾期预测[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.在没有对数据进行归一化处理时训练模型会出现预测结果全为一类的情况,可能是因为不同的特征之间在数量上相差太大,没有被同等程度地看待。

猜你喜欢

转载自blog.csdn.net/truffle528/article/details/84168200
今日推荐