.
.
.
.
.
.
.
.
.
.
.纯 干 货
.
.
.
.
.
.
.
.
..
.
.
.
.
.
目录
[1.线性回归(Linear Regression)](#1.线性回归(Linear Regression))
[2.多项式回归(Polynomial Regression)](#2.多项式回归(Polynomial Regression))
[3.岭回归(Ridge Regression)](#3.岭回归(Ridge Regression))
[4.Lasso回归(Lasso Regression)](#4.Lasso回归(Lasso Regression))
[5弹性网络回归(Elastic Net Regression)](#5弹性网络回归(Elastic Net Regression))
[6.逻辑斯蒂回归(Logistic Regression)](#6.逻辑斯蒂回归(Logistic Regression))
[7.决策树回归(Decision Tree Regression)](#7.决策树回归(Decision Tree Regression))
关于回归这一类算法的总结,我见到过的有简单的,也有特别详细的。百花齐放,各有优略!
今天总结了关于回归算法的方方面面,涉及到原理的解释、入门代码等等。
总的来说,回归算法是一类用于预测连续数值输出的监督学习算法。
根据输入特征预测一个或多个目标变量。
回归算法有多个分支和变种,每个分支都有其独特的优缺点。
今天要说的有8个部分,大家伙请看~
-
线性回归
-
多项式回归
-
岭回归
-
Lasso回归
-
弹性网络回归
-
逻辑斯蒂回归
-
决策树回归
-
随机森林回归
大家伙如果觉得还不错!可以点赞、收藏鼓励博主,谢谢。
**1.**线性回归(Linear Regression)
首先,线性回归(Linear Regression)是一种用于建立连续数值输出与一个或多个输入特征之间关系的监督学习算法。
它假设输出与输入特征之间存在线性关系,即可以用一条直线来拟合数据。
线性回归的目标是找到一条最佳拟合直线,以最小化预测值与真实值之间的误差。
下面是一个简单的案例,随机生成的数据来演示:
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
模型拟合数据,并绘制了原始数据和拟合直线的可视化图表。
实际情况下,可以根据自己的需求修改输入数据和模型来适应不同的案例。
2.多项式回归(Polynomial Regression)
多项式回归是一种回归分析方法,它通过使用多项式函数来拟合数据,而不仅仅是线性函数。
多项式回归通常用于处理数据与因变量之间的非线性关系,这种关系不能用线性回归来准确建模。
多项式回归的一般形式可以表示为:
下面展示如何进行多项式回归,包括数据生成、拟合模型以及可视化。
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()
在这个示例中,首先生成了一组随机的数据点,然后使用四次多项式来拟合这些数据。
拟合后,我们绘制了原始数据点和拟合曲线的可视化图表。
你可以根据自己的数据和需求,修改多项式的阶数和其他参数来进行多项式回归分析,以更好地拟合你的数据。
3.岭回归(Ridge Regression)
在多重共线性存在时,传统的线性回归模型可能会导致参数估计不稳定,岭回归通过引入正则化项来解决这个问题。
岭回归的目标函数如下所示:
首先,我们生成一个模拟的数据集,以便演示岭回归的效果,并使用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的值以控制正则化的强度。
4.Lasso回归(Lasso Regression)
Lasso回归(Least Absolute Shrinkage and Selection Operator Regression)是一种线性回归的变体,它用于数据特征选择和降维。
与普通线性回归不同,Lasso回归通过对系数进行L1正则化来惩罚模型中的不重要的特征,以促使模型选择更少的特征,从而提高模型的泛化能力。
L1正则化通过在损失函数中添加系数的绝对值之和来实现,这迫使一些系数变为零,从而实现特征选择的效果。
Lasso回归的损失函数如下所示:
以下是一个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
回归进行特征选择和建模。
5弹性网络回归(Elastic Net Regression)
弹性网络回归(Elastic Net Regression)是一种用于处理回归问题的线性模型,它结合了 L1
正则化(Lasso正则化)和L2
正则化(Ridge正则化)的特性,以解决特征选择和过拟合问题。
它的损失函数由两部分组成,一部分是均方误差(Mean Squared Error,MSE),另一部分是L1
和L2
正则化项的组合。
下面案例演示如何使用弹性网络回归处理一个数据集,并绘制可视化图表。
同样的也是使用一个自动生成的示例数据集。
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_)
在这个案例中,我们首先生成了一个简单的示例数据集,然后创建了一个弹性网络回归模型,拟合数据并进行了预测。
最后,我们使用Matplotlib绘制了原始数据和拟合线的可视化图表,并打印了模型的系数。
你可以根据自己的需求和数据集来调整正则化参数α和λ以及数据集的大小以获得更好的效果和可视化。
6.逻辑斯蒂回归(Logistic Regression)
逻辑斯蒂回归(Logistic Regression)是一种用于分类问题的统计学习方法。
通过建立一个逻辑斯蒂函数(也称为S型函数)来预测二分类问题中的概率。
逻辑斯蒂函数将输入值映射到0和1之间的概率值,通常用于估计某个事件发生的概率。
数学表达式:
通过训练,我们可以找到最佳的权重和偏置项来最大程度地拟合训练数据,从而用于分类新的数据点。
以下演示如何使用逻辑斯蒂回归进行分类,并使用可视化图表展示结果。
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()
这个示例生成了一个模拟的二分类数据集,并使用逻辑斯蒂回归模型进行训练和预测。
7.决策树回归(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()
上面案例中,我们首先生成了一个模拟数据集,然后使用决策树回归模型对数据进行拟合,并生成了预测结果的可视化图表。
你可以根据实际情况替换数据集和调整模型的参数来适应不同的案例。这个案例提供了一个简单的起点,帮助大家了解如何使用决策树回归来解决回归问题,并可视化结果。
8.随机森林回归(Random Forest Regression)
随机森林回归(Random Forest Regression)是一种集成学习方法,用于解决回归问题。
基于多个决策树构建,通过组合这些树的预测结果来提高模型的性能和稳定性。
随机森林回归简要介绍:
-
随机性:随机森林采用随机抽样技术,从训练数据中随机选择样本,并在每个决策树的节点上随机选择特征,以降低过拟合的风险。
-
集成:多个决策树的预测结果被组合,通常采用平均值(对于回归问题)或投票(对于分类问题)来生成最终的预测结果,这有助于降低模型的方差。
-
特征选择:在构建每个决策树时,随机森林只考虑特征的随机子集,从而增加了模型的多样性。
-
鲁棒性:由于随机森林由多个决策树组成,它对于噪声和异常值的鲁棒性较高,可以提供更稳定的预测。
随机森林回归的公式与上述提到的相同,即预测值是多个决策树预测结果的平均值。
假设我们有一个回归问题,其中我们希望预测目标变量 ,并且我们有一个包含 个样本的训练数据集,其中每个样本有 m个特征。
目标是使用随机森林回归来预测目标变量。
随机森林回归的预测值y pred 可以通过多个决策树的预测结果的平均值来计算:
这个公式表示随机森林回归的最终预测是多个决策树预测的平均值。由于随机性和多样性,随机森林通常能够提供较稳定和准确的回归预测。
下面,将使用随机森林回归来预测气温。
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)作为性能指标。
最后
今天介绍了8个机器学习中回归类算法的总结,以及不同情况使用的特征。
总的来说,不同的回归模型适用于不同的场景 :
线性回归: 适用于特征与目标之间呈线性关系的情况,例如简单的回归分析、连续型数值预测等。
多项式回归:当特征与目标之间的关系呈现出非线性趋势时,可以使用多项式回归来拟合曲线关系,适用于二次、三次等多项式关系。
岭回归: 在线性回归中存在多重共线性(特征之间高度相关)时,岭回归可以用来稳定模型。它也有助于防止过拟合。
Lasso回归: 适用于具有许多特征的数据集,可以帮助选择最重要的特征,同时进行特征选择和回归。
弹性网络回归:当需要在回归中同时考虑L1正则化(Lasso)和L2正则化(岭回归)的情况下,弹性网络回归是一种选择。
逻辑斯蒂回归:适用于二元分类问题,预测概率为某一类的情况。例如,预测是否购买、是否患病等问题。
决策树回归:适用于非线性、非连续性数据,对于复杂的数据分布和特征之间的交互关系具有较好的拟合能力。
随机森林回归:对于高维数据和大规模数据集,随机森林回归通常表现良好。它也能够处理多重共线性问题,并提供特征重要性评估。
每种回归方法都有其独特的优势和局限性,因此在选择时需要考虑数据的特点、建模的目标以及模型的性能需求。
通常,建议尝试多种方法,并使用交叉验证等技术来评估它们的性能,然后选择最适合特定问题的方法。
喜欢的朋友可以收藏、点赞。谢谢