Python 机器学习 XGBoost简单案例

XGBoost 是一个非常流行的机器学习库,用于执行梯度提升算法,特别适用于分类问题,回归问题和排名问题等。可以尝试更改 train_test_split 的参数或者 XGBClassifier 的超参数,比如 max_depth 和 n_estimators,来看看这些改变对模型性能的影响。

1、二元分类问题

二元分类是机器学习中一个常见的问题类型,它涉及将实例划分为两个类别中的一个。这类问题在许多应用领域都非常重要,如医疗诊断、垃圾邮件检测、信贷审批等。

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score

# 加载数据
data = load_breast_cancer()
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)

# 创建XGBoost分类器
xgb_clf = xgb.XGBClassifier(objective='binary:logistic', max_depth=3, learning_rate=0.1, n_estimators=100)

# 训练模型
xgb_clf.fit(X_train, y_train)

# 预测测试数据
y_pred = xgb_clf.predict(X_test)
y_pred_prob = xgb_clf.predict_proba(X_test)[:,1]

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_prob)

print(f"Accuracy: {accuracy:.2f}")
print(f"ROC AUC: {roc_auc:.2f}")

2、多类分类问题

多类分类问题是指一个分类任务需要将实例分配到三个或更多个类别中的一种。这与二元分类问题不同,后者仅涉及两个类别(如是与否,正与负)。多类分类的典型例子包括将邮件归类为垃圾邮件、正常邮件或促销邮件,或者识别图片中的物体属于哪一个类别(如车、飞机、猫等)。对于多类分类问题,XGBoost 可以使用其内置的 multi:softmaxmulti:softprob 目标函数来处理。

import xgboost as xgb
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成模拟的多类分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_classes=3, n_clusters_per_class=1, random_state=42)

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建 DMatrix 对象
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 设置参数
params = {
    'objective': 'multi:softmax',  # 使用 softmax 多类分类
    'num_class': 3,                # 类别数
    'max_depth': 6,                # 树的最大深度
    'eta': 0.3,                    # 学习率
    'verbosity': 0                 # 0 (silent), 1 (warning), 2 (info), 3 (debug)
}

# 训练模型
num_round = 100  # 训练轮数
model = xgb.train(params, dtrain, num_round)

# 预测
predictions = model.predict(dtest)

# 评估
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.2f}")

3、回归问题

机器学习中的回归问题是一种监督学习任务,它的目标是预测一个或多个连续数值的输出,这些输出是基于输入特征的。回归问题与分类问题不同,分类问题的目标是预测离散的类别标签,而回归问题是预测一个连续的量。

在回归问题中,模型尝试找到输入变量和输出变量之间的关系,通常是通过拟合一个或多个方程的形式来实现。

import xgboost as xgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import root_mean_squared_error

# 加载数据
datas = load_diabetes()
X, y = datas.data, datas.target

# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化XGBoost回归模型
model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
                max_depth = 5, alpha = 10, n_estimators = 10)

# 训练模型
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算并打印RMSE
rmse = root_mean_squared_error(y_test, y_pred)
print(f"RMSE: {rmse}")

4、特征重要性分析

特征重要性分析是一种评估模型中各个特征对预测结果影响程度的技术。简而言之,它帮助我们理解哪些特征在模型的决策过程中扮演了核心角色,以及它们对最终预测结果的贡献大小。

import xgboost as xgb
from xgboost import plot_importance
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

# 加载数据集
data = load_diabetes()
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)

# 创建 XGBoost 模型
model = xgb.XGBRegressor(objective='reg:squarederror')
model.fit(X_train, y_train)

# 特征重要性
feature_importances = model.feature_importances_

# 可视化特征重要性
plt.figure(figsize=(10, 8))
plot_importance(model, height=0.5, xlabel='F Score', ylabel='Features', importance_type='weight')
plt.show()

5、超参数调优

超参数调优是一个优化过程,旨在找到最佳的超参数配置,使得机器学习模型在给定的任务上表现最好。超参数是在学习过程开始之前设置的参数,它们控制了模型的训练过程和模型的结构(例如树的深度、学习率或神经网络中的层数)。

超参数

描述

max_depth

树的最大深度。深度大可以增加模型的复杂度,但可能导致过拟合。

min_child_weight

决定最小叶子节点样本权重和。增大此参数可以防止过拟合。

gamma

节点分裂所需的最小损失函数下降值。设置较高的值会使模型保守,有助于防止过拟合。

subsample

训练每棵树时使用的数据比例,防止过拟合。

colsample_bytree

建立树时的列采样比例。

learning_rate

学习率,也叫作 eta。

参数都可以在模型训练阶段通过网格搜索、随机搜索或其他优化方法来调整,以达到最佳的模型性能。

import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_diabetes
from sklearn.metrics import mean_squared_error

# 载入数据
data = load_diabetes()
X = data.data
y = data.target

# 定义 XGBoost 模型
model = xgb.XGBRegressor(objective='reg:squarederror')

# 设置要调优的超参数网格
param_grid = {
    'max_depth': [3, 5, 7],
    'min_child_weight': [1, 5, 10],
    'gamma': [0.5, 1, 1.5],
    'subsample': [0.6, 0.8, 1.0],
    'colsample_bytree': [0.6, 0.8, 1.0],
    'learning_rate': [0.01, 0.1, 0.2]
}

# 设置网格搜索
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=3, verbose=1)

# 执行网格搜索
grid_search.fit(X, y)

# 最佳参数和最佳模型的评分
print("Best parameters:", grid_search.best_params_)
print("Best score:", -grid_search.best_score_)

# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
predictions = best_model.predict(X)
mse = mean_squared_error(y, predictions)
print("MSE:", mse)

推荐阅读
cjavapy编程之路首页