文章目录
-
- 一、环境与数据准备
-
- [1.1 导入的核心库说明](#1.1 导入的核心库说明)
- [1.2 数据加载模块](#1.2 数据加载模块)
- 二、传统机器学习模型详解
-
- [2.1 逻辑回归(Logistic Regression)](#2.1 逻辑回归(Logistic Regression))
- [2.2 随机森林(Random Forest)](#2.2 随机森林(Random Forest))
- [2.3 高斯朴素贝叶斯(GaussianNB)](#2.3 高斯朴素贝叶斯(GaussianNB))
- [2.4 支持向量机(SVM)](#2.4 支持向量机(SVM))
- [2.5 AdaBoost集成方法](#2.5 AdaBoost集成方法)
- [2.6 XGBoost模型](#2.6 XGBoost模型)
- 三、深度学习模型架构
-
- [3.1 全连接神经网络(FCN)](#3.1 全连接神经网络(FCN))
- [3.2 一维卷积神经网络(1D-CNN)](#3.2 一维卷积神经网络(1D-CNN))
- 四、模型评估与结果存储
-
- [4.1 模型训练与评估流程](#4.1 模型训练与评估流程)
-
- [4.1.1 训练与预测通用模式](#4.1.1 训练与预测通用模式)
- [4.1.2 神经网络评估方法](#4.1.2 神经网络评估方法)
- [4.2 性能指标提取方法](#4.2 性能指标提取方法)
-
- [4.2.1 分类报告解析](#4.2.1 分类报告解析)
- [4.2.2 指标存储结构](#4.2.2 指标存储结构)
- [4.3 结果存储与持久化](#4.3 结果存储与持久化)
-
- [4.3.1 内存中的数据结构](#4.3.1 内存中的数据结构)
一、环境与数据准备
本部分导入了项目所需的全部核心库,并完成了数据加载的基础工作,为后续模型训练与评估做准备。
1.1 导入的核心库说明
python
# 数据处理与机器学习
import pandas as pd # 数据处理与分析
from sklearn import metrics # 模型评估指标
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier # 集成学习
from sklearn.tree import DecisionTreeClassifier # 决策树(AdaBoost基分类器)
import xgboost as xgb # XGBoost算法
from sklearn.model_selection import GridSearchCV # 网格搜索(已注释的调参部分)
# 更多机器学习模型
from sklearn.naive_bayes import GaussianNB # 高斯朴素贝叶斯
from sklearn.svm import SVC # 支持向量机分类器
# 深度学习框架
import torch
import torch.nn as nn # 神经网络模块
import torch.optim as optim # 优化器
import numpy as np
# 数据划分
from sklearn.model_selection import train_test_split # 数据集划分
1.2 数据加载模块
python
FILL_METHODS = '平均值填充' # 填充方法变量,可切换为:众数填充、中位数填充、线性回归填充、逻辑森林填充、只保留完整数据
# 加载训练数据集
train_data = pd.read_excel(rf'./temp_data//训练数据集[{FILL_METHODS}].xlsx')
train_data_x = train_data.iloc[:, 1:] # 特征列:第2列到最后
train_data_y = train_data.iloc[:, 0] # 标签列:第1列
# 加载测试数据集
test_data = pd.read_excel(rf'./temp_data//测试数据集[{FILL_METHODS}].xlsx')
test_data_x = test_data.iloc[:, 1:] # 特征列
test_data_y = test_data.iloc[:, 0] # 标签列
# 初始化结果存储字典
result_data = {} # 存储所有模型的评估结果
二、传统机器学习模型详解
本部分详细介绍了六种传统机器学习模型的实现方法、参数含义及其在矿物分类任务中的应用。
2.1 逻辑回归(Logistic Regression)
逻辑回归是一种线性分类模型,通过Sigmoid函数将线性回归结果映射到[0,1]区间,适用于二分类及多分类问题。
python
# 逻辑回归模型参数配置
lr = LogisticRegression(
C=0.001, # 正则化强度的倒数,值越小正则化越强
max_iter=100, # 最大迭代次数
solver='lbfgs' # 优化算法:拟牛顿法的一种,适合小数据集
)
# 模型训练
lr.fit(train_data_x, train_data_y) # 拟合模型
# 结果提取方法
a = metrics.classification_report(test_data_y, test_predicted, digits=6)
b = a.split() # 将分类报告按空格分割为列表
# b[6]对应类别0的召回率,b[11]对应类别1的召回率,依此类推

2.2 随机森林(Random Forest)
随机森林是一种集成学习方法,通过构建多棵决策树并综合它们的预测结果来提高分类准确性和稳定性。
python
rf = RandomForestClassifier(
bootstrap=False, # 不使用bootstrap采样,使用整个数据集
max_depth=20, # 树的最大深度,防止过拟合
max_features='log2', # 寻找最佳分割时考虑的特征数:log2(特征数)
min_samples_leaf=1, # 叶节点最少样本数
min_samples_split=2, # 内部节点分裂所需最小样本数
n_estimators=50, # 森林中树的数量
random_state=487 # 随机种子,保证结果可重现
)

2.3 高斯朴素贝叶斯(GaussianNB)
高斯朴素贝叶斯基于贝叶斯定理,假设特征之间相互独立且服从高斯分布,是一种简单高效的概率分类器。
python
gnb = GaussianNB() # 无重要超参数需要调整
# 基于贝叶斯定理,假设特征服从高斯分布

2.4 支持向量机(SVM)
支持向量机通过寻找最大间隔超平面来实现分类,可以有效处理高维数据和非线性问题。
python
svm = SVC(
C=1, # 惩罚参数,权衡间隔大小和分类错误
coef0=0.1, # 核函数独立项
degree=4, # 多项式核的次数
gamma=1, # 核函数系数,影响数据映射
kernel='poly', # 核函数类型:多项式核
probability=True, # 启用概率估计
random_state=100 # 随机种子
)

2.5 AdaBoost集成方法
AdaBoost是一种自适应增强算法,通过组合多个弱分类器来构建一个强分类器,重点关注之前分类错误的样本。
python
abf = AdaBoostClassifier(
n_estimators=50, # 弱学习器数量
learning_rate=1.0, # 学习率,控制每个弱学习器贡献
random_state=42 # 随机种子
# 默认基分类器为DecisionTreeClassifier(max_depth=1)
)

2.6 XGBoost模型
XGBoost是一种梯度提升框架的实现,通过优化正则化目标函数来提高模型性能,在各类机器学习竞赛中表现出色。
python
xgb_model = xgb.XGBClassifier(
learning_rate=0.05, # 学习率/步长缩减
n_estimators=200, # 树的数量
num_class=5, # 类别数量(应为4,此处设置为5可能是笔误)
max_depth=7, # 树的最大深度
min_child_weight=1, # 子节点最小样本权重和
gamma=0, # 节点分裂所需最小损失减少
subsample=0.6, # 样本采样比例
colsample_bytree=0.8, # 特征采样比例
objective='multi:softmax',# 多分类目标函数
seed=0 # 随机种子
)

三、深度学习模型架构
本部分介绍两种神经网络模型的设计与实现,展示了深度学习在矿物分类任务中的应用方法。
3.1 全连接神经网络(FCN)
全连接神经网络是最基础的神经网络结构,每一层的每个神经元都与下一层的所有神经元相连,适合处理结构化数据。
python
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(13, 32) # 输入层13维→隐藏层32维
self.fc2 = nn.Linear(32, 64) # 隐藏层32维→隐藏层64维
self.fc3 = nn.Linear(64, 4) # 隐藏层64维→输出层4维(4类别)
def forward(self, x):
x = torch.relu(self.fc1(x)) # ReLU激活函数
x = torch.relu(self.fc2(x))
x = self.fc3(x) # 输出层不使用激活函数(配合CrossEntropyLoss)
return x

3.2 一维卷积神经网络(1D-CNN)
一维卷积神经网络专门用于处理序列数据,通过卷积操作提取局部特征,适用于具有空间或时序结构的数据。
python
class ConvNet(nn.Module):
def __init__(self, num_features, hidden_size, num_classes):
super(ConvNet, self).__init__()
# 卷积层配置
self.conv1 = nn.Conv1d(
in_channels=1, # 输入通道数(1D数据)
out_channels=16, # 输出通道数/卷积核数量
kernel_size=3, # 卷积核大小
padding=1 # 填充,保持尺寸不变
)
self.conv2 = nn.Conv1d(16, 32, 3, padding=1) # 第二卷积层
self.conv3 = nn.Conv1d(32, 64, 3, padding=1) # 第三卷积层
self.relu = nn.ReLU() # 激活函数
self.fc = nn.Linear(64, num_classes) # 全连接输出层

四、模型评估与结果存储
本部分详细说明了各模型的训练评估流程、性能指标提取方法和完整的实验数据存储机制。
4.1 模型训练与评估流程
所有模型遵循统一的三阶段流程:训练集训练、测试集预测、性能指标计算。此流程确保了评估的一致性和可比性。
4.1.1 训练与预测通用模式
python
# 以逻辑回归为例的标准流程
lr.fit(train_data_x, train_data_y) # 1. 模型训练
train_predicted = lr.predict(train_data_x) # 2. 训练集预测
test_predicted = lr.predict(test_data_x) # 3. 测试集预测
# 输出详细评估报告
print('LR Train:\n', metrics.classification_report(train_data_y, train_predicted))
print('LR Test:\n', metrics.classification_report(test_data_y, test_predicted))
流程说明:
- 训练阶段 :使用
fit()方法在训练集上学习模型参数 - 训练集评估:计算模型在训练集上的性能,检查是否过拟合或欠拟合
- 测试集评估:计算模型在未见过的测试集上的性能,反映泛化能力
4.1.2 神经网络评估方法
深度学习模型采用自定义评估函数,跟踪训练过程中的性能变化:
python
def evaluate_model(model, X_data, Y_data, train_or_test):
"""统一的神经网络评估函数"""
size = len(X_data)
with torch.no_grad(): # 禁用梯度计算,提高评估效率
predictions = model(X_data)
correct = (predictions.argmax(1) == Y_data).type(torch.float).sum().item()
correct /= size
print(f"{train_or_test}: \t Accuracy: {(100 * correct):.2f}%")
return correct
# 每100个epoch评估一次性能
if (epoch + 1) % 100 == 0:
train_acc = evaluate_model(model, X_train, Y_train, 'train')
test_acc = evaluate_model(model, X_test, Y_test, 'test')
accs.append(test_acc * 100) # 记录测试准确率变化
4.2 性能指标提取方法
从分类报告中精确提取关键性能指标,便于后续比较分析。
4.2.1 分类报告解析
python
# 生成详细的分类评估报告
a = metrics.classification_report(test_data_y, test_predicted, digits=6)
# digits=6控制输出精度,确保足够的小数位数
# 报告分割与指标提取
b = a.split() # 将字符串按空白字符分割为单词列表
# 指标在列表中的位置映射
# b[6] -> 类别0的召回率 (recall)
# b[11] -> 类别1的召回率
# b[16] -> 类别2的召回率
# b[21] -> 类别3的召回率
# b[25] -> 整体准确率 (accuracy)
4.2.2 指标存储结构
为每个模型创建独立的字典存储各项性能指标:
python
# 以随机森林为例
RF_result = {} # 初始化结果字典
# 提取并存储各类别召回率
RF_result['recall_0'] = float(b[6]) # 类别A的召回率
RF_result['recall_1'] = float(b[11]) # 类别B的召回率
RF_result['recall_2'] = float(b[16]) # 类别C的召回率
RF_result['recall_3'] = float(b[21]) # 类别D的召回率
RF_result['acc'] = float(b[25]) # 整体准确率
# 汇总到总结果字典
result_data['RF'] = RF_result
指标解释:
- 召回率(recall):正确预测为该类别的样本数占该类别实际样本数的比例,关注漏检情况
- 准确率(accuracy):所有样本中被正确分类的比例,反映整体分类性能
4.3 结果存储与持久化
构建层次化的存储结构,支持不同填充方法的实验结果比较。
4.3.1 内存中的数据结构
最终的内存数据结构示例

