没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1
人工智能和机器学习之分类算法:梯度提升机(GBM):
梯度提升机的过拟合与欠拟合问题
1 梯度提升机简介
1.1 GBM 的基本原理
梯度提升机(Gradient Boosting Machine, GBM)是一种迭代的决策树算法,通
过构建一系列弱学习器并逐步优化,最终形成一个强大的预测模型。GBM 的核
心思想是利用前一个模型的残差作为当前模型的训练目标,通过梯度下降法来
最小化损失函数。这种算法特别适用于处理具有大量特征和复杂关系的数据集。
1.1.1 梯度提升过程
1. 初始化模型:通常从一个常数开始,作为所有样本的初始预测值。
2. 迭代训练:在每次迭代中,计算当前模型的残差(即实际值与预
测值之间的差异),然后训练一个新的弱学习器(如决策树)来拟合这些
残差。
3. 更新模型:将新训练的弱学习器加入到当前模型中,通过加权求
和的方式更新预测值。
4. 重复步骤 2 和 3:直到达到预设的迭代次数或模型性能不再提升。
1.1.2 代码示例
下面是一个使用 Python 的 sklearn 库实现 GBM 分类器的示例。我们将使用
一个简单的数据集来演示如何训练和评估 GBM 模型。
#
导入必要的库
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
#
生成分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, r
andom_state=42)
#
划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#
初始化
GBM
分类器
gbm = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_s
tate=42)
2
#
训练模型
gbm.fit(X_train, y_train)
#
预测测试集
y_pred = gbm.predict(X_test)
#
计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"GBM 分类器的准确率为: {accuracy}")
在这个例子中,我们首先生成了一个包含 1000 个样本和 20 个特征的分类
数据集。然后,我们使用 train_test_split 函数将数据集划分为训练集和测试集。
接下来,我们初始化了一个 GBM 分类器,设置了迭代次数(n_estimators)、学
习率(learning_rate)和决策树的最大深度(max_depth)。模型训练完成后,我
们使用测试集评估模型的性能,通过计算准确率来衡量模型的分类效果。
1.2 GBM 与传统机器学习算法的对比
GBM 与传统机器学习算法如逻辑回归、支持向量机等相比,具有以下优势:
� 自动特征选择:GBM 在训练过程中可以自动识别和利用最重要的
特征,而不需要人工进行特征选择。
� 处理非线性关系:GBM 通过组合多个决策树,能够很好地处理数
据中的非线性关系,这是线性模型难以做到的。
� 鲁棒性:GBM 对异常值和缺失数据具有较好的鲁棒性,能够自动
调整模型以适应数据的不规则性。
然而,GBM 也存在一些挑战:
� 过拟合风险:由于 GBM 模型的复杂性,如果不加以控制,很容易
过拟合训练数据,导致泛化能力下降。
� 训练时间:GBM 需要训练多个模型并进行迭代优化,因此训练时
间可能比一些简单模型要长。
� 参数调优:GBM 有多个参数需要调优,如学习率、迭代次数、树
的深度等,这可能需要更多的实验和时间。
1.2.1 示例对比
为了直观地展示 GBM 与逻辑回归在处理非线性数据时的性能差异,我们使
用一个具有非线性关系的合成数据集进行对比。
#
导入必要的库
from sklearn.datasets import make_moons
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
3
#
生成非线性数据集
X, y = make_moons(n_samples=1000, noise=0.3, random_state=42)
#
划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#
初始化逻辑回归分类器
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred_lr = lr.predict(X_test)
accuracy_lr = accuracy_score(y_test, y_pred_lr)
#
初始化
GBM
分类器
gbm = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_s
tate=42)
gbm.fit(X_train, y_train)
y_pred_gbm = gbm.predict(X_test)
accuracy_gbm = accuracy_score(y_test, y_pred_gbm)
#
打印准确率
print(f"逻辑回归分类器的准确率为: {accuracy_lr}")
print(f"GBM 分类器的准确率为: {accuracy_gbm}")
#
可视化决策边界
def plot_decision_boundary(model, X, y):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.title(f"{model.__class__.__name__} Decision Boundary")
plt.show()
#
绘制决策边界
plot_decision_boundary(lr, X, y)
plot_decision_boundary(gbm, X, y)
在这个对比示例中,我们使用 make_moons 函数生成了一个具有非线性关
系的二分类数据集。然后,我们分别训练了一个逻辑回归模型和一个 GBM 模型,
并在测试集上评估了它们的性能。最后,我们通过可视化决策边界来直观地比
较两个模型的性能。逻辑回归模型的决策边界是线性的,而 GBM 模型的决策边
界能够更好地适应数据的非线性结构,从而在测试集上获得了更高的准确率。
4
通过以上示例,我们可以看到 GBM 在处理非线性数据时的强大能力,以及
它与传统机器学习算法在性能上的显著差异。然而,GBM 的复杂性也意味着它
可能需要更多的计算资源和时间来训练,同时在参数调优方面也更加复杂。
2 过拟合与欠拟合的基础概念
2.1 过拟合的定义与识别
在机器学习中,过拟合(Overfitting)是指模型在训练数据上表现得过于优
秀,以至于它学习到了数据中的噪声和异常点,而不是数据的普遍规律。这种
情况下,模型对训练数据的预测非常准确,但对未见过的新数据(测试数据)
预测效果很差,即模型的泛化能力弱。
2.1.1 如何识别过拟合
� 训练集与测试集性能对比:如果模型在训练集上的性能远高于测
试集上的性能,这可能意味着过拟合。
� 学习曲线:绘制模型在训练集和验证集上的误差随训练轮次变化
的曲线,如果训练误差持续下降,而验证误差在某个点后开始上升,这
表明模型开始过拟合。
2.1.2 示例:使用随机森林分类器识别过拟合
假设我们有一组鸢尾花数据集,我们将使用随机森林分类器来预测鸢尾花
的种类,并通过学习曲线来识别过拟合。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#
加载数据
data = load_iris()
X = data.data
y = data.target
#
划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#
创建随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)
#
训练模型并记录训练和测试的准确率
剩余18页未读,继续阅读
资源评论
kkchenjj
- 粉丝: 2w+
- 资源: 5479
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功