线性回归必学的8种图线性模型的理解通常始于回归总结的表格,但这种充满数字的表格可能会让不同的听众感到枯燥或畏惧。为了更有效地传达信息,我们需要使用更易消化的视觉化工具。因此,本文将探索八种图表,帮助您使线性回归更加易于理解:
残差图相关热图权重图效应图平均效应图个体效应图趋势效应图线性模型的SHAP值特别是第四至第七图,它们在解释模型对预测的贡献方面特别有用。不少Nature子刊甚至正刊都使用了线性回归的变量贡献方法。
数据 本文使用Kaggle的数据,通过六个特征进行多元线性回归预测一个特征。
import statsmodels.api as smimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport pandas as pdfrom sklearn.preprocessing import StandardScalerimport shap# Load dataset and add squared termcredit_score = pd.read_csv('data/credit_score.csv')# Target variabley = credit_score['CREDIT_SCORE']# Add squared termcredit_score['R_EXPENDITURE_SQR'] = credit_score['R_EXPENDITURE']**2# Select featuresX = credit_score[['INCOME','R_DEBT_INCOME','R_EXPENDITURE','R_EXPENDITURE_SQR','R_ENTERTAINMENT','CAT_GAMBLING']].copy()# One-hot encodingX['GAMBLING_LOW'] = X['CAT_GAMBLING'].apply(lambda x: 1 if x == 'Low' else 0)X['GAMBLING_HIGH'] = X['CAT_GAMBLING'].apply(lambda x: 1 if x == 'High' else 0)X.drop(columns=['CAT_GAMBLING'], inplace=True)X.head()数据介绍接下来创建多元线性回归模型:
# Add a constant to the independent variables (intercept)X = sm.add_constant(X)# Fit a linear regression modelmodel = sm.OLS(y, X).fit()# Output the summary of the modelprint(model.summary())模型摘要传统角度上,这样就结束了,但是也可以用下面的一些图来向读者更清晰地展示你的数据,而不是一些简单的数字。
残差图 第一种方法是残差图。在统计学中,残差是模型的预测与给定实例的实际目标值之间的差异。这是理解回归模型性能的最佳可视化。在下面的代码中,我们创建了模型预测与实际观测值的散点图。然后我们添加了红色的1:1线。
残差图与R2值直接相关。这是用于评估模型整体拟合度的指标。它告诉我们模型预测与目标变量的接近程度。这就是残差图所呈现的效果。红线周围的点越分散,R2越低。
# Get model predictionsy_pred = model.predict(X)# Plot predicted vs actualfig, ax = plt.subplots(figsize=(5, 5))plt.scatter(y_pred,y)# Plot y=x lineax.plot([y.min(), y.max()], [y.min(), y.max()], color='tab:red')plt.xlabel('Predicted',size=15)plt.ylabel('Actual', size=15)残差图相关矩阵 其余的大多数方法旨在解释特征如何与目标变量相关。在讨论这些之前,有必要探讨一下变量之间的关联的。为此,我们可以使用特征的相关热图。我们计算所有数值特征之间的相关矩阵并用热图将其可视化
# Correlation matrixcorr_matrix = X.drop('const',axis=1).corr()sns.heatmap(corr_matrix, cmap='coolwarm', fmt='.1f', vmin=-1, vmax=1,annot=True)相关矩阵图权重图 权重图告诉我们一些关于模型如何做出这些预测的信息。对于每个特征,我们为其权重或系数绘制一个点。这些直接取自模型的summary。
# Get coefficients and standard errorscoefficients = model.params[1:][::-1]se = model.bse[1:][::-1]features = X.columns[1:][::-1]plt.figure(figsize=(10, 6))# Plot vertical dotted line at x=0plt.axvline(x=0, color='tab:red', linestyle='--')# Plot the coefficients and error barsplt.errorbar(coefficients, features, xerr=se, fmt='o', capsize=5)plt.xlabel('Coefficient (Weight)', size=15)权重图效应图 效应图显示哪些特征往往对结果贡献最大。该效应的值还告诉我们该特征与目标变量的关系。例如,正负值。如果效应是负的,那随着值增加最终会变小。
# Calculate the feature effects feature_effects = X * model.params# Combine feature effects for related featuresfeature_effects['R_EXPENDITURE'] = feature_effects['R_EXPENDITURE'] + feature_effects['R_EXPENDITURE_SQR']feature_effects['GAMBLING'] = feature_effects['GAMBLING_LOW']+feature_effects['GAMBLING_HIGH']feature_effects.drop(['const','R_EXPENDITURE_SQR','GAMBLING_LOW','GAMBLING_HIGH'],axis=1,inplace=True)# Create effect plots using boxplotsplt.figure(figsize=(12, 7))plt.axvline(x=0, color='tab:red', linestyle='--')sns.boxplot(data=feature_effects, orient='h', color='tab:Blue')plt.xlabel('Effect on Credit Score', size=15)效应图从效应图开始,我们就开始逐步进入回归模型的贡献与归因了,这在地学敏感性分析常常用到。(尤其是第四至第七图)后面的图我们会结合敏感性分析示例进行介绍与绘制。