python期末考试记录

机器学习 / 深度学习输入数据如何表示、如何预处理

一、基础概念:数据表示

  1. 核心思想:所有输入统一为 d 维数值向量

  2. 两条关键结论

  • 维度d不固定:简单问题d很小(仅面积、卧室 2 维),复杂图像 / 多模态问题d可达上万;

  • 原始数据不能直接丢进模型:不同特征量纲、取值范围、类型差异巨大,必须做数据预处理

二、两类核心特征:数值型特征 & 类别型特征

模块 1:数值型特征

本身自带连续 / 离散数字含义可直接参与数学运算的特征。

房价案例里:居住面积(2104\mathrm{ft}^2)、卧室数量 3、售价 400 千美元,都属于数值特征。

痛点: 不同数值特征尺度、量纲差距极大:比如面积几千、卧室仅 2~4,数值量级差异会导致模型梯度更新失衡,因此必须做数值规范化。

模块 2:类别型特征

描述事物属性或者分类无天然大小 / 数值关系文字描述无法直接计算

外观(光滑 / 有茸毛)、花纹(清晰 / 模糊)、瓜柄(绿色 / 干枯)、大小(大 / 一般 / 小)、声响(嘭嘭 / 当当 / 噗噗)等

类别特征向量化转换逻辑

把 “是 / 否” 类二元类别,转换成 0-1 二值向量:
例:表面光滑这一特征,满足 = 1,不满足 = 0;多条西瓜样本拼接成不同 0/1 向量,作为模型输入。

3. 类别编码的坑与正确方案(14 页)

错误做法:直接给类别赋 1/2/3 数字(如大 = 1、一般 = 2、小 = 3)
缺陷:模型会错误学习 “小 < 一般 < 大” 的数值大小关系,无中生有引入虚假顺序;
补充:即使赋值 1/0/-1 也存在相同问题。

4. 标准解决方案
对比维度 独热编码(One-hot Encoding) 可学习嵌入(Embedding)
核心原理 将多分类特征拆分为互斥的二元 0-1 维度,每个类别对应一个独立维度,仅目标类别对应的位置为 1,其余全部为 0 将离散类别映射到低维连续稠密向量,向量的具体数值不由人工定义,而是由模型在训练过程中自动学习优化
西瓜大小案例演示 西瓜大小分为「大、一般、小」3 个类别,拆分为 3 个二元维度,编码结果如下:大 = [1, 0, 0]一般 = [0, 1, 0]小 = [0, 0, 1] 西瓜大小分为「大、一般、小」3 个类别,映射到 2 维低维向量,示例编码结果如下:大 = [0.8, 0.2]一般 = [0.1, 0.7]小 = [-0.6, 0.3]
核心适用场景 1. 传统机器学习模型(线性回归、SVM、决策树等)2. 类别维度数量少(通常 < 10)的场景 1. 深度学习模型(神经网络、大模型等)2. 类别维度数量多(如词表、用户 ID、商品 ID 等)的大规模场景
维度特性 维度数量等于类别总数,属于高维稀疏编码 维度数量远小于类别总数,属于低维稠密编码,维度可人工控制
数据稀疏性 极度稀疏,绝大多数位置为 0,仅 1 个位置为有效数值 完全稠密,无零值,所有维度均为有效数值,无冗余信息
计算效率 小类别数下效率高,大类别数下会出现维度爆炸,计算效率骤降 维度固定,计算效率稳定,无维度爆炸问题,适配大规模数据
模型适配性 适配低参数传统模型,无法传递类别之间的隐含语义关联 适配深度学习模型,能自动学习类别之间的业务关联(如西瓜大小与成熟度的隐含关系)
核心优势 1. 实现简单,无学习成本2. 编码结果解释性强,可直接对应原始类别3. 无训练数据依赖,开箱即用 1. 维度可控,无维度爆炸风险2. 能学习类别语义关联,泛化能力强3. 适配大规模类别场景,是工业界深度学习主流方案
核心缺陷 1. 大类别数下维度爆炸,无法落地2. 无法表达类别之间的顺序 / 语义关联3. 对异常新增类别兼容性差 1. 编码结果解释性弱,无法直接对应原始类别含义2. 需要足够的训练数据支撑才能学习到有效向量3. 训练成本高于独热编码

三、数值特征规范化

针对数值特征尺度不一致问题,提供 3 种主流缩放算法,分别适用不同场景

