使用二分类逻辑回归识别贷款违约风险
为了说明逻辑回归的应用场景,这里引入一个案例,该案例有关银行贷款违约,我们使用二分类逻辑回归来评估信用风险,如果您是银行的贷款人员,那么您希望能够识别那些指示可能违约贷款的人的特征,并使用这些特征来识别不良的贷款。
这里我们使用的数据集假设有850位以往客户的贷款信息,前700个案例是以前给予贷款的客户,这些客户的违约情况是已经知道的,使用这700位客户的随机样本来创建逻辑回归模型,将剩余的150名客户用来进行验证分析。 然后使用该模型对150名潜在客户进行分类,判断是否存在信用风险,即判断这些用户是否会发生违约。
# 导入需要使用的库
import pandas as pd
from sklearn.cross_validation import train_test_split
# 导入并查看数据集
bankloan = pd.read_excel("./data/bankloan.xlsx")
bankloan.head()
ID | 年龄 | 教育 | 工龄 | 当前地址居住年限 | 收入 | 负债率 | 信用卡负债 | 其他负债 | 违约 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 41 | 大专 | 17 | 12 | 176 | 9.3 | 11.359392 | 5.008608 | 是 |
1 | 2 | 27 | 未完成高中 | 10 | 6 | 31 | 17.3 | 1.362202 | 4.000798 | 否 |
2 | 3 | 40 | 未完成高中 | 15 | 14 | 55 | 5.5 | 0.856075 | 2.168925 | 否 |
3 | 4 | 41 | 未完成高中 | 15 | 14 | 120 | 2.9 | 2.658720 | 0.821280 | 否 |
4 | 5 | 24 | 高中 | 2 | 0 | 28 | 17.3 | 1.787436 | 3.056564 | 是 |
bankloan.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 850 entries, 0 to 849
Data columns (total 13 columns):
ID 850 non-null int64
年龄 850 non-null int64
工龄 850 non-null int64
当前地址居住年限 850 non-null int64
收入 850 non-null int64
负债率 850 non-null float64
信用卡负债 850 non-null float64
其他负债 850 non-null float64
违约 850 non-null object
大学 850 non-null uint8
未完成高中 850 non-null uint8
研究生 850 non-null uint8
高中 850 non-null uint8
dtypes: float64(3), int64(5), object(1), uint8(4)
memory usage: 63.2+ KB
bankloan.教育.unique()
array(['大专', '未完成高中', '高中', '大学', '研究生'], dtype=object)
建立训练数据集与测试数据集
- 数据集中,有850条记录,其中700条已经打好违约标签,另外150条需要使用训练得到的模型进行预测
- 打好标签的700条记录将被随机分成训练集与测试集,训练集与测试集的比例一般为7:3(并不总是如此)
由于教育为多分类变量,需要先将其转换成二分类变量,并且纳入模型的数据集不应该包含原来的分类变量
# 将教育变量转换成二分类变量,并删除原有多分类变量
bankloan = pd.concat([bankloan,pd.get_dummies(bankloan.教育,drop_first=True)],axis=1).drop(['教育'],axis=1)
# 提取建模用数据
model_data = bankloan[:700]
# 提取需要进行预测的数据
predict_data = bankloan[700:]
#Define a generic function using Pandas replace function
def coding(col, codeDict):
colCoded = pd.Series(col, copy=True)
for key, value in codeDict.items():
colCoded.replace(key, value, inplace=True)
return colCoded
# 是=1, 否=0:
model_data["违约"] = coding(model_data['违约'], {'否':0,'是':1})
# 将自变量与因变量分开
X,y = model_data.drop(['违约','ID'],axis=1),model_data[['违约']]
# 随机抽取训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3,random_state = 10)
训练模型
# 导入逻辑回归需要使用的Python模块
from sklearn.linear_model import LogisticRegression
# 开始构建一个逻辑回归模型
model = LogisticRegression()
# 模型以X_train,y_train为输入数据进行训练
model.fit(X_train,y_train)
使用测试集查看模型预测准确性
# 导入相应的模块来查看预测的准确率
from sklearn.metrics import accuracy_score
# 打印针对测试集而言的准确率
print(accuracy_score(y_test,model.predict(X_test)))
0.819047619047619
使用训练得到模型对这些新申请贷款的人的违约风险进行预测
model.predict(predict_data.drop(['ID','违约'],axis=1))
array([0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64)