小白零基础学数学建模系列-Day3-线性回归模型的构建与评估

news2024/11/26 16:44:49

文章目录

    • 1 线性回归基础
      • 1.1 线性回归概念与应用
      • 1.2 数学原理与推导
      • 1.3 线性回归的实现
    • 2 案例分析:房价预测
      • 2.1 加载数据
      • 2.2 数据预处理
      • 2.3 探索性数据分析
      • 2.4 观察选择特征
      • 2.5 准备训练模型的数据
      • 2.6 将数据拆分为训练集和测试集
      • 2.7 训练和测试模型
      • 2.8 模型评估
    • 3 曲线拟合的方法
      • 3.1 曲线拟合的概念
      • 3.2 非线性回归
    • 4 实战案例:产品销量预测
    • 5 常见问题与解决方案
      • 5.1 模型评估与诊断
      • 5.2 模型改进与优化
    • 6 总结与练习
      • 6.1 本章总结
      • 6.2 练习题与项目

1 线性回归基础

1.1 线性回归概念与应用

线性回归的基本概念

线性回归是一种用于研究因变量与一个或多个自变量之间关系的统计方法。它的核心思想是通过拟合一条直线来描述数据的总体趋势,从而揭示变量间的线性关系。具体来说,线性回归模型通过以下形式的方程来预测因变量 (y) 的值:

y = β 0 + β 1 x + ϵ y = \beta_0 + \beta_1x + \epsilon y=β0+β1x+ϵ
其中,β是截距,表示当自变量 x为 0 时,因变量 y\的预测值;β是回归系数或斜率,表示 x 变化一个单位时,y预计会变化的数量;ϵ 则代表误差项,反映了模型未能解释的那部分变异。

线性回归的应用场景

线性回归在许多领域都有广泛的应用,尤其在经济学、金融、医学、工程和社会科学中表现尤为突出。例如,在经济学中,线性回归可以用来分析消费支出与收入之间的关系;在医学中,可以用来研究病人某项生理指标与疾病进展的关联;在工程中,线性回归则常用于预测系统的性能。

一个典型的应用场景是预测房价。我们可以通过历史数据分析房屋的各种特征(如面积、房间数、地理位置等)与其售价之间的关系,进而利用这些数据建立预测模型,为未来的房价预测提供参考。

1.2 数学原理与推导

最小二乘法

在线性回归模型中,最常用的估计方法是最小二乘法。其目标是通过最小化预测值与实际值之间的平方误差之和,找到最佳的线性关系。这个方法可以保证所选直线使得整体误差最小化,进而提供最优的回归系数估计值。

数学上,给定 n个数据点 (x1, y1), (x2, y2), …, (x_n, y_n),回归模型的目标是最小化以下目标函数:

RSS = ∑ i = 1 n ( y i − ( β 0 + β 1 x i ) ) 2 \text{RSS} = \sum_{i=1}^{n} (y_i - (\beta_0 + \beta_1x_i))^2 RSS=i=1n(yi(β0+β1xi))2

通过对 β0 和 β1求导并设为 0,可以推导出这两个参数的最优解:

β ^ 1 = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 \hat{\beta}_1 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n} (x_i - \bar{x})^2} β^1=i=1n(xixˉ)2i=1n(xixˉ)(yiyˉ)

β ^ 0 = y ˉ − β ^ 1 x ˉ \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} β^0=yˉβ^1xˉ