ecbc133f-36f4-4071-bce1-07c0da20ba82

四、完整数据预处理四大流程

前面所有特征转换、规范化都属于数据变换子步骤,完整预处理分为 4 个递进环节:

数据清洗

筛选和任务相关的有效特征,丢弃无关冗余信息;
处理缺失数据:删除残缺样本 / 均值 / 中位数 / 插值填充缺失值;

数据集成

融合多来源、多格式数据(例如房价数据 + 周边商圈数据 + 交通数据合并为一份数据集);

数据变换

两大分支:
类别特征:独热编码 / Embedding 编码,文字转数字向量;
数值特征:对数、多项式等非线性变换;

数值规范化

Min-Max、Z-score、分位数裁剪缩放,统一特征尺度,消除量纲影响。

高维数据降维方法

算法 类型 适用数据
PCA 线性降维 数据流形接近平面、无弯曲
Kernel PCA 核非线性降维 局部弯曲、简单非线性流形
LLE(局部线性嵌入) 流形学习 平滑卷曲流形(瑞士卷经典案例)
ISOMAP(等距映射) 流形学习 保持流形上真实测地距离

PCA(主成分分析)

PCA 的本质优化目标:寻找单位向量$v$,将所有样本向$v$投影,使投影后数据的方差(离散差异)最大化,该就$v$是第一主成分方向。

bddc42035170a9d59dd493e616a37572

点击查看代码
def standard_pca_manual(X, target_dim):
    """
    手动实现标准PCA,严格遵循课堂推导流程
    :param X: 原始数据矩阵 shape [N, D] N样本 D原始特征维度
    :param target_dim: 降维目标维度d
    :return:
        Z: 降维后数据 [N, d]
        variance_ratio: 各主成分方差贡献率
        cumulative_ratio: 累计方差贡献率
        projection_mat: 投影矩阵 [D, d]
        mean: 原始特征均值
        std: 原始特征标准差
    """
    N, D = X.shape
    # ========== 1. 预处理:中心化 + Z-score标准化(PPT强制要求) ==========
    mean = np.mean(X, axis=0)
    std = np.std(X, axis=0, ddof=1)
    # 防止除0,避免特征全相同报错
    std[std < 1e-8] = 1.0
    X_standard = (X - mean) / std

    # ========== 2. 计算无偏样本协方差矩阵 ==========
    cov_matrix = (X_standard.T @ X_standard) / (N - 1)

    # ========== 3. 特征分解求解特征值、特征向量 ==========
    eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
    # 数值计算会产生微小虚数,转为实数
    eigenvalues = np.real(eigenvalues)
    eigenvectors = np.real(eigenvectors)

    # ========== 4. 按特征值从大到小排序主成分 ==========
    sort_idx = np.argsort(eigenvalues)[::-1]
    eigenvalues = eigenvalues[sort_idx]
    eigenvectors = eigenvectors[:, sort_idx]

    # 统一特征向量符号(消除正负随机歧义)
    for i in range(eigenvectors.shape[1]):
        vec = eigenvectors[:, i]
        max_pos = np.argmax(np.abs(vec))
        if vec[max_pos] < 0:
            eigenvectors[:, i] = -vec

    # ========== 5. 截取前target_dim个主成分 ==========
    top_eig_vals = eigenvalues[:target_dim]
    projection_mat = eigenvectors[:, :target_dim]

    # ========== 6. 计算方差贡献率 ==========
    total_variance = np.sum(eigenvalues)
    variance_ratio = top_eig_vals / total_variance
    cumulative_ratio = np.cumsum(variance_ratio)

    # ========== 7. 数据投影到低维空间 ==========
    Z = X_standard @ projection_mat

    return Z, variance_ratio, cumulative_ratio, projection_mat, mean, std

KPCA(核主成分分析)

有监督学习

有监督学习的定义

314bb44a5657f533f09b576cddf7b3c0

有监督学习的分类

18d468e2a4dc46e77109bd4b6609332b

如何评估结果对错

