第 2 课:机器学习的主要类型:监督、无监督与强化学习
学习目标
完成本课学习后,你将能够:
- 清晰区分机器学习的三大主要范式:监督学习、无监督学习和强化学习。
- 理解每种学习类型的核心思想、数据特点以及典型的应用场景。
- 掌握与这三类方法相关的关键术语,如标签、特征、聚类、代理、环境等。
- 能够识别给定问题属于哪种机器学习类型,并对每种类型进行简单的应用。
核心概念
想象一下教一个孩子认识世界:
- 监督学习就像你拿着图片告诉他:“这是猫,这是狗。” 你提供了正确答案(标签),他通过看大量带标签的图片来学习规律。
- 无监督学习就像给他一堆动物图片,但不告诉他名字,让他自己去观察和分组。他可能会发现毛茸茸的、会叫的是一类(可能是狗),而有胡须、敏捷的是另一类(可能是猫)。你不知道他会怎么分,但他能自己发现数据中的隐藏结构。
- 强化学习就像训练一只小狗做动作。你发出口令(“坐下”),它尝试各种动作。做对了(坐下),就给它一块饼干(奖励);做错了,就得不到或轻轻纠正(惩罚)。它通过不断试错来学习哪个动作能获得最多奖励。
机器学习正是模仿了这些学习方式。
1. 监督学习 (Supervised Learning)
这是最常见、应用最广泛的类型。它就像一个有“老师”在旁边指导的学习过程。
- 核心思想:给算法提供一批有标签的训练数据。每个数据点都由特征(输入)和标签(正确的输出)组成。算法的目标是学习从特征到标签的映射关系。
- 数据特点:带标签。例如,一组房子的面积(特征)和价格(标签)。
- 目标:预测。
- 两大任务:
- 分类:预测离散的类别。例如:邮件是“垃圾邮件”还是“正常邮件”?图片里的动物是“猫”还是“狗”?
- 回归:预测连续的值。例如:预测明天的气温是多少?预测一辆二手车的价格?
- 典型算法:线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林、神经网络。
2. 无监督学习 (Unsupervised Learning)
这种学习方式没有“老师”提供答案,算法需要自己探索数据的内在规律。
- 核心思想:给算法提供没有标签的数据,让它自己去发现数据中潜在的结构或模式。
- 数据特点:无标签。只有一堆特征,没有对应的答案。
- 目标:发现隐藏结构。
- 两大任务:
- 聚类:将相似的数据点自动分组。例如:根据客户购买行为将客户分为不同群体,以便进行精准营销。
- 降维:在尽可能保留信息的前提下,减少数据的特征数量,用于数据压缩或可视化。
- 典型算法:K-Means聚类、层次聚类、主成分分析(PCA)。
3. 强化学习 (Reinforcement Learning)
这种学习方式更像是一种“试错”和“积累经验”的过程,强调智能体与环境的动态交互。
- 核心思想:一个代理在特定的环境中,通过执行动作并观察环境反馈的状态和奖励来学习。它的目标是学习一个策略,使得长期累积的奖励最大化。
- 关键要素:代理、环境、状态、动作、奖励。
- 目标:学习最优策略,获取最大累积奖励。
- 典型应用:游戏AI(如AlphaGo)、机器人控制、自动驾驶、个性化推荐系统。
- 典型算法:Q-Learning、深度Q网络(DQN)、策略梯度算法。
代码示例
示例1:监督学习 - 使用线性回归预测房价
这是一个经典的回归问题,我们使用scikit-learn库。
# 导入必要的库
from sklearn.linear_model import LinearRegression
import numpy as np
# 1. 准备数据(特征X和标签y)
# 假设房子面积(平米)是特征
X = np.array([[60], [80], [100], [120], [150]])
# 对应的价格(万元)是标签
y = np.array([[300], [400], [500], [550], [650]])
# 2. 创建并训练模型
model = LinearRegression()
model.fit(X, y) # 学习从面积到价格的映射关系
# 3. 使用模型进行预测
new_house_area = np.array([[110]]) # 预测110平米房子的价格
predicted_price = model.predict(new_house_area)
print(f"面积为 {new_house_area[0][0]} 平米的房子,预测价格为:{predicted_price[0][0]:.2f} 万元")
# 输出示例:面积为 110 平米的房子,预测价格为:525.00 万元
示例2:无监督学习 - 使用KMeans进行客户分群
这是一个聚类问题,我们根据客户的“年消费额”和“消费频率”对他们进行分组。
# 导入必要的库
from sklearn.cluster import KMeans
import numpy as np
# 1. 准备数据(只有特征,没有标签)
# 数据:[年消费额(千元), 消费频率(次/年)]
customers = np.array([
[2, 10], # 客户A:消费少但频繁
[30, 2], # 客户B:消费多但频率低
[5, 8], # 客户C
[25, 1], # 客户D
[1, 12], # 客户E
[28, 3], # 客户F
[4, 9] # 客户G
])
# 2. 创建聚类模型并指定分成3组
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(customers)
# 3. 查看每个客户所属的组(簇)
labels = kmeans.labels_
print("客户分组结果:")
for i, label in enumerate(labels):
print(f"客户 {chr(65+i)}: 属于第 {label} 组")
# 输出示例:
# 客户 A: 属于第 1 组
# 客户 B: 属于第 0 组
# 客户 C: 属于第 1 组
# 客户 D: 属于第 0 组
# 客户 E: 属于第 2 组
# 客户 F: 属于第 0 组
# 客户 G: 属于第 1 组
# 模型自动发现了“高消费低频”、“低消费高频”、“中等消费”等群体。
示例3:强化学习 - 简化版Q-Learning概念演示
这里用一个极其简单的“找宝藏”游戏来演示核心思想。环境是一个1x5的格子,代理在最左,宝藏在最右。
import numpy as np
# 简化版环境:0=起点,1-3=路,4=宝藏(终点)
# 动作:0=向右,1=原地不动(为简化,不允许向左)
num_states = 5
num_actions = 2
q_table = np.zeros((num_states, num_actions)) # 初始化Q表
# 学习参数
learning_rate = 0.1
discount_factor = 0.9
episodes = 1000 # 训练轮数
for episode in range(episodes):
state = 0 # 每轮从起点开始
while state != 4: # 直到找到宝藏
# 1. 选择动作(初期随机探索,后期利用知识)
if np.random.rand() < 0.1: # 10%的概率随机探索
action = np.random.randint(0, num_actions)
else:
action = np.argmax(q_table[state]) # 选择当前状态下Q值最大的动作
# 2. 执行动作,得到奖励和下一个状态
if action == 0: # 向右移动
next_state = state + 1 if state < 4 else state
reward = 10 if next_state == 4 else 0 # 找到宝藏得10分
else: # 原地不动
next_state = state
reward = -1 # 浪费一步,给小惩罚
# 3. 更新Q表(Q-Learning公式)
old_q = q_table[state, action]
next_max_q = np.max(q_table[next_state])
new_q = old_q + learning_rate * (reward + discount_factor * next_max_q - old_q)
q_table[state, action] = new_q
state = next_state # 进入下一状态
print("训练后的Q表(状态x动作):")
print(q_table)
print("\n学习到的策略:")
for s in range(num_states-1):
best_action = "向右" if np.argmax(q_table[s]) == 0 else "原地"
print(f"在状态{s},最佳动作是:{best_action}")
# 输出示例:
# 学习到的策略:
# 在状态0,最佳动作是:向右
# 在状态1,最佳动作是:向右
# 在状态2,最佳动作是:向右
# 在状态3,最佳动作是:向右
实践练习
练习1:类型判断
判断以下问题最适合用哪种机器学习类型(监督、无监督、强化)解决,并简要说明理由。
- 根据历史天气数据(温度、湿度、风速等)预测明天是否下雨。
- 自动将新闻文章按照主题(体育、政治、娱乐等)进行归类,但事先没有已知的类别。
- 设计一个程序,让一个虚拟角色在复杂的游戏地图中学习如何最有效地收集金币并避开陷阱。
练习2:监督学习应用
修改【示例1】的代码,使用一个更简单的关系:y = 2 * X + 1 来生成训练数据(X可以是1到10的整数)。然后用线性回归模型去拟合它,并预测当X=20时,y的值应该是多少?模型预测的结果与理论值2*20+1=41相差大吗?
练习3:无监督学习思维实验
假设你得到了一家超市的顾客交易数据,每条记录包含“顾客ID”和“购买的商品列表”。如果你打算使用无监督学习来改进超市的商品摆放布局,你会如何思考?
- 你可能会使用哪种无监督学习任务(聚类还是降维)?
- 你可能需要如何预处理原始数据(购买的商品列表),才能将其作为算法的输入?
常见错误
- 混淆学习类型:最大的错误是将问题与不匹配的学习类型配对。例如,试图用无监督学习直接预测房价(这是监督学习的回归任务)。
- 忽略数据要求:监督学习必须有高质量的标签数据。如果数据标签缺失或噪声很大,模型效果会很差。初学者常低估获取和清洗带标签数据的成本。
- 盲目选择算法:在明确问题类型前,就纠结于用哪种具体算法(如SVM还是神经网络)。正确顺序应该是:先明确问题类型 -> 再选择适合该类型的算法族。
- 强化学习理解偏差:认为强化学习就是“游戏AI”。实际上,它的核心是“延迟奖励”和“策略学习”,应用远不止游戏。另外,强化学习通常比监督和无监督学习需要更多的试错样本和计算资源。
- 过度复杂化:对于简单问题,使用过于复杂的模型。例如,对于一个线性可分的问题,使用简单的线性模型通常比用深度神经网络更高效、可解释性更好。
小结
本课我们掌握了机器学习三大基石的核心思想:
- 监督学习:有老师指导,数据有标签,目标是预测(分类或回归)。
- 无监督学习:自己发现规律,数据无标签,目标是发现隐藏结构(聚类或降维)。
- 强化学习:在试错中成长,通过状态、动作、奖励与环境交互,目标是学习最优策略以获得最大长期回报。
理解这些类型及其适用场景,是踏入机器学习世界的第一步,它能帮助你为实际问题选择正确的解决路径。在下一课中,我们将了解,无论采用哪种学习类型,一个完整的机器学习项目通常会遵循哪些共同的工作流程。
练习编辑器
rust
Loading...