机器学习实战——基于XGBoost的葡萄酒分类任务(附完整代码和结果图)
关于作者
作者:小白熊
作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。
联系邮箱:xbx3144@163.com
科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~
1 前言
分类问题是机器学习中最常见的任务之一。本文将通过一个经典的多分类任务——葡萄酒分类问题,展示如何使用XGBoost模型进行分类。我们将使用scikit-learn
的load_wine
数据集进行实验,采用数据预处理、模型训练、十折交叉验证,并展示多项评估指标。最后,我们将可视化模型的表现,特别是通过混淆矩阵来分析分类效果。
2 模型理论
XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升算法的增强学习方法。其通过构建一系列的弱学习器(如决策树)逐步减少训练误差,从而提高模型的整体性能。每次迭代都会针对前一轮的误差做出调整,最终得到一个性能更好的模型。
XGBoost的优势:
- 处理缺失值能力强:XGBoost能够自动处理缺失数据,尤其适合存在不完整数据的场景。
- 高效性:XGBoost的并行计算和正则化机制使其在处理大规模数据集时表现良好。
- 防止过拟合:XGBoost引入了正则化项,能够有效防止模型的过拟合问题。
3 评估指标
- 准确率:模型预测正确的样本数占总样本数的比例。
- 精确率(Precision):正确预测为正类的样本占模型预测为正类的总数。
- 召回率(Recall):模型正确预测为正类的样本占所有真实正类样本的比例。
- F1分数:精确率和召回率的调和平均数,综合考虑了模型的精确性和完整性。
4 数据集介绍
葡萄酒质量数据集(Wine Quality Dataset)是一个经典的多分类数据集,常用于机器学习和统计分析的教学和研究。该数据集最初来自于UCI机器学习库,主要用于预测葡萄酒的品质。葡萄酒的质量评估通常是一个复杂的任务,因为它涉及多个化学成分和感官特征。许多研究者和酿酒师希望通过分析这些特征来预测葡萄酒的质量评分,从而为生产提供指导。该数据集包含了意大利某地区的葡萄酒样本,旨在帮助用户了解如何使用机器学习技术进行多类分类任务。
葡萄酒数据集(Wine Dataset)包含了13个关于化学成分的特征,用于预测三种不同类别的意大利葡萄酒种类。该数据集常用于分类任务演示,是机器学习领域的经典数据集之一。每一行数据代表一种葡萄酒的化学特征,包括酒精含量、色度、灰分等信息。
5 代码流程
5.1 配置环境
首先需要导入一些必要的库。以下是本文使用到的主要库及其用途:
- Pandas: 用于数据处理和数据框操作。
- XGBoost: 提供XGBoost分类模型的实现。
- Scikit-learn: 提供数据集、数据预处理和评估方法。
- Matplotlib 和 Seaborn: 用于可视化数据和模型评估结果。
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
5.2 数据预处理
我们使用scikit-learn
的load_wine()
函数加载葡萄酒数据集,并将其转换为Pandas的DataFrame
以便于操作。之后,我们对数据进行标准化处理。
# 加载数据集
data = load_wine()
# 数据转换为DataFrame
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target
# 检查数据的缺失情况
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)
结果表明,葡萄酒数据集并没有缺失值,因此我们可以继续后续操作。
5.3 数据标准化
为了确保每个特征都在相同的尺度范围内,我们使用StandardScaler
对特征数据进行标准化。标准化可以加速模型收敛并提高模型的性能。
# 提取特征和目标
X = df.drop('Target', axis=1)
y = df['Target']
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
5.4 划分训练集和验证集
接下来,我们将数据集划分为训练集和验证集。为了确保模型的泛化性能,我们使用train_test_split
将数据按照80%训练集、20%验证集的比例进行拆分。
# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
5.5 构建模型
XGBoost(eXtreme Gradient Boosting)是一种高效的基于梯度提升算法的决策树模型。十折交叉验证的结果展示了模型在训练数据上的平均准确率。
# 构建XGBoost分类器
model = xgb.XGBClassifier(use_label_encoder=False)
# 使用十折交叉验证进行模型评估
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")
5.6 模型评估
我们使用训练好的模型在验证集上进行预测,并计算几项分类任务的评估指标,包括准确率、精确率、召回率、F1分数,以及通过混淆矩阵可视化模型的分类效果。
# 训练模型
model.fit(X_train, y_train)
# 预测验证集数据
y_val_pred = model.predict(X_val)
# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')
print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")
5.7 可视化混淆矩阵
混淆矩阵能够直观地显示模型的分类效果,它展示了模型在每个分类中的正确预测数量与错误预测数量。
# 计算并可视化混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()
混淆矩阵帮助我们了解模型在每个类别上的表现:
6 完整代码
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集
data = load_wine()
# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target
# 缺失值检测
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)
# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 构建模型
model = xgb.XGBClassifier(use_label_encoder=False)
# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")
# 训练模型
model.fit(X_train, y_train)
# 模型预测
y_val_pred = model.predict(X_val)
# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)
# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')
print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")
# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()
总结
在本文中,我们使用XGBoost模型对葡萄酒数据集进行了分类预测,通过十折交叉验证和多项评估指标,评估了模型的性能。通过使用混淆矩阵,我们进一步了解了模型的分类效果和各类之间的混淆情况。XGBoost由于其高效、鲁棒的特性,在实际应用中非常广泛。无论是分类还是回归任务,XGBoost都能为用户提供强大的工具来解决问题。