任务类型 评价指标 公式 & 通俗解释 好坏判断标准
回归(预测连续数,如房价) MSE 均方误差 MSE=m1​∑(f(xi​)−yi​)2预测值和真实值差值平方取平均 数值越小,预测越准
分类(预测类别,如好坏瓜) 错误率 E=m1​∑I(f(xi​)=yi​)预测错的样本占总样本比例 数值越小,模型越准
分类 精度 (准确率) acc=m1​∑I(f(xi​)=yi​)=1−E预测正确样本占比 越接近 1,效果越好
误差名称 别名 计算数据集 含义 参考价值
训练误差 经验误差 训练集 模型在训练用过的数据上的错误率 仅代表模型拟合现有数据能力,容易虚高
泛化误差 测试误差 从未见过的测试集 模型在全新未知数据上的错误率 衡量模型真实实用能力,核心评估标准
评估方法 操作流程 优点 缺点
留出法 Hold-out 一次性把全集分成不重叠训练集、测试集,训练后仅测 1 次 实现简单、速度快 单次划分有随机性,结果不稳定
交叉验证 Cross Validation 多次重复留出法(常用 K 折),轮流做训练 / 测试,取平均误差 结果稳定、可靠,减少划分偶然性 计算量大,耗时更长
拟合类型 训练误差 泛化 (测试) 误差 成因 解决办法
欠拟合 under-fitting 模型太简单,无法捕捉数据规律 提升模型复杂度、增加特征
正常拟合 模型复杂度适中,刚好匹配数据规律 无需调整,最优状态
过拟合 over-fitting 极低 很高 模型过于复杂,死记训练集噪声,泛化差 简化模型、增加数据、正则化、早停

线性回归

类型 适用数据 核心技巧
单变量线性回归 1 个特征,y 和 x 呈直线关系 求导解 w、b,画拟合直线
多变量线性回归 多个特征,线性相关 矩阵运算,一步算出全部权重
对数线性回归 y 随 x 指数暴涨 标签取对数,转成普通线性回归
广义线性模型 GLM 所有线性 / 类线性任务 用连接函数转换输出,统一框架

KNN算法

1aa99e871992b9540b703d6c1a67d6fb

f1ae1690768264a901e03ea5b8bcc27f

点击查看代码
# 输入:训练集X_train,y_train;待测样本X_test;近邻数K
FUNCTION KNN_Classify(X_train, y_train, X_test, K):
    初始化预测列表 pred_list = []
    FOR 每个样本 x IN X_test:
        # 1. 计算x与所有训练样本的欧氏距离
        dists = 空列表
        FOR xi, yi IN zip(X_train, y_train):
            dist = sqrt( sum( (x - xi)^2 ) )
            dists.append( (dist, yi) )
        # 2. 按距离从小到大排序,取前K个
        dists.sort()
        top_k = dists[0:K]
        # 3. 提取K个近邻的标签,投票
        k_labels = [label for (d, label) IN top_k]
        pred_label = 统计k_labels中出现次数最多的类别
        pred_list.append(pred_label)
    RETURN pred_list

无监督学习

聚类

聚类评价方法: 内部标准 外部标准

聚类一些可能出现的问题

影响因素 带来的问题 解决手段
K 值(类别数目) K 过大 / 过小都会破坏聚类结构 肘部法则、轮廓系数筛选最优 K
初始中心点 随机初始化易陷入局部最优,结果不稳定 K-Means++、多次初始化取最优
噪声 / 异常值 均值中心被偏移,簇变形 提前清洗异常、改用 DBSCAN

K-means聚类

点击查看代码
# 输入:特征矩阵X,簇数量K,最大迭代轮数max_iter
FUNCTION KMeans(X, K, max_iter):
    1. 标准化X
    2. 随机选取K个样本作为初始中心 mu[1...K]
    FOR t from 1 to max_iter:
        # 分配:每个样本找最近中心
        初始化K个空簇 C[1]...C[K]
        FOR x IN X:
            dist_list = [欧氏距离(x, mu_j) for mu_j in mu]
            idx = dist_list中最小值对应的下标
            C[idx].append(x)
        # 更新:重新计算每个簇中心
        new_mu = 空列表
        FOR j from 1 to K:
            IF C[j]不为空:
                new_mu_j = 簇C[j]所有样本求均值
            ELSE:
                new_mu_j = 原中心mu[j]  # 空簇保留旧中心
            new_mu.append(new_mu_j)
        # 收敛判断:中心无变化则停止
        IF new_mu 和 mu完全相等:
            BREAK
        mu = new_mu
    # 最后输出每个样本所属簇编号
    pred_label = 每个样本对应的簇下标
    RETURN pred_label, mu
posted @ 2026-07-03 22:21  RReally  阅读(9)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中