XGBoost API介绍
1 课程概览
本课讲解XGBoost的API使用。XGBoost在scikit-learn库中没有集成,需要手动安装。它支持两种风格:sklearn风格和非sklearn风格(自己的风格)。
2 核心概念与定义
- XGBoost安装:
pip install xgboost - sklearn风格:参数名与sklearn保持一致。
- 非sklearn风格:XGBoost自己的参数命名风格。
- 多语言支持:Python、R、JVM、Ruby、C/C++等。
3 算法与模型详解
3.1 XGBoost安装
安装命令:
pip install xgboost
镜像加速:
pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple
注意:
- 大小约150MB
- 下载可能较慢
- 以管理员身份运行Anaconda Prompt
3.2 官方文档
官方网址:https://xgboost.readthedocs.io/
查看最新版本:访问官网查看
3.3 两种编码风格
1. sklearn风格:
- 参数名与sklearn保持一致
- 调用方式与sklearn一模一样
- 适合熟悉sklearn的用户
2. 非sklearn风格(自己的风格):
- XGBoost自己的参数命名
- 参数名不同
- 例如:
n_estimatorsvsnum_boost_round
3.4 sklearn风格参数
常用参数(与sklearn一致):
n_estimators:树的数量max_depth:最大深度learning_rate:学习率subsample:样本采样比例colsample_bytree:特征采样比例
3.5 多语言支持
支持的语言:
- Python
- R语言
- JVM(Java)
- Ruby
- C/C++
3.6 导包
import xgboost as xgb
4 代码示例
import numpy as np
import xgboost as xgb
from sklearn.datasets import make_classification, make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_squared_error
# 1. sklearn风格的XGBoost
print("=== sklearn风格的XGBoost ===")
# 生成分类数据
X, y = make_classification(
n_samples=1000,
n_features=20,
n_informative=10,
n_classes=2,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# sklearn风格
xgb_clf = xgb.XGBClassifier(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
subsample=0.8,
colsample_bytree=0.8,
random_state=42
)
xgb_clf.fit(X_train, y_train)
y_pred = xgb_clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"XGBoost分类准确率: {acc:.4f}")
# 2. 非sklearn风格(原生风格)
print("\n=== 非sklearn风格(原生风格) ===")
# 转换为DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 参数设置
params = {
'max_depth': 3,
'eta': 0.1, # 学习率
'objective': 'binary:logistic',
'eval_metric': 'logloss',
'subsample': 0.8,
'colsample_bytree': 0.8
}
# 训练
num_round = 100
bst = xgb.train(params, dtrain, num_round)
# 预测
y_pred_proba = bst.predict(dtest)
y_pred = (y_pred_proba > 0.5).astype(int)
acc = accuracy_score(y_test, y_pred)
print(f"XGBoost原生风格准确率: {acc:.4f}")
# 3. XGBoost回归
print("\n=== XGBoost回归 ===")
X, y = make_regression(
n_samples=1000,
n_features=20,
n_informative=10,
noise=0.1,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# sklearn风格
xgb_reg = xgb.XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
)
xgb_reg.fit(X_train, y_train)
y_pred = xgb_reg.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"XGBoost回归MSE: {mse:.4f}")
# 4. 多分类
print("\n=== XGBoost多分类 ===")
X, y = make_classification(
n_samples=1000,
n_features=20,
n_informative=10,
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.2, random_state=42
)
# 多分类
xgb_multi = xgb.XGBClassifier(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
objective='multi:softprob',
num_class=3,
random_state=42
)
xgb_multi.fit(X_train, y_train)
y_pred = xgb_multi.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"XGBoost多分类准确率: {acc:.4f}")
# 5. 参数对比
print("\n=== 参数对比 ===")
print("sklearn风格 vs 原生风格:")
print(" n_estimators vs num_boost_round")
print(" max_depth vs max_depth")
print(" learning_rate vs eta")
print(" subsample vs subsample")
print(" colsample_bytree vs colsample_bytree")
# 6. 模型保存和加载
print("\n=== 模型保存和加载 ===")
# 保存
xgb_clf.save_model('xgboost_model.json')
print("模型已保存")
# 加载
xgb_loaded = xgb.XGBClassifier()
xgb_loaded.load_model('xgboost_model.json')
y_pred = xgb_loaded.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"加载后准确率: {acc:.4f}")
# 7. 特征重要性
print("\n=== 特征重要性 ===")
importance = xgb_clf.feature_importances_
print("特征重要性(前5个):")
for i in np.argsort(importance)[-5:][::-1]:
print(f" 特征{i}: {importance[i]:.4f}")
# 8. 早停
print("\n=== 早停 ===")
X, y = make_classification(
n_samples=1000,
n_features=20,
n_informative=10,
n_classes=2,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 进一步划分验证集
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=42
)
xgb_es = xgb.XGBClassifier(
n_estimators=1000,
max_depth=3,
learning_rate=0.1,
early_stopping_rounds=10,
eval_metric='logloss',
random_state=42
)
xgb_es.fit(
X_train, y_train,
eval_set=[(X_val, y_val)],
verbose=False
)
y_pred = xgb_es.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"早停后准确率: {acc:.4f}")
print(f"最佳轮数: {xgb_es.best_iteration}")
输出示例:
=== sklearn风格的XGBoost ===
XGBoost分类准确率: 0.9350
=== 非sklearn风格(原生风格) ===
XGBoost原生风格准确率: 0.9350
=== XGBoost回归 ===
XGBoost回归MSE: 0.0098
=== XGBoost多分类 ===
XGBoost多分类准确率: 0.8950
=== 参数对比 ===
sklearn风格 vs 原生风格:
n_estimators vs num_boost_round
max_depth vs max_depth
learning_rate vs eta
subsample vs subsample
colsample_bytree vs colsample_bytree
=== 模型保存和加载 ===
模型已保存
加载后准确率: 0.9350
=== 特征重要性 ===
特征重要性(前5个):
特征15: 0.1234
特征8: 0.0987
特征3: 0.0876
特征12: 0.0765
特征5: 0.0654
=== 早停 ===
早停后准确率: 0.9300
最佳轮数: 45
5 重难点与易错提醒
- ❗重点:XGBoost需要手动安装(pip install xgboost)。
- ❗重点:支持两种风格(sklearn风格和原生风格)。
- ❗重点:sklearn风格参数与sklearn一致。
- ❗重点:原生风格使用DMatrix格式。
- ⚠️易错:忘记安装xgboost库。
- ⚠️易错:混淆两种风格的参数名。
- 💡深入理解:早停可以防止过拟合。
6 课堂问答精选
Q: XGBoost的两种风格有什么区别?
A:
- sklearn风格:参数名与sklearn一致,调用方式相同,适合熟悉sklearn的用户
- 原生风格:XGBoost自己的参数命名,使用DMatrix格式,功能更丰富
例如:
- sklearn风格:
n_estimators、learning_rate - 原生风格:
num_boost_round、eta
Q: 如何安装XGBoost?
A:
pip install xgboost
如果下载慢,可以使用镜像:
pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple
7 本课小结
- 安装:
pip install xgboost - 两种风格:sklearn风格和原生风格
- sklearn风格:参数与sklearn一致
- 原生风格:使用DMatrix,参数名不同
- 多语言支持:Python、R、Java等
8 延伸思考与实践
- 实践:安装XGBoost并运行示例。
- 预习:XGBoost红酒品质分类案例。
- 思考:早停如何防止过拟合?