import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(color_codes=True)
tips = sns.load_dataset("tips")
一、绘制线性回归模型
seaborn主要通过两个函数来展示通过回归得到的线性关系,regplot()
和lmplot()
。它们紧密相关,而且共享大多数的核心功能。但是弄清楚他们的区别非常重要,这样我们就可以在针对特定工作时快速判断哪个工具更适合。
在最基本的调用过程中,他们都会画出关于x、y两个变量的散点图,同时用数据拟合一个y ~ x的模型出来,并将对应的直线和95%的置信区间绘制出来:
sns.regplot(x="total_bill", y="tip", data=tips)
sns.lmplot(x="total_bill", y="tip", data=tips)
二、拟合不同的模型
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 80});
第二个数据集中有着同样的线性关系,但是我们瞬间就能判断线性回归并不是一个最佳的模型:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
ci=None, scatter_kws={"s": 80})
在展示这种更高阶的关系时,lmplot()和regplot()可以通过拟合多项式回归模型来应对数据集中的一些简单的非线性趋势:
参数: order
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80})
另一个问题是由异常观测点导致的,这些观测点明显偏离了我们想要得到的主要趋势关系:
ns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
ci=None, scatter_kws={"s": 80})
参数: robust
在异常观测值存在时,我们可以拟合一个鲁棒回归(稳定回归)
,它使用了不同的损失函数,对较大的残差做了降权:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
robust=True, ci=None, scatter_kws={"s": 80})
当因变量y是二元变量时,简单线性回归会提供一个不太有说服力的预测:
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
y_jitter=.03);
这种情况下的解决方案是拟合一个逻辑回归模型,此时回归线的含义是在给定的x下y = 1的概率:
sns.lmplot(x="total_bill", y="big_tip", data=tips,
logistic=True, y_jitter=.03);
sns.lmplot(x="total_bill", y="tip", data=tips, lowess=True)
residplot()函数
residplot()函数
可以检查一个简单的回归模型对于某个数据集是否合适。它先拟合一个简单线性回归模型并移除它,然后将每个观测点与预测值的残差画出来。理想情况下,这些残差应该随机地分布在x轴上下方:
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
scatter_kws={"s": 80});
如果残差的分布具有某种规律,那说明简单线性回归或许并不是一个好的选择:
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
scatter_kws={"s": 80})