【机器学习】矿物识别系统实战——六种填充方法×六种模型全面对比

矿物识别系统实战------六种填充方法×六种模型全面对比

简介

在上一篇博客当中我们对数据集进行处理,使用了6种方法进行数据填充,经过一系列操作得到可以直接放到模型里面训练的数据集。接下来我们将使用6种机器学习算法进行训练和预测。

【机器学习】矿物识别系统实战------从数据清洗到多模型对比

一、训练前准备

读取训练数据与测试数据

python 复制代码
import pandas as pd

train_data = pd.read_excel(r"训练集数据(平均数).xlsx")
test_data = pd.read_excel(r"测试集数据(平均数).xlsx")

划分特征与标签
python
# 训练集:第1列为标签,其余为特征
train_data_x = train_data.iloc[:, 1:]   # 特征
train_data_y = train_data.iloc[:, 0]    # 标签

# 测试集:同样方式划分
test_data_x = test_data.iloc[:, 1:]     # 特征
test_data_y = test_data.iloc[:, 0]      # 标签
创建结果存储字典
python
result_data = {}   # 用于存储所有模型的评估结果

二、逻辑回归(Logistic Regression)

网格搜索调参

python 复制代码
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

param_grid = {
    'penalty': ['l1', 'l2', 'elasticnet', 'none'],
    'C': [0.001, 0.01, 0.1, 1, 10, 100],
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'max_iter': [100, 200, 500],
    'multi_class': ['multinomial']
}

logreg = LogisticRegression()
grid_search = GridSearchCV(logreg, param_grid, cv=5)
grid_search.fit(train_data_x, train_data_y)
print("最佳参数:", grid_search.best_params_)

模型训练

python 复制代码
LR_result = {}
lr = LogisticRegression(
    C=0.001,
    max_iter=100,
    penalty='none',
    solver='lbfgs'
)
lr.fit(train_data_x, train_data_y)

模型评估

python 复制代码
from sklearn import metrics

# 训练集评估
train_predicted = lr.predict(train_data_x)
print('LR训练集表现:\n', metrics.classification_report(train_data_y, train_predicted))

