草庐IT

机器学习入门 | 必知必会的基础理论

python与数据分析 2023-09-21 原文
文章大纲

一、什么是机器学习、数据挖掘?

1、AI是什么?

AI(人工智能)是研究开发用于模拟、延伸和扩展人的智能理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支。
AI的应用场景:必备基础 "机器学习"

机器学习的应用场景
2、机器学习是什么?

机器学习就是让机器有学习的能力,让机器通过"某种策略", 学习"历史数据"后,能够进行一定"预测"和"识别"的能力。

3、数据挖掘是什么?

数据挖掘是指从大量数据中通过算法搜索隐藏于其中信息的过程。机器学习是支撑数据挖掘的手段。从关系上看,数据挖掘包括机器学习。

4、为什么需要数据挖掘?

面临复杂且大量的新数据集时,传统数据分析计算常常遇到瓶颈,我们将常见瓶颈进行抽象。
1、高维性数据:随着5G及物联网的建设,数据量将会呈指数级的增长,常常遇到成百上千属性的维度,可想象,计算复杂度将迅速增加。
2、非结构化数据:非结构化数据也包含许多含金量的信息,例如视频、音频、文本等等,这些都是传统数据分析方法无法获取的信息。
3、自动及智能问题。传统分析方法常规流程就是"提出假设-验证假设",但这一过程劳力费神。当前的数据分析任务常常需要产生和评估数千种假设,因此需要自动、智能的手段。

注:数据挖掘非万能法则,数据分析也非所想的不堪,两者的结合应用才能更好的为业务赋能。事实上,数据挖掘是需要数据分析进行辅助的,比如数据探索,特征工程。

二、机器学习所需要的基础理论

  • 让机器通过"某种策略", 学习"历史数据"后,能够进行一定"预测"和"识别"的能力
1、某种策略(模型)、损失、模型训练和标签
1)模型是什么?以"一元线性回归"为例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df1 = pd.DataFrame({'用户人数':[100,200,300,400,500],'销售额(元)':[1000,2000,3000,4000,5000]})
df1.plot(x='用户人数',y='销售额(元)')
from sklearn.linear_model import LinearRegression
x = df1['用户人数'].values.reshape(-1,1)
y = df1['销售额(元)']
lr = LinearRegression()
lr.fit(x,y)
# 模型的斜率
lr.coef_
lr.predict(np.array([600]).reshape(-1,1))
假设用户人数为600,那销量是 6000 ,这是模型的预测能力。
2)损失

损失是对糟糕预测的惩罚。损失是一个数值,表示对于单个样本而言,模型预测的准确程度。如果模型的预测完全准确,则损失为零,否则损失会较大。如下图:那副图的损失更大?红色箭头表示损失,蓝色线表示预测,可见图二的模型更准确(预测值-实际值),图一的损失更大。

3)模型训练

模型训练表示通过有标签样本来学习(确定)所有权重和偏差的理想值。模型训练检查多个样本,并尝试找出可最大限度的减少损失的模型(方向)。比如:上面的线性回归,k 和 b 都是两个未知的参数 ,根据已有的样本 x 和 y 去训练模型。

y = kx + b
4)标签

标签,白话说就是模型的 y 值,比如上面的线性回归标签就是销售额,抽象的说,标签就是结论。比如:【x,y】——【用户人数,销售额】——【100,1000】,就是一个样本。

2、代价函数(损失函数)
  • 代价函数:是一个数学函数,能够以有意义的方式汇总各种损失
  • 最常见的代价函数:MSE(均方误差)指的是每个样本平均平方损失。

注:MSE 常用于机器学习,但它不是唯一实用的损失函数,也不是适用于所有模型最佳的损失函数。

三、划分数据集(训练、验证、测试)
1)训练集与测试集(常见模式)

训练集:用于训练模型的子集
测试集:用于测试训练后模型的子集

  • 举个例子:训练集相当于上课学知识,测试集相当于期末考试,用来最终评估学习效果。
2)划分注意点:

