监督学习与无监督学习是什么?关键区别在有没有答案

监督学习与无监督学习是什么?关键区别在有没有答案

机器学习方法很多,但刚入门时可以先问一个非常实用的问题:训练数据里有没有标准答案?

这个问题把常见任务分成了监督学习和无监督学习。

视频讲解:在官网观看本课视频

监督学习:拿着答案练习

监督学习使用带标签的数据训练模型。

例如垃圾短信识别的数据可能长这样:

短信内容标签
您的验证码是 3812正常短信
恭喜中奖,点击链接领取垃圾短信

短信内容是输入,标签是正确答案。模型先作出预测,再把预测和答案比较,根据错误调整参数。

常见监督学习任务包括:

  • 分类:预测类别;

  • 回归:预测连续数值;

  • 图像识别、文本分类和价格预测。

无监督学习:没有答案,自己找结构

无监督学习的数据没有预先给出的标签。模型要做的是发现样本之间的结构、相似性或分布规律。

例如商店拥有大量用户消费记录,却没有给用户分类。聚类算法可以根据消费习惯,把相似用户分到同一组。

常见无监督学习任务包括:

  • 聚类;

  • 降维;

  • 异常检测;

  • 数据分布探索。

两者不是谁更高级

它们解决的是不同问题。

有明确答案并且希望预测新样本时,通常考虑监督学习;没有标签,只想探索数据结构时,可以考虑无监督学习。

现实项目还会遇到半监督学习、自监督学习和强化学习。初学阶段不必一次记完,先掌握“有没有人工提供的答案”这条主线。

最容易混淆的地方

“监督”不是有人盯着电脑训练,而是数据中存在用于监督模型学习的目标值。

无监督学习也不是随便学习。它仍然有明确的算法目标,例如让同一组里的样本更相似、不同组之间差异更大。

从数据结构看两种学习方式

监督学习与无监督学习都有输入数据。真正的分界线,是训练数据里有没有目标标签。

用同一批数据运行分类与聚类

下面用六个二维点分别完成监督分类和无监督聚类:

import numpy as np from sklearn.cluster import KMeans from sklearn.linear_model import LogisticRegression ​ x = np.array([ [1.0, 1.0], [1.0, 2.0], [2.0, 1.0], [8.0, 8.0], [8.0, 9.0], [9.0, 8.0], ]) y = np.array([0, 0, 0, 1, 1, 1]) ​ # 监督学习:训练时同时使用特征 x 和标签 y classifier = LogisticRegression(random_state=0) classifier.fit(x, y) print("监督预测:", classifier.predict([[1.5, 1.2], [8.5, 8.2]])) ​ # 无监督学习:训练时只提供特征 x clusterer = KMeans(n_clusters=2, random_state=0, n_init=10) print("无监督分组:", clusterer.fit_predict(x))

安装并运行:

pip install numpy scikit-learn python 03_supervised_unsupervised.py

一组可能的结果是:

监督预测: [0 1] 无监督分组: [1 1 1 0 0 0]

聚类结果中的01只是分组编号,交换编号也不影响分组含义。监督学习的01则来自预先定义好的真实标签。

三个常见误区

  1. 没有测试集就是无监督学习。是否无监督取决于训练时有没有标签,不取决于是否划分测试集。

  2. 聚类编号就是类别含义。聚类只形成分组,编号本身没有“正常”或“垃圾”等业务意义。

  3. 无监督学习不需要目标。聚类仍然需要优化组内相似、组间差异等数学目标,只是没有人工标签。

这一课先记住什么

  • 有标签、需要学习输入到答案的映射:监督学习。

  • 没有标签、需要发现数据内部结构:无监督学习。

下一课继续拆分监督学习:分类和回归到底有什么不同


本文首发于「去你想去的地方」: 监督学习与无监督学习是什么?关键区别在有没有答案 | 去你想去的地方

完整学习路线、视频版和后续更新请访问原文。