机器学习算法之回归算法

一、回归算法思维导图

二、算法原理和实例代码

1、线性回归

1.1、概念

‌‌线性回归算法是一种统计分析方法,用于确定两种或两种以上变量之间的定量关系。‌ 线性回归算法通过建立线性方程来预测因变量(y)和一个或多个自变量(x)之间的关系。其基本形式为 y = wx + e,其中 w 是权重,x 是自变量,e 是误差项。

1.2、算法原理

线性回归算法的核心在于找到最佳的拟合直线,使得预测值与实际值之间的误差最小。这通常通过最小二乘法来实现,即最小化预测值与实际值之差的平方和。线性回归可以分为一元线性回归和多元线性回归:

(1)一元线性回归‌:只有一个自变量 x 和一个因变量 y。 ‌(2)多元线性回归‌:有多个自变量 x1, x2, ..., xn 和一个因变量 y。

1.3、应用场景

线性回归算法广泛应用于各个领域,包括但不限于: (1)‌经济学‌:预测股票价格、经济增长等。 ‌

(2)医学‌:预测疾病发病率、药物效果等。

(3)环境科学‌:预测气候变化、污染水平等。 ‌

(4)市场营销‌:预测销售量、市场份额等。

1.4、公式推导

线性回归方程的推导过程包括以下几个步骤: ‌

(1)计算平均值‌:分别计算 x 和 y 的平均值。

(2)计算分子和分母‌:使用最小二乘法计算回归系数 b 和 a。 ‌

(3)建立方程‌:最终得到线性回归方程 y = bx + a,其中 b 是斜率,a 是截距。

1.5、实例分析

假设有一组数据点 (x1, y1), (x2, y2), ..., (xn, yn),线性回归的目标是找到一条直线 y = bx + a,使得所有数据点到这条直线的垂直距离的平方和最小。通过最小二乘法,可以求解出最佳的 b 和 a 值,从而得到具体的线性回归方程。

1.6、具体代码
鸢尾花数据集介绍

该数据集包含了三个品种的鸢尾花(Setosa、Versicolor、Virginica)每个品种各有50个样本,共计150个样本。对于每个样本,测量了4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及其所属的品种标签。

数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。对花瓣我们可能比较熟悉,花萼是什么呢?花萼是花冠外面的绿色被叶,在花尚未开放时,保护着花蕾。四个属性的单位都是cm,属于数值变量,四个属性均不存在缺失值的情况,字段如下表所示:

bash 复制代码
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

# 加载鸢尾花数据集
def LoadIrisDataset():
  # 1.加载鸢尾花数据集
  iris = datasets.load_iris()
  X = iris.data  # 特征数据,包含所有样本的4个特征
  y = iris.target  # 目标变量,目前我们只使用第一个目标(0-1-2类)
  # 2.我们选择使用一个特征来进行线性回归,例如花瓣长度
  X = X[:, [2]]  # 选择第三个特征:花瓣长度
  # 3.将数据集分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 4.创建线性回归模型
  model = LinearRegression()
  # 5.训练模型
  model.fit(X_train, y_train)
  # 6.预测测试集的结果
  y_pred = model.predict(X_test)
  # 7.评估模型性能
  mse = mean_squared_error(y_test, y_pred)
  r2 = r2_score(y_test, y_pred)
  # 8.模型评估
  print(f"系数(斜率): {model.coef_[0]}")
  print(f"截距: {model.intercept_}")
  print(f"均方误差 (MSE): {mse}")
  print(f"决定系数 (R²): {r2}")
  return X_test, y_test, y_pred


# 二、绘制回归结果
def PlotResults(X_test, y_test, y_pred):
  plt.scatter(X_test, y_test, color="black", label="Data")
  plt.plot(X_test, y_pred, color="blue", linewidth=3, label="Linear Regression")
  plt.xlabel("花瓣长度 (cm)")
  plt.ylabel("目标值")
  plt.title("线性回归模型预测鸢尾花数据集")
  plt.legend()
  plt.show()

if __name__ == "__main__":
  X_test, y_test, y_pred = LoadIrisDataset()
  PlotResults(X_test, y_test, y_pred)

控制台输出结果为:

2、岭回归

2.1、概念

岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

2.2、算法原理
2.3、应用场景

(1)经济学:用于经济数据建模,以预测经济变量之间的关系。

(2)生物统计学:用于基因表达分析和生物信息学领域,以处理高维数据。

(3)工程学:用于工程建模和控制系统设计,以改善模型的鲁棒性。

(4)金融学:用于资产定价和风险管理,以降低投资组合的风险。

2.4、实例分析

这段代码实现了以下功能:

(1). 创建了一个具有10个特征的示例数据集,其中包含100个样本。

(2).将数据集划分为训练集和测试集,其中80%的数据用于训练,20%用于测试。

(3).使用scikit-learn库中的Ridge类定义了岭回归模型,并指定了岭参数(alpha)为1.0。

(4).在训练集上训练了岭回归模型。

