逻辑回归建模及变量重要性可视化(Python实现)

一、逻辑回归背景知识

逻辑回归(Logistic Regression)是最常用的分类算法之一,因其简单直观可解释而广受欢迎。它来源于统计学中的广义线性模型(GLM),也是机器学习领域的基本算法。
因本文重在分享对模型变量重要性的可视化,故在这里不对模型原理做过多说明。感兴趣的读者可以参考以下几篇文章。

简单地说,逻辑回归模型的变量系数,反映变量变动对比值比 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. 对变量重要性进行排序,条形图的条形顺序按照变量的系数大小从高到矮进行排列。
  2. 将变量系数直接显示在图中,方便直接比较数值大小。

这里分享我的代码,供大家参考。

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")

出图效果如下:
《逻辑回归建模及变量重要性可视化(Python实现)》

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)

出图效果如下:
《逻辑回归建模及变量重要性可视化(Python实现)》

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')

出图效果如下:
《逻辑回归建模及变量重要性可视化(Python实现)》
个人比较喜欢最后一种。当变量较多时,采用水平条形图,变量名称看的更加清楚。
对于多元线性回归等其他可以输出变量系数的模型,都可以采用以上方式将模型系数进行可视化,从而更加直观地展现变量重要性。

    原文作者:Howedata
    原文地址: https://blog.csdn.net/weixin_45494886/article/details/107433359
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