其中, x ˉ \bar{x} xˉ y ˉ \bar{y} yˉ 分别为 x 和(y 的均值。通过这些公式,我们可以计算出最佳拟合线的斜率和截距。

残差分析与模型适应性

残差是指实际观测值与模型预测值之间的差异。在线性回归分析中,残差的大小和分布情况能够揭示模型的拟合程度。如果残差呈现随机分布且均值接近零,说明模型的假设比较合理;反之,如果残差存在系统性偏差,则可能意味着模型存在问题,如遗漏了重要的变量或者模型形式不合适。

模型适应性指的是模型在不同数据集上的表现是否稳定。当模型在训练数据上表现良好但在新数据上表现较差时,可能出现了过拟合的问题。为了解决这个问题,可以考虑使用交叉验证、正则化等方法来提高模型的泛化能力。

1.3 线性回归的实现

使用Python进行线性回归

在实际操作中,我们通常使用编程语言来实现线性回归模型。在这里,我们使用Python中的scikit-learn库来进行线性回归的简单实现。

首先,我们需要导入相关的库并生成一个简单的数据集:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
plt.rcParams['font.sans-serif'] = ['SimHei']

# 生成更多的示例数据,X 是输入特征,y 是目标变量
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
y = np.array([1, 3, 2, 5, 4, 6, 5, 7, 6, 8])

# 拆分数据集为训练集和测试集,80% 作为训练集,20% 作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 创建线性回归模型并进行训练
model = LinearRegression()
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 输出回归模型的系数、截距、均方误差和R²值
print("回归系数:", model.coef_)
print("截距:", model.intercept_)
print("均方误差:", mean_squared_error(y_test, y_pred))
print("R²:", r2_score(y_test, y_pred))

# 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X_train, y_train, color='blue', label='训练数据')
plt.scatter(X_test, y_test, color='black', label='测试数据')
plt.plot(X, model.predict(X), color='red', linewidth=2, label='回归线')
plt.xlabel('输入特征 X')
plt.ylabel('目标变量 y')
plt.title('线性回归模型')
plt.legend()
plt.show()

运行如下:
在这里插入图片描述

根据上述回归系数和截距,数学模型可以表示为线性回归方程:

y = 0.6947 × X + 1.1409 y = 0.6947 \times X + 1.1409 y=0.6947×X+1.1409

  • 回归系数 (0.6947):表示输入特征 (X) 每增加 1 个单位,目标变量 (y) 将增加约 0.6947 个单位。
  • 截距 (1.1409):表示当 (X = 0) 时,目标变量 (y) 的预测值为 1.1409。

评价模型:

  • 均方误差(MSE: 1.7211):表示预测值与真实值之间的平均平方误差,MSE 越小表示模型预测越准确。
  • R² 值(0.5697):表示模型解释目标变量的方差的比例,R² 值在 0 到 1 之间,越接近 1 表示模型越好。这里的 R² 值为 0.5697,说明模型能够解释目标变量约 57% 的方差,模型有一定的解释能力,但仍有改进空间。

这个方程可以用来预测在给定输入 (X) 时,目标变量 (y) 的值。如果你有新的数据点 (X),你可以使用这个方程来计算对应的 (y) 值。

2 案例分析:房价预测

房价预测是线性回归模型的经典应用之一。在现实世界中,房价受多个因素的影响,包括房屋面积、房间数量、地理位置、建筑年份等。通过线性回归,我们可以构建一个模型,用这些因素(自变量)来预测房价(因变量)。下面,我们将详细介绍如何从数据准备到模型构建、评估的完整过程。

波士顿房价数据集包含波士顿不同房屋的信息,数据集最初是UCI机器学习库的一部分,现在可以通过scikit-learn库访问。数据集包含506个样本和13个特征变量,目标是使用这些特征来预测房屋的价格。

数据描述

特征的描述如下:

  • CRIM: 镇人均犯罪率
  • ZN: 占地超过25,000平方英尺的住宅用地比例
  • INDUS: 每个镇的非零售商业面积比例
  • CHAS: Charles河虚拟变量(=1 如果地段临河;否则为0)
  • NOX: 一氧化氮浓度(每千万分之一)
  • RM: 每套住宅的平均房间数
  • AGE: 1940年前建造的自有住房比例
  • DIS: 到波士顿五个就业中心的加权距离
  • RAD: 到放射状公路的可达性指数
  • TAX: 每$10,000美元的全额财产税率
  • PTRATIO: 每个镇的师生比例
  • B: 1000(Bk - 0.63)²,其中Bk是非裔美国人后裔的比例
  • LSTAT: 低收入人口的比例
  • MEDV: 自有住房的中位数价值(以$1000为单位)

变量所指示的房价MEDV是我们的目标变量,其余的是特征变量,我们将根据这些变量来预测房屋的价值。

2.1 加载数据

首先,我们将导入所需的库。

import numpy as np
import matplotlib.pyplot as plt 

import pandas as pd  
import seaborn as sns 

接下来,我们将加载数据(数据下载:下载 )

data= pd.read_csv('boston_house_prices.csv')
data

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

2.2 数据预处理

加载数据后,最好查看数据中是否有缺失值。我们使用以下方法计算每个特征的缺失值数量:isnull()

data.isnull().sum()

如下该数据集中没有缺失值。
在这里插入图片描述

2.3 探索性数据分析

探索性数据分析是训练模型前非常重要的一步。在本节中,我们将使用一些可视化来了解目标变量与其他特征的关系。

让我们首先绘制目标变量的分布MEDV。我们将使用库distplot中的函数seaborn。

sns.set(rc={'figure.figsize':(11.7,8.27)})
sns.distplot(data['MEDV'], bins=30)
plt.show()

运行如下:
在这里插入图片描述
我们看到的值MEDV呈正态分布,几乎没有异常值。接下来,我们创建一个相关矩阵来测量变量之间的线性关系。可以使用corrpandas dataframe 库中的函数来形成相关矩阵。我们将使用heatmapseaborn 库中的函数来绘制相关矩阵。

correlation_matrix = data.corr().round(2)
sns.heatmap(data=correlation_matrix, annot=True)

运行如下:
在这里插入图片描述
相关系数的范围是-1到1。如果该值接近于1,则表示两个变量之间存在很强的正相关性。当它接近于-1时,表示变量之间存在很强的负相关性。

2.4 观察选择特征

  • 为了拟合线性回归模型,我们选择那些与目标变量 MEDV 具有高度相关性的特征。通过查看相关矩阵可以发现,RMMEDV 之间具有较强的正相关性(0.7),而 LSTATMEDV 之间具有较强的负相关性(-0.74)。

  • 在为线性回归模型选择特征时,检查特征之间的多重共线性是非常重要的一步。比如,特征 RADTAX 之间的相关性为0.91,这表明这两个特征之间有很强的相关性,因此我们不应同时选择这两个特征来训练模型。类似地,DISAGE 之间的相关性为-0.75,也不建议同时使用。

根据以上观察,我们将RM和LSTAT作为我们的特征。使用散点图让我们看看这些特征如何随而变化MEDV。

plt.figure(figsize=(20, 5))

features = ['LSTAT', 'RM']
target = data['MEDV']

for i, col in enumerate(features):
    plt.subplot(1, len(features) , i+1)
    x = data[col]
    y = target
    plt.scatter(x, y, marker='o')
    plt.title(col)
    plt.xlabel(col)
    plt.ylabel('MEDV')

运行如下:
在这里插入图片描述
观察结果:

  • 价格随着 RM 值的线性增加而增加。异常值很少,数据似乎被限制在 50。
  • 价格趋向于随着 LSTAT 的增加而下降。尽管它看起来并不完全遵循直线。

2.5 准备训练模型的数据

X = pd.DataFrame(np.c_[data['LSTAT'], data['RM']], columns = ['LSTAT','RM'])
Y = data['MEDV']

2.6 将数据拆分为训练集和测试集

接下来,我们将数据分成训练集和测试集。我们用 80% 的样本训练模型,用剩下的 20% 进行测试。我们这样做是为了评估模型在未知数据上的表现。为了分割数据,我们使用scikit-learn 库提供的train_test_split函数。我们最后打印训练集和测试集的大小来验证分割是否正确进行。

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state=5)
print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)
print(Y_test.shape)