(5).在测试集上进行了预测,并计算了预测结果与真实值之间的均方误差(MSE)。

(6).最后,绘制了预测值与真实值的对比图,以直观地展示模型的性能。

bash 复制代码
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error


def TrainRidgeModel():
  # 1.创建示例数据集
  np.random.seed(0)
  X = np.random.rand(100, 10)  # 100个样本,10个特征
  y = 2 * X[:, 0] + 3 * X[:, 1] + np.random.randn(100)  # 构造线性关系,并添加噪声
  # 2.将数据集划分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 3.定义岭回归模型
  ridge = Ridge(alpha=1.0)  # alpha为岭参数,默认为1.0
  # 4.在训练集上训练模型
  ridge.fit(X_train, y_train)
  # 5.在测试集上进行预测
  y_pred = ridge.predict(X_test)
  # 6.计算均方误差(MSE)作为性能评估指标
  mse = mean_squared_error(y_test, y_pred)
  print("岭回归模型的均方误差为:", mse)
  return y_test, y_pred


def PlotPredictions(y_test, y_pred):
  # 1.绘制预测值与真实值的对比图
  plt.figure(figsize=(8, 6))
  plt.scatter(y_test, y_pred, color='blue')
  plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], linestyle='--', color='red')
  plt.xlabel('True Values')
  plt.ylabel('Predictions')
  plt.title('True vs. Predicted Values (Ridge Regression)')
  plt.show()
  

if __name__ == '__main__':
  y_test, y_pred = TrainRidgeModel()
  PlotPredictions(y_test, y_pred)

控制台输出结果为:

3、Lasso回归

3.1、概念

岭回归是一种正则化技术,用于处理多重共线性问题。在标准线性回归中,模型试图找到最小化残差平方和的参数。然而,在存在高度相关特征的情况下,最小二乘估计可能会变得不稳定。为了克服这个问题,岭回归通过向损失函数添加一个惩罚项(即L2正则化项),使得模型系数变得更小,从而降低了过拟合的风险。
岭回归的目标函数是:

其中,λ 是正则化参数,控制着惩罚的强度。

特点:

(1).正则化类型: 使用L2正则化,也称为权重衰减。

(2).系数收缩: 岭回归通过添加平方项来收缩系数,但不会将它们缩减至零。

(3).多共线性处理: 对于具有多重共线性的数据集非常有效,因为它可以稳定系数估计。

(4).参数调整: 正则化参数(λ)的选取对于模型性能至关重要。

3.2、应用场景

当数据集中存在高度相关的特征时。

当特征数量较大,但样本数量相对较少时。

当我们关心模型的解释性,而不是特征选择时。

3.3、实例分析
bash 复制代码
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

def LoadIrisAndPredict():
  # 1.加载鸢尾花数据集
  iris = datasets.load_iris()
  X = iris.data  # 特征数据,包含所有样本的4个特征
  y = iris.target  # 目标变量,目前我们只使用第一个目标(0-1-2类)
  # 2.我们选择使用一个特征来进行Lasso回归,例如花瓣长度
  X = X[:, [2]]  # 选择第三个特征:花瓣长度
  # 3.将数据集分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 4.创建Lasso回归模型
  lasso_model = Lasso(alpha=1.0)  # alpha是正则化强度
  # 5.训练模型
  lasso_model.fit(X_train, y_train)
  # 6.预测测试集的结果
  y_pred = lasso_model.predict(X_test)
  # 7.评估模型性能
  mse = mean_squared_error(y_test, y_pred)
  r2 = r2_score(y_test, y_pred)
  print(f"系数(斜率): {lasso_model.coef_[0]}")
  print(f"截距: {lasso_model.intercept_}")
  print(f"均方误差 (MSE): {mse}")
  print(f"决定系数 (R²): {r2}")
  return X_test, y_test, y_pred


# 可视化结果
def VisualizeResults(X_test, y_test, y_pred):
  plt.scatter(X_test, y_test, color="black", label="Data")
  plt.plot(X_test, y_pred, color="blue", linewidth=3, label="Lasso Regression")
  plt.xlabel("花瓣长度 (cm)")
  plt.ylabel("目标值")
  plt.title("Lasso回归模型预测鸢尾花数据集")
  plt.legend()
  plt.show()


if __name__ == "__main__":
  X_test, y_test, y_pred = LoadIrisAndPredict()
  VisualizeResults(X_test, y_test, y_pred)

运行结果为:

4、弹性网回归

4.1、概念

弹性网络回归(Elastic Net Regression)是‌岭回归(Ridge Regression)和‌Lasso回归(Lasso Regression)的结合。它通过引入两个正则化参数来实现特征选择和模型稳定性。弹性网络回归的损失函数结合了L1正则化和L2正则化,解决了Lasso在处理高相关特征时的缺陷,并且在处理高维数据时表现优异。

4.2、算法原理
4.3、应用场景和优势

