第 9 章 机器学习与数据挖掘
- 作者
- Name
- 青玉白露
- Github
- @white0dew
- Modified on
- Reading time
- 12 分钟
阅读:.. 评论:..
机器学习和数据挖掘是当前计算机科学和数据分析领域最热门的话题之一。随着数据量的爆炸式增长,如何从海量数据中挖掘出有价值的信息和知识,已经成为各行各业亟待解决的问题。MATLAB 作为一款功能强大的科学计算软件,集成了丰富的机器学习算法库和工具箱,为我们提供了一站式的机器学习解决方案。
9.1 机器学习基础
在开始学习机器学习算法之前,我们需要先了解一些基本概念。
9.1.1 机器学习的定义与分类
机器学习是一门多领域交叉学科,其目标是开发能够自动"学习"的计算机算法和系统。通过学习数据中的模式,机器学习算法可以对未知数据做出预测。 根据任务和反馈形式的不同,机器学习主要可以分为:
- 监督学习(Supervised Learning):训练数据包含输入和期望输出,算法需要从标注数据中学习映射关系。代表算法有回归、分类等。
- 无监督学习(Unsupervised Learning):训练数据只有输入没有标签,算法需要自主发现数据中有趣的结构。代表算法有聚类、降维等。
- 强化学习(Reinforcement Learning):通过与环境的交互获得奖励或惩罚来学习最优决策。代表算法有 Q 学习、策略梯度等。
本章将重点介绍前两类学习方法。
9.1.2 MATLAB 的机器学习工具箱
MATLAB 提供了功能丰富的机器学习工具箱,其中最主要的是:
- Statistics and Machine Learning Toolbox:提供了常用的统计和机器学习算法,包括监督学习和无监督学习。
- Deep Learning Toolbox:提供深度学习算法和预训练模型,支持卷积神经网络和长短期记忆网络等。
- Reinforcement Learning Toolbox:提供强化学习算法,如 Q 学习、SARSA、深度 Q 网络(DQN)等。
此外还有计算机视觉、自然语言处理、预测维护等领域的工具箱,都集成了先进的机器学习技术。本章的示例将主要使用 Statistics and Machine Learning Toolbox。
9.1.3 机器学习的基本流程
一个完整的机器学习项目通常包括以下几个步骤:
- 收集数据:从各种渠道收集和整理所需的数据。
- 数据预处理:对收集到的数据进行清洗、转换、特征提取等预处理。
- 选择模型:根据任务和数据的特点,选择合适的机器学习模型。
- 训练模型:使用预处理后的数据对选定的模型进行训练。
- 评估模型:使用一定的评价指标评估训练好的模型性能。
- 优化模型:分析模型表现,并通过调参、特征工程等方法优化模型。
- 应用模型:将训练好的模型部署到实际应用系统中。
本章将通过具体的算法讲解和案例演示,帮助你建立对机器学习的全面认识。
9.2 监督学习
监督学习是最常见的机器学习范式之一。在监督学习中,训练数据由输入和期望输出(标签)组成,算法的任务是学习输入到输出的映射关系。监督学习可以进一步分为回归和分类两大类任务。
9.2.1 线性回归
线性回归是最基础和常用的回归算法,它假设输入和输出之间存在线性关系。给定数据集
,线性回归的目标是学习一个线性函数: 使得预测值和真实值的差别最小。这里和是待学习的模型参数。 在 MATLAB 中,我们可以使用fitlm
函数来训练一个线性回归模型:
% 生成随机数据 X = rand(100, 1); y = 2 * X + 1 + 0.2*randn(size(X)); % 训练线性回归模型 mdl = fitlm(X,y);
训练好的模型可以对新数据进行预测:
% 生成测试数据 Xtest = rand(10, 1); ytest = predict(mdl, Xtest);
我们还可以用图形来直观地观察模型的拟合效果:
scatter(X, y) hold on plot(X, predict(mdl, X), 'r-', 'LineWidth', 2) xlabel('X') ylabel('y') legend('Data','Linear Fit','Location','best')
mermaid graph LR A((输入)) --> B(线性模型) B --> C((预测))
回归分析是一种强大的预测建模工具,除了线性回归外,常见的还有多项式回归、逻辑回归等。
9.2.2 分类方法
分类是监督学习的另一类重要任务,其目标是将输入数据划分到预先定义的类别中。常见的分类算法包括:
- k 近邻(k-NN):根据最近的 k 个训练样本的标签来决定新样本的分类。
- 朴素贝叶斯:利用贝叶斯定理,假设各特征相互独立,计算后验概率进行分类。
- 决策树:通过递归地构建一棵树,每个节点对某个特征进行分裂,实现分而治之的分类。
- 支持向量机(SVM):在特征空间中寻找一个最大间隔超平面来分割不同类别的数据。
下面以 k 近邻算法为例,演示如何用 MATLAB 进行分类任务。 首先,我们生成一个简单的二分类数据集:
rng(1); % 固定随机种子 X = [randn(50,2); randn(50,2)+2]; y = [zeros(50,1); ones(50,1)]; figure; gscatter(X(:,1), X(:,2), y)
mermaid graph LR A((输入)) --> B{分类模型} B -->|类别1| C((猫)) B -->|类别2| D((狗))
然后,使用fitcknn
函数训练一个 k 近邻分类器:
mdl = fitcknn(X,y,'NumNeighbors',3);
对新数据进行预测:
Xtest = [randn(10,2); randn(10,2)+2]; ytest = predict(mdl, Xtest); figure; gscatter(X(:,1), X(:,2), y) hold on gscatter(Xtest(:,1), Xtest(:,2), ytest) legend('Class 1','Class 2','Test Data','Location','best')
k 近邻是一种直观易懂的分类算法,但在高维数据上性能较差。其他几种分类器各有优缺点,需要根据任务的需求选择合适的算法。
9.2.3 模型评估与选择
训练好模型后,我们需要评估其泛化性能,即对未知数据的预测能力。常用的模型评估指标有:
- 回归任务:均方误差(MSE)、平均绝对误差(MAE)、决定系数(R^2)等。
- 分类任务:准确率、精确率、召回率、F1 值、ROC 曲线下面积(AUC)等。
在 MATLAB 中,我们可以方便地计算这些指标:
% 回归任务 y_pred = predict(mdl, X); mse = mean((y-y_pred).^2); mae = mean(abs(y-y_pred)); r2 = corr(y, y_pred)^2; % 分类任务 [~, scores] = resubPredict(mdl); [X,Y,T,AUC,OPTROCPT] = perfcurve(y,scores(:,2), 1);
为了更准确地评估模型性能,我们通常使用交叉验证的方法,将数据划分为多个互斥的训练集和测试集,多次训练和评估后取平均值。MATLAB 提供了现成的交叉验证函数:
CVO = cvpartition(y,'KFold',5); for i = 1:CVO.NumTestSets trIdx = CVO.training(i); teIdx = CVO.test(i); mdl = fitcknn(X(trIdx,:),y(trIdx)); y_pred = predict(mdl, X(teIdx,:)); acc_cv(i) = sum(y_pred == y(teIdx)) / numel(y_pred); end mean_acc = mean(acc_cv);
除了交叉验证,我们还可以用留一法、自助法等方法来评估模型。模型评估的目的是为了选择性能最优的模型进行后续的预测任务。
9.3 无监督学习
与监督学习相对,无监督学习的训练数据没有标签信息。算法需要从数据本身学习其内在结构和关系。无监督学习主要包括聚类、降维、异常检测等任务。
9.3.1 聚类分析
聚类分析将相似的样本自动归到一个类别中,是最经典的无监督学习任务之一。常见的聚类算法有:
- k 均值聚类:将数据划分为 k 个簇,每个簇由该簇的中心(均值)描述。
- 层次聚类:生成一个聚类树,不同层次反映了不同粒度的聚类结果。
- 基于密度的聚类:根据样本分布的紧密程度来划分簇。
在 MATLAB 中,我们可以使用kmeans
函数实现 k 均值聚类:
X = [randn(200,2); randn(200,2)+3; randn(200,2)+6]; [idx, C] = kmeans(X, 3); figure; scatter(X(:,1),X(:,2),50,idx,'filled') hold on plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 15, 'LineWidth', 3) legend('Cluster 1','Cluster 2','Cluster 3','Centroids',... 'Location','NW')
mermaid graph TD A((数据)) --> B{聚类算法} B --> C[聚类1] B --> D[聚类2] B --> E[聚类3]
聚类的评估指标主要有轮廓系数、Calinski-Harabasz 指数等,反映了聚类的紧凑度和分离度。
9.3.2 降维方法
在实际任务中,我们经常会遇到高维数据。过高的维度不仅增加了时间和空间复杂度,还可能带来维度灾难等问题。降维就是要在保持数据特性的前提下,将高维数据映射到低维空间。 常用的降维方法包括:
- 主成分分析(PCA):通过线性变换将数据投影到方差最大的几个正交方向上。
- 独立成分分析(ICA):通过线性变换找到数据的统计独立成分。
- 流形学习:假设高维数据位于低维流形上,通过非线性映射找到内在低维结构。
下面演示如何用 MATLAB 进行 PCA 降维:
load fisheriris X = meas; [coeff, score, latent] = pca(X); figure; scatter(score(:,1), score(:,2)) xlabel('1st Principal Component') ylabel('2nd Principal Component')
PCA 不仅可以用于数据压缩和可视化,还能用于特征提取和噪声过滤。除了 PCA,MATLAB 还提供了fastICA
, lle
等函数实现其他降维算法。
9.3.3 异常检测
异常检测的目标是找出数据中与大多数样本有显著差异的个体。异常值得关注,因为它们可能代表了测量误差、恶意行为等特殊情况。 异常检测的常用方法有:
- 统计方法:假设正常数据服从某种分布,小概率事件即为异常。
- 距离方法:异常点与其他点的距离较远。
- 密度方法:异常点所在区域的密度较低。
下面用 MATLAB 实现一个简单的基于高斯分布的异常检测:
X = randn(1000,2); X = [X; [3,4]; [4,3]; [10, 1]]; mu = mean(X); sigma = cov(X); p = mvnpdf(X,mu,sigma); threshold = 0.05; outliers = X(p<threshold,:); figure; scatter(X(:,1), X(:,2)) hold on scatter(outliers(:,1), outliers(:,2), 100, 'r', 'x') legend('Normal','Anomaly','Location','NW')
mermaid graph LR A((输入)) --> B{异常检测} B -->|正常| C((数据点)) B -->|异常| D((异常点))
MATLAB 也提供了现成的异常检测函数如isoutlier
, robustcov
等。异常检测在诸如故障诊断、欺诈检测等领域有广泛应用。
9.4 模型评估与选择
前面我们介绍了几种常见的机器学习任务和算法。但在实际应用中,我们往往要在多个候选模型中进行选择。这就需要使用恰当的方法对模型进行评估和比较。
9.4.1 评估指标
针对不同的任务,我们需要选取合适的评估指标:
- 回归任务:MSE, MAE, R^2 等。
- 分类任务:准确率、精确率、召回率、F1 值、混淆矩阵、ROC 曲线等。
- 聚类任务:轮廓系数、Davies-Bouldin 指数、Calinski-Harabasz 指数等。
- 降维任务:重构误差、可解释方差比等。
除了上述提到的,还有一些通用的指标如训练时间、预测时间、模型大小等,也需要权衡。
9.4.2 交叉验证
为了得到模型性能的无偏估计,我们通常使用交叉验证的方法,将数据划分为多份,轮流作为训练集和测试集,最后取平均值。常见的交叉验证方法有:
- 留出法:将数据划分为互斥的训练集和测试集。
- k 折交叉验证:将数据等分为 k 份,轮流取其中 1 份作为测试集,其余作为训练集。
- 留一法:每次只留 1 个样本作为测试集,其余作为训练集,重复 n 次。
MATLAB 提供了便捷的交叉验证框架,以 k 折交叉验证为例:
load ionosphere indices = crossvalind('Kfold',Y,5); cp = classperf(Y); for i = 1:5 test = (indices == i); train = ~test; mdl = fitcknn(X(train,:),Y(train)); predictions = predict(mdl,X(test,:)); classperf(cp,predictions,test) end cp.ErrorRate
交叉验证可以有效减少数据划分的随机性,提高性能评估的可靠性。
9.4.3 模型选择
利用交叉验证,我们可以比较不同模型的性能,选出最优的模型。除此之外,我们还需要调整模型的超参数以达到最佳性能,这个过程称为模型选择。常用的模型选择方法有:
- 网格搜索:穷举所有超参数组合。
- 随机搜索:随机采样超参数组合。
- 贝叶斯优化:建立超参数与性能的概率模型,引导搜索方向。
MATLAB 提供了fitcauto
等自动化模型选择的函数,用户只需提供数据和候选模型,即可自动搜索最优模型:
load fisheriris X = meas; Y = species; template = templateSVM('KernelFunction','rbf'); mdl = fitcauto(X,Y,'OptimizeHyperparameters','auto',... 'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName',... 'expected-improvement-plus'),'Holdout',0.3,... 'Learners',template,'ShowPlots',true); mdl.HyperparameterOptimizationResults
fitcauto
使用贝叶斯优化来自动调优超参数,并返回性能最优的模型。
模型评估和选择是机器学习不可或缺的一步。通过使用合适的评估指标、交叉验证和超参数优化,我们能够从众多候选模型中选出性能最优、泛化能力最强的模型,用于后续的预测任务。