输出如下:

(404, 2)
(102, 2)
(404,)
(102,)

2.7 训练和测试模型

我们使用 scikit-learnL 的inearRegression在训练集和测试集上训练我们的模型。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

lin_model = LinearRegression()
lin_model.fit(X_train, Y_train)

2.8 模型评估

我们将使用 RMSE 和 R2 分数评估我们的模型。

from sklearn.metrics import r2_score

# 训练
y_train_predict = lin_model.predict(X_train)
rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))
r2 = r2_score(Y_train, y_train_predict)

print("训练集的模型性能 ")
print("--------------------------------------")
print('RMSE is {}'.format(rmse))
print('R2 score is {}'.format(r2))
print("\n")

# 测试
y_test_predict = lin_model.predict(X_test)
rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))
r2 = r2_score(Y_test, y_test_predict)

print("测试集的模型性能 ")
print("--------------------------------------")
print('RMSE is {}'.format(rmse))
print('R2 score is {}'.format(r2))

如下:

训练集的模型性能 
--------------------------------------
RMSE is 5.6371293350711955
R2 score is 0.6300745149331701


测试集的模型性能 
--------------------------------------
RMSE is 5.137400784702911

好的,以下是“曲线拟合的方法”的完整内容:


3 曲线拟合的方法

3.1 曲线拟合的概念

3.1.1 曲线拟合的定义与应用场景
曲线拟合是指使用一个函数模型来逼近数据点的过程。相比于线性回归,曲线拟合允许模型更加灵活,能够捕捉到非线性关系。在许多实际应用中,数据并不呈现线性关系,而是随着变量的变化表现出复杂的模式,此时需要通过曲线拟合来更好地描述数据。
应用场景

  • 生物医学:药物剂量反应曲线,用于评估药物对不同剂量的反应。
  • 经济学:供求关系分析,在市场中价格与需求量之间通常存在非线性关系。
  • 工程学:材料应力-应变曲线,描述材料在不同载荷下的力学行为。