① 通常将数据集的70%作为训练集,30%作为测试集(8 : 2也行),并且挑选的测试集的特征应该与训练集的特征相同。
② 通常需要在开始构建模型之前把数据集进行划分,防止数据窥探偏误。也就是说,我们避免了解太多关于测试集中的样本特点,防止我们认为的挑选有助于测试集数据的模型。这样的结果会过于乐观,但是实际上并没有预期的那样优秀。
③ 对于时序数据集、训练集和测试集需按时间划分。比如说我目前有 1-10 月的数据,那么 1-8 月作为训练集,9-10月作为测试级。

  • 原因:假设我们有了这个模型以后,都是用历史的数据,去预测未来的数据的,所以我们在训练数据的时候也要符合这个模式。
3)流程:

借助这种划分,可以对一个样本集进行训练,然后使用不同的样本集测试模型。采用两种分类以后,工作流程可能如下所示。

  • 缺点:相当于不断的利用测试集(未来数据)去调整模型,类似数据窥探的效果会增大模型过拟合的风险。
4)优化后的流程:
  • 缺点:① 验证集的缺点,10%数据很宝贵,拿去训练模型可能会产生更好的效果。② 繁琐
    通常采用第一种(测试集和训练集),如果发现训练模型过拟合,通过手段没有降低的话,可以采用第二种模式。
四、交叉验证(Cross Validation)
  • 交叉验证的基本思想是把在某种意义下将原始数据进行分组,一部分作为训练集(train set),另一部分作为验证集(validation set or test set)。首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来作为评价分类器的性能指标。
  • 目的 : 用交叉验证的目的是为了得到可靠稳定的模型。
  • 留出法(Holdout cross validation):上面提到的按照固定比例将数据集静态的划分为训练集、验证集、测试集的方法就是留出法。
  • 留一法(Leave one out cross validation ):每次的测试集都只有一个样本,需要进行 n 次训练和预测。这个方法用于训练的数据只比仅整体数据集少了一个样本,因此最接近原始样本的分布。但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同,一般在数据缺乏时使用。
  • K折交叉验证(k-fold cross validation ):静态的留出法对数据的划分方式比较敏感,有可能不同的划分方式得到了不同的模型。【K折交叉验证】是一种动态的验证方式,这种方式可以降低数据划分带来的影响,会得到一个更可靠的模型。具体步骤如下:
  • 五折交叉验证法:

① 将所有的数据集均匀的分成五份
② 不重复的每次取出其中一份做测试集,用其他四份做训练集训练模型,之后计算该模型在测试集上的MSE
③ 将五次的MSE取平均得到的最后的MSE,作为评价模型的指标

五、泛化能力与过拟合
  • 泛化能力:对未知数据 (新数据) 的预测能力。
  • 过拟合: 指的是模型在训练集上表现的很好,但是在交叉验证集合和测试集上表现一般,也就是说模型对未知样本的预测表现一般,泛化能力较差。
    举例:比如下图三个模型,绿色表示训练集样本,红线表示模型的预测能力,蓝色表示新样本点。看模型三在训练集表示很好,但是在新样本表现一般,所以说泛化能力较差,出现过拟合。模型一在训练集表现的也不好,新样本预测也不好,称之为欠拟合。最终我们选择模型二,泛化能力越好,就是越好的模型。


    哪个模型的泛化能力较差?
为什么会产生过拟合?
  • ① 训练数据集合训练数据集样本单一,样本不足。如果训练样本只有负样本,然后拿生成的模型去预测正样本,这肯定预测不准,所以训练样本要尽可能的全面,覆盖所有的数据类型。
  • ②训练数据中噪声干扰过大,噪声指训练数据中的干扰数据,过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
  • ③ 模型过于复杂,模型太复杂,已经能够死记硬背记下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的模型都有稳定的输出,模型太复杂是过拟合的重要因素。
