机器学习之监督学习
目录
机器学习之监督学习
监督学习(Supervised Learning)是机器学习中最常见和广泛应用的分支之一。它的核心思想是通过 带有标签的数据 来训练模型,使模型能够学习输入特征与输出标签之间的映射关系,从而对新的未见数据进行预测。监督学习广泛应用于分类、回归等任务。
1. 监督学习的核心概念
1.1 输入与输出
- 输入(特征)
:模型的输入数据,通常表示为
。
- 输出(标签)
:模型的预测目标,通常表示为
。
1.2 训练数据
监督学习依赖于标注数据集 D={(
,
),(
,
),…,(
,
是输入特征。
是对应的标签。
1.3 模型的目标
监督学习的目标是学习一个函数
,使得
能够尽可能准确地预测
。
2. 监督学习的任务类型
监督学习主要分为两类任务:
2.1 分类(Classification)
目标:预测离散的类别标签。
示例:
- 二分类:垃圾邮件分类(是/否)。
- 多分类:手写数字识别(0-9)。
2.2 回归(Regression)
目标:预测连续的数值。
示例:
- 房价预测。
- 股票价格预测。
3. 监督学习的常见算法
3.1 线性模型
- 线性回归(Linear Regression) :用于回归任务,拟合线性关系。
- 逻辑回归(Logistic Regression) :用于分类任务,输出概率值。
3.2 决策树
- 决策树(Decision Tree) :通过树状结构进行决策。
- 随机森林(Random Forest) :基于多个决策树的集成方法。
- 梯度提升树(Gradient Boosting Trees) :通过逐步优化残差提升模型性能。
3.3 支持向量机(SVM)
- 用于分类和回归任务,通过最大化间隔找到最优分离超平面。
3.4 神经网络
- 多层感知机(MLP) :基础的前馈神经网络。
- 卷积神经网络(CNN) :用于图像分类等任务。
- 循环神经网络(RNN) :用于序列数据(如文本、时间序列)。
4. 监督学习的流程
4.1 数据准备
- 收集和清洗数据。
- 划分数据集为训练集、验证集和测试集。
4.2 特征工程
- 提取和选择特征。
- 对特征进行标准化或归一化。
4.3 模型选择
- 根据任务类型选择合适的算法。
4.4 模型训练
- 使用训练数据拟合模型。
4.5 模型评估
使用验证集评估模型性能。
常用指标:
- 分类任务:准确率、精确率、召回率、F1 分数。
- 回归任务:均方误差(MSE)、平均绝对误差(MAE)。
4.6 模型调优
- 通过超参数调优和交叉验证提升模型性能。
4.7 模型部署
- 将训练好的模型应用于实际场景。
5. 监督学习的代码示例
5.1 线性回归(回归任务)
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 创建一些随机数据
X = np.random.rand(100, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)
5.2 逻辑回归(分类任务)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 创建一些随机数据
X = np.random.rand(100, 2)
y = (X[:, 0] + X[:, 1] > 1).astype(int) # 简单二分类
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
5.3 使用 PyTorch 实现神经网络
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的神经网络
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 50)
self.fc2 = nn.Linear(50, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 创建一些随机数据
X = torch.randn(100, 10)
y = torch.randn(100, 1)
# 训练模型
for epoch in range(100):
optimizer.zero_grad()
outputs = model(X)
loss = criterion(outputs, y)
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f"Epoch [{epoch+1}/100], Loss: {loss.item():.4f}")
6. 监督学习的挑战
6.1 数据质量
- 标签错误或缺失会影响模型性能。
- 数据不平衡可能导致模型偏向多数类。
6.2 过拟合
- 模型在训练集上表现良好,但在测试集上表现较差。
- 解决方法:正则化、交叉验证、增加数据量。
6.3 特征工程
- 特征选择和提取对模型性能至关重要。
- 自动化特征工程(如深度学习)可以缓解这一问题。