3.1.2 不同类型的曲线拟合
曲线拟合可以使用不同类型的函数模型,常见的有多项式拟合、指数拟合和对数拟合等。每种方法都有其特定的应用场景和优缺点。

  • 多项式拟合:通过多项式函数(如二次、三次等)来拟合数据,能够捕捉到数据中的非线性趋势。
    • 优点:模型较为简单,容易解释,适用于数据的趋势变化较为平滑的情况。
    • 缺点:容易出现过拟合现象,特别是在高阶多项式情况下,模型可能会过度复杂,难以泛化。
  • 指数拟合:适用于数据呈现指数增长或衰减的场景,如人口增长、放射性衰变等。
    • 优点:能够有效捕捉指数增长或衰减趋势,模型简单易理解。
    • 缺点:不适用于不符合指数模式的数据。
  • 对数拟合:常用于数据变化幅度较大的情况,如财富分布、震级与能量的关系。
    • 优点:对数变换后可以将数据压缩至较小的范围内,使得模型更加稳健。
    • 缺点:对数模型不适合数据中存在负值或零值的情况。
  • 其他拟合方法:如幂函数拟合、正弦曲线拟合等,适用于特定的周期性或非线性场景。

3.2 非线性回归

3.2.1 非线性回归的基本原理
非线性回归与线性回归的主要区别在于模型中参数与自变量之间的关系是非线性的。这种回归分析技术适用于那些无法用直线关系描述的数据集。

  • 非线性回归的优势:相比线性回归,非线性回归能够更准确地描述复杂的现实世界数据,尤其是当数据表现出弯曲或其他非线性模式时。
  • 常见非线性回归模型:包括逻辑斯蒂回归、幂回归、双曲线回归等,适用于不同类型的非线性数据。

3.2.2 非线性回归模型的优化
非线性回归模型的训练通常更加复杂,因为其目标函数可能不是凸函数,容易陷入局部最优解。

  • 优化方法
    • 梯度下降法:通过迭代的方法寻找最优参数,适用于大多数非线性回归问题。
    • 牛顿法:一种更快的优化算法,适用于凸函数,但对初值敏感,可能导致发散。
    • 模拟退火算法:适用于多峰优化问题,能够避免局部最优,寻找全局最优解。
  • 过拟合与欠拟合:为了避免模型的过拟合,可以采用正则化方法如Lasso和Ridge回归。此外,交叉验证也可以用来评估模型的泛化能力。

4 实战案例:产品销量预测

在本案例中,我们将使用曲线拟合技术来预测产品的销量。通过分析历史销售数据,选择合适的拟合方法,以提高预测的准确性。我们将使用Python编程语言来实现整个流程。

步骤1:数据准备

首先,获取历史销售数据。假设我们有一个数据集,其中包含以下信息:

  • 日期(Date):产品销售的日期。
  • 销量(Sales):对应日期的产品销售数量。
  • 广告费用(Advertising Spend):对应日期的广告投入。

数据例子如下:

Date,Sales,Advertising Spend
2024-01-01,100,500
2024-01-02,110,520
2024-01-03,120,530
2024-01-04,130,540
2024-01-05,140,550
2024-01-06,150,560
2024-01-07,160,580
2024-01-08,170,600
2024-01-09,180,620
2024-01-10,190,640
2024-01-11,200,650
2024-01-12,210,670
2024-01-13,220,690
2024-01-14,230,700
2024-01-15,240,720
2024-01-16,250,740
2024-01-17,260,750
2024-01-18,270,770
2024-01-19,280,780
2024-01-20,290,800
2024-01-21,300,820
2024-01-22,310,830
2024-01-23,320,850
2024-01-24,330,870
2024-01-25,340,880
2024-01-26,350,900
2024-01-27,360,920
2024-01-28,370,940
2024-01-29,380,960
2024-01-30,390,980

我们可以使用Pandas库加载CSV格式的数据:

import pandas as pd

# 加载数据集
data = pd.read_csv('sales_data.csv')

# 查看数据集的前几行
data.head()

如下:

在这里插入图片描述

步骤2:数据预处理

在处理数据之前,通常需要进行一些预处理步骤,包括处理缺失值、数据标准化等。

# 检查缺失值
print(data.isnull().sum())

# 如果有缺失值,可以选择删除或填充
data = data.dropna()

# 标准化广告费用,以便于后续分析
data['Advertising Spend'] = (data['Advertising Spend'] - data['Advertising Spend'].mean()) / data['Advertising Spend'].std()

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

步骤3:探索性数据分析(EDA)

