机器学习中的聚类分析与模型解释
立即解锁
发布时间: 2025-08-31 00:28:36 阅读量: 12 订阅数: 18 AIGC 

### 机器学习中的聚类分析与模型解释
#### 1. 聚类分析概述
聚类分析是一种无监督机器学习方法,旨在将数据分组到不同的簇中,每个簇包含相似的观测值。其相似性基于特定的度量标准,这些标准因任务和应用而异。与分类问题不同,聚类处理的是没有真实标签或类别分配的数据集。
mlr3cluster 包为聚类分析扩展了 mlr3,提供了以下对象:
- `TaskClust`:用于定义聚类任务。
- `LearnerClust`:作为聚类学习器的基类。
- `PredictionClust`:作为预测对象的专用类。
- `MeasureClust`:作为性能度量的专用类。
由于聚类是无监督学习的一种,`TaskClust` 与 `TaskRegr` 和 `TaskClassif` 对象略有不同:
- 缺少 `truth()` 函数,因为观测值没有标签。
- `target` 字段为空,访问时将返回 `character(0)`。
此外,`LearnerClust` 提供了两个监督学习器中不存在的额外字段:
- `assignments`:返回训练数据的簇分配,训练前访问返回 `NULL`。
- `save_assignments`:一个布尔字段,控制是否在学习器中存储训练集分配。
最后,`PredictionClust` 包含两个额外字段:
- `partition`:存储簇分区。
- `prob`:存储每个观测值属于每个簇的概率。
#### 2. 聚类学习器的训练和预测
聚类学习器提供了训练和预测方法。分析通常包括使用所有可用数据构建簇,此过程称为训练。
一些学习器可以使用 `predict` 将新观测值分配到现有组中,但并非所有情况都适用,例如层次聚类。在层次聚类中,目标是通过将大簇拆分为小簇或将小簇合并为大簇来构建嵌套簇的层次结构,最终结果是一个树或树状图,添加新数据点时可能会改变。为了与生态系统的其他部分保持一致,mlr3cluster 为层次聚类器提供了 `predict` 方法,但它只是通过在相应级别切割树将所有点分配到指定数量的簇中。
训练后,`model` 字段存储学习器的模型,不同学习器的模型外观取决于底层库。`predict` 返回一个 `PredictionClust` 对象,提供学习模型的简化视图。
以下是一个使用 $k$-means 学习器对美国逮捕数据集进行聚类分析的示例:
```R
library("mlr3")
library("mlr3cluster")
library("mlr3viz")
set.seed(1L)
# create an example task
task = tsk("usarrests")
print(task)
# create a k-means learner
learner = lrn("clust.kmeans")
# assigning each observation to one of the two clusters (default in clust.kmeans)
learner$train(task)
learner$model
# make "predictions" for the same data
prediction = learner$predict(task)
autoplot(prediction, task)
```
#### 3. 聚类质量评估指标
由于无监督学习中没有真实数据,无法像监督学习那样将预测与真实标签进行比较。但可以通过量化同一簇内对象的紧密程度(簇内聚性)以及不同簇之间的差异程度(簇分离性)来衡量聚类分配的质量。
有几个内置的评估指标可用于评估聚类质量:
- **簇内平方和(WSS)**:计算观测值与质心之间的平方差之和,范围为 $[0, \infty)$,值越小表示簇越紧凑。
- **轮廓质量指数**:量化每个点属于其分配簇与相邻簇的程度,值在 $[-1, 1]$ 范围内。接近 1 表示聚类良好,接近 0 表示位于两个簇之间,接近 -1 表示可能放置在错误的簇中。
以下是一个使用不同学习器对鸢尾花数据集进行基准实验的示例,并使用簇内平方和和轮廓度量评估每个学习器的质量:
```R
design = benchmark_grid(
tasks = TaskClust$new("iris", iris[-5]),
learners = list(
lrn("clust.kmeans", centers = 3L),
lrn("clust.pam", k = 2L),
lrn("clust.cmeans", centers = 3L)),
resamplings = rsmp("insample"))
print(design)
# execute benchmark
bmr = benchmark(design)
# define measure
measures = list(msr("clust.wss"), msr("clust.silhouette"))
bmr$aggregate(measures)
```
实验表明,使用三个中心的 $k$-means 算法在簇内平方和得分上优于其他学习器。然而,考虑到轮廓度量时,具有两个簇的 `pam` 学习器表现最佳。
#### 4. 聚类分析的可视化
mlr3 中的聚类分析与 mlr3viz 集成,提供了许多有用的绘图功能。
以下是一些可视化示例:
- **PCA 图**:对任务进行主成分分析并显示分配。
```R
task = TaskClust$new("iris", iris[-5])
learner = lrn("clust.kmeans")
learner$train(task)
prediction = learner$predict(task)
# performing PCA on task and showing assignments
autoplot(prediction, task, type = "pca")
# same as above but with probability ellipse that assumes normal distribution
autoplot(prediction, task, type = "pca", frame = TRUE, frame.type = 'norm')
```
- **树状图**:用于层次聚类。
```R
task = tsk("usarrests")
learner = lrn("clust.agnes")
learner$train(task)
# dendrogram for hierarchical clustering
autoplot(learner)
# advanced dendrogram options from `factoextra::fviz_dend`
autoplot(learner,
k = learner$param_set$values$k, rect_fill = TRUE,
rect = TRUE, rect_border = c("red", "cyan"))
```
- **轮廓图**:帮助直观评估分析质量并选择合适的簇数量。
```R
task = TaskClust$new("iris", iris[-5])
learner = lrn("clust.kmeans")
learner$param_set$values = list(centers = 5L)
learner$train(task)
prediction = learner$predict(task)
autoplot(prediction, task, type = "sil")
learner = lrn("clust.kmeans")
learner$param_set$values = list(centers = 2L)
learner$train(task)
prediction = learner$predict(task)
autoplot(prediction, task, type = "sil")
`
```
0
0
复制全文
相关推荐










