一、实验目的
实验背景:
分类算法是机器学习和人工智能领域中的一种重要技术,它主要用于将输入数据分为不同的类别。这种技术在各种应用场景中得到了广泛的应用
实验目的:
1.理解并掌握几种常见的机器学习分类算法(如逻辑回归、决策树、贝叶斯分类、支持向量机SVM、K近邻KNN等)的基本原理。
2.通过实际数据集的应用,比较不同分类算法在特定问题上的性能表现,包括准确率、召回率、F1分数等指标。
3.学习如何对分类模型进行训练、评估及调优,以提高模型的泛化能力。
4.掌握数据预处理的基本方法,如缺失值处理、特征选择、数据标准化/归一化等。
二、实验环境
- 硬件要求:普通PC或服务器,建议CPU性能良好,内存至少8GB。
- 软件要求:Matlab
三:源代码
1.决策树算法:
load fisheriris
data = meas; % 特征数据
labels = species; % 标签数据
%数据清洗
% 将字符串标签转换为数值型
label_map = containers.Map({'setosa', 'versicolor', 'virginica'}, {1, 2, 3});
numeric_labels = zeros(size(labels));
for i = 1:length(labels)
numeric_labels(i) = label_map(labels{i});
end
%数据划分(训练集与测试集)
cv = cvpartition(size(data, 1), 'HoldOut', 0.3);
idxTrain = training(cv);
idxTest = test(cv);
XTrain = data(idxTrain, :);
YTrain = numeric_labels(idxTrain);
XTest = data(idxTest, :);
YTest = numeric_labels(idxTest);
% 选择决策树算法进行实现,对算法进行参数调优
% 初始化决策树模型
treeModel = fitctree(XTrain, YTrain);
% 参数调优(例如调整最大分支数)
maxSplits = [1:10, 20, 50];
accuracy = zeros(length(maxSplits), 1);
for i = 1:length(maxSplits)
treeModel = fitctree(XTrain, YTrain, 'MaxNumSplits', maxSplits(i));
predictions = predict(treeModel, XTest);
accuracy(i) = sum(predictions == YTest) / length(YTest);
end
% 找到最优参数
[~, bestIdx] = max(accuracy);
bestMaxSplits = maxSplits(bestIdx);
bestAccuracy = accuracy(bestIdx);
fprintf('Optimal MaxNumSplits: %d, Accuracy: %.2f%%\n', bestMaxSplits, bestAccuracy * 100);
%分类性能对比图
figure;
plot(maxSplits, accuracy, '-o');
xlabel('Max Number of Splits');
ylabel('Accuracy');
title('Accuracy vs. Max Number of Splits');
grid on;
% 使用最优参数重新训练模型
treeModel = fitctree(XTrain, YTrain, 'MaxNumSplits', bestMaxSplits);
predictions = predict(treeModel, XTest);
% 绘制混淆矩阵
confMat = confusionmat(YTest, predictions);
figure;
confusionchart(confMat);
title('Confusion Matrix');
% 计算准确率、召回率等
accuracy = sum(predictions == YTest) / length(YTest);
classCounts = histcounts(YTest, [0.5, 1.5, 2.5, 3.5]);
precision = zeros(length(classCounts), 1);
recall = zeros(length(classCounts), 1);
for i = 1:length(classCounts)
classIdx = i;
truePositives = sum((predictions == classIdx) & (YTest == classIdx));
falsePositives = sum((predictions == classIdx) & (YTest ~= classIdx));
falseNegatives = sum((predictions ~= classIdx) & (YTest == classIdx));
precision(i) = truePositives / (truePositives + falsePositives);
recall(i) = truePositives / (truePositives + falseNegatives);
end
fprintf('Accuracy: %.2f%%\n', accuracy * 100);
disp('Precision for each class:');
disp(precision);
disp('Recall for each class:');
disp(recall);
运行结果:
(1)混淆矩阵:
(2)分类性能对比图:
(3)准确率与召回率:
2.贝叶斯分类算法:
% 加载数据集
load fisheriris;
irisData = meas; % 特征矩阵
irisLabels = species; % 标签向量
% 数据划分 将数据集按照8:2的比例划分为训练集和测试集。
cv = cvpartition(irisLabels, 'HoldOut', 0.2);
idxTrain = training(cv);
idxTest = test(cv);
irisTrainData = irisData(idxTrain, :);
irisTrainLabels = irisLabels(idxTrain);
irisTestData = irisData(idxTest, :);
irisTestLabels = grp2idx(irisLabels(idxTest));
% 训练朴素贝叶斯分类器
Mdl = fitcnb(irisTrainData, irisTrainLabels);
% 预测测试集
irisPredLabels = grp2idx(predict(Mdl, irisTestData));
% 绘制混淆矩阵
confMat = confusionmat(irisTestLabels, irisPredLabels);
figure;
confusionchart(confMat);
title('Confusion Matrix for Naive Bayes Classifier');
% 计算准确率
accuracy = sum(irisPredLabels == irisTestLabels) / length(irisTestLabels);
fprintf('Accuracy: %.2f%%\n', accuracy * 100);
% 是三类分类问题,计算每类的召回率(真正例率)
truePositives = zeros(3, 1);
falseNegatives = zeros(3, 1);
for i = 1:3
truePositives(i) = sum((irisPredLabels == i) & (irisTestLabels == i));
falseNegatives(i) = sum((irisPredLabels ~= i) & (irisTestLabels == i));
end
recall = truePositives ./ (truePositives + falseNegatives);
fprintf('Recall for each class: [%.2f%%, %.2f%%, %.2f%%]\n', recall * 100);
运行结果:
(1)混淆矩阵:
(2)准确率与召回率:
3.模型性能对比
决策树算法
优点:
(1)易于理解和解释:决策树模型以树状图的形式呈现,直观易懂。
(2)能够处理数值和分类数据:决策树算法可以处理不同类型的数据,具有广泛的适用性。
(3)对缺失值不敏感:在存在缺失值的情况下,决策树算法仍然可以进行训练。
(4)计算效率高:在构建模型时,决策树算法通常具有较高的效率。
缺点:
(1)过拟合风险:如果决策树过于复杂,可能会发生过拟合,导致模型在测试集上的表现不佳。
(2)忽略属性间的相关性:决策树假设属性之间相互独立,这在现实中往往不成立,可能影响模型的准确性。
(3)对类别不平衡敏感:对于样本类别分布极不均匀的数据,决策树的效果可能不佳。
贝叶斯分类算法
优点:
(1)分类准确率高:在许多场合,朴素贝叶斯(Naïve Bayes)分类算法可以与决策树和神经网络分类算法相媲美。
(2)计算效率高:朴素贝叶斯分类器在训练过程中计算效率很高,适用于大规模数据集。
(3)对缺失数据不敏感:在存在缺失数据的情况下,朴素贝叶斯仍然可以进行分类。
缺点:
(1)属性独立性假设:朴素贝叶斯假设属性之间相互独立,这在现实中往往不成立,可能导致分类结果不准确。
(2)对输入数据的表达形式敏感:不同的数据表达形式可能会影响分类效果。
4.调优效果分析
决策树算法:
(1)剪枝:通过剪枝操作,可以减少决策树的复杂度,降低过拟合的风险。剪枝包括预剪枝和后剪枝两种方式,预剪枝是在构建决策树的过程中提前停止树的生长,后剪枝是在决策树构建完成后对树进行简化。
(2)特征选择:选择合适的特征可以提高决策树的准确性。可以使用信息增益、基尼系数等指标进行特征选择,选择对分类结果影响较大的特征。
(3)参数调优:决策树算法中有一些参数可以进行调优,如树的深度、叶子节点的最小样本数等。通过调整这些参数,可以使决策树更加适应数据集。
经过调优后,决策树算法在保持模型简洁性的同时,可以提高模型的准确性和泛化能力。
贝叶斯分类算法:
(1)特征选择:与决策树类似,选择合适的特征也可以提高贝叶斯分类算法的准确性。需要选择对分类结果影响较大的特征进行训练。
(2)参数估计:在贝叶斯分类算法中,参数估计的准确性对分类结果有很大影响。可以使用最大似然估计、贝叶斯估计等方法进行参数估计。
(3)降低独立性假设:为了降低朴素贝叶斯算法中属性独立性假设的影响,可以使用一些改进的贝叶斯分类算法,如TAN(tree augmented Bayes network)算法等。这些算法通过发现属性对之间的依赖关系来降低任意属性之间独立的假设。
经过调优后,贝叶斯分类算法可以在保持计算效率的同时,提高模型的准确性和鲁棒性。
5.结论与未来工作展望
在对比决策树算法与贝叶斯分类算法的研究中,我们深入分析了这两种算法在机器学习领域的应用及其性能特点。决策树算法凭借其直观易懂、处理数据类型广泛以及计算效率高等优点,在诸多实际场景中得到了广泛应用。同时,通过剪枝、特征选择等调优手段,决策树算法在防止过拟合、提高分类准确性方面展现出了强大的能力。
而贝叶斯分类算法,特别是朴素贝叶斯分类器,其分类准确率高且计算效率显著,对缺失数据不敏感,这些特点使其在大规模数据集上表现出色。尽管朴素贝叶斯算法基于属性独立性假设,但在许多实际应用中,其分类效果仍然令人满意。通过特征选择、参数估计以及改进算法以降低独立性假设的影响,贝叶斯分类算法的准确性和鲁棒性得到了进一步提升。
综上所述,决策树算法与贝叶斯分类算法各有千秋,选择哪种算法取决于具体问题的特性和数据集的属性。在实际应用中,我们应结合问题的实际需求和数据特点,灵活选择并调优算法,以期达到最佳的分类效果。