在进行曲线拟合之前,首先要对数据进行初步分析,以确定可能的趋势和模式。

import matplotlib.pyplot as plt

# 绘制日期与销量的关系
plt.figure(figsize=(10, 6))
plt.plot(data['Date'], data['Sales'], label='Sales')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Sales Over Time')
plt.legend()
plt.show()

# 绘制广告费用与销量的关系
plt.figure(figsize=(10, 6))
plt.scatter(data['Advertising Spend'], data['Sales'], label='Sales vs. Advertising Spend')
plt.xlabel('Advertising Spend')
plt.ylabel('Sales')
plt.title('Sales vs. Advertising Spend')
plt.legend()
plt.show()

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

从这些图表中,我们可以初步了解销量随时间的变化趋势,以及广告费用与销量之间的关系。

步骤4:选择拟合模型

通过对数据的初步分析,我们发现销量与广告费用之间可能存在非线性关系,例如指数增长或多项式关系。因此,我们选择多项式回归来进行拟合。

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 提取自变量和因变量
X = data['Advertising Spend'].values.reshape(-1, 1)
y = data['Sales'].values

# 使用二次多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

# 拟合多项式回归模型
model = LinearRegression()
model.fit(X_poly, y)

# 打印回归系数
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)

如下:

Coefficients: [ 0.         88.1177643  -2.43329749]
Intercept: 247.35218757019658

步骤5:训练模型

模型训练完成后,我们可以使用训练集来预测销量,并将实际销量与预测结果进行比较。

# 预测销量
y_pred = model.predict(X_poly)

# 可视化拟合效果
plt.figure(figsize=(10, 6))
plt.scatter(data['Advertising Spend'], data['Sales'], color='blue', label='Actual Sales')
plt.plot(data['Advertising Spend'], y_pred, color='red', label='Predicted Sales')
plt.xlabel('Advertising Spend')
plt.ylabel('Sales')
plt.title('Polynomial Regression: Sales vs. Advertising Spend')
plt.legend()
plt.show()

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

步骤6:模型评估

为了评估模型的效果,我们可以计算均方误差(MSE)和R²判定系数:

from sklearn.metrics import mean_squared_error, r2_score

# 计算MSE和R²
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)

print(f"Mean Squared Error: {mse}")
print(f"R²: {r2}")

如下:

Mean Squared Error: 8.711255075096117
R²: 0.9988372073314666

如果R²值接近1,且MSE较小,说明模型拟合效果良好。

步骤7:进一步优化模型

如果发现模型效果不理想,可以通过以下几种方式进行优化:

  • 提高多项式的阶数:如使用三次或四次多项式。
  • 尝试其他拟合方法:如指数回归或对数回归。
  • 增加正则化:通过Lasso或Ridge回归来减少过拟合现象。
# 使用四次多项式进行拟合
poly3 = PolynomialFeatures(degree=4)
X_poly3 = poly3.fit_transform(X)

model3 = LinearRegression()
model3.fit(X_poly3, y)

# 预测并评估四次多项式的效果
y_pred3 = model3.predict(X_poly3)
mse3 = mean_squared_error(y, y_pred3)
r23 = r2_score(y, y_pred3)

print(f"Mean Squared Error (degree 3): {mse3}")
print(f"R² (degree 4): {r23}")

如下:

Mean Squared Error (degree 3): 5.118937518543499
R² (degree 4): 0.999316715792853

步骤8:预测未来销量

最终,当我们对模型满意后,可以使用模型来预测未来的产品销量。

# 假设未来的广告投入
future_ad_spend = np.array([[1.5], [2.0], [2.5]])

# 进行多项式变换
future_ad_spend_poly = poly3.transform(future_ad_spend)

# 预测未来销量
future_sales_pred = model3.predict(future_ad_spend_poly)

print("Future Sales Predictions:", future_sales_pred)

如下:

Future Sales Predictions: [374.11991712 414.41945526 453.9283957 ]

通过以上步骤,我们完成了一个基于曲线拟合的产品销量预测模型的构建、训练与优化,并成功预测了未来的销量。


5 常见问题与解决方案

在使用线性回归和曲线拟合模型的过程中,常常会遇到一些问题和挑战。这一部分将讨论这些常见问题,并提供相应的解决方案,以帮助确保模型的准确性和可靠性。

5.1 模型评估与诊断

