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

您所在的位置:网站首页 多变量logistic回归模型 逻辑回归建模及变量重要性可视化(Python实现)

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

2024-07-12 08:20| 来源: 网络整理| 查看: 265

一、逻辑回归背景知识

逻辑回归(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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3