机器学习笔记

1. 机器学习基础

1.1 什么是机器学习?

机器学习是人工智能的一个分支,它使计算机能够从数据中学习,而无需显式编程。

1.2 机器学习的类型

  • 监督学习: 从标记数据中学习
  • 无监督学习: 从未标记数据中学习
  • 半监督学习: 从部分标记数据中学习
  • 强化学习: 通过与环境交互学习

1.3 机器学习工作流程

  1. 数据收集
  2. 数据预处理
  3. 特征工程
  4. 模型选择
  5. 模型训练
  6. 模型评估
  7. 模型部署

2. 数学基础

2.1 线性代数

线性代数是机器学习的基础,涉及向量、矩阵和线性变换等概念。

import numpy as np

# 向量
v = np.array([1, 2, 3])

# 矩阵
M = np.array([[1, 2], [3, 4]])

# 矩阵乘法
result = np.dot(M, v[:2])
print(result)

2.2 微积分

微积分在机器学习中用于优化算法,特别是梯度下降法。

# 简单的导数计算
def derivative(f, x, h=1e-6):
    return (f(x + h) - f(x - h)) / (2 * h)

# 测试
def f(x):
    return x**2

print(derivative(f, 2))  # 应该输出约 4.0

2.3 概率与统计

概率与统计用于模型评估和不确定性量化。

import numpy as np
import scipy.stats as stats

# 生成正态分布数据
data = np.random.normal(0, 1, 1000)

# 计算均值和标准差
mean = np.mean(data)
std = np.std(data)

# 计算概率密度函数
x = np.linspace(-4, 4, 100)
pdf = stats.norm.pdf(x, mean, std)

print(f"Mean: {mean:.2f}, Std: {std:.2f}")

3. 监督学习算法

3.1 线性回归

线性回归用于预测连续值,假设特征与目标之间存在线性关系。

from sklearn.linear_model import LinearRegression
import numpy as np

# 生成数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])

# 创建并训练模型
model = LinearRegression()
model.fit(X, y)

# 预测
print(model.predict([[6]]))  # 应该输出约 [12]

3.2 逻辑回归

逻辑回归用于分类问题,将线性回归的输出映射到 [0, 1] 区间。

from sklearn.linear_model import LogisticRegression
import numpy as np

# 生成二分类数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])

# 创建并训练模型
model = LogisticRegression()
model.fit(X, y)

# 预测
print(model.predict([[3.5, 4.5]]))  # 应该输出类别

3.3 决策树

决策树通过递归地将数据划分为子集来构建模型。

from sklearn.tree import DecisionTreeClassifier
import numpy as np

# 生成数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])

# 创建并训练模型
model = DecisionTreeClassifier()
model.fit(X, y)

# 预测
print(model.predict([[3.5, 4.5]]))

3.4 随机森林

随机森林是决策树的集成,通过投票提高模型性能。

from sklearn.ensemble import RandomForestClassifier
import numpy as np

# 生成数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])

# 创建并训练模型
model = RandomForestClassifier(n_estimators=10)
model.fit(X, y)

# 预测
print(model.predict([[3.5, 4.5]]))

4. 无监督学习算法

4.1 K-均值聚类

K-均值聚类将数据分为 K 个簇,使簇内距离最小,簇间距离最大。

from sklearn.cluster import KMeans
import numpy as np

# 生成数据
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])

# 创建并训练模型
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

# 预测
print(kmeans.predict([[0, 0], [10, 10]]))

4.2 主成分分析 (PCA)

PCA 用于降维,保留数据的主要变异性。

from sklearn.decomposition import PCA
import numpy as np

# 生成高维数据
X = np.random.rand(100, 10)

# 创建并训练模型
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

print(f"原始维度: {X.shape}")
print(f"降维后维度: {X_reduced.shape}")

5. 深度学习基础

5.1 神经网络基础

神经网络由神经元组成,通过前向传播和反向传播进行学习。

5.2 张量流 (TensorFlow)

TensorFlow 是 Google 开发的深度学习框架。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 创建简单的神经网络模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(10,)),
    Dense(32, activation='relu'),
    Dense(1, activation='sigmoid')
])

# 编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 查看模型结构
model.summary()

5.3 PyTorch

PyTorch 是 Facebook 开发的深度学习框架,以动态计算图著称。

import torch
import torch.nn as nn

# 创建简单的神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, 1)
        self.relu = nn.ReLU()
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.sigmoid(self.fc3(x))
        return x

# 创建模型实例
model = SimpleNN()
print(model)

6. 模型评估

6.1 评估指标

  • 准确率 (Accuracy): 正确预测的比例
  • 精确率 (Precision): 正例预测正确的比例
  • 召回率 (Recall): 实际正例被正确预测的比例
  • F1 分数: 精确率和召回率的调和平均
  • 均方误差 (MSE): 回归问题的评估指标

6.2 交叉验证

交叉验证用于评估模型的泛化能力。

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
import numpy as np

# 生成数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])

# 创建模型
model = LogisticRegression()

# 5折交叉验证
scores = cross_val_score(model, X, y, cv=5)
print(f"交叉验证分数: {scores}")
print(f"平均分数: {scores.mean()}")

7. 特征工程

7.1 特征选择

特征选择用于选择对模型最有贡献的特征。

from sklearn.feature_selection import SelectKBest, f_regression
import numpy as np

# 生成数据
X = np.random.rand(100, 10)
y = np.random.rand(100)

# 选择K个最佳特征
selector = SelectKBest(f_regression, k=5)
X_new = selector.fit_transform(X, y)

print(f"原始特征数: {X.shape[1]}")
print(f"选择后特征数: {X_new.shape[1]}")

7.2 特征缩放

特征缩放用于将不同尺度的特征标准化。

from sklearn.preprocessing import StandardScaler, MinMaxScaler
import numpy as np

# 生成数据
X = np.array([[1, 100], [2, 200], [3, 300], [4, 400], [5, 500]])

# 标准缩放 (均值为0,标准差为1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("标准缩放结果:")
print(X_scaled)

# 最小最大缩放 (范围 [0, 1])
min_max_scaler = MinMaxScaler()
X_minmax = min_max_scaler.fit_transform(X)
print("\n最小最大缩放结果:")
print(X_minmax)

8. 机器学习实践

8.1 项目结构

ml-project/
├── data/              # 数据文件夹
│   ├── raw/          # 原始数据
│   ├── processed/     # 处理后的数据
├── models/           # 模型文件夹
│   ├── trained/       # 训练好的模型
│   ├── scripts/       # 模型训练脚本
├── notebooks/         # Jupyter  notebooks
├── src/              # 源代码
│   ├── data/          # 数据处理代码
│   ├── features/       # 特征工程代码
│   ├── models/         # 模型定义代码
│   ├── evaluation/     # 模型评估代码
├── README.md          # 项目说明
├── requirements.txt    # 依赖包列表

8.2 调参技巧

  • 网格搜索: 穷举所有参数组合
  • 随机搜索: 随机采样参数组合
  • 贝叶斯优化: 基于先验知识的参数优化

8.3 常见问题与解决方案

过拟合: 模型在训练数据上表现良好,但在测试数据上表现差。

解决方案: 增加数据量、使用正则化、减少模型复杂度、使用 dropout 等。

欠拟合: 模型在训练数据和测试数据上表现都差。

解决方案: 增加模型复杂度、添加更多特征、减少正则化等。

数据不平衡: 不同类别的样本数量差异很大。

解决方案: 过采样、欠采样、使用加权损失函数等。