5.1.1 过拟合与欠拟合

  • 问题描述

    • 过拟合:模型在训练数据上表现非常好,但在测试数据上表现较差。这通常是由于模型过于复杂,捕捉到了训练数据中的噪声。
    • 欠拟合:模型在训练数据和测试数据上都表现不佳。这通常是由于模型过于简单,未能捕捉到数据中的关键模式。
  • 解决方案

    • 过拟合的解决方法
      • 正则化:通过L1正则化(Lasso)或L2正则化(Ridge)来减少模型的复杂性,从而提高模型的泛化能力。
      • 减少模型复杂度:降低多项式的阶数或使用更简单的模型。
      • 增加数据量:通过增加训练数据的数量,帮助模型更好地学习数据的总体分布。
    • 欠拟合的解决方法
      • 增加模型复杂度:使用更高阶的多项式或更复杂的非线性模型。
      • 增加特征:通过引入更多有用的特征来增强模型的表达能力。

5.1.2 多重共线性

  • 问题描述:当回归模型中的自变量高度相关时,就会出现多重共线性。这种情况会导致回归系数不稳定,影响模型的解释性和预测性。

  • 解决方案

    • 去除高相关的变量:通过相关性分析,识别并去除高度相关的自变量。
    • 主成分分析(PCA):使用PCA将相关变量转换为不相关的主成分,从而降低共线性。
    • 岭回归:岭回归是一种可以处理共线性的正则化方法,通过对系数引入惩罚项来减少共线性的影响。

5.1.3 异方差性

  • 问题描述:异方差性指的是回归模型中残差的方差不恒定。异方差性会导致回归系数的估计不再是最小方差估计,并影响模型的预测能力。

  • 解决方案

    • 变换自变量:通过对自变量进行对数、平方根等变换,减少异方差性。
    • 加权最小二乘法(WLS):使用加权最小二乘法来处理异方差性,通过为每个观测值分配权重,使得方差恒定。
    • 稳健回归:使用稳健回归技术(如Huber回归)来降低异方差性对模型的影响。

5.1.4 残差分析

  • 问题描述:残差分析用于检查模型的拟合情况。如果残差分布不满足独立同分布(iid)假设,则模型可能不适用。

  • 解决方案

    • 残差图:绘制残差图,检查残差是否呈现随机分布。若发现模式,需重新考虑模型。
    • 调整模型:根据残差分析的结果,考虑调整模型的结构,如引入新的变量或采用非线性模型。

5.2 模型改进与优化

5.2.1 特征工程

  • 问题描述:特征工程是提高模型表现的关键步骤。错误或不完整的特征会限制模型的预测能力。

  • 解决方案

    • 特征选择:通过相关性分析、递归特征消除(RFE)等方法选择最有影响力的特征。
    • 特征提取:使用主成分分析(PCA)、因子分析等方法从原始特征中提取新的、更具代表性的特征。
    • 特征交互:创建特征交互项(如乘积或组合),以捕捉特征之间的复杂关系。

5.2.2 数据预处理

  • 问题描述:模型的准确性和稳定性依赖于输入数据的质量。数据中可能存在噪声、缺失值、异常值等问题,影响模型的表现。

  • 解决方案

    • 数据清洗:处理缺失值和异常值,确保数据的完整性和一致性。
    • 数据变换:对数据进行标准化、归一化处理,特别是在使用梯度下降等对尺度敏感的算法时。
    • 数据增强:在数据不足的情况下,可以使用数据增强技术,如数据扩充、合成少数类技术(SMOTE)等来提高模型的泛化能力。

5.2.3 交叉验证与模型选择

  • 问题描述:不同模型在不同数据集上的表现可能有所不同,选择合适的模型并进行评估至关重要。

  • 解决方案

    • 交叉验证:使用k折交叉验证来评估模型在不同数据集上的表现,从而选择最优模型。
    • 模型集成:通过集成学习(如随机森林、提升方法)来提高模型的预测精度和稳健性。
    • 参数调优:通过网格搜索(Grid Search)、随机搜索(Random Search)等方法调优模型参数,以提高模型的性能。

5.2.4 应对模型的偏差与方差问题

  • 问题描述:模型的偏差与方差问题会影响其泛化能力。高偏差导致欠拟合,高方差导致过拟合。

  • 解决方案

    • 减少偏差:通过增加模型复杂度、引入更多特征来减少偏差。
    • 减少方差:通过正则化、集成学习方法来减少方差,提高模型的稳健性。

6 总结与练习

经过前几章的学习,我们已经深入探讨了线性回归与曲线拟合的基本概念、数学原理、实践应用及其在实际项目中的应用。这一章将对所学内容进行全面总结,并提供一系列练习题和项目,帮助你巩固所学知识,并应用于实际问题中。

6.1 本章总结

