1. 监督学习:从数据标签中学习规律
监督学习就像有个老师手把手教你做题。我给你一堆带答案的习题(标记数据),你通过反复练习总结出解题方法(模型),最后遇到新题目时就能自己给出答案。我在实际项目中常用逻辑回归做二分类任务,比如判断用户是否会点击广告。下面这个代码示例展示了如何用Scikit-learn实现手写数字识别:
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
# 加载包含1797个手写数字样本的数据集
digits = load_digits()
X, y = digits.data, digits.target
# 训练随机森林分类器
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)
# 预测新样本(这里用训练集模拟新数据)
predicted = model.predict([X[0]]) # 预测第一个样本
print(f"预测数字: {predicted[0]}, 真实标签: {y[0]}")
典型应用场景:
- 垃圾邮件过滤(二分类)
- 房价预测(回归)
- 医疗影像诊断(多分类)
实战经验:去年做电商用户流失预测时,我发现特征工程比模型选择更重要。通过对用户行为序列进行时间窗口统计,准确率提升了23%。监督学习最大的痛点在于数据标注成本,标注100万张医学影像可能需要专业团队工作数月。
2. 无监督学习:发现数据的内在结构
无监督学习像在没有地图的情况下探索新大陆。给你一堆未知岛屿的坐标数据,你要自己发现哪些岛屿可能属于同一群岛。K-means是最经典的聚类算法,我常用它做客户分群。下面示例用鸢尾花数据集展示如何发现数据中的自然分组:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2] # 只取前两个特征方便可视化
# 用肘部法则确定最佳K值
inertia = []
for k in range(1, 6):
kmeans = KMeans(n_clusters=k, random_state=42).fit(X)
inertia.append(kmeans.inertia_)
plt.plot(range(1, 6), inertia, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
关键挑战:确定最佳聚类数量是个难题。有次给银行做交易异常检测,过度依赖轮廓系数导致漏掉了重要的小规模欺诈模式。后来改进为分层聚类+业务规则过滤才解决。
典型应用:
- 市场细分(聚类)
- 推荐系统(协同过滤)
- 数据降维(PCA可视化)
3. 强化学习:通过试错学习最优策略
强化学习就像训练宠物完成特技动作。做对动作给零食(正奖励),犯错就无视(负奖励)。我在智能仓储机器人路径规划中用过Q-learning,下面是简化版的迷宫寻路示例:
import numpy as np
# 定义4x4迷宫环境
# 0=可通行, 1=障碍, 2=目标
env = np.array([
[0,0,0,1],
[0,1,0,1],
[0,0,0,1],
[1,0,2,0]
])
# Q表初始化
q_table = np.zeros((env.size, 4)) # 状态数 x 动作数(上下左右)
# 训练参数
episodes = 500
alpha = 0.1
gamma = 0.9
for _ in range(episodes):
state = 0 # 起点
while True:
action = np.argmax(q_table[state])
next_state, reward = take_action(env, state, action)
q_table[state][action] += alpha * (reward + gamma * np.max(q_table[next_state]) - q_table[state][action])
if env.flat[next_state] == 2: break # 到达目标
state = next_state
踩坑记录:初期设计的奖励函数过于简单,导致机器人总绕远路躲避所有障碍。后来加入步数惩罚和区域停留惩罚才使路径更合理。深度强化学习在游戏AI中表现惊艳,但工业场景要谨慎处理安全约束。
4. 半监督学习:小标签撬动大数据
半监督学习就像老师只批改部分作业,学生通过对比已批改和未批改作业自己领悟评分标准。我在医疗影像分析中用过标签传播算法,仅用30%标注数据就达到全监督90%的准确率:
from sklearn.semi_supervised import LabelSpreading
from sklearn.datasets import make_classification
# 生成1000个样本,只标注前300个
X, y = make_classification(n_samples=1000, n_features=20)
y[300:] = -1 # 未标注样本标记为-1
# 训练标签传播模型
model = LabelSpreading(kernel='knn', n_neighbors=7)
model.fit(X, y)
# 评估在未标注数据上的伪标签准确率
pseudo_labels = model.transduction_[300:]
true_labels = y_true[300:] # 假设有真实标签用于验证
print(f"伪标签准确率: {accuracy_score(true_labels, pseudo_labels):.2f}")
核心技巧:数据增强是关键。对CT影像做随机旋转、亮度调整后,模型对未标注数据的泛化能力显著提升。但要注意确认偏差问题——错误的伪标签会像滚雪球一样影响后续学习。
5. 自监督学习:让数据自己创造监督信号
自监督学习是近年最让我兴奋的方向。就像让AI玩"找不同"游戏,通过设计 pretext task 让模型学习通用表征。我在视频行为识别中用过时序对比学习(TCL),效果远超传统监督学习:
import torch
import torch.nn as nn
# 简单的自监督编码器
class SSLEncoder(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=2)
self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=2)
def forward(self, x):
x = torch.relu(self.conv1(x))
return torch.relu(self.conv2(x))
# 定义对比损失
def contrastive_loss(feat1, feat2, temperature=0.1):
logits = torch.mm(feat1, feat2.T) / temperature
labels = torch.arange(len(feat1)).to(logits.device)
return nn.CrossEntropyLoss()(logits, labels)
# 训练流程
encoder = SSLEncoder()
optimizer = torch.optim.Adam(encoder.parameters(), lr=1e-4)
for frames in dataloader: # frames是视频片段
aug1 = random_augment(frames) # 数据增强版本1
aug2 = random_augment(frames) # 数据增强版本2
feat1 = encoder(aug1)
feat2 = encoder(aug2)
loss = contrastive_loss(feat1, feat2)
optimizer.zero_grad()
loss.backward()
optimizer.step()
创新应用:在工业质检中,我们用拼图任务(Jigsaw Puzzle)作为pretext task,让模型学习零件图像的几何特征,下游缺陷检测任务的F1值提升了18%。自监督学习的魅力在于它能从海量无标注数据中挖掘知识,这对数据标注困难的领域尤为重要。
6. 迁移学习:站在巨人肩膀上创新
迁移学习像知识跨领域复用。我用在ImageNet上预训练的ResNet做花卉分类,仅需微调最后几层就能达到专业级效果。关键是要合理冻结/解冻网络层:
from torchvision.models import resnet50
from torch.optim import AdamW
# 加载预训练模型
model = resnet50(pretrained=True)
# 冻结所有卷积层
for param in model.parameters():
param.requires_grad = False
# 替换并解冻最后的全连接层
model.fc = nn.Linear(2048, 102) # 假设有102类花卉
for param in model.fc.parameters():
param.requires_grad = True
# 使用差分学习率
optimizer = AdamW([
{'params': model.fc.parameters(), 'lr': 1e-3},
{'params': model.layer4.parameters(), 'lr': 1e-4}
])
# 微调训练
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = nn.CrossEntropyLoss()(outputs, labels)
loss.backward()
optimizer.step()
领域适配技巧:做跨语言文本分类时,发现直接微调BERT效果不佳。加入领域适配层(Domain Adaptation Layer)和MMD损失后,英语到德语的情感分析准确率从68%提升到82%。迁移学习成功的关键是找到源领域和目标领域的共享表征空间。
1073

被折叠的 条评论
为什么被折叠?



