一旦从 Scikit-Learn 实例化一个梯度提升模型,对其进行训练并用于预测会遵循一个熟悉且一致的模式。该过程与库的标准 API 保持一致,该 API 包含两个主要方法:.fit() 用于训练模型和 .predict() 用于生成输出。这个工作流程使得梯度提升模型(GBM)算法的应用变得简单直接。标准模型训练工作流程从数据到预测的整个过程可以概括为几个步骤。您首先准备数据,将其分成训练集和测试集,然后使用这些集合来训练模型并评估其表现。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fontname="sans-serif", margin=0.2]; edge [fontname="sans-serif"]; subgraph cluster_data { label="数据准备"; style="filled"; color="#e9ecef"; node [fillcolor="#a5d8ff"]; rawData [label="原始数据"]; splitData [label="拆分数据\n(训练集与测试集)"]; rawData -> splitData; } subgraph cluster_model { label="模型训练"; style="filled"; color="#e9ecef"; node [fillcolor="#96f2d7"]; instantiate [label="实例化模型\n(例如,GradientBoostingRegressor)"]; fit [label="拟合模型\n.fit(X_train, y_train)"]; instantiate -> fit; } subgraph cluster_predict { label="预测"; style="filled"; color="#e9ecef"; node [fillcolor="#bac8ff"]; trainedModel [label="已训练模型"]; predict [label="生成预测\n.predict(X_test)"]; predictions [label="预测结果", shape=document, fillcolor="#ffec99"]; trainedModel -> predict -> predictions; } splitData -> instantiate [style=dashed, lhead=cluster_model]; fit -> trainedModel [style=dashed, ltail=cluster_model, lhead=cluster_predict]; }Scikit-Learn 中典型的机器学习工作流程。模型在一个数据子集上训练,并用于在另一个子集上进行预测。使用 .fit() 拟合模型.fit(X, y) 方法是任何 Scikit-Learn 估计器的核心方法。当您在梯度提升模型上调用此方法时,您就启动了我们在上一章中讨论的顺序树构建过程。X 参数是您的特征矩阵(通常是 pandas DataFrame 或 NumPy 数组),而 y 是目标向量(pandas Series 或 NumPy 数组)。让我们通过 GradientBoostingRegressor 来看一下实际操作。假设我们有一个小型房产特征数据集,并希望预测价格。import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingRegressor # 示例数据 data = { 'Area': [2100, 1600, 2400, 1800, 3000, 2200], 'Bedrooms': [3, 3, 3, 2, 4, 3], 'Age': [5, 10, 2, 8, 1, 7], 'Price': [400, 310, 430, 350, 550, 410] # 价格以千为单位 } df = pd.DataFrame(data) X = df[['Area', 'Bedrooms', 'Age']] y = df['Price'] # 将数据拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) # 1. 实例化模型 gbr = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, random_state=42) # 2. 使用训练数据拟合模型 gbr.fit(X_train, y_train) print("模型训练完成。")当执行 gbr.fit(X_train, y_train) 时,模型在内部执行以下步骤:它用一个简单的预测(通常是 y_train 的均值)初始化模型。它计算预测值与实际值之间的误差(残差)。它根据这些残差拟合一棵决策树。它将这棵新树添加到集成模型中,并根据 learning_rate 进行缩放。它更新预测并重复该过程,根据新的残差拟合新的树。这个过程持续 n_estimators 次迭代,每棵新树都修正了其之前集成模型的误差。使用 .predict() 生成预测模型训练完成后,.predict(X) 方法用于在新、未见过的数据上生成预测。它接受一个与训练数据结构相同的特征矩阵 X,并返回一个预测值数组。继续我们的回归例子:# 3. 在测试集上生成预测 predictions = gbr.predict(X_test) # 显示测试数据和模型的预测结果 results = X_test.copy() results['Actual_Price'] = y_test results['Predicted_Price'] = predictions.round(1) print(results)输出: Area Bedrooms Age Actual_Price Predicted_Price 1 1600 3 10 310 334.8 5 2200 3 7 410 404.7.predict() 方法通过让输入数据通过集成模型中的每棵树来工作。给定样本的最终预测是初始预测与所有后续树的输出之和,每棵树的输出都按学习率进行缩放。{"layout": {"title": {"text": "回归:实际值与预测值"}, "xaxis": {"title": {"text": "实际价格(千美元)"}}, "yaxis": {"title": {"text": "预测价格(千美元)"}}, "plot_bgcolor": "#e9ecef", "paper_bgcolor": "#ffffff"}, "data": [{"type": "scatter", "mode": "markers", "x": [310, 410], "y": [334.8, 404.7], "marker": {"color": "#4263eb", "size": 12}}, {"type": "scatter", "mode": "lines", "x": [300, 450], "y": [300, 450], "line": {"color": "#fa5252", "dash": "dash"}, "name": "理想拟合"}]}实际价格与预测价格的比较。越接近虚线的点表示预测越准确。分类预测:.predict() 与 .predict_proba()对于使用 GradientBoostingClassifier 的分类任务,您有两种方法进行预测,每种方法都有不同的作用。.predict(X):此方法返回最终的预测类别标签(例如,0 或 1,'是' 或 '否')。模型计算每个类别的概率,并返回概率最高的那个。.predict_proba(X):此方法返回每个类别的概率估计值。对于二元分类问题,它返回一个二维数组,其中每行包含两个值:负类别的概率和正类别的概率。我们通过一个简单的客户流失预测例子来说明。from sklearn.ensemble import GradientBoostingClassifier # 示例分类数据 c_data = { 'Tenure': [2, 48, 12, 1, 36, 24], 'MonthlySpend': [50, 100, 80, 45, 110, 95], 'Churn': [1, 0, 0, 1, 0, 1] # 1 表示流失,0 表示未流失 } c_df = pd.DataFrame(c_data) X_c = c_df[['Tenure', 'MonthlySpend']] y_c = c_df['Churn'] # 实例化并拟合分类器 gbc = GradientBoostingClassifier(n_estimators=100, random_state=42) gbc.fit(X_c, y_c) # 用于预测的新数据 new_customers = pd.DataFrame({'Tenure': [3, 25], 'MonthlySpend': [60, 105]}) # 获取类别预测 class_predictions = gbc.predict(new_customers) print(f"类别预测: {class_predictions}") # 获取概率预测 proba_predictions = gbc.predict_proba(new_customers) print("概率预测(未流失,流失):") print(proba_predictions.round(3))输出:Class Predictions: [1 0] Probability Predictions (No Churn, Churn): [[0.435 0.565] [0.528 0.472]]下面是如何解释输出结果:对于第一个新客户(Tenure:3,MonthlySpend:60),预测类别为 1(流失)。这是因为流失的概率(0.565)大于未流失的概率(0.435)。对于第二个客户(Tenure:25,MonthlySpend:105),预测类别为 0(未流失),因为其概率(0.528)更高。.predict_proba() 的输出通常比 .predict() 提供更多信息。它使您能够了解模型的置信度并为分类设置自定义阈值。例如,根据业务背景,您可能只在预测概率高于 0.7 时才将客户归类为“流失”。