6.1.1 线性回归与曲线拟合的重要性

  • 线性回归:作为最基础的统计学习方法之一,线性回归在解释变量之间的线性关系、预测、分类等任务中具有广泛应用。通过最小二乘法,我们可以得到最优的回归系数,并进一步进行模型评估和诊断。
  • 曲线拟合:当数据表现出非线性关系时,曲线拟合提供了更灵活的建模方法。通过多项式回归、指数回归等非线性模型,我们可以更准确地捕捉数据中的复杂模式。

6.1.2 模型的选择与优化

  • 模型选择:不同数据场景下,需要根据实际情况选择合适的模型。线性回归适用于简单线性关系,而曲线拟合则更适合复杂的非线性关系。
  • 模型优化:通过特征工程、正则化、交叉验证等技术,我们可以改进模型性能,减少过拟合与欠拟合现象,提升模型的泛化能力。

6.1.3 实战应用

  • 在实际案例中,如房价预测和产品销量预测,我们演示了如何通过数据准备、模型选择、训练与优化,以及结果评估等步骤,构建高效的回归模型。这些实践经验不仅帮助我们理解了理论知识,还提高了在实际应用中的问题解决能力。

6.1.4 常见问题与解决方案

  • 在回归模型的应用过程中,我们常常遇到如多重共线性、异方差性、过拟合与欠拟合等问题。通过诊断工具和技术手段,如正则化、残差分析、主成分分析等,可以有效应对这些挑战,确保模型的稳健性。

6.2 练习题与项目

为帮助你进一步巩固所学知识,这里提供了一些练习题和一个综合性项目。通过这些练习,你将能够熟练掌握线性回归和曲线拟合的应用。

  1. 线性回归基础

    • 解释线性回归中最小二乘法的原理,并推导出回归系数的计算公式。
    • 对以下数据集应用线性回归,求出回归方程,并解释回归系数的意义。
      • 数据集:[X: 1, 2, 3, 4, 5], [Y: 2, 4, 5, 4, 5]
    • 使用Python实现上述线性回归模型,并绘制回归线与数据点的图形。
  2. 曲线拟合

    • 说明在什么情况下我们需要使用曲线拟合而非线性回归,并列举两个应用场景。
    • 使用多项式回归拟合以下数据,并分析多项式阶数对模型拟合效果的影响。
      • 数据集:[X: 1, 2, 3, 4, 5], [Y: 2.2, 4.1, 5.6, 4.9, 7.8]
    • 在Python中实现多项式拟合,并绘制拟合曲线。对比不同阶数的多项式模型在拟合效果上的差异。
  3. 模型评估与诊断

    • 解释R²和均方误差(MSE)指标,并使用它们评估以下回归模型的表现。
      • 数据集:真实值 [Y_true: 3, -0.5, 2, 7], 预测值 [Y_pred: 2.5, 0.0, 2, 8]
    • 讨论在模型评估中,交叉验证的作用,并列举两种交叉验证的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu每次登录都提示有新的更新,apt更新却0个软件需要升级:清空MOTD消息 安装update-notifier-common组件 运行强制更新脚本

问题 每登录ubuntu,都会显示有更新需要注意。 80更新可以立即应用。 这些更新中有 1 个是标准安全更新。 要查看这些附加更新,请运行:apt list --upgradable 然而使用更新命令却提示0可更新 查询了一下,这似乎是MOTD的错误&#x…

Gartner发布2024年网络风险管理成熟度曲线:使网络安全战略与业务目标保持一致的概念、方法、流程和技术

网络风险管理现在是高管和监管机构最关注的问题,它采用多种方法和技术来支持治理、风险管理和合规性。安全和风险管理领导者可以使用此技术成熟度曲线来评估解决方案并做出适当的采用决策。 战略规划假设 到 2026 年,60% 的网络安全职能将实施以业务影响…

【Qt】Qt编程注意事项

目录 Qr中的命名规范 Qt Creator中的快捷键 查询文档的方式 Qt窗口坐标体系 Qr中的命名规范 在学习编程语言阶段,给变量、函数、文件、类命名是非常有讲究的。 命名要有描述性,不要使用abc,xyz这种比较无规律的名字类描述。如果名字比较…

什么是前端微服务,有何优势

随着互联网技术的发展,传统的单体应用架构已经无法满足复杂业务场景的需求。微服务架构的兴起为后端应用的开发和部署提供了灵活性和可扩展性。与此同时,前端开发也经历了类似的演变,前端微服务作为一种新兴的架构模式应运而生。 一、前端微服…

开源web版3D展示工具Online3DViewer

