小白零基础学数学建模系列-Day3-线性回归模型的构建与评估
文章目录
- 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=1∑n(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(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
β ^ 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
具有高度相关性的特征。通过查看相关矩阵可以发现,RM
与MEDV
之间具有较强的正相关性(0.7),而LSTAT
与MEDV
之间具有较强的负相关性(-0.74)。 -
在为线性回归模型选择特征时,检查特征之间的多重共线性是非常重要的一步。比如,特征
RAD
和TAX
之间的相关性为0.91,这表明这两个特征之间有很强的相关性,因此我们不应同时选择这两个特征来训练模型。类似地,DIS
和AGE
之间的相关性为-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 = targetplt.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_splitX_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_errorlin_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 练习题与项目
为帮助你进一步巩固所学知识,这里提供了一些练习题和一个综合性项目。通过这些练习,你将能够熟练掌握线性回归和曲线拟合的应用。
-
线性回归基础
- 解释线性回归中最小二乘法的原理,并推导出回归系数的计算公式。
- 对以下数据集应用线性回归,求出回归方程,并解释回归系数的意义。
- 数据集:
[X: 1, 2, 3, 4, 5], [Y: 2, 4, 5, 4, 5]
- 数据集:
- 使用Python实现上述线性回归模型,并绘制回归线与数据点的图形。
-
曲线拟合
- 说明在什么情况下我们需要使用曲线拟合而非线性回归,并列举两个应用场景。
- 使用多项式回归拟合以下数据,并分析多项式阶数对模型拟合效果的影响。
- 数据集:
[X: 1, 2, 3, 4, 5], [Y: 2.2, 4.1, 5.6, 4.9, 7.8]
- 数据集:
- 在Python中实现多项式拟合,并绘制拟合曲线。对比不同阶数的多项式模型在拟合效果上的差异。
-
模型评估与诊断
- 解释R²和均方误差(MSE)指标,并使用它们评估以下回归模型的表现。
- 数据集:
真实值 [Y_true: 3, -0.5, 2, 7], 预测值 [Y_pred: 2.5, 0.0, 2, 8]
- 数据集:
- 讨论在模型评估中,交叉验证的作用,并列举两种交叉验证的方法。
- 解释R²和均方误差(MSE)指标,并使用它们评估以下回归模型的表现。
相关文章:

小白零基础学数学建模系列-Day3-线性回归模型的构建与评估
文章目录 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…...

Flutter中的 extended_nested_scroll_view 库:介绍与使用指南
在开发Flutter应用时,处理复杂的滚动效果是一项常见的任务。Flutter提供了NestedScrollView来实现可折叠的应用栏与滚动列表的结合,但在某些情况下,NestedScrollView可能不够强大。为了解决这些问题,我们可以使用extended_nested_…...

Elasticsearch 综合搜索案例解析
Elasticsearch 是一个功能强大的搜索引擎,它不仅支持全文搜索,还提供了排序、分页、高亮显示等多种搜索结果处理功能。通过综合使用这些功能,我们可以构建出丰富而高效的搜索应用。本文将通过一个具体的案例,介绍如何在 Elasticse…...

Web存储革命:揭秘JavaScript的会话存储(sessionStorage)
标题:Web存储革命:揭秘JavaScript的会话存储(sessionStorage) 在当今的Web开发中,状态管理和数据持久化是构建交互式应用的关键。JavaScript提供了多种客户端存储解决方案,其中会话存储(sessio…...

基于python的百度迁徙迁入、迁出数据分析(九)
副标题:从百度迁徙数据看——人口虹吸效应 人口虹吸效应:人口虹吸效应是指大城市或中心城市因其经济、文化、教育、医疗等资源的优势,吸引周边地区的人口、资本和其他资源向其集中的一种现象。这种效应在城市化进程中尤其明显,通…...

2025上海礼品展 华东礼品工艺品展览会
2025第25届上海国际礼品及家居用品展 在璀璨繁华的上海,一场盛大的礼品盛宴即将拉开帷幕。2025年上海国际礼品及 家居用品展览会(简称“华礼展”),作为华东地区乃至全国范围内备受瞩目的礼 品行业盛会,将于2025年6月29日至7月1日在上海新国…...

Flink开发(一):概述与基础
目录 1. Flink概述 1.1 什么是Flink? 1.2 Flink的主要特点 2. Flink的核心组件 2.1 Flink架构 2.2 数据流模型 3. Flink的基础应用 3.1 开发环境配置 3.3 数据源和数据接收器 4. Flink的高级功能 4.1 状态管理与容错 4.2 窗口操作 5. Flink的应用场景 …...

GD32E503实现串口中断收发功能
如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…...

照片怎么提取文字?分享5种简单好用的提取方法
在我们日常的学习或者是办公中,往往会使用到大量的图片文件,而在这些图片中往往蕴含着丰富的文字信息,但手动输入不仅费时费力,还容易出错。如果能够一键提取出图片中的文字就会大大提高工作效率,下面给大家分享5种提取…...

最佳云服务器推荐:三丰云免费虚拟主机和云服务器
随着云计算技术的不断发展,越来越多的企业和个人开始将业务迁移到云端。在这个过程中,选择一款稳定、高效、性价比高的云服务器至关重要。今天,我就为大家推荐一家备受好评的云服务器提供商——三丰云(https://www.sanfengyun.com…...

IPKISS Tutorial 目录(目前 45 篇 持续更新中,部分教程尚未制作成目录)
IPKISS Tutorial 目录 芯片版图绘制教程IPKISS Tutorial(5)Basis直接创建结构(1)PCell(3)Layer and Template(Trace Template)(2)参数查询(2)Lumerical API&a…...

加强混合工作时代的组织网络安全态势
随着组织转向采用和实施混合和远程工作模式,网络安全的重要性从未如此重要。虽然工作场所的这种演变提供了灵活性并有望提高生产力,但它也带来了组织无法忽视的无数网络安全挑战。多样化工作环境的整合需要强大的安全措施、创新的保护策略和警惕的文化&a…...

vivado报错:file ended before end of clause
最近在学习Xilinx FPGA时,遇到 Vivado 报错如下图所示: 刚开始,看到错误是在第1行代码中出现的,我的第一反应是该行代码写错了,然后搜了搜语法,发现没错。 分析报错信息发现,该错误应该是和文件…...

基于asp.net的webform框架的校园点餐系统源码
今天给大家分享一套基于asp.net的webform框架的网页点餐系统,适合课程设计参考及其自己学习,需要的小伙伴自己参考下,下载链接我放在后面了 主要功功能 系统的主要功能包含:前端点餐页面、加入购物车、商品食物浏览、我的购 物车…...

俞敏洪,真窝囊?
文|琥珀食酒社 作者 | 璇子 大家都被俞敏洪骗了 当年《中国合伙人》一播出 俞敏洪竟抱怨黄晓明说: “你把我演得太窝囊!” 那俞敏洪真的不窝囊吗? 他培养出董宇辉 让他赚了近6亿 结果人没留住、公司也送了人 还要被丈母娘…...

速盾:高防ip和cdn哪个好?
高防IP和CDN是两种常见的网站安全解决方案,它们在提供网站安全保护方面有着不同的优势和特点。下面,我们将从技术原理、性能优势和适用场景等方面进行比较,帮助您选择适合自己网站的解决方案。 首先,我们来看看高防IP的特点。高防…...

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理
本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理,同时总结一些代表性工作。 注:图像代表Image,视频代表Video(不含声音),音频代表 Audio/Music,语音代表Speech 各种…...

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?
什么是 Headlesschrome? Headless?是的,这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互,你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…...

JDK 8 有哪些新特性?
JDK 8 引入了一系列新特性,主要包括: 1. 元空间替代了永久代 解决了永久代的内存管理、性能问题。提高了类加载器的隔离性。增强了可扩展性和跨平台性。提升了与垃圾收集器的兼容性。 因为 JDK8 要把 JRockit 虚拟机和 Hotspot 虚拟机融合,…...

C++ Win32API 贪吃蛇游戏
程序代码: #include <windows.h> #include <list> #include <ctime>// 定义游戏区域大小 const int width 20; const int height 20;// 定义贪吃蛇的方向 enum Direction { UP, DOWN, LEFT, RIGHT };// 定义贪吃蛇的节点 struct SnakeNode {in…...

【Python实现代码视频/视频转字符画/代码风格视频】
该程序改良自GitHub开源项目VideoCharDraw 在源程序CharDraw_thread.py 带压缩和多线程版本字符画的基础上使用Tkinter库添加了图形化的操作,使用户操作体验更方便。 什么是视频字符画? 视频转字符画是一种将视频中的每一帧图像转换为由字符组成的图…...

基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统
Title 题目 Evaluation of a Cascaded Deep Learning–based Algorithm for Prostate Lesion Detection at Biparametric MRI 基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估 Background 背景 Multiparametric MRI (mpMRI) improves prostate cancer (PCa) de…...

基于STM32开发的智能门铃系统
目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭门铃系统智能社区门禁管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门铃系统结合了传统门铃功能与现代技术,通过摄像头、麦克风、…...

【WebRTC指南】远程视频流
远程视频流使用入门 RTCPeerConnection 连接到远程对等设备后,就可以在它们之间流式传输音频和视频。此时,我们会将从 getUserMedia() 收到的数据流连接到 RTCPeerConnection。媒体流包含至少一个媒体轨道,当我们想将媒体传输到远程对等设备时,它们会分别添加到 RTCPeerCo…...

前端构建URL的几种方法比对,以及函数实现
当我们在前端开发中处理 URL 时,可能会用到字符串拼接、ES6 模板语法 (template literals) 或者使用 new URL() 构造函数。这三者各有优劣,适用于不同的场景。 1. 字符串拼接与 ES6 模板语法 字符串拼接 和 ES6 模板语法 都是将不同的字符串片段组合在…...

场外个股期权如何发出行权指令?
场外期权行权指令也就是平仓指令的意思,一般场外个股期权交易有三种方式开仓和行权平仓指令,分别是市价,限价和半小时询价,跟普通股票的买卖和交易方式类似,唯一区别是手动发出场外个股期权的行权指令,下文…...

AH8681锂电升压3.7升5V升12V 2A可支持QC2.0 3.0
135.3806.7573在探讨AH8681这款专为3.7V升压5V至12V,并具备2A输出能力,同时兼容QC2.0与QC3.0快充协议的升压芯片时,我们不得不深入其技术细节、应用场景、设计优势以及市场定位等多个维度,以全面理解其在现代电子设备中的重要作用…...

那些年我们一起遇到过的奇技淫巧
EVAL长度限制突破技巧 PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell? 写一段限制长度在小于17位的字符,拿下webshell <?php highlight_file(__FILE__); $param $_REQUEST[param]; if (strlen($param) < 17 &&am…...

机器学习笔记:编码器与解码器
目录 介绍 组成结构 代码实现 编码器 解码器 合并编码器-解码器 思考 介绍 在机器翻译中,输入的序列与输出的序列经常是长度不相等的序列,此时,像自然语言处理这种直接使用循环神经网络或是门控循环单元的方法就行不通了。因此&#x…...

加密狗创新解决方案助力工业自动化
面临的挑战 早在1991年,COPA-DATA就认识到需要一个既能提供长期保护又能灵活应对的解决方案,以防止软件盗版并确保客户在各种复杂的工业环境下能够顺利使用其产品。这一解决方案不仅要兼容Windows系统,还必须在网络连接受限的情况下ÿ…...