)
引言在前面的文章中我们完成了矿物数据的预处理和缺失值填充得到了干净完整的训练集和测试集。接下来我们需要训练分类模型判断矿物类型A、B、C、D四类。本文将以均值填充后的数据为例依次训练逻辑回归、随机森林、支持向量机SVM、AdaBoost、高斯朴素贝叶斯、XGBoost六种模型并比较它们的性能。同时我们还会演示如何使用网格搜索GridSearchCV对逻辑回归进行超参数调优。本文代码保持原样重点讲解第一个模型——逻辑回归及其调参过程后续模型仅做简要差异说明。通过本文你将了解如何用 scikit-learn 快速训练多个分类器并提取关键评估指标。一、数据读取与准备首先加载已经填充好的训练集和测试集这里以均值填充的结果为例我的版本比较新用这个老的老警告看得烦就给屏蔽了import pandas as pd import warnings warnings.filterwarnings(ignore) # 忽略警告信息让输出更干净 datas1 pd.read_csv(data/训练数据集_均值填充.csv) datas2 pd.read_csv(data/测试数据集_均值填充.csv) x_train datas1.iloc[:, :-1] # 特征列除了最后一列 y_train datas1.iloc[:, -1] # 标签列最后一列 x_test datas2.iloc[:, :-1] y_test datas2.iloc[:, -1]数据格式为每一行是一个矿物样本最后一列是矿物类型0,1,2,3其余列是特征。二、逻辑回归含网格搜索逻辑回归虽然名字带“回归”但它是经典的分类算法尤其适合多分类任务。它通过线性组合特征再经过 softmax 函数转换为类别概率。1. 网格搜索调参在实际项目中我们通常希望找到最优的超参数组合。原代码中有一段注释掉的网格搜索代码这里我们将其展开解释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: [auto, ovr, multinomial], } # 创建Logistic回归模型实例 logreg LogisticRegression() grid_search GridSearchCV(logreg, param_grid, cv5) # 5折交叉验证 grid_search.fit(x_train, y_train) print(Best parameters set found on development set:) print(grid_search.best_params_)LogisticRegression关键参数整理penalty正则化类型可选值l1、l2、elasticnet、noneC正则化强度的倒数数值越小正则化效果越强solver优化算法不同算法支持的正则化有差异newton‑cg、lbfgs、sag仅支持 L2 或无正则化liblinear支持 L1、L2仅适用于二分类 / one‑vs‑rest多分类saga支持 L1、L2、elasticnet、无正则化multi_class多分类策略ovr一对多multinomial多项式softmax注意penaltynone时不支持该选项max_iter最大迭代次数注意事项上述参数网格并不是所有组合都合法部分参数之间存在约束关系penaltyl1不能搭配newton‑cg、sag、lbfgspenaltynone参数C会被直接忽略solverliblinearmulti_class只能设置为ovr实际做网格搜索时有两种处理方案根据不同solver拆分多组参数网格设置error_scoreraise直接抛出错误定位非法参数组合。原代码直接使用全部参数排列组合会生成大量不兼容的参数对运行过程容易报错建议参考官方文档精简搜索空间。小技巧简单可靠方案固定penaltyl2、multi_classmultinomial仅对C和solver做网格搜索可规避绝大多数参数兼容问题。2. 模型创建与参数设置原始代码中直接使用了一组固定参数lr LogisticRegression(C0.001, max_iter100, penaltyNone, solverlbfgs)模型参数说明penaltyNone关闭正则化。逻辑回归一般使用L1/L2正则化抑制过拟合本案例数据集规模不大、特征已做标准化因此选择不施加正则化。C0.001正则化强度倒数。由于设置了penaltyNone此参数不会生效。solverlbfgs优化算法属于拟牛顿法适合小数据集与多分类场景。max_iter100最大迭代次数模型没收敛的情况下可以适当调大该数值。3. 训练与预测若使用固定参数本文实际采用lr.fit(x_train, y_train) from sklearn import metrics train_predicted lr.predict(x_train) print(lr的自测结果是) print(metrics.classification_report(y_train, train_predicted, digits6)) test_predicted lr.predict(x_test) print(lr的测试结果是) print(metrics.classification_report(y_test, test_predicted, digits6))classification_report 会输出每个类别的精确率precision、召回率recall、F1-score以及整体的准确率accuracy。digits6 让数值保留6位小数便于观察细微差别。4. 提取关键指标为了方便后续比较代码从分类报告中提取了各类别的召回率和整体准确率存入字典 LR_resulta metrics.classification_report(y_test, test_predicted, digits6) b a.split() # 将报告字符串按空白字符分割成列表 LR_result {} LR_result[lr中0的回归率] b[6] LR_result[lr中1的回归率] b[11] LR_result[lr中2的回归率] b[16] LR_result[lr中3的回归率] b[21] LR_result[lr测试集正确率] b[25] print(LR_result)这里采用了一种“取巧”的方式分类报告的文本格式固定通过 split() 将其拆分成单词列表然后根据位置索引取出所需数值。例如 b[6] 对应类别0的召回率。这种方法虽然不够优雅但简单有效。三、随机森林随机森林是一种集成学习算法通过构建多棵决策树并投票决定最终类别。它对异常值不敏感能处理非线性关系。from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(bootstrapFalse, max_depth20, max_featureslog2, min_samples_leaf1, min_samples_split2, n_estimators50, random_state487)n_estimators50决策树的数量max_depth20单棵树的最大深度用于抑制过拟合max_featureslog2每棵树做分裂时选取log2(总特征数)个特征参与计算bootstrapFalse关闭自助采样每棵树使用全部样本进行训练其余参数min_samples_leaf、min_samples_split用于进一步控制树的生长过程训练和评估方式与逻辑回归完全相同不再赘述。四、支持向量机SVMSVM 通过寻找最大间隔超平面来分类可以使用核函数处理非线性问题。from sklearn.svm import SVC svm SVC(C1, coef00.1, degree4, gamma1, kernelpoly, probabilityTrue, random_state100)kernelpoly使用多项式核函数degree4多项式核的阶次gamma1核系数影响决策边界形态C1惩罚参数控制间隔大小与误分类样本之间的权衡probabilityTrue开启概率估计代码未调用predict_proba该参数用于预留兼容五、AdaBoostAdaBoostAdaBoost 是一种 Boosting 算法通过组合多个弱学习器通常是决策树桩来提升性能。from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier abf AdaBoostClassifier( estimatorDecisionTreeClassifier(max_depth2), n_estimators200, learning_rate1.0, random_state0 )estimator基学习器本案例使用最大深度为2的决策树n_estimators200弱学习器的最大数量代表迭代次数learning_rate1.0学习率用于控制每个弱学习器的权重缩减系数六、高斯朴素贝叶斯朴素贝叶斯基于贝叶斯定理和特征条件独立假设。高斯朴素贝叶斯适用于连续特征并假设每个特征服从高斯分布。from sklearn.naive_bayes import GaussianNB gnb GaussianNB()无需调参简单快速。七、XGBoostXGBoost 是梯度提升树的优化实现在很多竞赛中表现优异。import xgboost as xgb xgb_model xgb.XGBClassifier(learning_rate0.05, n_estimators200, num_class5, max_depth7, min_child_weight1, gamma0, subsample0.6, colsample_bytree0.8, objectivemulti:softmax, seed0)learning_rate0.05学习率取值较小时一般需要更多棵树才能收敛n_estimators200决策树数量max_depth7单棵树的最大深度subsample0.6、colsample_bytree0.8分别为行采样、列采样比例用于缓解过拟合objectivemulti:softmax多分类任务的目标函数八、模型性能比较每个模型都提取了测试集正确率最后通过比较找出最优模型all_models [ (逻辑回归, float(LR_result[lr测试集正确率])), (随机森林, float(RF_result[rf测试集正确率])), (SVM, float(SVM_result[svm测试集正确率])), (AdaBoost, float(ABF_result[abf测试集正确率])), (高斯朴素贝叶斯, float(GNB_result[gnb测试集正确率])), (XGBoost, float(XGBoost_result[xgb测试集正确率])) ] best_name, best_score max(all_models, keylambda t: t[1]) print(正确率最高模型, \t, best_name, best_score)九、总结本文演示了如何用 scikit-learn 快速训练六种分类模型并评估它们在矿物分类任务上的表现。逻辑回归作为基础模型简单可解释随机森林和 XGBoost 通常能获得更高的准确率SVM 在特征维度较高时表现不错朴素贝叶斯计算快速适合基线模型。此外我们还介绍了如何使用网格搜索对逻辑回归进行超参数调优但需要注意参数组合的兼容性。在实际项目中建议对所有模型都进行一定程度的调参例如对随机森林调整 n_estimators 和 max_depth对 SVM 调整 C 和 gamma并使用交叉验证选择最优参数。本文仅以逻辑回归为例演示了网格搜索其余模型可参照类似方法进行优化。