机器学习入门指南
简介
AI(Artificial Intelligence 人工智能):用计算机模拟人脑,让计算机像人一样的思考和行动
ML(Machine Learning 机器学习):训练机器从数据中自动学习规律和模式
DL(Deep Learning 深度学习):也叫深度神经网络,大脑仿生,设计一层一层神经元模拟万事万物
机器学习是实现人工智能的一种途径,深度学习是机器学习的一种方法(机器学习包含深度学习)
AI发展三要素:数据(决定模型效果上限)、算法、算力
常用术语
| 术语 | 英文 | 定义 |
|---|---|---|
| 样本 | sample | 一行数据就是一个样本 |
| 数据集 | dataset | 多个样本组成数据集 |
| 特征 | feature | 一列数据一个特征,也叫属性 |
| 标签/目标 | label/target | 模型要预测的那一列数据 |
数据集划分:训练集用来训练模型、测试集用来测试评估模型,一般比例 7:3 或 8:2
拟合:模型在训练集和测试集上的表现情况
- 欠拟合(under-fitting):模型在训练集和测试集表现都不好 → 模型太简单
- 过拟合(over-fitting):训练集表现好,测试集表现不好 → 模型过复杂、数据不纯、训练数据太少
泛化(Generalization):模型在新数据集(非训练数据)上表现好坏的能力
ML算法分类
有监督学习:有特征、有标签
- 标签连续 → 回归问题(房屋信息–>价格预测)
- 标签不连续 → 分类问题(猫/狗图片–>猫|狗)
无监督学习:有特征、没有标签,基于样本间相似性(如:聚类)
半监督学习:专家标注少量数据训练模型,用模型预测未标记数据,再由专家校验审核
强化学习:寻找最优解以获取更多奖励
- 四要素:Agent(智能体)、环境(environment)、行动(action)、奖励(reward)
- 示例:下象棋,每一步追求最优解
有监督分类问题
Classification:标签/目标不连续
- 分类种类:二分类、多分类
- 示例:猫狗分类
有监督回归问题
Regression:目标是连续的,y=wx+b 线性回归
- 示例:房价预测
无监督聚类问题
Clustering:有特征、没有标签
ML建模流程
- 加载数据:图像数据、文本数据等
- 数据预处理:处理缺失值、异常值等
- 特征工程:
- 特征提取(提取和任务相关特征)
- 特征预处理(归一化、标准化)
- 特征降维、特征选择、特征组合
- 模型训练:线性回归、决策树等
- 评估:回归评测指标、分类评测指标等
- 模型预测:图像数据、文本数据等
交叉验证
数据集的分割方法,将训练集分n份,拿一份做验证集(测试集)、其他n-1份做训练集
是划分数据集的一种方法,目的为了得到更加准确可信的模型评分
解决:模型数据输入问题(数据集划分)
网格搜索
是模型调参的有力工具,只需将若干参数传给网格搜索对象,它自动帮我们完成不同超参数的组合、模型训练、模型评估,最终返回一组最优的超参数
KNN的K就是超参
解决:超参数的组合
一般都是网格搜索 + 交叉验证组合(模型选择和调优)
1 | sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None) |
对估计器的指定参数值进行详尽搜索
- estimator:估计器对象也就是模型
- param_grid:估计器参数 (dict)
{"n_neighbors": [1, 3, 5]} - cv:指定几折交叉验证
- fit:输入训练数据
- score:准确率
结果分析:
- best_score:在交叉验证中验证的最好结果
- best_estimator:最好的参数模型
- cv_results:每次交叉验证后的验证集准确率结果和训练集准确率结果
KNN算法
K-近邻算法(K Nearest Neighbor)简称KNN,根据你的邻居来推断你的类型
思想:一个样本在特征空间中的k个最相似的样本中,大多数属于某个类别,则该样本也属于这个类别
距离度量:
- 欧式距离:对应维度差值平方和,开平方根
- 曼哈顿距离:对应维度差值的绝对值求和
- 示例:坐标(0,0)到(6,6) → |0-6|+|0-6|=12步
K值选择:
- K过大会欠投合 → 模型变得简单
- K过小则过拟合 → 过度分析样本
算法步骤:
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排序
- 取出距离最近的K个训练样本
- 分类:进行多数表决,统计K个样本中哪个类别的样本个数最多
- 回归:把K个样本的目标值计算其平均值
代码示例
分类问题:
1 | from sklearn.neighbors import KNeighborsClassifier |
回归问题:
1 | from sklearn.neighbors import KNeighborsRegressor |
归一化
通过对原始数据进行变化,把数据映射到0到1之间,都包括左右
适用场景:适合小数据集操作
公式:(当前值-最小值)/(最大值-最小值)
| 样本 | 特征1 (原始) | 特征2 (原始) | 特征3 (原始) | 特征4 (原始) |
|---|---|---|---|---|
| A | 90 | 2 | 10 | 40 |
| B | 60 | 4 | 15 | 45 |
| C | 75 | 3 | 13 | 46 |
示例:90 → (90-60)/(90-60)=1.0,60 → (60-60)/(90-60)=0
映射到其他范围:结果 *(最大值-最小值)+ 最小值
| 样本 | 特征1 | 特征2 | 特征3 | 特征4 |
|---|---|---|---|---|
| A | 1.0 | 0.0 | 0.0 | 0.0 |
| B | 0.0 | 1.0 | 1.0 | 0.83 |
| C | 0.5 | 0.5 | 0.6 | 1.0 |
1 | from sklearn.preprocessing import MinMaxScaler |
标准化
数据标准化:通过对原始数据进行标准化,各列的值映射到均值为0、标准差为1的标准正态分布序列
正态分布:也叫高斯分布,记作 N(μ, σ)
- μ决定其位置
- 标准差σ决定了分布的幅度
适用场景:大数据处理,样本大时异常值影响可忽略不计
目的:解决量纲(单位)问题导致的模型评估较低等问题
公式:x =(当前值-该列平均值)/ 该列的标准差σ
1 | from sklearn.preprocessing import StandardScaler |
计算示例(第一列):
- 均值:(90+60+75)/3 = 75
- 方差:((90-75)²+(60-75)²+(75-75)²)/3 = 150
- 标准差:√150 = 12.24744871
- 90标准化后:(90-75)/12.247 = 1.22474487
公式说明:
- 方差 = 该列每个值与均值的差的平方和的平均值
- 标准差 = √方差
线性回归
定义:用一条线表示2个变量之间的关系
公式:
- 一元线性回归:y=kx+b(k斜率,b截距)
- 多元线性回归:y=w₁x₁+w₂x₂+…+b = wᵀx + b
- 其中:w(weight)权重,b(bias)偏置
应用场景:有了身高体重数据,根据身高去预测体重
损失函数(loss function):用来计算模型的预测值和真实值之间的误差,也叫代价函数、目标函数 = 各个样本的误差和,越小越好
让损失函数最小的方法:
- 梯度下降法:更加普遍
- 正规方程(求导、偏导):适合数据量小
回归模型评估指标
| 指标 | 全称 | 计算公式 | 说明 |
|---|---|---|---|
| MAE | 平均绝对误差(Mean Absolute Error) | Σ|预测值−真实值| / 样本总数 | 反映预测值与真实值的平均误差,对异常值不敏感 |
| MSE | 均方误差(Mean Squared Error) | Σ(预测值−真实值)² / 样本总数 | 平方放大误差,对异常值敏感,最小二乘法常用 |
| RMSE | 均方根误差(Root Mean Squared Error) | √MSE | 与原始数据单位一致,对较大误差更加敏感 |
sklearn API
LinearRegression(正规方程优化):
1 | sklearn.linear_model.LinearRegression(fit_intercept=True) |
- 参数:fit_intercept 是否计算偏置
- 属性:coef*(回归系数),intercept*(偏置)
SGDRegressor(随机梯度下降):
1 | sklearn.linear_model.SGDRegressor(loss=”squared_loss”, fit_intercept=True, |
- 参数:
- loss:损失函数类型
- fit_intercept:是否计算偏置
- learning_rate:学习率策略
- eta0:学习率的值
- 属性:coef*(回归系数),intercept*(偏置)
梯度
概念:梯度的方向就是上升最快的方向,单变量函数就是导数,多变量函数就是偏导数
梯度下降法公式:下一个点 = 当前点 - 学习率 × 损失函数
学习率:范围一般 0.001~0.01
- 太小:学的很慢
- 太大:抖动、震荡、错过最优解
梯度下降算法分类
| 算法 | 全称 | 说明 |
|---|---|---|
| FGD | 全梯度下降 | 使用全部样本的梯度值 |
| SGD | 随机梯度下降 | 随机选择一个样本的梯度值更新权重 |
| Mini-batch | 小批量梯度下降 | 随机选择小部分样本的梯度值更新权重(使用最多) |
| SAG | 随机平均梯度下降 | 使用以前产生的梯度值来指导当前的梯度计算 |
逻辑回归
一种分类模型,把线性回归的输出,作为逻辑回归的输入,输出(0,1)之间的值
基本思想:
- 利用线性模型 f(x)=wᵀx+b 根据特征的重要性计算出一个值
- 再使用 sigmoid 激活函数将 f(x) 的输出值映射为概率值
- 设置阈值(eg: 0.5),输出概率值大于 0.5 → 1类
- 否则 → 0类
假设函数:h(x)=sigmoid(wᵀx+b)
一般用于二分类
损失函数:- 极大似然估计函数
分类问题评估
混淆矩阵、精确率、召回率、F1-score
示例:共10个样本,其中6个为恶性(正例),4个为良性(假例),模型A预测对了3个恶性肿瘤样本,4个良性肿瘤样本
| 预测:正例 | 预测:假例 | |
|---|---|---|
| 真实:正例 (6) | TP = 3 | FN = 3 |
| 真实:假例 (4) | FP = 0 | TN = 4 |
| 指标 | 计算公式 | 含义 |
|---|---|---|
| 精确率 (Precision) | TP/(TP+FP) | 预测为正例的样本中,有多少是真的正例 |
| 召回率 (Recall) | TP/(TP+FN) | 所有真实的正例样本中,有多少被成功预测出来 |
| F1-Score | 2×精确率×召回率/(精确率+召回率) | 精确率和召回率的调和平均数 |
决策树
树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果
核心概念:
- 信息熵:数据的混乱程度,数据越混乱,熵越大
- H = -Σ(Pᵢ × log₂Pᵢ)
- 条件熵:特征列中A分类占比 × 条件A的熵 + …
- 信息增益:熵 - 条件熵
- 信息增益率:信息增益 / 特征熵(C4.5树)
ID3 决策树构建流程
- 计算每个特征的信息增益
- 使用信息增益最大的特征将数据集拆分为子集
- 使用该特征作为决策树的一个节点
- 使用剩余特征对子集重复上述过程
CART决策树(Classification and Regression Tree)
Cart模型是一种决策树模型,必须是二叉树,既可以用于分类,也可以用于回归
| 类型 | 策略 |
|---|---|
| Cart回归树 | 平方误差最小化 |
| Cart分类树 | 基尼指数最小化 |
基尼值:从数据集中随机抽取两个样本,其类别标记不一致的概率 = 1 - ΣPᵢ²(越小越好,纯度越高)
基尼系数:分类占比 × 基尼值 累加和
剪枝
把叶子节点、子节点删掉,用更大的叶子节点(子树)替换叶子节点
| 类型 | 说明 |
|---|---|
| 预剪枝 | 在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点 |
| 后剪枝 | 先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点 |
集成学习
定义:构建并结合多个”弱学习器”(表现一般的模型),组合成一个”强学习器”
目的:通过集体智慧,解决单一模型预测不准的问题,从而获得比单个模型更好的性能
Bagging思想(代表算法:随机森林)
采用决策树模型作为每一个弱学习器
| 特点 | 说明 |
|---|---|
| 有放回抽样 | Bootstrap Sampling,允许重复抽取,每个子模型看到的数据略有不同 |
| 并行训练 | 所有的子模型同时训练,互不干扰,效率很高 |
| 平权投票 | 分类任务采用”多数表决”,回归任务采用”平均法” |
Boosting思想(代表算法:AdaBoost, GBDT, XGBoost)
Boosting的核心在于**”串行”与”纠错”**
| 特点 | 说明 |
|---|---|
| 关注不足 | 每一个新模型都是为了解决前一个模型的错误而生 |
| 串行训练 | 模型必须一个接一个地训练,后一个模型依赖于前一个模型的结果 |
| 加权投票 | 表现好的模型话语权更大(权重高),表现差的模型话语权小 |
聚类算法
无监督学习,根据样本之间的相似度进行划分,一般用相似度计算方法,如欧式距离
聚类分类:Kmeans算法、层次聚类、DBSCAN聚类、谱聚类
sklearn实现
1 | sklearn.cluster.KMeans(n_clusters=8) |
核心参数:
n_clusters:聚类中心数量(默认值8)- 含义:指定生成的聚类数,即最终要产生的质心数量
常用方法:
estimator.fit(x):训练模型,确定聚类中心的位置estimator.predict(x):根据已确定的聚类中心,判断每个样本属于哪个类别estimator.fit_predict(x):一步到位,同时完成”计算聚类中心”和”预测样本类别”
基础数学
为什么要学习标量、向量、矩阵、张量?
宗旨:用到就学什么,不要盲目的展开、大篇幅学数学
| 概念 | 说明 |
|---|---|
| 标量 scalar | 一个独立存在的数,只有大小没有方向 |
| 向量 vector | 一列顺序排列的元素,默认是列向量,有大小和方向 |
| 矩阵 matrix | 二维数组,Pandas中的DataFrame |
| 张量 tensor | 基于向量和矩阵的推广,reshape(2,3,4) 表示2个3行4列的矩阵 |
导数:函数值变化量与自变量变化量的比值,当变化量趋于无穷小

导数四则运算:

鸢尾花
花特征
| 特征 | 最小值 | 最大值 | 均值 | 标准差 | 类别相关性 |
|---|---|---|---|---|---|
| sepal length | 4.3 | 7.9 | 5.84 | 0.83 | 0.7826 |
| sepal width | 2.0 | 4.4 | 3.05 | 0.43 | -0.4194 |
| petal length | 1.0 | 6.9 | 3.76 | 1.76 | 0.9490 (high!) |
| petal width | 0.1 | 2.5 | 1.20 | 0.76 | 0.9565 (high!) |
总结
1 | 有监督学习(Supervised Learning) |