Online3DViewer是一个免费且开源的Web解决方案,它允许用户在浏览器中直接预览和探索3D模型。 以下是关于Online3DViewer的详细介绍: 一、基本概述 定义:Online3DViewer是一个在线3D模型查看器,支持多种3D文件格式,用…

如何评价2023年数学建模国赛?

2023年的赛题已经发布了,ABC三题侧重点不同,但是A题专业性较强,涉及微分方程,以及优化模型,B题题目为多波束测线问题,第一问需要计算,结合函数和几何的相关知识点,问题2涉及到最小路径问题,如下有总结,可以查看相应的模块方法,C题目为“蔬菜类商品的自动定价与补货决…

C++ 哈希使用与底层原理

哈希的概念 哈希是一种建立映射的思想,我们尝试用的数据结构是哈希表 ,又称「散列表」,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具 体而言,我们向哈希表输入一个键 key ,则可以在 &am…

Docker③_VMware虚拟机和Docker的备份与恢复

目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…

【C语言-扫雷游戏】mineweeper【未完成】

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱&…

psychopy stroop 实验设计

斯特鲁stroop实验就是色词一致/不一致实验。 设计步骤如下: 1. 先去设置中将Input改为PsychToolbox, 2. 然后左上角File-New新建一个 3. 右键trial,rename改名 改成自己想要的名字即可,比如欢迎界面welcome。 4. 接下来添加提示语…

老阳推荐的temu选品师项目能不能做成?

在不断变化的电商领域,temU选品师项目作为一种新兴职业,受到了越来越多的关注。老阳的推荐使得这一项目引起了不少人的兴趣,那么,temU选品师项目究竟能否成功呢?让我们从一个新的角度来探讨这一问题。 新兴市场的机遇与挑战 temU…

C语言 ——— 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

目录 题目要求 代码思路 代码实现 题目要求 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串 例如 s1 "AABCD" ;s2 "BCDAA" ,返回1 s1 "AABcd" ;s2 "BCDAA" …

免费分享一套SpringBoot+Vue仓库(进销存)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue仓库(进销存)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue仓库(进销存)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 该系统的设计初衷是解决传统仓库管理中存…

高可用集群KEEPALIVED

文章目录 高可用集群KEEPALIVEDVRRPkeepalived 部署环境准备 开启通信功能设置独立日志设置独立子配置文件抢占模式和非抢占模式延迟抢占非抢占模式 单播模式邮箱邮件通知脚本 双主架构实现ipvs的高可用性lvs-dr VRRP Script实现HAProxy高可用 文章相关连接如下: 如…

力扣 | 动态规划 | 在字符串的应用 | 最长回文子串、最长回文子序列、单词拆分、编辑距离

文章目录 1.最长回文子串2.最长回文子序列3.单词拆分4.编辑距离5. 共同点和思路6. 各个问题的思路和扩展1. 最长回文子串2. 最长回文子序列3. 单词拆分4. 编辑距离 在解答字符串动态规划的应用时,我们需要非常注意一个问题:   有时候我们定义 d p [ i …

MoonBit 周报 Vol.53:新增高级循环语法、引入字符串插值、MoonBit AI 支持代码解释!

weekly 2024-08-05 MoonBit更新 添加了基于 Iter 和 Iter2 类型的 for .. in 循环支持: fn main {for x in [ 1, 2, 3 ] {println(x)}for k, v in { "x": 1, "y": 2 } {println("\{k} > \{v}")} }for 与 in 之间可以使用 1&…

事务及事务的控制.特性

一.事务 1.事务定义 ​ 逻辑上多个DML操作形成的一个整体,多个DML操作要么全都执行成功,要么全都执行失败,如果是DDL的操作会自动提交事务. 2.事务的控制 命令 start transaction开启事务rollback 回滚commit提交事务 mysql默认自动提交事务,每个DML执行完毕后,直接提交事…

【Linux】编译器gcc/g++ 、程序翻译过程、动静态库

目录 1.gcc/g Linux编译器1.1. gcc与g的安装1.2. gcc与g用法1.2.1.gcc用法1.2.2. g用法 1.3. 程序翻译的过程1.3.1. 前提知识:1.3.2. 预处理(语言种类不变)条件编译用途: 1.3.3. 编译(生成汇编语言)1.3.4. …

性能测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…

‘Task‘ object is not callable ERROR

pycharm 调试异步的代码报错 TypeError: ‘Task‘ object is not callable ERROR: Exception in callback <Task 解决方法:点击菜单栏帮助-查找操作-注册表,在注册表中搜索python.debug.asyncio.repl禁用即可