# 测试集评估
test_predicted = lr.predict(test_data_x)
print('LR测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

结果提取

python 复制代码
# 提取各类别召回率和整体准确率
report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

LR_result['recall_0'] = float(parts[6])
LR_result['recall_1'] = float(parts[11])
LR_result['recall_2'] = float(parts[16])
LR_result['recall_3'] = float(parts[21])
LR_result['acc'] = float(parts[25])

result_data['LR'] = LR_result

三、随机森林(Random Forest)

网格搜索调参

python 复制代码
from sklearn.ensemble import RandomForestClassifier

param_grid = {
    'n_estimators': [50, 100, 200, 300],
    'max_depth': [None, 10, 20, 30, 40],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'max_features': ['sqrt', 'log2', None],
    'bootstrap': [True, False],
    'criterion': ['gini', 'entropy']
}

rf_model = RandomForestClassifier()
grid_search = GridSearchCV(rf_model, param_grid, cv=5)
grid_search.fit(train_data_x, train_data_y)
print("最佳参数:", grid_search.best_params_)

模型训练

python 复制代码
RF_result = {}
rf = RandomForestClassifier(
    bootstrap=False,
    max_depth=20,
    max_features='log2',
    min_samples_leaf=1,
    min_samples_split=2,
    n_estimators=50,
    random_state=487
)
rf.fit(train_data_x, train_data_y)

模型评估

python 复制代码
# 训练集评估
train_predicted = rf.predict(train_data_x)
print('RF训练集表现:\n', metrics.classification_report(train_data_y, train_predicted))

# 测试集评估
test_predicted = rf.predict(test_data_x)
print('RF测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

结果提取

python 复制代码
report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

RF_result['recall_0'] = float(parts[6])
RF_result['recall_1'] = float(parts[11])
RF_result['recall_2'] = float(parts[16])
RF_result['recall_3'] = float(parts[21])
RF_result['acc'] = float(parts[25])

result_data['RF'] = RF_result

四、支持向量机(SVM)

网格搜索调参

python 复制代码
from sklearn.svm import SVC

param_grid = {
    'C': [0.001, 0.01, 0.1, 1, 2],
    'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],
    'gamma': ['scale', 'auto', 0.001, 0.01, 0.1, 1],
    'degree': [2, 3, 4],
    'coef0': [0.0, 0.1, 1.0],
    'shrinking': [True, False],
    'probability': [False, True],
    'class_weight': [None, 'balanced']
}

svm_model = SVC()
grid_search = GridSearchCV(svm_model, param_grid, cv=5)
grid_search.fit(train_data_x, train_data_y)
print("最佳参数:", grid_search.best_params_)

模型训练

python 复制代码
SVM_result = {}
svm = SVC(
    C=1,
    coef0=0.1,
    degree=4,
    gamma=1,
    kernel='poly',
    probability=True,
    random_state=100
)
svm.fit(train_data_x, train_data_y)

模型评估与结果提取

python 复制代码
# 测试集评估
test_predicted = svm.predict(test_data_x)
print('SVM测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

SVM_result['recall_0'] = float(parts[6])
SVM_result['recall_1'] = float(parts[11])
SVM_result['recall_2'] = float(parts[16])
SVM_result['recall_3'] = float(parts[21])
SVM_result['acc'] = float(parts[25])

result_data['SVM'] = SVM_result

五、AdaBoost

网格搜索调参

python 复制代码
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

param_grid = {
    'n_estimators': [50, 100, 200, 300],
    'learning_rate': [0.01, 0.1, 0.5, 1.0, 1.5],
    'algorithm': ['SAMME', 'SAMME.R'],
    'base_estimator__max_depth': [1, 2, 3, 4],
    'base_estimator__min_samples_split': [2, 5],
    'base_estimator__min_samples_leaf': [1, 2]
}

ada_model = AdaBoostClassifier()
grid_search = GridSearchCV(ada_model, param_grid, cv=5)
grid_search.fit(train_data_x, train_data_y)
print("最佳参数:", grid_search.best_params_)

模型训练

python 复制代码
AdaBoost_result = {}
ada = AdaBoostClassifier(
    algorithm='SAMME',
    base_estimator=DecisionTreeClassifier(max_depth=2),
    n_estimators=200,
    learning_rate=1.0,
    random_state=0
)
ada.fit(train_data_x, train_data_y)

模型评估与结果提取

python 复制代码
test_predicted = ada.predict(test_data_x)
print('AdaBoost测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

AdaBoost_result['recall_0'] = float(parts[6])
AdaBoost_result['recall_1'] = float(parts[11])
AdaBoost_result['recall_2'] = float(parts[16])
AdaBoost_result['recall_3'] = float(parts[21])
AdaBoost_result['acc'] = float(parts[25])

result_data['AdaBoost'] = AdaBoost_result

六、XGBoost

网格搜索调参

python 复制代码
import xgboost as xgb

param_grid = {
    'learning_rate': [0.01, 0.05, 0.1, 0.2],
    'n_estimators': [100, 200, 300, 500],
    'max_depth': [3, 5, 7, 9],
    'min_child_weight': [1, 3, 5],
    'subsample': [0.6, 0.8, 1.0],
    'colsample_bytree': [0.6, 0.8, 1.0],
    'gamma': [0, 0.1, 0.2]
}

xgb_model = xgb.XGBClassifier(objective='multi:softmax', num_class=5, seed=0)
grid_search = GridSearchCV(xgb_model, param_grid, cv=5)
grid_search.fit(train_data_x, train_data_y)
print("最佳参数:", grid_search.best_params_)

模型训练

python 复制代码
XGBoost_result = {}
xgb_model = xgb.XGBClassifier(
    learning_rate=0.05,
    n_estimators=200,
    num_class=5,
    max_depth=7,
    min_child_weight=1,
    gamma=0,
    subsample=0.6,
    colsample_bytree=0.8,
    objective='multi:softmax',
    seed=0
)
xgb_model.fit(train_data_x, train_data_y)

模型评估与结果提取

python 复制代码
test_predicted = xgb_model.predict(test_data_x)
print('XGBoost测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

XGBoost_result['recall_0'] = float(parts[6])
XGBoost_result['recall_1'] = float(parts[11])
XGBoost_result['recall_2'] = float(parts[16])
XGBoost_result['recall_3'] = float(parts[21])
XGBoost_result['acc'] = float(parts[25])

result_data['XGBoost'] = XGBoost_result

七、高斯朴素贝叶斯(GaussianNB)

模型训练

python 复制代码
from sklearn.naive_bayes import GaussianNB

GNB_result = {}
gnb = GaussianNB()
gnb.fit(train_data_x, train_data_y)

模型评估与结果提取

python 复制代码
test_predicted = gnb.predict(test_data_x)
print('GNB测试集表现:\n', metrics.classification_report(test_data_y, test_predicted))

report = metrics.classification_report(test_data_y, test_predicted, digits=6)
parts = report.split()

GNB_result['recall_0'] = float(parts[6])
GNB_result['recall_1'] = float(parts[11])
GNB_result['recall_2'] = float(parts[16])
GNB_result['recall_3'] = float(parts[21])
GNB_result['acc'] = float(parts[25])

result_data['GNB'] = GNB_result

八、保存所有模型结果

python 复制代码
import json

final_result = {}
final_result['mean_fill'] = result_data

with open('平均值填充result.json', 'w', encoding='utf-8') as f:
    json.dump(final_result, f, ensure_ascii=False, indent=4)

总结

六种模型性能对比

维度 内容
填充方法 均值填充、中位数填充、众数填充、空值删除、线性回归填充、随机森林填充
机器学习模型 LR(逻辑回归)、RF(随机森林)、SVM、AdaBoost、GNB(高斯朴素贝叶斯)、XGBoost
评估指标 各类别召回率(recall_0~3)、整体准确率(acc)

一、各填充方法下的模型表现汇总

1. 均值填充

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.8373 0.0297 0.9000 0.6875 0.5751
RF 0.9699 0.9307 0.9667 0.6875 0.9425
SVM 0.9518 0.7624 0.8667 0.3750 0.8530
AdaBoost 0.9639 0.9505 1.0000 0.5625 0.9425
GNB 0.7289 0.0198 0.8333 0.7500 0.5112
XGBoost 0.9819 0.9406 0.9667 0.7500 0.9553

均值填充下最优模型:XGBoost(acc=0.9553)

2. 中位数填充

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.5455 0.1667 1.0000 0.3333 0.3929
RF 0.7273 0.5833 0.0000 0.6667 0.6071
SVM 0.6364 0.5833 0.0000 0.3333 0.5357
AdaBoost 0.6364 0.5833 0.0000 0.3333 0.5357
GNB 0.7273 0.8333 0.0000 0.6667 0.7143
XGBoost 0.5455 0.5833 0.5000 0.6667 0.5714

中位数填充下最优模型:GNB(acc=0.7143)

3. 众数填充

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.8133 0.1386 0.3000 0.6250 0.5367
RF 0.9036 0.7525 0.5000 0.4375 0.7923
SVM 0.8072 0.0000 0.0667 0.9375 0.4824
AdaBoost 0.7771 0.6337 0.2333 0.4375 0.6613
GNB 0.4217 0.0198 0.2000 0.8125 0.2907
XGBoost 0.8675 0.7525 0.5333 0.3750 0.7732

众数填充下最优模型:RF(acc=0.7923)

4. 空值删除(CCA)

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.8193 0.1386 0.4000 0.5000 0.5431
RF 0.8855 0.7525 0.4333 0.4375 0.7764
SVM 0.7892 0.2970 0.6000 0.8750 0.6166
AdaBoost 0.6807 0.5644 0.3667 0.3750 0.5974
GNB 0.5542 0.0198 0.1333 0.7500 0.3514
XGBoost 0.8795 0.7228 0.5333 0.4375 0.7732

空值删除下最优模型:RF(acc=0.7764)

5. 线性回归填充

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.8494 0.0594 0.9333 0.8125 0.6006
RF 0.9759 0.9307 0.9667 0.8125 0.9521
SVM 0.8795 0.4455 0.9667 0.7500 0.7412
AdaBoost 0.9699 0.9604 0.9667 0.7500 0.9553
GNB 0.7289 0.0198 0.8000 0.7500 0.5080
XGBoost 0.9759 0.9604 0.9667 0.6875 0.9553

线性回归填充下最优模型:AdaBoost 和 XGBoost(acc=0.9553)

6. 随机森林填充

模型 recall_0 recall_1 recall_2 recall_3 acc
LR 0.8373 0.0891 0.4667 0.5625 0.5463
RF 0.9036 0.8119 0.6000 0.9375 0.8466
SVM 0.7771 0.3366 0.8000 1.0000 0.6486
AdaBoost 0.7229 0.7624 0.5667 0.7500 0.7220
GNB 0.4337 0.0198 0.2000 0.7500 0.2939
XGBoost 0.8675 0.8119 0.6333 0.8125 0.8243

随机森林填充下最优模型:XGBoost(acc=0.8243)

二、综合分析

1. 各填充方法下最优模型汇总

填充方法 最优模型 最佳准确率
均值填充 XGBoost 0.9553
中位数填充 GNB 0.7143
众数填充 RF 0.7923
空值删除 RF 0.7764
线性回归填充 AdaBoost / XGBoost 0.9553
随机森林填充 XGBoost 0.8243

2. 关键发现

整体最优组合

线性回归填充 + XGBoost / AdaBoost(准确率 0.9553)

模型表现分析

模型 最佳表现场景 最佳准确率 特点
XGBoost 均值填充、线性回归填充 0.9553 在多种填充方法下表现稳定且最优
RF 众数填充、空值删除 0.7923 集成学习优势明显
AdaBoost 线性回归填充 0.9553 与XGBoost并列最优
GNB 中位数填充 0.7143 简单模型在特定场景下表现突出
SVM 均值填充 0.8530 核方法有效但调参复杂
LR --- 0.6006 线性模型表达能力有限

3. 结论

  1. 最优填充方法 :线性回归填充 和均值填充效果最佳,准确率均达到 0.955
  2. 最优模型 :XGBoost 在多种填充方法下表现稳定,是最值得推荐的模型
  3. 推荐组合 :线性回归填充 + XGBoost,准确率 0.9553
相关推荐
2601_962071006 分钟前
Grok 4.6 与 Kimi K2.5 对比:编程、长文本与 API 成本怎么选?
人工智能
王仔小奶7 分钟前
慢SQL治理与性能调优:DBA如何用Shell/Python提升运维效率?
python·sql·dba
秦先生在广东8 分钟前
用4条规矩驯服AI写代码
人工智能
用户03321266636711 分钟前
使用 Python 快速在 PowerPoint 中生成表格【教程】
python
LeoLi63811 分钟前
随机应变,不是见招拆招:AI 干 6 倍工时之后,我把它做成了三层降级链路
人工智能·程序员
秦先生在广东15 分钟前
OpenBot让AI在本地当持久队友
人工智能
RaaS10018 分钟前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
烬羽18 分钟前
给 RAG Agent 装上"仪表盘":LangSmith 全链路观测与量化评估实战
深度学习·openai·ai编程
用户01715828193319 分钟前
Agent 为什么需要 CLI
人工智能
东坡AI20 分钟前
Agent 安全网关 · 威胁模型 v1.0(AI知识学习分享)
人工智能