逻辑回归建模及变量重要性可视化(Python实现)
一、逻辑回归背景知识
逻辑回归(Logistic Regression)是最常用的分类算法之一,因其简单直观可解释而广受欢迎。它来源于统计学中的广义线性模型(GLM),也是机器学习领域的基本算法。
因本文重在分享对模型变量重要性的可视化,故在这里不对模型原理做过多说明。感兴趣的读者可以参考以下几篇文章。
-
对于模型的思想、推导等步骤,可以参考以下文章。
Logistic Regression(逻辑回归)详细讲解 -
对于模型系数的解读,可参考以下文章。
对一般Logistic模型系数的解释
正确打开/解读Logit模型系数的方式——离散选择模型之四 -
对广义线性模型的介绍,可参考这篇。
广义线性模型到底是个什么鬼?
简单地说,逻辑回归模型的变量系数,反映变量变动对比值比y/1-y(odd)的影响,即对样本X作为正例的相对可能性的影响。
这里我们先建立模型,输出系数,供后面可视化使用。
#=============== 逻辑回归 =================
#加载包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#数据读入
filename='loandata.xls'
data=pd.read_excel(filename)
data.head()
#数据准备
X_data = data.drop(['违约'],axis=1)
print(X_data.head())
y_data = np.ravel(data[['违约']])
#划分数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X_data,y_data,random_state=1)
X_train.shape
X_test.shape
#建立模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression ()
lr.fit(X_train,y_train)
lr.predict(X_test)
#输出模型系数
print('训练模型自变量参数为:',lr.coef_)
print('训练模型截距为:',lr.intercept_)
#模型评价
print('模型的平均正确率为:',lr.score(X_test,y_test))
#看下预测精度
from sklearn.metrics import accuracy_score
y_predict=lr.predict(X_test)
accuracy_score(y_test,y_predict)
二、变量重要性的可视化
利用sklearn,我们可以很容易地建立逻辑回归模型。建模完毕后,除了直接调用 lr.predict 函数进行预测,往往还需要对模型进行解释,看看哪些变量对目标值(这里是logit(y/1-y))的影响更大。但逻辑回归不同于随机森林等基于树的模型,模块中没有直接对变量重要性进行可视化的函数。因此,我们只能先输出变量系数coef_,然后利用Matplotlib等绘图包进行可视化。
可视化模型系数时,条形图通常是个不错的选择。但如果直接调用pandas的plot接口作图,会存在两个问题:第一,条形顺序依靠模型中的变量顺序,无法对变量重要性进行排序;第二,条形图中无法显示模型系数具体数值,只能简单依靠条形长短直观判断,不够精确。
因此,一个清晰的变量重要性条形图应该具有两个特点:
- 对变量重要性进行排序,条形图的条形顺序按照变量的系数大小从高到矮进行排列。
- 将变量系数直接显示在图中,方便直接比较数值大小。
这里分享我的代码,供大家参考。
1、系数排序,正负值分开
#============= 变量重要性可视化 =============
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文宋体
plt.rcParams['axes.unicode_minus']=False #显示负号
# 1、简单排序,正负分开按顺序
coef_LR = pd.Series(lr.coef_.flatten(),index = X_test.columns,name = 'Var')
plt.figure(figsize=(8,8))
coef_LR.sort_values().plot(kind='barh')
plt.title("Variances Importances")
出图效果如下:
2、竖直柱形图,正负值而分开,显示系数数值
# 2、柱形图
#变量重要性排序
coef_lr = pd.DataFrame({'var' : X_test.columns,
'coef' : lr.coef_.flatten()
})
index_sort = np.abs(coef_lr['coef']).sort_values(ascending = False).index
coef_lr_sort = coef_lr.loc[index_sort,:]
# 变量重要性柱形图
plt.figure(figsize=(14,8))
x, y = coef_lr_sort['var'], coef_lr_sort['coef']
rects = plt.bar(x, y, color='dodgerblue')
plt.grid(linestyle="-.", axis='y', alpha=0.4)
plt.tight_layout()
y1 = y[ y > 0];x1 = x[y1.index]
for a,b in zip(x1,y1):
plt.text(a ,b+0.02,'%.2f' %b, ha='center',va='bottom',fontsize=12)
y2 = y[ y < 0];x2 = x[y2.index]
for a,b in zip(x2,y2):
plt.text(a ,b-0.02,'%.2f' %b, ha='center',va='bottom',fontsize=12)
出图效果如下:
3、水平柱形图,正负值分开,显示系数数值
# 变量重要性排序
coef_lr = pd.DataFrame({'var' : X_test.columns,
'coef' : lr.coef_.flatten()
})
index_sort = np.abs(coef_lr['coef']).sort_values().index
coef_lr_sort = coef_lr.loc[index_sort,:]
# 水平柱形图绘图
fig,ax=plt.subplots()
x, y = coef_lr_sort['var'], coef_lr_sort['coef']
rects = plt.barh(x, y, color='dodgerblue')
plt.grid(linestyle="-.", axis='y', alpha=0.4)
plt.tight_layout()
#添加数据标签
for rect in rects:
w = rect.get_width()
ax.text(w, rect.get_y()+rect.get_height()/2,'%.2f' %w,ha='left',va='center')
出图效果如下:
个人比较喜欢最后一种。当变量较多时,采用水平条形图,变量名称看的更加清楚。
对于多元线性回归等其他可以输出变量系数的模型,都可以采用以上方式将模型系数进行可视化,从而更加直观地展现变量重要性。
本文地址:https://blog.csdn.net/weixin_45494886/article/details/107433359