机器学习入门
luqimu
一.基础知识与术语
1.machine learning
定义:对于一个计算机程序,如果它利用经验(E)来提升在某一类任务(T)上的性能(P),并且这种提升可以被度量(P)所验证,那么我们就说这个程序具有学习能力。
本质:就是找到一个最优的数学函数(模型),使得 P(性能) 随着 E(数据经验) 的增加而不断提高。
2.三要素:模型+策略+算法
1.模型:确定要学习的假设空间,即决定用什么样的数学结构来拟合数据。
2.策略:确定从假设空间中选取最优模型的评价标准(即损失函数 / 风险函数)。
绝对误差和均方误差(MSE):惩罚太离谱的猜测
3.算法:求解最优化问题的具体计算方法。即用什么样的步骤去找到策略中定义的最优模型参数。
3.机器学习和统计学的关系:
1.根本差异: 统计学:解释变量之间的关系(追求因果和可解释性) 机器学习:进行预测(追求效果和泛化能力)
2.机器学习基于统计学的框架
4.机器学习的分类:
1.监督学习(supervised learning):
逻辑:利用带有明确答案的历史数据,训练出一个能从输入特征(X)精准映射到输出目标(Y)的数学模型。其本质是通过已知结果来反推规律
解决问题:
- 分类:输出是类别。如“垃圾邮件/正常邮件”、“猫/狗”。
- 回归:输出是连续数值常见算法:线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林
2.无监督学习(unsupervised learning):
逻辑:在完全没有标注信息(即无Y值)的前提下,仅依靠数据本身的内在属性,自动发掘数据中隐藏的潜在结构或关联模式。其本质是对数据先验分布的一种探索性推断。
解决问题:
- 聚类:把相似的东西自动归为一组。
- 降维:把几千个复杂特征压缩成几个核心特征,方便可视化或加速计算。常见算法:K-Means聚类、PCA(主成分分析)、DBSCAN。
3.强化学习(reinforcement learning):
逻辑:在与动态环境的持续交互中,通过试错机制不断执行动作,并根据环境反馈的延迟奖励来调整自身策略。其核心追求是实现长期累积回报的最大化
解决问题:序列决策问题
常见算法:
- 基于价值(Value-based):Q-Learning、深度Q网络(DQN)
- 基于策略(Policy-based):策略梯度法、近端策略优化(PPO)4.半监督学习(semi-supervised learning):逻辑:手头只有极少量的标签,但有海量的无标签数据。它先把海量无标签数据自学一遍,再用那极少量的有标签数据做微调矫正。其本质是利用无标注数据来修正和加固监督模型对整体数据分布的认知。解决问题:工程落地问题常见算法:自训练,协同训练图,半监督学习
分类本质在于反馈信息的完备程度不同
5.特化: 模型过度拟合了训练数据随机噪声和局部特征,导致模型复杂度远超数据本身的真实复杂度。训练误差极低,但测试误差巨大
泛化:模型在测试集 上的期望预测能力。基于有限样本,推断出潜在的总体分布规律。训练误差 ≈ 测试误差
6.欠拟合:指模型所选择的假设空间容量过小,导致其无法捕捉到数据生成分布中的真实数据生成分布。
原因:1:模型容量不足:假设空间的VC维远低于真实函数的复杂度。模型的表达能力不足以覆盖目标函数的非线性程度。
2: 特征信息匮乏:输入特征 X 与输出 Y 之间的互信息过低。特征空间未能有效包含预测所需的判别性信息。
3: 过度正则化:在优化目标(损失函数 + 正则项)中,正则化系数 λλ 设置过大,导致模型参数被过度收缩向零,人为扼杀了模型对数据细微结构的探索能力。
解决方案:提升模型容量,优化特征工程,放松正则化约束,调整优化超参,集成弱学习器
过拟合:学习算法所选的假设空间容量过大,导致模型不仅捕捉到了训练数据中的真实信号,还强行拟合了数据中的随机噪声和偶然波动
原因:1. 模型容量过剩:假设空间的VC维远超训练样本量 N。模型的表达能力过于强大,自由度太高,足以扭曲自身去穿过每一个样本点。
2.训练数据稀缺:训练集规模 N 过小,无法覆盖真实数据分布的全貌。模型把抽样带来的巧合当成了普适规律。
3.训练迭代过度:优化算法(如梯度下降)在误差曲面上迭代步数过多,导致参数在收敛到全局最优之后,继续朝着拟合特定批次噪声的方向偏移。
解决方法:第一类:改变损失函数
岭回归:L2范数惩罚(参数权重的平方和)
Lasso:L1范数惩罚(参数权重的绝对值之和)
第二类:改变训练过程
Dropout:神经元随机失活,每轮训练,以一定概率随机掐掉隐藏层的部分神经元,不让他们参与前向和反向传播。
早停:基于验证集的截断收敛。在训练过程中监测验证集误差,当验证集性能不再提升时停止训练。
第三类:集成学习
bagging:并行训练多个相互独立的通过不同数据子集训练出有差异的模型,最终通过投票/平均决定结果
boosting:串行训练弱学习器,后一个模型重点纠正前一个模型犯错的样本,最终加权结合。
7.归纳偏好:机器学习算法在面对不确定性(即训练数据不足或存在多个等效解)时,所表现出的一种倾向性假设。
奥卡姆剃刀:在多个同样能够解释拟合现有数据的假设或模型中,我们应该选择最简单、假设最少的那一个。
“Entities should not be multiplied without necessity.”*
NFL定理(No Free Lunch):在所有可能的目标函数(或数据生成分布)上取平均,任何两个学习算法(无论其复杂程度如何)的期望泛化误差是完全相同的。
8.数据集的划分:在机器学习中,我们训练一个模型的目的不是让它只记住已有数据,而是希望它能够对没有见过的新数据也有较好的预测能力。需要将数据划成三个部分:训练模型,调整参数,评价性能
划分方法:留出法:互不相交 交叉验证法:(k折交叉验证)让每一条数据都有机会作为测试数据,同时也参与训练。
自助法(Pull oneself up by one’s bootstrap):有放回抽样(随机森林)
9.模型性能度量:分类混淆矩阵 TP:真正例&TN:真负例&FP:假正例&FN:假负例
错误率E=a/m×100% 正确率Accuracy=1-E 查准率P:Precision(p)=TP/TP+FP(结果质量) 查全率R:Recall(R)=TP/TP+FN(发现能力)
F1(P+R):F1=2PR/P+R
类别不平衡问题:多种指标评估:precision,recall,f1,auc
回归模型评价:1.均方误差 MSE=n1∑(yi−y^i)2
2.均方根误差 RMSE=\sqrt{MSE}
3平均绝对误差MAE=n1∑∣yi−y^i∣
10.模型优化与评价:1.超参数调优:模型参数和超参数(在训练模型前人工设置的参数):决策数,k近邻,神经网络
常见方法:1.网格搜索.2.随机搜索.3.贝叶斯优化
2.ROC曲线(SF曲线):观察阈值变化时,模型性能如何变化。用于二分类模型性能评价。(类别不平衡时可能过于乐观。)
看模型整体区分正负样本能力。
横轴:假正例率FPR=FP/FP+TN 纵轴:真正例率:TPR=TP/TP+FN(Recall)
好的模型曲线靠近左上角
3.AUC(Area under curve):ROC曲线下的面积 0≤AUC≤1
理解:随机选择一个正样本和一个负样本,模型把正样本排在负样本前面的概率。
4.PR曲线:纵轴:precision 横轴:recall(数据不均衡时使用)
看模型找到正样本的能力。
二.数据工程与机器学习
1.定义:对数据进行采集、存储、处理、转换,使其能够被分析和机器学习模型有效利用的过程。
2.基本步骤:数据采集 数据存储 数据清洗 数据集成 数据转换 特征工程 数据划分 模型训练
3.有监督学习的基本步骤:数据包含:输入数据&&标签 D={(x1,y1),(x2,y2),…,(xn,yn)}
数据收集 数据预处理 数据划分 选择模型 模型训练 模型评价 模型调优 模型部署
4.特征工程:将原始数据转换为机器学习模型能够理解并有效利用的特征的过程。
1.向量化 2.特征选择(过滤式,包裹式,嵌入式)
3.分类特征(无序类别&&有序类别) 有序处理方法:One-hot Encoding,Label Encoding,Target Encoding
4.文本特征:词袋模型(BOW)
TF-IDF:一个词如果在当前文章经常出现,在其他文章很少出现那么重要。TF−IDF=TF×IDF
词向量
5.图像特征:像素矩阵 主要使用CNN
6.衍生特征:根据已有特征创造新的特征。
5.数据预处理:Garbage in,garbage out
1.划分训练集,验证集,测试集(防止数据泄露原则:所有fit操作只在训练集上进行,测试集只做transform)
X = df.drop('Survived', axis=1)
y = df['Survived']d#定义特征x和目标标签y
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42, # 固定随机种子,保证可复现
stratify=y ) # 分层抽样,保持正负样本比例一致
2.数据探索分析(EDA):X_train.info()
3.数据清洗
1.处理重复值
# 如果有重复行
if duplicates > 0:
X_train = X_train.drop_duplicates()
y_train = y_train[X_train.index] # 保持 y 与 X 同步
2.处理缺失值:缺失率极低删样本行,缺失率极高删整列
数值型用中位数或均值填充,类别型用众数填充
age_imputer = SimpleImputer(strategy='median//most_frequent')
age_imputer.fit(X_train[['Age']]) # fit 只用训练集
X_train['Age'] = age_imputer.transform(X_train[['Age']]).ravel()
X_test['Age'] = age_imputer.transform(X_test[['Age']]).ravel() # 用训练集的中位数
3.异常值检测:
for i, col in enumerate(['Age', 'Fare', 'SibSp']):
X_train.boxplot(column=col, ax=axes[i])
axes[i].set_title(f'{col} Boxplot')
采用IQR,截断策略:
Q1 = data[column].quantile(0.25)
Q3 = data[column].quantile(0.75)
IQR = Q3 - Q1
lower = max(0, Q1 - factor * IQR)
upper = Q3 + factor * IQR
4.特征编码
目的:将文本映射为数值,使模型 能进行数学运算
序数编码:保留严格顺序
独热编码:无大小顺序之分,用0,1表示,消除虚假的大小关系
缺点:数据稀疏 ,建议使用embedding
标签编码:引入数值大小(二分类,分类任务,树模型)
5.特征构造与删除:合并特征,提取信息,删减噪音
6.特征缩放:
标准化:z=x−μ/σ 目标:把原始数据转换成均值为 0,标准差为 1 的分布。
归一化:x′=x−xmin/xmax−xmin 目标:把数据线性转换到一个固定区间,最常见的是 [0,1]。
三.机器学习基本模型
1.线性回归
目标:
学习输入特征 X 与输出 Y 之间的线性关系,用于预测连续数值。
核心:找一条最符合数据规律的直线,用它预测未来的数据。
一元线性回归:y=wx+b
多元线性回归:y=w1x1+w2x2+…+wnxn+b
2.梯度下降
思想:不断调整参数,使损失函数下降。
损失函数:线性回归+MSE=凸函数
概念:把所有变量的偏导数组合成一个向量,就得到了梯度。
梯度的重要性质
- 梯度的方向,是函数值增长最快的方向。
- 梯度的反方向,就是函数值下降最快的方向。梯度下降迭代公式:$$
\theta_{new} = \theta_{old} – \eta \cdot \nabla L(\theta_{old})
$$
推导过程:
$$
\nabla L(w,b)=\left(\frac{\partial L}{\partial w},\frac{\partial L}{\partial b}\right)
$$
损失函数(MSE)
$$
MSE= \frac{1}{n} \sum_{i=1}^{n} (\hat{y}_i-y_i)^2
$$
$$
L(w,b)= \frac{1}{n} \sum_{i=1}^{n} (wx_i+b-y_i)^2
$$
使用链式法则分别对 w 和 b 求偏导:
$$
\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}
$$
$$
\frac{\partial L}{\partial w} = \frac{2}{n} \sum_{i=1}^{n} (wx_i+b-y_i)\cdot x_i
$$
$$
\frac{\partial L}{\partial b} = \frac{2}{n} \sum_{i=1}^{n} (wx_i+b-y_i)
$$
优化算法:动量法(方向加速).AdaGrad,RmsProp(自适应步幅),Adam(自适应矩估计)
梯度下降的变体:全量(BGD),随机(SGD),小批量(Mini-batch)
训练的核心
前向传播:计算输出和损失值
反向传播:利用链式法则计算梯度
梯度下降:拿到梯度后更新参数
深度学习训练 = 反向传播 + 梯度下降
3.逻辑回归
线性回归解决是多少的问题,逻辑回归解决属于哪一类的问题
本质:逻辑回归是一种用于分类任务的监督学习算法
在线性回归上增加了分类功能
第一步:计算z=w1x1+w2x2+…+b
第二步:利用sigmoid函数转化z:σ(z)=1/1+e^{-z}
损失函数:线性回归+MSE=非凸函数(局部最优_梯度消失)
基础工具:对数函数:1.最大化某个概率完全等价于最大化它的对数
2.防止数值下溢出:log(a*b)=loga+logb
统一概率公式结合逻辑回归:p(y|x)=\hat{y}^{y}(1-\hat{y}^{1-y})
最大似然估计:既然事情已经发生那么让事情发生概率最大的参数,就是最好的参数
似然:是在已知观测数据的情况下评估未知模型参数的可能性
交叉熵损失函数:
$$
J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y_i\log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i) \right]
$$
4.决策树
决策树是一种模仿人类决策时层层提问方式的机器学习算法.它将数据按照不同特征进行递归分裂,最终形成倒立的树状结构
熵:来自物理与信息论,用来衡量一个节点中各类别分布的混乱程度
基尼系数:
Gini(D) = 1 – \sum_{k=1}^{K} p_k^2
Gini(D) = \sum_{k=1}^{K} p_k(1-p_k)
随机从节点中抽取两个样本,它们属于不同类别的概率
剪枝:防止过拟合(pruning)
预剪枝:限制最大深度,限制叶节点最小样本数
后剪枝:最后从下往上检查
5.朴素贝叶斯公式
P(Ck∣X)=P(X∣Ck)P(Ck)/P(X)
6.随机森林 bagging
集成学习:通过随机采样建立不同的决策树,独立判断汇总结果
双重随机性:1.样本随机:有放回抽样
2.特征随机:并不考虑全部特征,随机抽取一个子集(通常取\sqrt{d},d为特征总数)
带外估计(OOB):P(未被抽中)=1/e=36.8%
分类任务:多数表决
$$
\hat{y}=\arg\max_{c}\sum_{t=1}^{T}\mathbb{I}[h_t(x)=c]
$$
回归任务:简单平均
$$
\hat{y}=\frac{1}{T}\sum_{t=1}^{T}h_t(x)
$$
特征重要性:基于不纯度减少(MDI):统计所有节点带来的不纯度下降之和,对高基数特征的偏好
基于排列的重要性:更可靠,不受基数影响
7.GBDT(梯度提升树) boosting:XGboost,LightGBM,CatBoost
每个新模型都在拟合前面
函数 F(x)(一个模型)
负梯度:
$$
-\frac{\partial L}{\partial F(x)}
$$
模型更新:
$$
F_m(x)=F_{m-1}(x)+\eta \cdot h_m(x)
$$
| 损失函数 | 负梯度(每棵新树拟合的目标) |
|---|---|
| 均方误差(MSE) | y – F(x),是残差 |
| 绝对误差(MAE) | \text{sign}(y – F(x)),只有方向 \pm 1,对异常值更鲁棒 |
| 对数损失(分类) | y – p,真实标签减去预测概率 |
XGboost:加入正则化,二阶梯度信息,工程正则化,内置正则化,早停
LightGBM:优势快:直方图算法,带深度限制的leaf-wise生长策略,单边梯度采样,互斥特征捆绑
Catboost:原生支持类别特征,排序提升(解决预测偏移),对称树结构
8.k-means聚类
聚类:在没有标签的前提下,根据样本之间的随机性,将数据自动划分为若干组,使得同组内样本尽可能相似,不同组之间尽可能有差异
质心:一个簇的中心位置,通常取该簇所有点在各个维度上的均值
距离度量: 欧氏距离
二维平面中 A、B 两点的距离:
$$
d(A,B)=\sqrt{(A_x-B_x)^2+(A_y-B_y)^2}
$$
当维度扩展到 n 维时:
$$
d(A,B)=\sqrt{\sum_{i=1}^{n}(A_i-B_i)^2}
$$
K-Means 追求的是:
同一个簇中的样本尽可能彼此接近,并且尽量靠近该簇的质心。
通常通过簇内平方和 SSE(Sum of Squared Errors)来衡量:
$$
SSE=\sum_{i=1}^{K}\sum_{x\in C_i}||x-\mu_i||^2
$$
其中:
- C_i:表示第 i 个簇。
- \mu_i:表示第 i 个簇的质心。
- ||x-\mu_i||^2:表示样本点到质心的平方距离。
SSE 越小,说明簇内样本越紧凑,聚类效果通常越好。
优化:初始质心选择(K-means++):优先考虑哪些距离当前已有质心较远的样本点
肘部法则选择k值(斜率突然减小,曲线由陡转平)
其他常见聚类算法:K-Medoids(中心点聚类):强制选取实际存在的数据点作为质心
DBSCAN(基于密度聚类):通过样本的密度来划分簇
层次聚类:计算节点之间的距离.构建一颗聚类树
9.PCA主成分分析
维度灾难:计算成本急剧增长,数据稀疏性与过拟合风险,距离度量失效,多重共线问题
核心:将高维数据投影到低维空间,同时尽可能保留数据中存在的最大方差(即信息量)
流程:1.去中心化处理
2.计算协方差矩阵:
$$
C=\frac{1}{n-1}X^TX
$$
(n-1贝塞尔修正,自由度少一)
对协方差矩阵 C 进行特征分解,求解所有特征值 \lambda 和对应的特征向量 v:
$$
Cv=\lambda v
$$
- 特征向量: 新的坐标轴方向,即主成分方向。
- 特征值: 代表数据投影到对应特征向量上的方差大小,也就是主成分的重要性。
10.svm支持向量机
核心:在样本空间中找到一个最优超平面,使不同类别样本之间的间隔最大。
SVM预测:
$$
f(x)=w^Tx+b
$$
根据符号判断类别:
$$
y= \begin{cases} +1,&w^Tx+b>0\\ -1,&w^Tx+b<0 \end{cases}
$$
支持向量:离超平面最近的样本点
硬间隔: SVM要求:所有样本正确分类。
约束:
$$
y_i(w^Tx_i+b)\geq1
$$
y_i:真实标签(+1/-1) w^Tx_i+b:预测结果
软间隔:允许部分样本进入间隔,分类错误
引入松弛变量表示第i个样本违反间隔程度。
约束:
$$
y_i(w^Tx_i+b)\ge1-\xi_i
$$
$$
\xi_i\ge0
$$
优化:
$$
\min \frac12||w||^2 + C\sum_i\xi_i
$$
升维转换,kernel trick核技巧,