【建议收藏】线性回归 10 种图表 上

 这段时间,不少同学提到了一些图表的问题。

每次在使用matplotlib画图,运用这些图表说明问题的时候,很多时候是模糊的,比如说什么时候画什么图合适?

其实这个根据你自己的需求,自己的想法来就行。

今天的话,我这里举例在线性回归中,最常用的一些图表,应该可以cover绝大多数情况了。其他算法模型适用的图表,咱们在后面再给大家进行总结~

至于数据集,表现方式,大家可以根据我给出的代码继续调整即可!

那么,在线性回归学习中,以下10种图表是很重要的:

  • 散点图

  • 线性趋势线图

  • 残差图(Residual plot)

  • 正态概率图

  • 学习曲线

  • 方差-偏差权衡图

  • 残差对预测值图

  • 部分回归图

  • 杠杆图

  • Cook's 距离图  

1,散点图

散点图(Scatter plot)是一种展示两个变量之间关系的图表。它通过在坐标系中以点的形式表示数据,其中每个点的位置由两个变量的值决定,从而展示它们之间的关系。

在线性回归中,散点图通常用于可视化数据集中两个变量之间的关系,并帮助我们判断是否适合使用线性模型进行建模。

咱们使用sklearn库中的load_diabetes数据集。然后,将选择数据集中的一个特征作为自变量X,另一个特征作为因变量y。后面的案例,也用这个数据集给大家进行演示。

from sklearn.datasets import load_diabetes

# 加载数据集
diabetes = load_diabetes()
X = diabetes.data[:, 2]  # 使用第三个特征作为自变量
y = diabetes.target

# 手动实现简单线性回归算法
def simple_linear_regression(X, y):
    # 计算均值
    X_mean = sum(X) / len(X)
    y_mean = sum(y) / len(y)
    
    # 计算斜率和截距
    numerator = sum((X - X_mean) * (y - y_mean))
    denominator = sum((X - X_mean) ** 2)
    slope = numerator / denominator
    intercept = y_mean - slope * X_mean
    
    return slope, intercept

# 获取回归直线的斜率和截距
slope, intercept = simple_linear_regression(X, y)

现在,画出散点图并添加回归直线。

import matplotlib.pyplot as plt

# 绘制散点图
plt.scatter(X, y, color='blue', label='Data points')
# 添加回归直线
plt.plot(X, slope*X + intercept, color='red', label='Regression line')
plt.xlabel('X label')
plt.ylabel('y label')
plt.title('Scatter plot with regression line')
plt.legend()
plt.show()

为什么使用散点图?

因为散点图可以直观地展示数据的分布情况,同时通过添加回归直线,我们可以更好地理解数据的趋势和线性关系。这种图表有助于我们验证线性回归模型的有效性,并且可以用来预测新的数据点。

2,线性趋势线图

线性趋势线图(Linear trend line plot)是一种在散点图中添加一条直线来表示数据的线性趋势的图表。这条直线通常被称为趋势线或回归线,它可以帮助我们更清晰地看到数据的整体趋势,特别是在数据点分布较为杂乱或噪声较多时。

在线性回归中,线性趋势线图用于可视化数据集中自变量和因变量之间的线性关系,以及线性回归模型拟合的效果。

from sklearn.datasets import load_diabetes

# 加载数据集
diabetes = load_diabetes()
X = diabetes.data[:, 2]  # 使用第三个特征作为自变量
y = diabetes.target

# 手动实现简单线性回归算法
def simple_linear_regression(X, y):
    # 计算均值
    X_mean = sum(X) / len(X)
    y_mean = sum(y) / len(y)
    
    # 计算斜率和截距
    numerator = sum((X - X_mean) * (y - y_mean))
    denominator = sum((X - X_mean) ** 2)
    slope = numerator / denominator
    intercept = y_mean - slope * X_mean
    
    return slope, intercept

# 获取回归直线的斜率和截距
slope, intercept = simple_linear_regression(X, y)

现在,可以画出线性趋势线图来表示算法的效果。

import seaborn as sns
import matplotlib.pyplot as plt

# 绘制线性趋势线图,样本点为红色,拟合线为蓝色
sns.regplot(x=X, y=y, color='red', scatter_kws={'color': 'blue', 's': 10})  # s设置散点的大小
plt.xlabel('X label')
plt.ylabel('y label')
plt.title('Linear trend line plot')
plt.show()

为什么使用线性趋势线图?

因为线性趋势线图可以帮助我们更直观地看到数据的整体趋势,特别是在数据点分布较为杂乱或噪声较多时,趋势线可以帮助我们更清晰地理解数据的线性关系,并验证线性回归模型的有效性。这种图表有助于我们预测新的数据点并评估模型的拟合效果。

3,残差图

残差图(Residual plot)通过将数据点的残差(预测值与实际值之间的差异)绘制在纵轴上,自变量的值(或者预测值)绘制在横轴上,来展示模型的拟合情况和误差分布。在理想情况下,残差应该随机地分布在横轴上,没有明显的模式,如果残差图显示出某种模式,则可能表示模型存在问题。

from sklearn.datasets import load_diabetes

# 加载数据集
diabetes = load_diabetes()
X = diabetes.data[:, 2]  # 使用第三个特征作为自变量
y = diabetes.target