如何降低过拟合?
  • ① 获取和使用更多的数据(数据集增强)是解决过拟合的根本性方法。
  • ② 采用合适的模型,控制模型的复杂度。根据奥卡姆剃刀法则:在同样能够解释已知观测现象的假设中,我们应该挑选 "最简单" 的那一个,对于模型的设计而言,我们应该选择简单合适的模型解决复杂的问题。


  • ③ 降低特征的数量。对于一些特征工程而言,可以降低特征的数量,删除冗余特征,人工选择保留哪些特征,这种方法也可以解决过拟合问题。
  • ④ 正则化,正则化就是在模型的代价函数里添加一个约束,使得可以减少模型参数的候选空间,使得模型更加简洁,本质上是控制模型复杂度。
  • ⑤ dropout是在训练网络时用的一种技巧,相当于在隐藏单元增加了到噪声。drop out指的是在训练过程中,每次按一定的概率,比如50%,随机的删除一部分隐藏单元神经元。所谓的删除不是真正意义上的删除,其实就是将该部分神经元的激活函数设为零,激活函数的输出为零,让这些神经元不计算而已。
  • ⑥ 提前终止,对模型进行训练的过程即是对模型的参数进行学习更新的过程。这个参数学习的过程往往会用到一些迭代方法,比如梯度下降Early stopping是一种迭代次数截断的方法来阻止过拟合的方法。即在模型对训练数据及迭代收敛之前停止迭代来防止过拟合。
所以,总的来说,一个好的模型,损失函数尽可能的小,泛化能力尽可能大。
六、模型类别
  • 监督学习
    监督学习是从<x,y标签>这样的事例中学习统计规律,然后对于新的 x 给出对应的 y 。通俗的讲,就是根据已有的数据集知道输入和输出结果之间的关系,根据这种已知的关系,训练得到一个最优模型。
    ① 分类模型:标签为分类型数据,比如预测用户是否流失(标签 y 为【是否】)
    ② 回归模型:标签为数值数据,比如预测销售额。
  • 监督学习常见模型
    K-近邻(KNN)
    线性回归(回归模型)
    逻辑回归(分类模型)
    支持向量机
    决策树和随机森林
    神经网络
  • 无监督学习
    相比监督学习没有标注数据,也就是 y。无监督学习是从一堆数据中学习其内在统计规律或内在结构。学习到的模型可以是类别,转换或者概率,这些模型可以实现对数据的聚类、降维、可视化、概率估计和关联规则学习。
  • 无监督学习常见模型
    a.聚类算法
    k-means算法(kmeans)
    密度聚类算法
    最大期望算法(EM)
    b.降维
    主成分分析(PCA)
    c.关联规则学习
    Apriori
    d. 时间序列预测
  • 半监督学习
    半监督学习包含大量未标注数据和少量标注数据,主要是利用未标注中的信息辅助标注数据进行监督学习。大多数半监督学习算法是无监督式和监督式算法的结合。
七、模型评估

不同类型的模型评估方法不一。
先讲一个常见误区,大家是否觉得评估模型就用模型准确率 ?

  • 实际例子,小a是某运营商的一名数据分析师,老板最近和他说:"小a,最近我们这个 xx 流量产品每月流失用户都挺多的,能不能帮忙想想办法。",小a 思考了一下,觉得假设我们能预测出下个月流失用户的名单,那我们是不是能提前对这批用户发发优惠,或者引导他们升级变更其他流量产品去挽留他们呢?
  • 模型准确率9/10 = 90%
  • 记得我们的任务目标吗,我们目标是不是想预测出哪些用户流失了?那这个模型在预测流失用户的表现如何,模型一个流失用户都没预测出来,尽管模型的准确率是90%这么高,但对于我们的业务来说,是无效模型。

分类评估指标

  • ① 一级指标(底层指标)
    混淆矩阵:混淆矩阵就是分别统计分类模型、归错类、归对类的观测值个数,然后把结果放在一个表里展示出来,这个表就是混淆矩阵。
  • 真实值是positive,模型认为是positive的数量(True Positive =TP),真阳性。
  • 真实值是positive,模型认为是negative的数量(False Negative = FN),这就是统计学上的第一类错误,弃真,假阴性。
  • 真实值是negative,模型认为是positive的数量(False Positive = FP),这就是统计学上的第二类错误,纳伪,假阳性。
  • 真实值是negative,模型认为是negative的数量(True Negative = TN),真阴性。
  • 套上例子:
    实际为流失用户,而模型预测也是流失用户的数量,即为TP
    实际为流失用户,而模型预测时非流失用户的数量,即为FN
    实际为非流失用户,而模型预测的是流失用户的数量,即为FP
    实际为非流失用户,而模型预测是非流失用户的数量,即为TN

