文章目录
哈喽,我是cos大壮!
关于回归算法的总结,我见到过的有简单的,也有特别详细的。百花齐放,各有优略!
今天总结了关于回归算法的方方面面,涉及到原理的解释、入门代码等等。
总的来说,回归算法是一类用于预测连续数值输出的监督学习算法。
根据输入特征预测一个或多个目标变量。
回归算法有多个分支和变种,每个分支都有其独特的优缺点。
今天要说的有8个部分,大家伙请看~
- 线性回归
- 多项式回归
- 岭回归
- Lasso回归
- 弹性网络回归
- 逻辑斯蒂回归
- 决策树回归
- 随机森林回归
大家伙如果觉得还不错!可以点赞、转发安排起来,让更多的朋友看到。
一起来看看吧~
线性回归(Linear Regression)
首先,线性回归(Linear Regression)是一种用于建立连续数值输出与一个或多个输入特征之间关系的监督学习算法。
它假设输出与输入特征之间存在线性关系,即可以用一条直线来拟合数据。
线性回归的目标是找到一条最佳拟合直线,以最小化预测值与真实值之间的误差。
简单线性回归:
y
=
m
x
+
b
y = mx + b
y=mx+b
多元线性回归:
y
=
b
0
+
b
1
x
1
+
b
2
x
2
+
…
+
b
n
x
n
y = b_0 + b_1x_1 + b_2x_2 + \ldots + b_nx_n
y=b0+b1x1+b2x2+…+bnxn
其中:
- y y y 是预测的目标变量。
- x x x 是输入特征。
- m m m 是斜率(简单线性回归中)或权重(多元线性回归中)。
- b b b 是截距。
- b 0 , b 1 , b 2 , … , b n b_0, b_1, b_2, \ldots, b_n b0,b1,b2,…,bn 是多元线性回归中的权重。
下面是一个简单的案例,随机生成的数据来演示:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 1) # 输入特征
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1) # 生成输出数据,带有一些噪声
# 创建线性回归模型
model = LinearRegression()
# 拟合模型
model.fit(X, y)
# 预测
y_pred = model.predict(X)
# 绘制原始数据和拟合直线
plt.scatter(X, y, label='Original Data')
plt.plot(X, y_pred, color='red', linewidth=3, label='Fitted Line')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Linear Regression Example')
plt.show()
上面案例中,使用LinearRegression
模型拟合数据,并绘制了原始数据和拟合直线的可视化图表。
实际情况下,可以根据自己的需求修改输入数据和模型来适应不同的案例。
多项式回归(Polynomial Regression)
多项式回归是一种回归分析方法,它通过使用多项式函数来拟合数据,而不仅仅是线性函数。
多项式回归通常用于处理数据与因变量之间的非线性关系,这种关系不能用线性回归来准确建模。
多项式回归的一般形式可以表示为:
Y = a 0 + a 1 X + a 2 X 2 + … + a n X n + ϵ Y = a_0 + a_1X + a_2X^2 + \ldots + a_nX^n + \epsilon Y=a0+a1X+a2X2+…+anXn+ϵ
其中, Y Y Y 是因变量, X X X 是自变量, a 0 , a 1 , a 2 , … , a n a_0, a_1, a_2, \ldots, a_n a0,a1,a2,…,an 是模型参数, n n n 是多项式的阶数, ϵ \epsilon ϵ 是误差项。
下面展示如何进行多项式回归,包括数据生成、拟合模型以及可视化。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# 生成随机数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.cos(X).ravel() + np.random.randn(80) * 0.1
# 使用多项式特征扩展
poly = PolynomialFeatures(degree=4) # 选择多项式的阶数
X_poly = poly.fit_transform(X)
# 创建线性回归模型
model = LinearRegression()
model.fit(X_poly, y)
# 预测
X_test = np.linspace(0, 5, 100)[:, np.newaxis]
X_test_poly = poly.transform(X_test)
y_pred = model.predict(X_test_poly)
# 绘制原始数据和拟合曲线
plt.scatter(X, y, label='Original Data')
plt.plot(X_test, y_pred, label='Polynomial Regression', color='r')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Polynomial Regression Example')
plt.show()
在这个示例中,首先生成了一组随机的数据点,然后使用四次多项式来拟合这些数据。
拟合后,我们绘制了原始数据点和拟合曲线的可视化图表。
你可以根据自己的数据和需求,修改多项式的阶数和其他参数来进行多项式回归分析,以更好地拟合你的数据。
岭回归(Ridge Regression)
岭回归(Ridge Regression)是一种线性回归的改进方法,用于解决多重共线性(multicollinearity)问题,即自变量之间存在高度相关性的情况。在多重共线性存在时,传统的线性回归模型可能会导致参数估计不稳定,岭回归通过引入正则化项来解决这个问题。
岭回归的目标函数如下所示:
Minimize
(
∑
i
=
1
n
(
y
i
−
β
0
−
∑
j
=
1
p
β
j
x
i
j
)
2
+
λ
∑
j
=
1
p
β
j
2
)
\text{Minimize} \left( \sum_{i=1}^{n} \left( y_i - \beta_0 - \sum_{j=1}^{p} \beta_j x_{ij} \right)^2 + \lambda \sum_{j=1}^{p} \beta_j^2 \right)
Minimize
i=1∑n(yi−β0−j=1∑pβjxij)2+λj=1∑pβj2
其中:
- y i y_i yi 是因变量(目标变量)的观测值。
- β 0 , β 1 , … , β p \beta_0, \beta_1, \ldots, \beta_p β0,β1,…,βp 是模型的参数,其中 β 0 \beta_0 β0 是截距, β 1 , … , β p \beta_1, \ldots, \beta_p β1,…,βp 是自变量的系数。
- x i j x_{ij} xij 是第 i i i 个观测值的第 j j j 个自变量的值。
- λ \lambda λ 是岭回归的超参数,用于控制正则化的强度。
首先,我们生成一个模拟的数据集,以便演示岭回归的效果,并使用matplotlib库进行可视化。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 生成模拟数据集
np.random.seed(0)
n_samples, n_features = 200, 5
X = np.random.randn(n_samples, n_features)
true_coefficients = np.array([4, 2, 0, 0, -1])
y = X.dot(true_coefficients) + np.random.randn(n_samples) * 1.0
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用岭回归拟合数据
alpha = 1.0 # 正则化强度参数
ridge = Ridge(alpha=alpha)
ridge.fit(X_train, y_train)
# 输出岭回归模型的系数
print("Ridge Regression Coefficients:", ridge.coef_)
# 计算模型在测试集上的R^2分数
r_squared = ridge.score(X_test, y_test)
print("R-squared:", r_squared)
# 绘制实际值和预测值的散点图
plt.scatter(y_test, ridge.predict(X_test))
plt.xlabel("Actual Values")
plt.ylabel("Predicted Values")
plt.title("Ridge Regression: Actual vs. Predicted")
plt.show()
这个示例演示了如何使用岭回归来处理多重共线性问题,并可视化实际值与预测值之间的关系。
要注意的是,可以调整超参数alpha的值以控制正则化的强度。
Lasso回归(Lasso Regression)
Lasso回归(Least Absolute Shrinkage and Selection Operator Regression)是一种线性回归的变体,它用于数据特征选择和降维。
与普通线性回归不同,Lasso回归通过对系数进行 L 1 L1 L1正则化来惩罚模型中的不重要的特征,以促使模型选择更少的特征,从而提高模型的泛化能力。
L 1 L1 L1正则化通过在损失函数中添加系数的绝对值之和来实现,这迫使一些系数变为零,从而实现特征选择的效果。
Lasso回归的损失函数如下所示:
Lasso Loss = ∑ i = 1 n ( y i − y ^ i ) 2 + α ∑ j = 1 p ∣ β j ∣ \text{Lasso Loss} = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 + \alpha \sum_{j=1}^{p}|\beta_j| Lasso Loss=i=1∑n(yi−y^i)2+αj=1∑p∣βj∣
其中:
- n n n 是样本数
- y i y_i yi 是观测到的目标值
- y ^ i \hat{y}_i y^i 是模型预测的目标值
- p p p 是特征的数量
- β j \beta_j βj 是特征 j j j 的系数
- α \alpha α 是正则化参数,控制着正则化的强度。较大的 α \alpha α 值将导致更多的特征系数为零。
以下是一个Python案例,演示如何使用Lasso回归拟合一个数据集并可视化结果。我们将使用一个合成的数据集来说明,该数据集包含两个特征和一个目标变量。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 生成合成数据集
X, y = make_regression(n_samples=100, n_features=2, noise=0.5, random_state=42)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建Lasso回归模型
alpha = 1.0 # 正则化参数
lasso = Lasso(alpha=alpha)
# 拟合模型
lasso.fit(X_train, y_train)
# 预测测试集
y_pred = lasso.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
# 绘制特征系数
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], y, label='Feature 1')
plt.scatter(X[:, 1], y, label='Feature 2')
plt.xlabel('Features')
plt.ylabel('Target')
plt.title('Original Data')
plt.legend()
plt.subplot(1, 2, 2)
plt.bar(['Feature 1', 'Feature 2'], lasso.coef_)
plt.xlabel('Features')
plt.ylabel('Coefficient Value')
plt.title('Lasso Coefficients')
plt.show()
上述代码演示了如何使用Lasso
回归对合成数据集进行建模,并且展示了特征系数的可视化。
实际情况中,可以根据自己的数据集和需求调整代码来使用Lasso
回归进行特征选择和建模。
弹性网络回归(Elastic Net Regression)
弹性网络回归(Elastic Net Regression)是一种用于处理回归问题的线性模型,它结合了L1
正则化(Lasso正则化)和L2
正则化(Ridge正则化)的特性,以解决特征选择和过拟合问题。
它的损失函数由两部分组成,一部分是均方误差(Mean Squared Error,MSE),另一部分是L1
和L2
正则化项的组合。
公式如下:
E
l
a
s
t
i
c
N
e
t
L
o
s
s
=
M
S
E
+
α
∗
[
λ
∗
L
1
n
o
r
m
+
(
1
−
α
)
∗
0.5
∗
λ
∗
L
2
n
o
r
m
]
Elastic Net Loss = MSE + α * [λ * L1_{norm} + (1-α) * 0.5 * λ * L2_{norm}]
ElasticNetLoss=MSE+α∗[λ∗L1norm+(1−α)∗0.5∗λ∗L2norm]
其中:
- M S E MSE MSE是均方误差,用来衡量模型预测值与实际值之间的差距。
- λ ( l a m b d a ) λ(lambda) λ(lambda)是正则化参数,用于控制正则化的强度。
- L 1 n o r m L1_{norm} L1norm是L1正则化的项,它是模型系数的绝对值之和。
- L 2 n o r m L2_{norm} L2norm是L2正则化的项,它是模型系数的平方和。
-
α
(
a
l
p
h
a
)
α(alpha)
α(alpha)是一个介于0和1之间的参数,用于权衡
L1
和L2
正则化的贡献。当 α = 0 α=0 α=0时,模型等同于Ridge
回归,当 α = 1 α=1 α=1时,模型等同于Lasso
回归。
下面案例演示如何使用弹性网络回归处理一个数据集,并绘制可视化图表。
同样的也是使用一个自动生成的示例数据集。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import ElasticNet
from sklearn.datasets import make_regression
# 生成示例数据集
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
# 创建弹性网络回归模型
elastic_net = ElasticNet(alpha=0.5, l1_ratio=0.5, random_state=42)
# 拟合模型
elastic_net.fit(X, y)
# 预测
y_pred = elastic_net.predict(X)
# 绘制原始数据和拟合线
plt.scatter(X, y, label='Actual Data', color='b')
plt.plot(X, y_pred, label='Elastic Net Regression', color='r')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Elastic Net Regression')
plt.show()
# 打印模型系数
print("Elastic Net Coefficients:")
print("Intercept:", elastic_net.intercept_)
print("Coefficient:", elastic_net.coef_)
在这个案例中,我们首先生成了一个简单的示例数据集,然后创建了一个弹性网络回归模型,拟合数据并进行了预测。
Elastic Net Coefficients:
Intercept: 0.05906898426354079
Coefficient: [33.78639071]
最后,我们使用Matplotlib绘制了原始数据和拟合线的可视化图表,并打印了模型的系数。
你可以根据自己的需求和数据集来调整正则化参数α和λ以及数据集的大小以获得更好的效果和可视化。
逻辑斯蒂回归(Logistic Regression)
逻辑斯蒂回归(Logistic Regression)是一种用于分类问题的统计学习方法。
通过建立一个逻辑斯蒂函数(也称为S型函数)来预测二分类问题中的概率。
逻辑斯蒂函数将输入值映射到0和1之间的概率值,通常用于估计某个事件发生的概率。
数学表达式:
P ( Y = 1 ∣ X ) = 1 1 + e − ( W X + b ) P(Y=1|X) = \frac{1}{1 + e^{-(WX + b)}} P(Y=1∣X)=1+e−(WX+b)1
其中:
- P ( Y = 1 ∣ X ) P(Y=1|X) P(Y=1∣X) 是观测到类别1的概率。
- X X X 是输入特征向量。
- W W W 是特征权重向量。
- b b b 是偏置项。
- e e e 是自然对数的底数。
通过训练,我们可以找到最佳的权重和偏置项来最大程度地拟合训练数据,从而用于分类新的数据点。
以下演示如何使用逻辑斯蒂回归进行分类,并使用可视化图表展示结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.preprocessing import StandardScaler
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=2, n_classes=2, n_clusters_per_class=1, n_redundant=0, random_state=42)
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练逻辑斯蒂回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 绘制决策边界和数据点
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100),
np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.RdBu, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.RdBu, marker='o')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Decision Boundary')
plt.show()
这个示例生成了一个模拟的二分类数据集,并使用逻辑斯蒂回归模型进行训练和预测。
最后,通过绘制决策边界和数据点的可视化图表来展示模型的分类效果。
决策树回归(Decision Tree Regression)
决策树回归(Decision Tree Regression)是一种用于预测连续型目标变量的机器学习方法。
与分类决策树不同,决策树回归的目标是通过构建树状结构来拟合数据,以便对连续值的输出进行预测。
决策树回归的主要思想是将数据集分割成不同的子集,然后在每个子集上拟合一个简单的线性模型(通常是均值),最终形成一个树状结构,使得每个叶节点都包含一个用于预测的数值。
以下展示如何使用决策树回归来预测房屋价格的案例。
使用sklearn库进行建模和可视化。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
# 创建一个模拟数据集
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
# 训练决策树回归模型
regressor = DecisionTreeRegressor(max_depth=5)
regressor.fit(X, y)
# 生成预测结果
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_pred = regressor.predict(X_test)
# 绘制原始数据和决策树回归结果
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black", c="darkorange", label="data")
plt.plot(X_test, y_pred, color="cornflowerblue", linewidth=2, label="prediction")
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()
上面案例中,我们首先生成了一个模拟数据集,然后使用决策树回归模型对数据进行拟合,并生成了预测结果的可视化图表。
这个图表展示了原始数据点和决策树回归模型的拟合曲线。
你可以根据实际情况替换数据集和调整模型的参数来适应不同的案例。这个案例提供了一个简单的起点,帮助大家了解如何使用决策树回归来解决回归问题,并可视化结果。
随机森林回归(Random Forest Regression)
随机森林回归(Random Forest Regression)是一种集成学习方法,用于解决回归问题。
基于多个决策树构建,通过组合这些树的预测结果来提高模型的性能和稳定性。
随机森林回归简要介绍:
-
随机性:随机森林采用随机抽样技术,从训练数据中随机选择样本,并在每个决策树的节点上随机选择特征,以降低过拟合的风险。
-
集成:多个决策树的预测结果被组合,通常采用平均值(对于回归问题)或投票(对于分类问题)来生成最终的预测结果,这有助于降低模型的方差。
-
特征选择:在构建每个决策树时,随机森林只考虑特征的随机子集,从而增加了模型的多样性。
-
鲁棒性:由于随机森林由多个决策树组成,它对于噪声和异常值的鲁棒性较高,可以提供更稳定的预测。
随机森林回归的公式与上述提到的相同,即预测值是多个决策树预测结果的平均值。
假设我们有一个回归问题,其中我们希望预测目标变量 y y y,并且我们有一个包含 n n n 个样本的训练数据集,其中每个样本有 m m m 个特征。
目标是使用随机森林回归来预测目标变量。
随机森林回归的预测值
y
pred
y_{\text{pred}}
ypred可以通过多个决策树的预测结果的平均值来计算:
y
pred
=
1
N
∑
i
=
1
N
y
i
y_{\text{pred}} = \frac{1}{N} \sum_{i=1}^{N} y_i
ypred=N1i=1∑Nyi
其中:
- N N N 是随机森林中的决策树数量。
- y i y_i yi 是第 i i i 个决策树的预测值。
这个公式表示随机森林回归的最终预测是多个决策树预测的平均值。由于随机性和多样性,随机森林通常能够提供较稳定和准确的回归预测。
下面,将使用随机森林回归来预测气温。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# 创建一个示例数据集
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.rand(80)
# 创建随机森林回归模型
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
# 训练模型
rf_regressor.fit(X, y)
# 预测
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_pred = rf_regressor.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y, rf_regressor.predict(X))
print("Mean Squared Error:", mse)
# 绘制真实值和预测值的可视化图表
plt.figure(figsize=(10, 6))
plt.scatter(X, y, s=20, edgecolor="black", c="darkorange", label="data")
plt.plot(X_test, y_pred, color="cornflowerblue", linewidth=2, label="prediction")
plt.xlabel("data")
plt.ylabel("target")
plt.title("Random Forest Regression")
plt.legend()
plt.show()
这个示例使用随机森林回归模型来拟合一个带有噪声的正弦曲线,并绘制出真实值和模型预测值的可视化图表,以及均方误差(Mean Squared Error)作为性能指标。