欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-04 19:21:49
一、逻辑回归背景知识逻辑回归(Logistic Regression)是最常用的分类算法之一,因其简单直观可解释而广受欢迎。它来源于统计学中的广义线性模型(GLM),也是机器学习领域的基本算法。因本文重在分享对模型变量重要性的可视化,故在这里不对模型原理做过多说明。感兴趣的读者可以参考以下两篇文章。对于模型的思想、推导等步骤,可以参考以下文章。Logistic Regression(逻辑回归)详细讲解https://blog.csdn.net/joshly/article/details/50...

一、逻辑回归背景知识

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

本文地址:https://blog.csdn.net/weixin_45494886/article/details/107433359