混淆矩阵怎么看?预测性分类模型肯定是希望越准越好,那么对应到混淆矩阵中,那肯定是希望TP和TN的数量大,而FP与FN的数量小。

② 二级指标
混淆矩阵里面统计的是个数,有时候面对大量的数据,光凭算个数很难衡量模型的优劣。因此混淆矩阵在基本的统计结果上又延伸了如下四个指标,我们称它为二级指标。

  • accuracy (准确率):(TP + TN)/(TP + FN + FP + FN)
    意义:分类模型所有判断正确的结果占总观测值的比重,一般不用
  • precision(准确率):TP /(TP + FP)
    意义:表示预测为正的样本数有多少是对的,可解释性强,常用越高越好。
  • record (召回率、查全率,真正率TPR):TP / ( TP + FN)
    意义:表示样本中的正例有多少被预测正确,可解释强,常用越高越好。
  • FPR (假正率) :FP / (FP + FN)
    意义:表示当前被错误分到正样本类别中真实的负样本 所占所有负样本总数 的比例,越低越好。
  • ③三级指标
  • ROC curve,这个曲线就是以下 TPR 和 FPR 为轴,取不同的阈值点画的。
  • 模型去预测分类型任务的时候,本质上是预测分类型的概率的,比如计算流失的概率,如果这个概率大于阈值0.5的话,这即为流失,所以这里就有个阈值的存在。不同的阈值,会有不同的TP 、FP。

ROC_AUC:AUC就是曲线下面积,我们根据ROC曲线想一下,到底我们这个曲线涨什么样的模型才算好呢?TR率是越高越好,FP率是越低越好,所以我们的曲线应该是越靠近Y轴越好。(粗鲁)理解最终可抽象成,ROC曲线下面积越大越好,即AUC越大越好。

AUC评判标准 :
0.5-0.7 : 效果较低,但预测股票已经很不错了。
0.7-0.85 : 效果一般
0.85-0.95 : 效果很好
0.95-1 : 效果非常好,但不太可能

f1值:(2*Precision * Recall/(Precision+Record)
意义:我们的模型想recall和precision都高,但鱼与熊掌不可兼得,如果想要找到它们的平衡,那就用f1值。

  • 分类评估指标,如何选择?
    选择方针,根据你模型所解决的目的进行选择,比如我想现在。训练一个模型来识别出哪些是在逃罪犯?(宁可错杀1000,也不放过一个)-- recall,因为recall为表示样本中的正例有多少被预测正确,对于这个模型,就是所有的在逃罪犯为分母,模型预测为在逃罪犯为分子。假设recall为1,也就是所有的在逃罪犯模型都预测正确了。
  • 根据指标可解释性去选择。实际工作中常常要向不懂机器学习的人去解释模型的效果,类似roc_auc和f1值,这种三级指标可解释性较弱,所以我们一般是选择recall和precision。

回归评估指标

  • 平均绝对误差MAE


  • 均方误差 MSE



    相对MAE而言,MSE的数值更大。

  • 均方根误差 RMSE


  • 中位绝对误差


  • r^2决定系数(拟合优度)

回归评估指标如何选择?
  • 一般选择MSE作为评估指标
  • MSE的误差的量纲相对较大。若选看量纲接近业务水平的,用MSE和RMSE
  • 若担心某个误差较大会影响整体的评估指标,用MedAE
  • 如果模型希望的是找到能够解释目标y变动的因变量,则选用R Squared更合适。
机器学习的基础概念介绍到这里,懂得了基础概念,才能开始后续的学习。

有关机器学习入门 | 必知必会的基础理论的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  8. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  9. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