Bayes、决策树、SVM 图像分类对比:6类垃圾数据集上66.13% vs 52.17% vs 52.04%
📅 2026/7/7 1:40:22
👁️ 阅读次数
📝 编程学习
三大经典算法在垃圾分类图像识别中的性能较量
当面对一个包含六类垃圾(纸板、玻璃、金属、纸张、塑料和其他垃圾)的图像数据集时,数据科学家通常会考虑多种机器学习算法。本文将通过实验数据,深入分析朴素贝叶斯、决策树和支持向量机(SVM)这三种经典算法在该任务上的表现差异,并探讨背后的原因。
1. 实验设计与数据集准备
我们使用的数据集包含六类垃圾的图片,每类样本被存储在以数字0-5命名的文件夹中。数据集按照70%训练集和30%测试集的比例随机划分,确保各类别在训练和测试集中的分布均衡。
图像预处理采用以下步骤:
- 使用OpenCV读取图片并统一调整为256×256像素
- 计算每个通道的二维直方图(256×256 bins)
- 将直方图归一化并展平作为特征向量
import cv2 import numpy as np from sklearn.model_selection import train_test_split # 图像读取与特征提取 X = [] Y = [] for i in range(6): for f in os.listdir(f"Garbage_classification/{i}"): img = cv2.imread(f"Garbage_classification/{i}/{f}") img = cv2.resize(img, (256,256), interpolation=cv2.INTER_CUBIC) hist = cv2.calcHist([img], [0,1], None, [256,256], [0.0,255.0,0.0,255.0]) X.append((hist/255).flatten()) Y.append(i) X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=1)2. 算法实现与性能指标
我们采用Scikit-learn库实现三种算法,使用准确率、Kappa系数和混淆矩阵作为评估指标。Kappa系数衡量分类结果与随机分类的一致性,值越高表示模型性能越好。
2.1 朴素贝叶斯分类器
朴素贝叶斯基于贝叶斯定理,假设特征之间相互独立。我们使用伯努利朴素贝叶斯变体:
from sklearn.naive_bayes import BernoulliNB from sklearn.metrics import cohen_kappa_score, classification_report clf = BernoulliNB(alpha=6, binarize=0) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print(f"准确率: {clf.score(X_test,y_test):.2%}") print(f"Kappa系数: {cohen_kappa_score(y_test, y_pred):.3f}") print(classification_report(y_test, y_pred))2.2 决策树分类器
决策树通过递归划分特征空间进行分类,我们设置了最大深度等参数防止过拟合:
from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(max_depth=11, max_features=83, min_samples_leaf=2, min_samples_split=12) clf.fit(X_train, y_train) y_pred = clf.predict(X_test)2.3 支持向量机(SVM)
SVM寻找使类别间隔最大化的超平面,我们使用默认的RBF核函数:
from sklearn import svm clf = svm.SVC() clf.fit(X_train, y_train) y_pred = clf.predict(X_test)3. 性能对比与分析
三种算法在测试集上的表现对比如下:
| 算法 | 准确率 | Kappa系数 | 训练速度 |
|---|---|---|---|
| 朴素贝叶斯 | 52.04% | 0.404 | 最快 |
| 决策树 | 52.17% | 0.406 | 中等 |
| SVM | 66.13% | 0.577 | 最慢 |
从混淆矩阵分析,SVM在各类别上的表现更为均衡,而朴素贝叶斯和决策树在"其他垃圾"类别上表现较差。这可能是因为:
- 特征线性可分性:SVM通过核技巧将特征映射到高维空间,可能找到了更好的分类边界
- 特征独立性假设:朴素贝叶斯的强独立性假设在图像数据上不成立
- 过拟合问题:决策树尽管设置了剪枝参数,仍可能对训练数据过拟合
提示:在实际应用中,SVM的优异表现往往伴随着更长的训练时间,特别是在大数据集上。需要在准确率和计算成本之间权衡。
4. 算法特性与适用场景
4.1 朴素贝叶斯的优势与局限
优势:
- 训练和预测速度极快
- 小样本表现良好
- 对缺失数据不敏感
局限:
- 特征独立性假设在实际中很少成立
- 对输入数据分布敏感
4.2 决策树的特性
特点:
- 可解释性强
- 支持特征重要性评估
- 对数据分布无要求
改进方向:
- 可通过集成方法(如随机森林)提升性能
- 需要仔细调参防止过拟合
4.3 SVM的核心优势
优势:
- 有效处理高维数据
- 核技巧处理非线性问题
- 泛化能力强,不易过拟合
参数调优建议:
- 尝试不同核函数(线性、多项式、RBF)
- 调整正则化参数C
- 对大规模数据考虑线性SVM变种
5. 优化方向与实用建议
基于实验结果,我们提出以下优化建议:
特征工程改进:
- 尝试CNN提取的深度特征替代手工特征
- 使用PCA降维减少计算量
算法调参:
from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1]} grid = GridSearchCV(svm.SVC(), param_grid, cv=5) grid.fit(X_train, y_train)集成方法:
- 结合多种算法的优势
- 使用投票或堆叠策略
数据增强:
- 对训练图像进行旋转、翻转等变换
- 解决类别不平衡问题
在实际部署中,如果计算资源有限且对实时性要求高,可以考虑轻量级的朴素贝叶斯;如果追求最佳准确率且能接受较高计算成本,SVM是更好的选择。
编程学习
技术分享
实战经验