一、什么是 XGBoost?
XGBoost 是一种特别厉害的 "分类工具",就像一个聪明的 "判断专家"。它的工作原理是:先找一堆 "不太聪明" 的小模型(比如简单的决策树),然后让这些小模型接力工作 —— 每个小模型都努力修正上一个模型的错误,最后把所有小模型的判断加起来,得到一个非常准确的结果。
二、实战:用 XGBoost 给红酒分类
我们用一个红酒数据集来演示,目标是通过红酒的特征(比如酒精含量、颜色等)判断它属于哪种类型。
1. 准备工具
首先要导入需要的 "工具箱"(Python 库),就像做饭前要准备好锅碗瓢盆:
# 导入数据分析工具
import pandas as pd
import numpy as np
# 导入机器学习工具
from sklearn.model_selection import train_test_split # 拆分数据
from sklearn.preprocessing import StandardScaler # 数据标准化
from sklearn.preprocessing import LabelEncoder # 标签编码
from xgboost import XGBClassifier # XGBoost模型
from sklearn.metrics import accuracy_score # 计算准确率
2. 获取数据
加载红酒数据,里面包含各种特征和对应的红酒种类:
# 读取红酒数据
df = pd.read_excel('https://labfile.oss.aliyuncs.com/courses/40611/%E7%BA%A2%E9%85%92%E6%95%B0%E6%8D%AE.xlsx')
# 查看前5行数据
df.head()
运行后会看到类似这样的数据:
酒精 | 苹果酸 | 灰分 | ... | 种类 |
---|---|---|---|---|
14.38 | 3.59 | 2.28 | ... | 琴酒 |
12.45 | 3.03 | 2.64 | ... | 贝尔摩德 |
3. 整理数据
数据不能直接用,需要简单处理:
(1)给中文列名改英文名(方便代码处理):
# 中文列名映射为英文
column_mapping = {
'酒精': 'Alcohol',
'苹果酸': 'Malic_Acid',
'种类': 'Class' # 其他列类似
}
df.rename(columns=column_mapping, inplace=True)
(2)拆分特征和标签:
- 特征:用来判断的依据(比如酒精含量、苹果酸等)
- 标签:要预测的结果(红酒种类)
X = df.drop('Class', axis=1) # 特征(去掉种类列)
y = df['Class'] # 标签(只保留种类列)
(3)标准化数据:
让不同特征的数值范围统一(比如都缩放到 0 附近),避免某一个特征 "太霸道":
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 标准化后的特征
(4)拆分训练集和测试集:
- 训练集:教模型学习的 "教材"
- 测试集:检验模型学习效果的 "考题"
# 80%数据当教材,20%当考题,random_state=42保证结果可重复
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.2, random_state=42
)
(5)给标签编码:
模型只认数字,所以把 "琴酒"、"贝尔摩德" 这些文字换成数字(比如 0、1、2):
label_encoder = LabelEncoder()
y_train_encoded = label_encoder.fit_transform(y_train) # 训练集标签转数字
y_test_encoded = label_encoder.transform(y_test) # 测试集标签转数字
4. 训练 XGBoost 模型
让模型通过训练集学习 "特征和种类的关系":
# 创建XGBoost分类器(objective指定任务是分类)
model = XGBClassifier(objective='multi:softmax', random_state=42)
# 用训练集训练模型
model.fit(X_train, y_train_encoded)
5. 测试模型效果
用测试集检验模型学的怎么样:
# 让模型预测测试集的红酒种类
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test_encoded, y_pred)
print('准确率:', accuracy) # 输出:0.9444(100个能对94个)
还可以看更详细的报告:
from sklearn.metrics import classification_report
print(classification_report(y_test_encoded, y_pred))
报告会显示每种红酒的预测准确率、召回率等。
6. 看哪个特征最重要
想知道哪些特征对判断红酒种类影响最大?可以画个图:
import matplotlib.pyplot as plt
import seaborn as sns
# 获取特征重要性
feature_importances = model.feature_importances_
features = X.columns # 特征名称
# 画条形图
plt.figure(figsize=(10, 6))
sns.barplot(x=feature_importances, y=features)
plt.xlabel('重要性分数')
plt.ylabel('特征名称')
plt.show()
从图中能看到,"稀释的酒的蛋白质浓度的光谱度量" 这个特征最重要,就像判断一个水果是不是苹果,"形状圆不圆" 比 "颜色深不深" 更关键。
三、总结
XGBoost 是一个 "学霸级" 的分类工具,通过多个小模型接力修正错误,既能保证准确率,又不容易 "学傻"。上面的例子里,它只用简单几步就实现了 94% 的红酒分类准确率,还能告诉我们哪些特征最关键,非常实用!