# 手动实现简单线性回归算法
def simple_linear_regression(X, y):
    # 计算均值
    X_mean = sum(X) / len(X)
    y_mean = sum(y) / len(y)
    
    # 计算斜率和截距
    numerator = sum((X - X_mean) * (y - y_mean))
    denominator = sum((X - X_mean) ** 2)
    slope = numerator / denominator
    intercept = y_mean - slope * X_mean
    
    return slope, intercept

# 获取回归直线的斜率和截距
slope, intercept = simple_linear_regression(X, y)

# 计算预测值
y_pred = slope * X + intercept

# 计算残差
residuals = y - y_pred

现在,我们可以画出残差图来表示算法的效果。

import matplotlib.pyplot as plt

# 绘制残差图
plt.scatter(X, residuals, color='blue')
plt.axhline(y=0, color='red', linestyle='--')  # 添加水平参考线
plt.xlabel('X label')
plt.ylabel('Residuals')
plt.title('Residual plot')
plt.show()

为什么使用残差图?

因为残差图可以帮助我们检验线性回归模型是否合适。在理想情况下,残差应该随机地分布在横轴上,没有明显的模式。如果残差图显示出某种模式(如残差随自变量增大而增大或减小),则可能表示模型存在问题,需要进一步改进。这种图表有助于我们评估模型的拟合效果和准确性。

4,正态概率图

正态概率图(Normal probability plot)是一种用于检验数据是否符合正态分布的图表。在正态概率图中,将数据的标准化值(即Z分数)绘制在纵轴上,理论上的正态分布的分位数对应值(即标准正态分布的分位数)绘制在横轴上。如果数据符合正态分布,那么点应该沿着一条直线大致分布。

在线性回归中,正态概率图用于检验模型的残差是否符合正态分布。如果残差符合正态分布,则说明模型的假设是合理的,可以进行进一步的分析和预测。

from sklearn.datasets import load_diabetes

# 加载数据集
diabetes = load_diabetes()
X = diabetes.data[:, 2]  # 使用第三个特征作为自变量
y = diabetes.target

# 手动实现简单线性回归算法
def simple_linear_regression(X, y):
    # 计算均值
    X_mean = sum(X) / len(X)
    y_mean = sum(y) / len(y)
    
    # 计算斜率和截距
    numerator = sum((X - X_mean) * (y - y_mean))
    denominator = sum((X - X_mean) ** 2)
    slope = numerator / denominator
    intercept = y_mean - slope * X_mean
    
    return slope, intercept

# 获取回归直线的斜率和截距
slope, intercept = simple_linear_regression(X, y)

# 计算预测值
y_pred = slope * X + intercept

# 计算残差
residuals = y - y_pred

现在,画出正态概率图来表示算法的效果。

import scipy.stats as stats
import matplotlib.pyplot as plt

# 绘制正态概率图
stats.probplot(residuals, dist="norm", plot=plt)
plt.xlabel('Theoretical quantiles')
plt.ylabel('Ordered residuals')
plt.title('Normal probability plot')
plt.show()

为什么使用正态概率图?

因为正态概率图可以帮助我们检验模型的残差是否符合正态分布。如果点大致沿着一条直线分布,那么残差就符合正态分布,说明模型的假设是合理的。这种图表有助于我们验证模型的假设,评估模型的拟合效果和准确性。

5,学习曲线

学习曲线(Learning curve)是一种展示模型在训练集和验证集上表现随训练样本数量变化的图表。它通常将训练集和验证集的误差(如均方误差)或准确率作为纵轴,训练样本数量作为横轴,可以帮助我们分析模型的拟合情况和泛化能力。

在线性回归中,学习曲线可以帮助我们判断模型是否过拟合或欠拟合。 当模型在训练集上表现良好但在验证集上表现较差时,可能存在过拟合;而当模型在两个集合上表现都较差时,可能存在欠拟合。通过观察学习曲线,可以调整模型的复杂度或者增加训练样本数量来改善模型的表现。

from sklearn.datasets import load_diabetes
from sklearn.model_selection import learning_curve
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

# 加载数据集
diabetes = load_diabetes()
X = diabetes.data[:, 2]  # 使用第三个特征作为自变量
y = diabetes.target

# 创建线性回归模型
model = LinearRegression()

# 计算学习曲线
train_sizes, train_scores, valid_scores = learning_curve(model, X[:, np.newaxis], y, train_sizes=[50, 100, 200, 300], cv=5)

# 计算训练集和验证集的平均误差
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
valid_mean = np.mean(valid_scores, axis=1)
valid_std = np.std(valid_scores, axis=1)

# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.1, color="r")
plt.fill_between(train_sizes, valid_mean - valid_std, valid_mean + valid_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_mean, 'o-', color="r", label="Training score")
plt.plot(train_sizes, valid_mean, 'o-', color="g", label="Cross-validation score")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.title("Learning curve")
plt.legend(loc="best")
plt.show()

为什么使用学习曲线?

因为学习曲线可以帮助我们分析模型在不同训练样本数量下的表现,进而判断模型是否过拟合或欠拟合。通过观察学习曲线,我们可以选择合适的模型复杂度或增加训练样本数量来改善模型的表现,从而提高模型的泛化能力。这种图表有助于我们优化模型并提高预测的准确性。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值