逻辑回归建模及变量重要性可视化(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")

出图效果如下:
在这里插入图片描述

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

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

  • 22
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
高斯过程回归是一种基于贝叶斯推断的非参数回归方法,它可以用于对任意维度的数据进行建模和预测。在Python中,可以使用scikit-learn库中的GaussianProcessRegressor类来实现高斯过程回归。具体步骤如下: 1. 导入必要的库,包括numpy、matplotlib、seaborn和sklearn中的GaussianProcessRegressor和相关的核函数。 2. 准备数据,包括输入变量和对应的输出变量。 3. 定义核函数,可以使用常见的核函数,如RBF核函数、Matern核函数等。 4. 创建高斯过程回归模型,指定核函数和其他参数。 5. 拟合模型,使用fit方法拟合数据。 6. 预测新数据,使用predict方法对新数据进行预测。 下面是一个简单的高斯过程回归的Python实现的例子: ``` import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C, WhiteKernel # 准备数据 X = np.array([[-1, 0], [0, 1], [1, 2], [2, 3], [3, 4]]) y = np.array([0, 1, 2, 3, 4]) # 定义核函数 kernel = C(1.0, (1e-3, 1e3)) * RBF(10, (1e-2, 1e2)) + WhiteKernel(1e-3) # 创建高斯过程回归模型 model = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=9) # 拟合模型 model.fit(X, y) # 预测新数据 X_new = np.array([[4, 5], [5, 6]]) y_pred = model.predict(X_new) # 可视化结果 plt.scatter(X[:, 0], y) plt.plot(X_new[:, 0], y_pred, 'r--') plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值