多项式回归

用适当幂次的多项式来近似反映因变量与自变量之间的关系。

  • 什么是多项式模型?

它是由常数与自变量\(𝑥\) 经过有限次乘法与加法运算得到。

例如 \(𝑝_n(𝑥)= 𝑎_n𝑥^n + 𝑎_{n-1}x^{n-1}+...+a_1x+a_0\)就是多项式函数。

  • 多项式回归的步骤:
  1. 生成多项式特征。

例如输入样本是\(2\)维的如\([𝑎, 𝑏]\),则二阶多项式 的 特 征 集 为 \([1,𝑎,𝑏,𝑎^2,𝑎𝑏,𝑏^2]\)

在 sklearn 中 可 以 使 用 𝑷𝒐𝒍𝒚𝒏𝒐𝒎𝒊𝒂𝒍𝑭𝒆𝒂𝒕𝒖𝒓𝒆𝒔生成多项式特征。

  1. 利用得到的多项式特征,使用线性分类器处理。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 披萨的直径和价格之间的关系

# 训练集数据
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]

# 测试集数据
X_test = [[6], [8], [11], [16]]
y_test = [[8], [12], [15], [18]]


def R_2(y, y_hat):
    '''
    计算R方
    :param y: 实际值
    :param y_hat: 预测值
    :return:
    '''
    # 均值
    y_mean = np.mean(y)
    # 残差平方和
    res = np.sum(np.power((y - y_hat), 2))
    # 样本总离差平方和
    tss = np.sum(np.power((y - y_mean), 2))
    # R方
    r = 1 - res / tss
    print(r)


def calc(degree):
    '''
    多项式拟合
    :param degree: 
    :return: 
    '''
    # 生成多项式特征X2
    poly = PolynomialFeatures(degree)
    poly.fit(X_train)
    X2 = poly.transform(X_train)

    # 拟合线性分类器
    lr = LinearRegression()
    lr.fit(X2, y_train)

    prediction = lr.predict(poly.transform(X_test))
    R_2(y_test, prediction)

测试结果:

degree R2
2 0.868
3 0.836
4 0.810
5 0.782
6 0.696
7 0.492

绘图看效果


def run(degree=3):
    # 生成多次特征
    poly = PolynomialFeatures(degree)
    poly.fit(X)
    X2 = poly.transform(X)
    print('X2的大小', X2.shape)

    # 继续使用线性模型
    lr = LinearRegression()
    lr.fit(X2, y)
    fit = lr.predict(X2)
    
    plt.figure(figsize=(10, 6))
    
    plt.subplot(1, 2, 1)
    plt.plot(X, fit, '.-', label='fit', color='blue')
    plt.plot(X, y_train, 's-', label='actual', color='red')
    plt.legend()

    prediction = lr.predict(poly.transform(X_test))

    plt.subplot(1, 2, 2)
    plt.plot(X_test, prediction, '.-', label='prediction', color='blue')
    plt.plot(X_test, y_test, 's-', label='actual', color='red')
    plt.legend()
    plt.show()

degree=1

degree=2

degree=3

degree=4

从4开始,出现过拟合

degree=7

在测试集的表现,已经出现严重偏差

避免过拟合的办法:
正则化、加噪、dropout等

posted on 2022-11-01 16:11  宋岳庭  阅读(201)  评论(0编辑  收藏  举报