python期末考试记录
机器学习 / 深度学习输入数据如何表示、如何预处理
一、基础概念:数据表示
-
核心思想:所有输入统一为 d 维数值向量
-
两条关键结论
-
维度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 种主流缩放算法,分别适用不同场景

四、完整数据预处理四大流程
前面所有特征转换、规范化都属于数据变换子步骤,完整预处理分为 4 个递进环节:
数据清洗
筛选和任务相关的有效特征,丢弃无关冗余信息;
处理缺失数据:删除残缺样本 / 均值 / 中位数 / 插值填充缺失值;
数据集成
融合多来源、多格式数据(例如房价数据 + 周边商圈数据 + 交通数据合并为一份数据集);
数据变换
两大分支:
类别特征:独热编码 / Embedding 编码,文字转数字向量;
数值特征:对数、多项式等非线性变换;
数值规范化
Min-Max、Z-score、分位数裁剪缩放,统一特征尺度,消除量纲影响。
高维数据降维方法
| 算法 | 类型 | 适用数据 |
|---|---|---|
| PCA | 线性降维 | 数据流形接近平面、无弯曲 |
| Kernel PCA | 核非线性降维 | 局部弯曲、简单非线性流形 |
| LLE(局部线性嵌入) | 流形学习 | 平滑卷曲流形(瑞士卷经典案例) |
| ISOMAP(等距映射) | 流形学习 | 保持流形上真实测地距离 |
PCA(主成分分析)
PCA 的本质优化目标:寻找单位向量$v$,将所有样本向$v$投影,使投影后数据的方差(离散差异)最大化,该就$v$是第一主成分方向。

点击查看代码
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(核主成分分析)
有监督学习
有监督学习的定义

有监督学习的分类

如何评估结果对错
| 任务类型 | 评价指标 | 公式 & 通俗解释 | 好坏判断标准 |
|---|---|---|---|
| 回归(预测连续数,如房价) | 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算法


点击查看代码
# 输入:训练集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

浙公网安备 33010602011771号