机器学习(算法篇)
2023-08-29 21:01:54 11 举报
AI智能生成
机器学习(算法篇)
作者其他创作
大纲/内容
知识准备
scikit_learn介绍
Python语言的机器学习工具
Scikit-learn包括许多知名的机器学习算法的实现
Scikit-learn文档完善,容易上手,丰富的API
获取数据
sklearn数据集介绍
获取数据集
小数据集:
sklearn.datasets.load_*()
大数据集:
sklearn.datasets.fetch_*()
数据集包含内容
data:特征数据数组,
target: 目标值数组,
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:目标值名
查看数据分布
seaborn.lmplot()
x,y --分别代表横纵坐标内容
data -- 需要关联到的数据集
hue -- 最后显示的种类(目标值)
fit_reg -- 是否进行线性拟合
数据集分类
分类
训练数据(训练集) -- 模型构建
测试数据(测试集) -- 模型评估
api的使用
sklearn.model_selection.train_test_split()
返回值:调用返回顺序:
训练集的特征值
测试集的特征值
训练集的目标值
测试集的目标值
传入的参数:
x 数据集的特征值
y 数据集的目值值
test_size 测试集的大小,一般为float
训练集 -- (70% - 80%)
测试集 -- (20% - 30%)
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
数据基本处理
缺失值处理
缩小数据范围
异常数据处理
数据分割
留出法
留出法:
train_test_split
留一法:
sklearn.model_selection.LeaveOneOut
loo.split()
优缺点
优点:评估结果往往被认为比较准确。
缺点:当数据量大的时候,效率极低。
交叉验证法
gridsearchCV
KFlod
确定验证集的时候,直接从数据集中获取,没有考虑分类
StratifiedKFold
确定验证集的时候,直接从数据集中获取,需要考虑分类
StratifiedShuffleSplit
自助法
每次进行有放回的抽样,最后得到的结果中,有36.8%的数据抽不到,然后把这部分数据当成测试集
优缺点
优:在数据集小的时候,用起来非常有效
缺:最后确定的测试集中,数据的分布可能和训练集不同。
类别不平衡数据处理方式
1.类别不平衡数据集基本介绍
api:
imbalanced-learn
处理方式:
欠采样方法
减少数量较多那一类样本的数量,使得正负样本比例均衡。
过采样方法
增加数量较少那一类样本的数量,使得正负样本比例均衡。
2.过采样方法
增加一些少数类样本使得正、反例数目接近,然后再进行学习。
方法:
随机过采样
imblearn.over_sampling.RandomOverSampler
随机找一些点(少类别的点)进行复制
缺点:
造成模型训练复杂度加大
造成模型的过拟合问题
smote【**】
imblearn.over_sampling.SMOTE
可以避免过拟合问题
3.欠采样方法
去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。
随机欠采样
imblearn.under_sampling.RandomUnderSampler
缺点:
会造成数据丢失
...
特征工程
定义
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
包含内容
特征预处理
定义
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
包含内容:
归一化
定义:
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
api:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
小结:
注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响
这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化
定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
api:
sklearn.preprocessing.StandardScaler( )
小结
在已有样本足够多的情况下比较稳定
适合现代嘈杂大数据场景。
特征抽取
定义
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
分类
字典特征提取
sklearn.feature_extraction.DictVectorizer()
对于特征当中存在类别信息的我们都会做one-hot编码处理
文本特征提取
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
文本内容抽取(英文)
sklearn.feature_extraction.text.CountVectorizer()
文本内容抽取(中文)
首先, 使用jieba.cut()
sklearn.feature_extraction.text.CountVectorizer()
tf_idf的使用
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
from sklearn.feature_extraction.text import TfidfVectorizer
图像特征提取(深度学习将介绍)
特征降维
定义
指在某些限定条件下,降低随机变量(特征)个数
降维的两种方式
特征选择 -- 过滤式
低方差特征过滤
目的:
删除低方差的一些特征
api:
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
相关系数
皮尔逊相关系数
判断标准:
一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
api:
from scipy.stats import pearsonr
斯皮尔曼相关系数
api
from scipy.stats import spearmanr
主成分分析
定义
高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变
api:
sklearn.decomposition.PCA(n_components=None)
机器学习(算法)
k-近邻算法
理解
根据最近距离,去判断你属于哪个类别
api:
sklearn.neighbors.KNeighborsClassifier()
参数
n_neighbors的选取对结果有影响
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
距离度量
常见距离公式
欧式距离
曼哈顿距离
切比雪夫距离
闵可夫斯基距离
p=1时,就是曼哈顿距离;
当p=2时,就是欧氏距离;
当p→∞时,就是切比雪夫距离。
距离分类
连续属性
离散属性
存在序的关系,转换为连续值求解
不存在序的关系,转换为向量的形式
K值的选择
K值过小:
容易受到异常点的影响
意味着整体模型变得复杂,容易发生过拟合
k值过大:
受到样本均衡的问题
K值的增大就意味着整体的模型变得简单,容易发生欠拟合
K=N(N是训练样本的个数)
发生完全不足取的情况
此时训练的模型完全失效
判断的类别只会选择样本中样本数最多的类别
kd树
目标
对训练数据进行快速k近邻搜索
kd树实现思路
构建树
构造根节点
通过递归方式去不断的构造
直到子区域没有节点,停止
最近领域搜索
构造一个栈,使遍历过的点在这个栈里面
是否过了超平面的判断,如果没有过,跳过,过了的话,需要把当前的子节点添加进去.
循环操作,求得最近点
K-近邻总结
优点:
简单,易于理解,易于实现
缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定K值,K值选择不当则分类精度不能保证
使用场景:小数据场景,几千~几万样本
线性回归
定义:
利用回归方程(函数)
对一个或多个自变量(特征值)和因变量(目标值)之间关系
进行建模的一种分析方式。
线性回归分类
线性关系(重点)
非线性关系
线性回归的损失和优化原理
1. 损失函数:
最小二乘
2. 优化算法
正规方程(了解)
通过矩阵变换,可以一步进行求解
只是适合小样本数据的计算
梯度下降法(循序渐进, 重要)
1.梯度
单变量 -- 函数的微分
多变量 -- 向量
2.梯度下降思路
首先要指定初始值点[完全随机的]
知道一个学习率(步长)
循环迭代,只到最后判断周围点都比我大,我默认找到了"最小点"
α(学习率,步长)
学习率不可以过大,也不可以过小
过大 -- 避开了极小点
过小 -- 步子太小,找到极小点,耗费时间太长
"-"(为什么是负梯度)
梯度前面加一个负号,目的是找到最快梯度下降方向,梯度本身值是最快上升方向
梯度下降方法介绍
全梯度下降算法(Full gradient descent),
让全部数据参与运算
运算效率低
随机梯度下降算法(Stochastic gradient descent),
只是随机选择一个样本进行计算
计算速度增加,但是容易受到异常值的影响
小批量梯度下降算法(Mini-batch gradient descent),
选择一部分数据参与运算
结合了前两者
随机平均梯度下降算法(Stochastic average gradient descent)
在计算过程中,对前面的梯度,维持一个均值
api
正规方程对应的api:
sklearn.linear_model.LinearRegression()
参数
fit_intercept:是否计算偏置
属性
LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置
梯度下降法对应的api
sklearn.linear_model.SGDRegressor()
评估-均方误差api
sklearn.metrics.mean_squared_error(y_true, y_pred)
线性回归的改进-岭回归
岭回归理解
带有L2正则化的线性回归
api
sklearn.linear_model.Ridge()
alpha -- 正则化力度
slover -- 优先会选择随机平均梯度下降法(SAG)
normalize -- 是否对特征值进行标准化
岭回归中正则化变化对结果的影响
正则化力度越大,权重系数越小
正则化力度越小,权重系数越大
回归算法总结
小规模数据:
LinearRegression(不能解决拟合问题)
岭回归
大规模数据:
SGDRegressor
逻辑回归(分类)
逻辑回归理解
逻辑回归就是解决二分类问题的利器
逻辑回归的输入就是线性回归输出的结果
激活函数 -- sigmoid函数
损失与优化
1) 损失
损失函数: 对数似然损失
2) 优化
提升原本属于1类别的概率,降低原本是0类别的概率。
api
sklearn.linear_model.LogisticRegression()
参数
solver -- 可选择的梯度下降方式
liblinear, sag, saga...
penalty -- 正则化方式
C -- 正则化力度
决策树
理解:
一棵由多个判断节点组成的树
决策树分类原理
熵
就是"混乱"程度的度量
判断
如果信息越混乱-- 熵值越高
如果信息越有序-- 熵值越低
-plogp
信息增益
以某特征划分数据集前后的熵的差值。
entroy(前) - entroy(后)
信息增益比
为了避免信息增益在使用的过程中,尽可能的先去选择划分类比比较多的特征作为节点
基尼值和基尼指数
基尼值
从数据集D中随机抽取两个样本,其类别标记不一致的概率
Gini(D)值越小,数据集D的纯度越高
cart剪枝
目的:防止过拟合
方法
预剪枝
通过叶子节点的样本数量进行判断
通过树的深度进行判断
通过熵值进行判断
后剪枝
把决策树生成之后,再进行相应的剪枝
api的使用
sklearn.tree.DecisionTreeClassifier()
criterion --
使用划分决策树的标准
默认是gini, 也可以使用entropy
max_depth --
树的最大深度
决策树总结
优点:
简单的理解和解释,树木可视化。
缺点:
决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
改进:
减枝cart算法 -- 设置深度,设置叶子节点的最小个数...
随机森林(集成学习的一种)
回归决策树
1.需要确定问题
如何选择划分点?
如何决定叶节点的输出值?
2.流程
1.选择最优切分特征j与切分点s
2.用选定的对(j,s)划分区域并决定相应的输出值
3.递归完成前面两步骤,直到满足条件停止
4.确定分割点,输出函数
朴素贝叶斯
基本概念
1.概率定义
一件事情发生的可能性
2.其他概率概念
联合概率
条件概率
相互独立
3.贝叶斯公式
p(C|W) = [p(W|C)p(C)]/[p(W)]
c -- 文档类别
w -- 文档特征值
4.拉普拉斯平滑系数
目的:为了计算中,避免部分数据值为零,导致结果为0的情况
处理方式:
分子 -- +a
分母 -- +am
api
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
alpha:拉普拉斯平滑系数
朴素贝叶斯算法总结
优点
3.分类准确度高,速度快
2.常用于文本分类
1.分类效率不错
缺点
1.如果特征属性有关联时其效果不好
2.假设的先验模型会导致效果不好
SVM
定义
寻找到一个超平面使样本分成两类,并且间隔最大。
SVM中常见名词
超平面
间隔最大
支持向量
硬间隔和软间隔
硬间隔
只在数据是线性可分离的时候才有效
对异常值非常敏感
软间隔
尽可能在保持最大间隔宽阔和限制间隔违例之间找到良好的平衡
间隔惩罚通过C值确定
SVM算法原理
要去求一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合。
SVM的损失函数【***】
0/1损失函数
Hinge损失函数【*****】
Logistic损失函数
SVM的核方法
一个从低维空间到高维空间的映射
常见核函数:
线性核[**]
多项式核
RBF核[***]
Sigmoid核
SVM回归
SVM回归是让尽可能多的实例位于预测线上,同时限制间隔违例(也就是不在预测线距上的实例)
api
sklearn.svm.……
SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同
NuSVC中的nu参数和SVC中的C参数;
LinearSVC是实现线性核函数的支持向量分类,没有kernel参数。
SVM 算法总结
SVM的优点:
在高维空间中非常高效;
即使在数据维度比样本数量大的情况下仍然有效;
在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的;
通用性:不同的核函数与特定的决策函数一一对应;
SVM的缺点:
如果特征数量比样本数量大得多,在选择核函数时要避免过拟合;
对缺失数据敏感;
对于核函数的高维映射解释力不强
EM 算法
1.是什么
期望最大化
一个为期望步(E步),
另一个为极大步(M步)
2.EM算法的流程
1.初始化参数
2.计算分布
3.重新估计参数
4.判断参数是否”重合“,如果”重合“,结束,否则继续循环
HMM模型
马尔科夫链
1.概念
状态空间中从一个状态到另一个状态转换的随机过程。
无记忆性:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。
HMM简介
1.隐马尔可夫模型
是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。
常见概念
隐含状态
可见状态
转换概率
输出概率
2.HMM模型基础
观测序列:
一类序列数据是可以观测到的结果
隐藏状态序列,简称状态序列:
不能观察到的结果,但是在里面真是存在
隐藏状态初始概率分布
状态转移概率矩阵
观测状态概率矩阵
3.HMM模型假设
齐次马尔科夫链假设:
任意时刻的隐藏状态只依赖于它前一个隐藏状态
观测独立性假设
任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态.
前向后向算法评估观察序列概率
求解问题:
即已知模型和观测序列,求观测序列出现的概率
思路:
前向算法:从 1 ---> N 一步步进行求解
后向算法:从 N ---> 1 一步步进行求解
维特比算法解码隐藏状态序列
1.解决问题:
即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。
2.怎么解决
输入:HMM -- λ=(A,B,Π),观测序列O
输出:最有可能的隐藏状态序列
流程:
1.初始化局部状态:
2.进行动态规划递推时刻t=2,3,...T时刻的局部状态
3.计算时刻T最可能隐藏状态序列出现的概率
4.利用局部状态,进行回溯,寻找参数
鲍姆-韦尔奇算法简介
即给定观测序列,估计模型λ=(A,B,Π)的参数,使该模型下观测序列的条件概率P(O∣λ)最大。
HMM-api
api
hmmlearn
属性:
"startprob_"参数对应我们的隐藏状态初始分布Π,
"transmat_"对应我们的状态转移矩阵A,
"emissionprob_"对应我们的观测状态概率矩阵B。
K-means
简介
一种典型的无监督学习算法
将相似的样本自动归到一个类别中
组内距离最小化,组间举例最大化
API
sklearn.cluster.KMeans()
参数
n_clusters:开始的聚类中心数量
实现流程
确定常数K
选定初始点为质心
重新计算每个类的质心(即为类中心)
重复上过程,直到质心不再改变
误差评估
1. 肘部法
下降率突然变缓时即认为是最佳的k值
2. SC系数
取值为[-1, 1],其值越大越好
3. CH系数
分数s高则聚类效果越好
算法优化
Canopy+kmeans
Canopy粗聚类配合kmeans
kmeans++
距离越远越容易成为新的质心
二分k-means
拆除SSE最大的簇
K-medoids
ISODATA
动态聚类
kernel kmeans
映射到高维空间
Mini-batch K-Means
大数据集分批聚类
集成学习
简介
定义
通过建立几个模型来解决单一预测问题,生成多个模型,各自独立学习,然后进行结合
分类
bagging
互相扼制变壮
boosting
弱弱组合变强
bagging
流程
1.对数据进行重新采样(在原数据集中)
2.对新数据集分别进行学习
3.平权投票,集成,产生结果
随机森林
Bagging + 决策树/ = bagging集成学习方法
sklearn.ensemble.RandomForestClassifier()
参数
n_estimator -- 森林里的树木数量
Criterion -- 分割特征的测量方法
max_depth -- 树的最大深度
max_features="auto”,每个决策树的最大特征数量
bootstrap -- 是否有放回抽取
min_samples_split:节点划分最少样本数
min_samples_leaf:叶子节点的最小样本数
优势
1.均可在原有算法上提高约2%左右的泛化正确率
2.简单,方便,通用
boosting
流程
1.初始化训练数据,其权重相等,
2.计算这个学习器在训练数据中的错误率
3.计算这个学习器的投票权重
4.根据投票权重对训练数据重新赋权
5.重复执行1-4步骤m次
6.对m个学习器进行加权投票
bagging和boosting的区别
数据方面:bagging,对数据要进行重新采样,boosting:调整数据
投票方面:bagging, 平权,boosting:加权
学习顺序:bagging, 并行,boosting:串行
主要作用:bagging, 过拟合,boosting:欠拟合
gbdt
简介
梯度提升决策树
算法由多棵决策树组成,所有树的结论累加起来做最终答案
2.公式
GBDT = 梯度下降 + Boosting + 决策树+一阶导数
3.GBDT主要执行思想
1.使用梯度下降法优化代价函数;
2.使用一层决策树作为弱学习器,负梯度作为目标值;
3.利用boosting思想进行集成。
xgboost
xgboost算法原理
1.最优模型的构建⽅法
追求目标:结构⻛险最⼩化
经验风险最小化(一味追求,容易发生过拟合)
2.XGBoost的⽬标函数推导
目标函数:
损失函数+模型复杂度
模型复杂度:
树的结构
各个叶子节点的值
损失函数推导
前向分布算法
二阶泰勒展开式
目标函数,最后转化为打分函数
3.XGBoost的回归树构建⽅法
打分函数,主要用于回归树构建过程中,判断是否进行再次节点划分
Gain = 划分之前打分函数值-划分之后打分函数值
tips:\gamma值 -- 代表树的复杂度
停⽌分裂条件判断
Gain<0
max_depth
阈值
XGBOOST = 梯度下降 + Boosting + 决策树/Linear+二阶阶导数
api介绍
api
pip3 install xgboost
参数
通用参数
Booster 参数
Tree Booster
Linear Booster
学习目标参数
XGBoost与GBDT的区别
1.区别一:
xgboost在构建过程中考虑了输的复杂度
gbdt是在剪枝步骤,考虑输的复杂度
2.区别二:
gbdt -- 一阶导
xgboost -- 二阶导
3.区别三:
xgboost -- 对特征数据,可以进行并行处理
gbdt -- 只能串行处理
lightGBM
lightGBM基本介绍
1.启发
通过神经网络等算法选择一部分数据进行训练
lightGBM 也是在选择数据集的时候,通过min-batch方式进行训练
2.特点
速度惊人
支持分布式
代码清晰易懂
3.优化内容:
基于Histogram(直方图)的决策树算法
Lightgbm 的Histogram(直方图)做差加速
带深度限制的Leaf-wise的叶子生长策略
直接支持类别特征
直接支持高效并行
lightGBM算法api介绍
1.api
pip3 install lightgbm
2.参数
Control Parameters
Core Parameters
IO parameter
模型评估与调优
模型评估
回归模型
MSE(均方误差)
MAE(平均绝对误差)
RMSE(均方根误差)
……
分类模型
准确率
预测正确的数占样本总数的比例。
精确率
正确预测为正占全部预测为正的比例
召回率
正确预测为正占全部正样本的比例
F1-score
主要用于评估模型的稳健性
AUC指标
主要用于评估样本不均衡的情况
欠拟合和过拟合
欠拟合
模型过于简单
在训练数据和测试数据上都不能得到很好的拟合
解决办法:增加数据的特征数量
过拟合
模型过于复杂
在训练数据上可以得到很好的拟合,但是在测试数据上得不到很好的拟合
解决办法:正则化
模型选择与调优
交叉验证、网格搜索
交叉验证
为了让从训练得到模型结果更加准确,我们把数据再进行划分
分支主题
训练集:训练集+验证集
测试集:测试集
网格搜索:
对模型预设几种超参数组合,最后选出最优参数组合建立模型。
api
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_:每次交叉验证后的验证集准确率结果和训练集准确率结果
使用for循环,调整单个参数
模型保存与加载
API
from sklearn.externals import joblib
import joblib
最新版
保存:
joblib.dump(rf, 'test.pkl')
加载:
estimator = joblib.load('test.pkl')
0 条评论
下一页