弹性网络回归在处理多重共线性和特征选择方面特别有用。它结合了岭回归和Lasso回归的优点,适用于高维数据集,能够自动选择最重要的特征,同时保持模型的稳定性。弹性网络回归在‌生物信息学、‌金融数据分析等领域有广泛应用。

4.4、实例分析
bash 复制代码
在这里插入代码片


5、ARIMA

5.1、概念

ARIMA(AutoRegressive Integrated Moving Average)是一种用于时间序列预测的统计方法。它结合了自回归(Autoregressive, AR)、差分(Integrated,I)和移动平均(Moving Average, MA)三个部分,以建模和预测时间序列数据。

5.2、算法原理

(1)检查平稳性:首先需要确保时间序列数据是平稳的。如果数据不是平稳的,则需要通过差分使其变得平稳。

(2)确定参数 p、d 和 q:

1)选择合适的自回归阶数 ( p )。

2)确定使数据平稳所需的差分阶数 ( d )。

3)选择合适的移动平均阶数 ( q )。

(3)模型拟合:使用确定的参数进行模型拟合,以最小化预测误差。

(4)模型验证和评估:通过残差分析、AIC/BIC准则等方法来评估模型的性能,并进行必要的调整。

5.3、应用场景

(1)金融市场

股票价格预测:利用历史股价数据预测未来的股价走势。

汇率变动预测:通过观察历史汇率数据来预测未来汇率的变化。

(2) 宏观经济分析

通货膨胀率预测:根据过去的通胀数据,预测未来的通货膨胀趋势。

GDP增长率预测:利用历史的经济数据来预测国家或地区的经济增长情况。

(3) 供应链管理

库存预测:通过历史销售数据来预测未来的需求量,从而更好地进行库存管理和优化。

生产计划制定:根据历史生产和销售数据来调整未来的生产计划。

(4)气象和环境科学

温度变化预测:利用过去的气温数据来预测未来几天或几周的天气情况。

空气质量预测:通过分析历史空气质量数据,预测未来的空气污染程度。

(5)销售预测

产品销量预测:根据过去的产品销售数据来预测未来的销售额,从而更好地进行库存管理和营销策略制定。

5.4、算法实例

假设我们有一个时间序列数据集,并且经过检验发现该数据是不平稳的。我们可以先应用一阶差分使其变得平稳(即 ( d = 1 )),然后选择合适的( p ) 和 ( q ) 值。假设通过试错法确定了 ( (p, d, q) = (2, 1, 2) ),那么模型可以表示为 ARIMA(2, 1, 2)。
使用Python实现ARIMA 在Python中,你可以使用statsmodels库来实现ARIMA模型。以下是一个简单的示例:

bash 复制代码
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题


def LoadIrisData():
  # 1.假设我们有一个时间序列数据集
  data = pd.read_csv('time_series_data.csv', parse_dates=['date'], index_col='date')
  data.index.freq = 'D'  # 设置频率为每天
  # 2.检查数据平稳性并进行差分
  diff_data = data.diff().dropna()
  # 3.确定参数 p, d, q
  model = ARIMA(data, order=(2, 1, 2))
  results = model.fit()
  print(results.summary())
  # 4.预测未来值
  forecast_steps = 10
  forecast = results.get_forecast(steps=forecast_steps)
  mean_forecast = forecast.predicted_mean
  conf_int = forecast.conf_int()
  return data, mean_forecast, conf_int


# 绘制预测结果
def PlotForecast(data, mean_forecast, conf_int):
  plt.figure(figsize=(14, 7))
  plt.plot(data, label='Original Data')
  plt.plot(mean_forecast.index, mean_forecast.values, color='red', label='Forecast')
  plt.fill_between(conf_int.index, conf_int.iloc[:, 0], conf_int.iloc[:, 1], color='pink', alpha=0.3)
  plt.legend()
  plt.show()


if __name__ == '__main__':
  data, mean_forecast, conf_int = LoadIrisData()
  PlotForecast(data, mean_forecast, conf_int)

运行结果如下:

相关推荐
南城花随雪。16 分钟前
蚁群算法(Ant Colony Optimization)详细解读
算法
lLinkl23 分钟前
Java面试经典 150 题.P27. 移除元素(002)
算法
tangguofeng29 分钟前
合并排序算法(C语言版)
算法
ChaoZiLL1 小时前
关于我的数据结构与算法——初阶第二篇(排序)
数据结构·算法
爱编程的古惑仔1 小时前
leetcode刷题笔记——15.三数之和
笔记·算法·leetcode
T0uken2 小时前
【机器学习】Softmax 函数
神经网络·机器学习·分类
MogulNemenis2 小时前
随机题两题
java·后端·学习·算法
single5942 小时前
【综合算法学习】(第十篇)
java·数据结构·c++·vscode·学习·算法·leetcode
TangKenny2 小时前
荒岛逃生游戏
算法·游戏
bitenum3 小时前
qsort函数的学习与使用
c语言·开发语言·学习·算法·visualstudio·1024程序员节