password
URL
type
status
date
slug
summary
tags
category
icon
周起始
标签
是否汉化
1. 机器学习概述
1.1 什么是机器学习
机器学习是人工智能的一个核心领域,它涉及研究和开发算法,使计算机系统能够利用数据来提高性能、做出决策、或者通过经验来改进。与传统的编程不同,机器学习不依赖于明确编写的规则,而是通过从数据中学习模式和关系来实现任务。
机器学习的关键特点包括:
- 自动化学习:算法能够从数据中自动发现规律,而不需要人为编写所有规则。
- 模式识别:机器学习模型擅长识别数据中的模式,这些模式可能对人类来说并不明显。
- 预测和决策:基于学习到的模式,机器学习模型可以进行预测(如分类、回归)或推荐决策。
- 适应性:机器学习模型可以适应新的数据和环境,随着时间的推移提高其性能。
1.2 机器学习中的基本概念
在机器学习领域,理解以下基本概念是非常重要的:
- 数据集 (Dataset):
- 数据集是用于机器学习模型训练和评估的整个数据集合。它通常包含多个样本。
- 样本 (Sample):
- 样本是数据集中的一个数据点或观测值。在机器学习中,样本通常是特征的集合。
- 特征 (Feature):
- 特征是数据集中每个样本的某个具体属性或测量值。特征用于描述样本,是模型用来进行预测或分类的基础。
- 属性空间 (Feature Space):
- 属性空间是特征空间的同义词,指的是由所有可能的特征值组成的空间。一个机器学习样本在这个空间中可以被表示为一个点。
- 特征向量 (Feature Vector):
- 特征向量是表示样本的有序特征值列表,通常以向量形式表示。
- 标签 (Label):
- 在监督学习中,标签是与样本相关联的输出值。例如,在分类任务中,标签可以是类别名称;在回归任务中,标签可以是一个连续值。
- 模型 (Model):
- 模型是机器学习算法的实现,它根据输入的特征向量来预测或分类标签。
- 训练 (Training):
- 训练是使用训练数据集来调整模型参数的过程,目的是最小化损失函数,提高模型的预测准确性。
- 训练数据集 (Training Dataset):
- 训练数据集是用于训练模型的数据子集。它包含了输入特征和对应的标签。
- 验证数据集 (Validation Dataset):
- 验证数据集是从整体数据集中划分出来的另一部分,用于在训练过程中评估模型性能,以便进行超参数调整。
- 测试数据集 (Test Dataset):
- 测试数据集是用于最终评估模型性能的数据子集,它应该与训练数据集和验证数据集尽可能不同,以确保模型的泛化能力。
- 泛化能力 (Generalization):
- 泛化能力是指模型在未见过的数据上的表现能力。一个具有良好泛化能力的模型能够从训练数据中学习到普适的规律,而不是仅仅记住训练数据。
这些概念构成了机器学习的基础,理解它们有助于更好地设计、训练和评估机器学习模型。
1.3 易混淆的几个概念
人工智能、机器学习和深度学习在概念上的区别和联系。
- 人工智能,是人们最常听到的说法。在不需要严谨表达时,一般都可以用这个词来表达一些不同以往的“智能”应用。而实际上,程序员写的每一行逻辑代码都是“人工智能”,每一个软件都包含了“人工智能”,不是“人类智能”。如果要严谨的表达,“人工智能”和“软件”并没有什么区别,也不表达什么意义深刻的“智能“革新产品。 但如果遵循普适的理解,那么“人工智能”一定是得有一些新奇的、超越以往的“人工智能”的东西,才能配得上这个词。比如,以往计算器(注意,不是计算机,是加减乘除的计算器)刚出现时,它就是新奇的事物,超越了人类的认知。在那个时刻,“计算器”就代表了“人工智能”的最高水平,是当之无愧的“人工智能”产品。 那么,什么时候适合用“人工智能”这个词汇呢?如果别人在用这个词汇说明什么,那就跟着用就好了,不必过于严谨。如果觉得有什么超越以往的“智能”的事物,那就用“人工智能”来介绍它。放之当下(2018年),图像中识别出物体、语音中识别出文本、自动驾驶等等就可以称为“人工智能”了(本文也没少用)。但电灯能感应到人后自动点亮,就不足以说是“人工智能”了。
- 机器学习。这是专业词汇,表达的是具有“学习“能力的软硬件产品,与程序员写就的代码相区别。可以认为,机器学习模型是一个函数,有输入输出,它的逻辑是数据驱动的,核心逻辑在数据中,不在代码中。 机器学习的“学习过程“,如果也用函数来类比,那么就是首先给模型传入输入,获得输出。然后将模型的输出与期望的输出(即样本数据中的标记结果)进行比较。并根据比较结果来更新模型中的数据,以便下一次的模型输出能够与期望结果更接近。这个过程,和人学习时的题海战术很类似。 由此看出,机器学习的学习过程是机器直接学习规律,改进数据,逐渐形成逻辑。而不是先有人类学习规律后,再写成代码。故称之为“机器学习”。
- 深度学习。这是机器学习的子领域,但带来了非常大的变革,因此成为了流行的词汇。从字面上解释,所谓深度学习,即在机器学习时,数据组织成了多层次的、有“深度”的网络。传统成功的机器学习算法一般是三层,而深度学习能够实现多达上千层的网络。层次越多,可以认为机器学习模型就能越“聪明”,越有“智能”。 深度学习成功的解决了大量和人类认知相关的问题,如:图像中识别物体、物体位置、人脸,语音中更精确的识别文字,文字中翻译、理解含义等。一方面,将机器学习模型的效果大大提升,另一方面,反而降低了机器学习模型应用的难度,让更多的人能够参与进来。最近的一次“人工智能“热潮,也是深度学习所带来的。
1.4 机器学习应用场景
机器学习在各个领域都有广泛的应用,以下列举了一些常见的机器学习应用场景:
- 自然语言处理(NLP):
- 文本分类:垃圾邮件过滤、情感分析等。
- 机器翻译:Google 翻译、百度翻译等。
- 文本生成:语言模型生成文本、自动摘要等。
- 计算机视觉(CV):
- 图像分类:识别图像中的物体或场景。
- 目标检测:检测图像中的特定对象。
- 图像分割:将图像分割成不同的区域。
- 人脸识别:识别图像中的人脸。
- 声音识别与处理:
- 语音识别:将语音转换为文本。
- 语音合成:将文本转换为语音。
- 声音分类:识别声音的类型或来源。
- 推荐系统:
- 个性化推荐:根据用户的历史行为和偏好推荐商品、音乐、视频等。
- 内容推荐:根据内容的特征和相似性推荐相关内容。
- 医疗保健:
- 医学影像分析:辅助医生诊断疾病,如肿瘤检测、骨折识别等。
- 疾病预测:根据患者的历史数据和症状预测可能患上的疾病。
- 金融领域:
- 风险评估:评估借款人的信用风险。
- 股票预测:预测股票价格的走势。
- 欺诈检测:检测信用卡交易中的欺诈行为。
- 智能交通:
- 交通流量预测:预测城市道路的交通流量,以优化交通管理。
- 自动驾驶:利用机器学习算法实现车辆的自主驾驶。
- 工业制造:
- 设备故障预测:预测设备的故障,以便提前进行维护。
- 生产优化:优化生产线的流程和效率,减少生产成本。
1.5 机器学习分类
1.5.1 监督学习 (Supervised Learning)
- 含义:使用带有标签的数据训练模型,目的是使模型能够预测或决定未见过数据的标签。
- 解决问题:
- 回归问题:预测一个连续值,如房价、温度等。
- 分类问题:预测一个类别标签,如垃圾邮件检测、图片中物体的识别等。
1.5.2 无监督学习 (Unsupervised Learning)
- 含义:处理没有标签的数据,目的是发现数据内在的结构和模式。
- 解决问题:
- 聚类问题:将数据集中的样本根据相似性分组,如市场细分、社交网络中的社区检测等。
- 异常检测:识别数据集中的异常或不寻常的模式。
- 降维:减少数据的复杂性,同时尽量保持原始数据的结构。
1.5.3 强化学习 (Reinforcement Learning)
- 含义:强化学习主要关注如何在环境中做出决策。通俗来说,强化学习可以被看作是一种“学习如何做决策”的过程,其中的“学习”是通过智能体(Agent)与其所处环境(Environment)之间的交互来实现的。
- 解决问题:
- 控制任务:如机器人控制、游戏AI等。
- 优化问题:在没有明确解决方案的情况下寻找最优或可行的解决方案。
强化学习的关键概念:
- 智能体 (Agent):在强化学习中,智能体是指能够观察环境、做出决策并执行动作的实体。
- 环境 (Environment):智能体所处并与之交互的外部世界。
- 状态 (State):在强化学习中,环境在任何给定时间点的情况或配置。
- 动作 (Action):智能体可以执行的行为。
- 奖励 (Reward):智能体在执行动作后从环境中获得的反馈信号,奖励可以是正的(鼓励某行为)或负的(惩罚某行为)。
- 策略 (Policy):从当前状态到动作的映射,它定义了智能体在给定状态下应采取的动作。
- 价值函数 (Value Function):预测智能体从某个状态开始,遵循特定策略所能获得的期望累积奖励。
- Q函数 (Q Function):预测在给定状态下采取某个动作并遵循特定策略所能获得的期望累积奖励。
强化学习的训练过程:
- 初始化:智能体开始于环境的某个状态。
- 观察:智能体观察当前环境的状态。
- 决策:智能体根据某种策略决定要执行的动作。
- 行动:智能体执行选定的动作。
- 奖励:环境根据智能体的动作给出奖励。
- 新状态:智能体进入新的状态。
- 学习:智能体更新其策略,以最大化长期累积奖励。这通常涉及到价值函数或Q函数的更新。
- 重复:智能体重复观察、决策、行动的循环,直到达到某个终止条件,如完成特定任务或达到预定的迭代次数。
想象一下,强化学习就像训练一只小狗学会坐下。刚开始,小狗(智能体)不知道坐下(动作)会有什么结果。当你(环境)说“坐下”,它可能不会立即响应。如果它最终坐下了,你给它一个奖励,比如一块小饼干(奖励)。这样,小狗就学会了坐下可以得到奖励。随着时间的推移,当你说“坐下”时,它会更快地做出反应,因为它学会了这种行为会带来好处。这个学习过程就是强化学习。
强化学习在许多领域都有应用,包括游戏、机器人、自动驾驶汽车、资源管理等。通过不断的试错和学习,智能体能够找到实现目标的最优策略。
2. 机器学习生命周期
机器学习最主要的三个步骤可概括为:数据处理、建模以及部署。参考Microsoft《机器学习平台建设》
2.1 理解业务需求
- 明确业务目标和需求。
- 确定要解决的问题类型(分类、回归、聚类、异常检测等)。
2.2 数据处理
- 数据收集和存储:
收集相关数据,可能包括历史数据、实时数据或通过实验和调查获得的数据。
- 数据探索:
对收集的数据进行初步分析,了解数据的基本特性。
- 数据预处理:
清洗数据,处理缺失值、异常值和重复记录。
- 数据标记
数据标注或数据标注(Data Annotation),是机器学习领域中一个重要的预处理步骤。它涉及对原始数据进行分类、标记或描述,以便机器学习模型能够从这些数据中学习并做出预测或分类。
- 特征工程
特征工程(Feature Engineering)是机器学习中一个至关重要的步骤,它涉及从原始数据中选择、构建和转换特征(变量),以提高机器学习模型的性能。特征工程的目的是提取出对预测任务最有用的信息,并以一种模型能够理解的方式表示这些信息。
以下是特征工程的一些关键方面:
特征工程是机器学习成功的关键因素之一,因为模型的性能很大程度上取决于输入特征的质量。通过特征工程,可以提高模型的准确性、减少训练时间,并提高模型的泛化能力。然而,特征工程也需要专业知识和经验,以避免过拟合和欠拟合等问题。
2.3 模型开发
- 选择模型:
- 根据问题类型和数据特点选择合适的机器学习算法。
- 模型训练:
- 将数据分割为训练集、验证集和测试集。
- 使用训练集数据训练模型。
- 模型评估及调优:
- 使用验证集评估模型性能,调整模型参数。
- 通过交叉验证等技术来优化模型的超参数。
- 模型验证:
- 使用测试集对模型进行最终评估,确保模型的泛化能力。
2.4 模型部署
2.4.1 部署
模型创建好后,还需要部署后进行推理应用,产生价值。部署并不只是将模型复制到线上,还涉及到线上模型的管理等功能。
2.4.2 性能监控
ABTest
1. 模型训练
除了使用现成的机器学习算法,我们可以自己训练自己的模型。
在机器学习中,模型确是通过参数化的函数表达式来表示的,这些参数决定了模型的行为和预测能力,函数表达式将输入数据(特征)映射到输出结果(预测)。
不同类型的模型(如线性模型、决策树、神经网络等)具有不同的函数形式。例如,线性模型的函数可能是一个线性方程,而神经网络的函数则可能包含多个非线性变换。
1.1 模型训练目标
模型的训练目标是找到一组参数,使得模型对于给定的输入数据能够做出尽可能准确的预测。这个目标可以通过以下几种方式来实现:
- 最小化损失函数 (Loss Function):损失函数衡量模型预测结果与实际结果之间的差异。模型训练的过程就是通过调整参数来最小化损失函数的过程。
- 最大化似然 (Likelihood):在概率模型中,训练目标是找到一组参数,使得观测到的数据出现的概率(似然)最大。
- 优化性能指标 (Performance Metrics):除了损失函数外,还可以使用其他性能指标(如准确率、F1分数等)来评估模型,并作为训练目标。
- 泛化能力 (Generalization):训练目标还包括提高模型的泛化能力,即模型不仅在训练数据上表现良好,也能在未见过的数据上做出准确的预测。
1.2 模型训练流程
模型训练流程是构建和优化机器学习模型的一系列步骤。以下是模型训练流程的典型步骤,以及每一步所实现的目标:
- 数据收集:
- 收集用于训练模型的数据。这些数据可以来自数据库、文件、API或其他来源。
- 数据预处理:
- 清洗数据,处理缺失值、异常值和重复记录。
- 进行特征工程,包括选择相关特征、创建新特征、转换非数值数据为数值数据等。
- 数据探索:
- 使用统计分析和可视化工具探索数据,了解数据的分布和潜在关系。
- 数据分割:
- 将数据集分割为训练集、验证集和测试集。这一步对于评估模型的泛化能力至关重要。
- 选择模型:
- 根据问题类型(回归、分类、聚类等)和数据特点选择合适的机器学习算法。
- 模型初始化:
- 创建模型的实例,并设置初始参数。在某些模型中,这可能涉及到随机初始化参数。
- 模型训练:
- 使用训练集数据对模型进行训练。这个过程通常涉及优化算法,如梯度下降,来调整模型参数以最小化损失函数。
- 超参数调优:
- 调整模型的超参数(如学习率、正则化参数等),以提高模型的性能。
- 模型验证:
- 使用验证集评估模型的性能,确保模型没有过拟合或欠拟合。
- 模型评估:
- 使用测试集对模型进行最终评估,测试集数据在训练过程中未被使用。
1.3 模型训练方式
模型的训练方式主要分为在线训练(Online Learning)和离线训练(Offline Learning或Batch Learning)。这两种训练方式在数据处理、模型更新和应用场景上有所不同。
1.3.1 在线训练(Online Learning)
含义:
在线训练指的是模型可以实时地或者以小批量的方式逐步使用新数据进行训练或更新。这种方式适合于数据流不断变化的环境。
使用的数据集:
- 通常是实时数据或者实时获取的小批量数据。
优点:
- 适应性:能够适应新数据和随时间变化的数据分布。
- 灵活性:适合处理不断变化的任务。
- 计算效率:可以利用小批量数据进行快速更新,减少计算资源的消耗。
缺点:
- 稳定性:可能会因为噪声数据而影响模型稳定性。
- 复杂性:算法实现相对复杂,需要能够处理数据流。
1.3.2 离线训练(Offline Learning / Batch Learning)
含义:
离线训练指的是模型使用整个数据集进行一次性的训练,这些数据通常已经收集完毕。
使用的数据集:
- 完整的、预先收集好的数据集。
优点:
- 简单性:算法实现简单,容易理解和实现。
- 稳定性:使用整个数据集可以更好地估计模型参数。
- 效率:可以利用批处理优势,进行高效的计算。
缺点:
- 更新困难:模型更新需要重新训练,可能耗时。
- 适应性:对新数据的适应性较差。
在线训练(Online Learning)和离线训练主要体现在数据集的不同。
- 数据的实时性:在线训练使用的数据通常是实时的或接近实时的,而离线训练使用的数据是历史数据。
- 数据的大小:在线训练可能使用小批量数据,而离线训练使用整个数据集。
- 数据的更新频率:在线训练的数据集会频繁更新,而离线训练的数据集通常在模型训练周期内保持不变。
在线训练(Online Learning)和离线训练各自的适用场景不同。
- 在线训练:适用于需要快速适应新情况的场景,如实时推荐系统、欺诈检测等。
- 离线训练:适用于数据相对稳定,不需要频繁更新模型的场景,如传统的客户细分、市场预测等。
选择在线训练还是离线训练,取决于具体问题的需求、数据的特性以及计算资源的限制。在实际应用中,有时也会结合使用这两种训练方式,例如,先使用离线训练得到一个稳定的模型,然后通过在线训练进行微调以适应新数据。
1.4 模型训练的数据
1.5 模型训练的问题
在机器学习中,欠拟合(Underfitting)和过拟合(Overfitting)是两种常见的模型训练问题,它们描述了模型在训练数据上的表现与期望之间的差异。
1.5.1 欠拟合 (Underfitting)
含义:
欠拟合是指模型在训练数据上的表现不佳,无法捕捉到数据中的基本规律。这通常是因为模型过于简单,没有足够的能力来学习数据的特征。
原因:
- 模型太简单:模型的复杂度不足以捕捉数据的复杂性。
- 训练不充分:模型没有训练足够的时间或迭代次数。
- 特征选择不当:使用了不相关或不重要的特征。
避免方法:
- 增加模型复杂度:选择更复杂的模型或增加模型的参数。
- 更长时间的训练:让模型训练更多的迭代次数。
- 特征工程:选择更有意义的特征或增加特征的数量。
1.5.2 过拟合 (Overfitting)
含义:
过拟合是指模型在训练数据上表现得很好,但是对于未见过的新数据,其表现显著下降。这通常是因为模型对训练数据中的噪声和细节过度敏感,学习到了数据中的“假特征”。
原因:
- 模型太复杂:模型的复杂度远超过数据的复杂性。
- 训练数据不纯:训练数据包含错误、异常值或噪声。
- 数据量不足:训练数据太少,不足以泛化到新数据。
避免方法:
- 减少模型复杂度:选择更简单的模型或减少模型的参数。
- 正则化:使用如L1、L2正则化等技术来限制模型的复杂度。
- 增加数据量:使用更多的训练数据或通过数据增强来扩充数据集。
- 交叉验证:使用交叉验证等技术来评估模型的泛化能力。
- Dropout:在使用神经网络时,可以使用Dropout技术来减少过拟合。
总结:
- 欠拟合通常发生在模型太简单,无法学习数据的基本结构时。
- 过拟合则发生在模型太复杂,学习到了数据中的噪声和细节时。
在实际应用中,需要通过调整模型的复杂度、训练时间、正则化技术、数据量和数据质量等方法来平衡欠拟合和过拟合,以达到最佳的泛化能力。常用的方法是使用验证集来监控模型在训练过程中的表现,并根据需要调整模型和训练策略。
1.6 模型验证
交叉验证。
机器学习库
Scikit-learn 和 Spark MLlib 都是流行的机器学习库。都提供了大量经典的机器学习算法。
Scikit-learn适用于小规模数据集和单机环境下的机器学习任务,而Spark MLlib适用于大规模数据集和分布式计算环境下的机器学习任务,具有更强的扩展性和适用性。
1. Scikit-learn
https://scikit-learn.org/
- 特点:
- 易用性: Scikit-learn提供了简单、一致的API,易于学习和使用,适合初学者和快速原型开发。
- 丰富的算法支持: Scikit-learn包含了大量的经典机器学习算法和模型,包括分类、回归、聚类、降维等。
- 灵活性: Scikit-learn提供了丰富的模型选择和参数调优工具,支持交叉验证、网格搜索等方法。
- 适用性: Scikit-learn适用于小规模数据集和单机环境下的机器学习任务,特别适合于探索性数据分析和模型原型验证。
- 应用场景:
- 小规模数据集的机器学习任务:适用于在单机环境下处理小规模数据集的机器学习任务。
- 探索性数据分析和模型原型验证:适用于快速建立和验证机器学习模型,进行探索性数据分析和实验。
- 主要功能:
- 分类:识别对象属于哪个类别,如垃圾邮件检测、图像识别等,支持梯度提升、最近邻、随机森林、逻辑回归等算法。
- 回归:预测与对象相关的连续值属性,如药物反应、股票价格等,支持梯度提升、最近邻、随机森林、岭回归等算法。
- 聚类:自动将相似对象分组,如客户细分、实验结果分组等,支持k均值、HDBSCAN、层次聚类等算法。
- 降维:减少考虑的随机变量数量,如可视化、提高效率等,支持PCA、特征选择、非负矩阵分解等算法。
- 模型选择:比较、验证和选择参数和模型,如通过参数调整提高准确性,支持网格搜索、交叉验证、度量等。
- 预处理:特征提取和归一化,如将文本转换为机器学习算法可用的输入数据,支持预处理、特征提取等。
2. Spark MLlib
https://spark.apache.org/docs/latest/ml-guide.html
- 特点:
- 分布式计算: Spark MLlib是基于Spark引擎的分布式机器学习库,能够在分布式计算集群上运行。
- 大规模数据支持: Spark MLlib适用于处理大规模数据集,能够利用Spark集群的并行计算能力进行高效处理。
- 内置算法和工具: Spark MLlib提供了丰富的分布式机器学习算法和工具,包括分类、回归、聚类、推荐等。
- 整合Spark生态系统: Spark MLlib能够与Spark的其他组件(如Spark SQL、Spark Streaming)无缝整合,支持复杂的数据处理和分析任务。
- 应用场景:
- 大规模数据集的机器学习任务:适用于处理大规模数据集和分布式计算集群上的机器学习任务。
- 实时数据处理和分析:适用于与Spark Streaming等组件结合,进行实时数据处理和实时机器学习。
- 数据湖和大数据平台上的机器学习任务:适用于在数据湖、大数据平台上进行机器学习模型的训练和部署。
- MLlib提供的工具:
- ML Algorithms:常见的机器学习算法,包括分类、回归、聚类和协同过滤。
- Featurization:特征提取、转换、降维和选择。
- Pipelines:构建、评估和调整机器学习流水线的工具。
- Persistence:保存和加载算法、模型和流水线。
- Utilities:线性代数、统计、数据处理等工具。
选择 Scikit-learn 还是 Spark MLlib?
- 数据规模:如果你的数据集较小,可以轻松地在单机上处理,Scikit-learn 是一个非常好的选择。如果你需要处理大量数据,或者数据已经分布式存储,Spark MLlib 更合适。
- 编程语言:如果你已经熟悉 Python 并且喜欢其简洁的语法,Scikit-learn 可能更适合你。如果你的项目需要使用 Scala 或 Java,或者你想利用 Spark 的其他组件(如 Spark SQL 或 Spark Streaming),Spark MLlib 可能更合适。
- 算法需求:两者都提供了广泛的算法,但 Scikit-learn 在算法的多样性和更新上可能略胜一筹。
- 社区和资源:Scikit-learn 拥有一个非常活跃的社区,有大量的教程和资源。Spark MLlib 作为 Spark 生态系统的一部分,也有很好的社区支持,但可能更侧重于大规模数据处理。
https://time.geekbang.org/column/intro/100085501[零基础实战机器学习\_机器\_机器学习\_黄佳\_人工智能\_AI\_大数据\_数据\_数据分析\_深度学习\_监督学习\_半监督学习\_无监督学习\_神经网络算法-极客时间](https://time.geekbang.org/column/intro/100085501?)
机器学习算法主要解决以下几类问题:
- 回归问题 (Regression):预测一个连续的输出值。
- 线性回归
- 决策树回归
- 随机森林回归
- 支持向量回归 (SVR)
- 神经网络
- 分类问题 (Classification):预测一个离散的类别标签。
- 逻辑回归
- K最近邻 (KNN)
- 决策树分类
- 随机森林分类
- 支持向量机 (SVM)
- 神经网络
- 朴素贝叶斯
- 聚类问题 (Clustering):将数据分组,组内成员相似度高,组间差异大。
- K-Means
- 层次聚类
- DBSCAN
- 高斯混合模型 (GMM)
- 异常检测 (Anomaly Detection):识别数据集中的异常或不寻常的模式。
- Isolation Forest
- One-Class SVM
- Autoencoder
- 降维 (Dimensionality Reduction):减少数据的复杂性,同时尽量保持原始数据的结构。
- 主成分分析 (PCA)
- 线性判别分析 (LDA)
- t-SNE
- 强化学习 (Reinforcement Learning):智能体通过与环境的交互来学习行为策略,以最大化累积奖励。
- Q学习
- SARSA
- 深度Q网络 (DQN)
- 策略梯度
- 推荐系统 (Recommendation Systems):预测用户对物品的偏好或评分。
- 协同过滤
- 基于内容的推荐
- 混合推荐系统
- 自然语言处理 (NLP):理解和生成人类语言。
- 文本分类
- 情感分析
- 机器翻译
- 命名实体识别 (NER)
- 语言模型
- 图像处理 (Image Processing):图像识别、分割和分类。
- 卷积神经网络 (CNN)
- 图像分割算法
- 时间序列预测 (Time Series Forecasting):基于历史数据预测未来的数据点。
- ARIMA
- 季节性分解的时间序列预测 (STL)
- 长短期记忆网络 (LSTM)
分类算法实战
1. 决策树
掌握 sklearn 中自带的决策树分类器 DecisionTreeClassifier
2. 朴素贝叶斯
Scikit-learn,它给我们提供了 3 个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。
这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:
高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现。
3. 支持向量机SVM
今天我给你讲了 SVM 分类器,它在文本分类尤其是针对二分类任务性能卓越。同样,针对多分类的情况,我们可以采用一对多,或者一对一的方法,多个二值分类器组合成一个多分类器。
sklearn 工具包中有 SVM 算法23丨SVM(下):如何进行乳腺癌检测?-数据分析实战45讲-极客时间
SVM 既可以做回归,也可以做分类器。
4. KNN ( K-Nearest Neighbor)
在工程上,我们一般采用交叉验证的方式选取 K 值。在工程上,我们一般采用交叉验证的方式选取 K 值。KNN 不仅可以做分类,还可以做回归。
回归算法实战
1. 线性回归
线性回归是机器学习中最基本的算法之一,它试图找到特征和连续输出值之间的线性关系。以下是使用 Python 的
scikit-learn
库实现线性回归的示例代码:在这个例子中:
- 我们首先导入了必要的库,包括
numpy
用于数值计算,LinearRegression
用于线性回归模型,matplotlib.pyplot
用于绘图。
- 创建了一些示例数据,表示房子的大小和价格之间的关系。
- 使用
reshape
方法将特征矩阵X
转换为二维数组,因为scikit-learn
需要这种格式的数据。
- 创建了
LinearRegression
的实例,并用fit
方法训练模型。
- 使用
model.intercept_
和model.coef_
获取了截距和斜率,这两个参数定义了线性回归模型的直线方程y = slope * x + intercept
。
- 使用
predict
方法预测了新数据点的价格。
- 使用
matplotlib
绘制了原始数据点和模型的拟合线。
- 打印出了线性回归模型的截距和斜率。
请注意,这个例子是在一个非常小的数据集上进行的,实际应用中你可能需要在更大的数据集上训练模型,并且可能需要进行更复杂的数据预处理步骤。此外,线性回归模型假设输入特征和输出变量之间存在线性关系,如果这种关系不成立,模型的预测效果可能不佳。
2. 决策树回归
3. KNN回归
4. 随机森林回归
聚类算法实战
1. K-Means聚类
K-Means 是一种非监督学习,解决的是聚类问题。K 代表的是 K 类,Means 代表的是中心,你可以理解这个算法的本质是确定 K 类的中心点,当你找到了这些中心点,也就完成了聚类。
K-Means 的工作原理给你总结下:选取 K 个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;将每个点分配到最近的类中心点,这样就形成了 K 个类,然后重新计算每个类的中心点;重复第二步,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。
2. EM聚类
3. EM 和 K-Means比较
EM聚类(期望最大化,Expectation Maximization)和K-Means聚类都是流行的聚类算法,用于将数据点分组成多个簇。尽管它们都旨在发现数据的内在结构,但它们在多个方面存在不同。以下是EM聚类和K-Means聚类的相同之处和不同之处的比较:
相同之处:
- 聚类目标:两者都旨在将数据点划分为多个簇,以便簇内的点相似度高,簇间的点相似度低。
- 迭代优化:两种算法都采用迭代方法来优化聚类过程,通过不断调整簇中心或分布参数来改进聚类结果。
- 数据压缩:它们都可以用来压缩数据,通过将数据点映射到簇的代表(如簇中心或分布参数)来简化数据表示。
不同之处:
- 算法原理:
- K-Means:基于距离度量(通常是欧几里得距离),通过最小化数据点到簇中心的距离之和来形成簇。
- EM:基于概率生成模型,通过最大化数据点属于各个簇的概率(即似然函数)来形成簇。
- 簇的类型:
- K-Means:生成的簇是圆形或球形的,因为它依赖于距离度量。
- EM:可以发现任意形状的簇,因为它不依赖于距离度量,而是依赖于数据点的概率分布。
- 初始化:
- K-Means:需要预先指定簇的数量(K值),并且簇中心的初始化对最终结果有较大影响。
- EM:通常不需要预先指定簇的数量,因为它通过迭代过程来确定簇的分布参数。
- 聚类结果:
- K-Means:结果是确定性的,每次运行算法(给定相同的初始化和数据)都会得到相同的簇。
- EM:结果可能依赖于初始化,但算法试图找到最大似然解,这通常与簇的数量无关。
- 适用场景:
- K-Means:适合于大数据集和噪声较少的数据,以及当簇大致呈球形分布时。
- EM:适合于数据点分布具有明显的概率分布特征,或者数据中包含噪声和异常值时。
- 计算复杂度:
- K-Means:通常更快,因为它的计算简单,每次迭代只需要计算距离和更新簇中心。
- EM:可能更慢,尤其是在数据较大或模型复杂时,因为每次迭代都需要计算概率和更新分布参数。
- 软分配:
- K-Means:采用硬分配,每个数据点只属于一个簇。
- EM:采用软分配,每个数据点属于每个簇的概率由其在该簇中的分布决定。
- 模型选择:
- K-Means:需要手动选择K值,可能需要多次尝试或使用如肘部法则等方法来确定。
- EM:可以通过交叉验证等方法来选择最佳模型,因为它基于似然函数。
在实际应用中,选择哪种聚类算法取决于数据的特性、簇的形状、以及对聚类结果的具体要求。有时候,这两种算法也可以结合使用,比如使用EM算法来初始化K-Means算法的簇中心。
4. DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它能够识别任意形状的聚类,并且对噪声点具有良好的鲁棒性。DBSCAN 的核心思想是将具有足够高密度的区域划分为聚类,同时识别出低密度区域的离群点。
DBSCAN 的原理:
- 核心点 (Core Points):如果一个点在ε(Epsilon)距离内拥有的邻居数目大于等于 MinPts,则该点被认为是核心点。
- 边界点 (Border Points):如果一个点在ε距离内的邻居数目少于 MinPts,但该点位于某个核心点的ε距离内,则被认为是边界点。
- 离群点 (Noise Points):如果一个点既不是核心点也不是边界点,则被认为是离群点。
- 聚类形成:核心点及其ε距离内的邻居形成一个聚类。如果两个核心点的ε邻域相交,则它们属于同一个聚类。
DBSCAN 算法步骤:
- 对于每个点,计算其ε距离内的邻居数目。
- 标记核心点、边界点和离群点。
- 对于每个未访问的核心点,执行密度可达的递归步骤,将核心点及其密度可达的点划分为一个聚类。
- 对于每个未访问的点,如果它是核心点,则重复步骤3。
- 剩下的未访问的点被认为是离群点。
以下是使用 Python 的
scikit-learn
库实现 DBSCAN 聚类的示例代码:在这个例子中:
- 我们首先导入了
DBSCAN
类和必要的库。
- 创建了一些示例数据,表示两个聚类和一个离群点。
- 使用
DBSCAN
类进行聚类,设置eps
参数为3,min_samples
参数为2。
- 使用
fit
方法对数据进行聚类,并获取每个点的聚类标签。
- 使用
matplotlib
绘制了聚类结果。
- 打印出了每个点的聚类标签。
请注意,DBSCAN 的性能和结果高度依赖于
eps
和 min_samples
参数的设置。在实际应用中,可能需要通过多次尝试或使用如肘部法则等方法来确定这些参数的最佳值。此外,DBSCAN 对数据的尺度敏感,因此在聚类之前可能需要对数据进行标准化处理。降维算法实战
常见的降维算法有两种:主成分分析法(PCA)和线性判别分析(LDA)。PCA 是一种无监督的降维方法,而 LDA 是一种有监督的降维方法。
1. PCA算法
主成分分析(PCA)是一种常用的降维技术,它通过正交变换将数据转换到新的坐标系中,使得新坐标系的第一主成分具有最大的方差(数据的最大变异性),第二主成分具有第二大的方差,依此类推。这样,可以选择前几个主成分来近似表示原始数据,从而达到降维的目的。
PCA 的原理:
- 数据标准化:通常首先对数据进行标准化处理,使得每个特征的均值为0,标准差为1。
- 协方差矩阵计算:计算数据的协方差矩阵,以确定数据特征之间的关系。
- 特征值和特征向量计算:计算协方差矩阵的特征值和对应的特征向量。特征向量决定了主成分的方向,而特征值决定了主成分的方差大小。
- 选择主成分:根据特征值的大小,选择前几个最大的特征值对应的特征向量,这些特征向量定义了主成分的空间。
- 构造新特征空间:将原始数据投影到选定的主成分上,构造新的特征空间。
以下是使用 Python 的
scikit-learn
库实现 PCA 的示例代码:在这个例子中:
- 我们首先导入了
PCA
类、StandardScaler
类和必要的库。
- 创建了一些示例数据。
- 使用
StandardScaler
对数据进行标准化处理。
- 创建了
PCA
对象,并设置n_components
参数为2,表示我们希望保留2个主成分。
- 使用
fit_transform
方法对数据进行拟合和转换。
- 打印了原始数据的形状、降维后数据的形状、主成分(特征向量),以及每个主成分解释的方差比例。
请注意,PCA 的结果高度依赖于数据的标准化。在实际应用中,可能需要根据数据的特点和降维的需求来选择合适的主成分数量。此外,PCA 也可以用于数据可视化、噪声去除、特征提取等任务。
2. LDA算法
线性判别分析(LDA)是一种监督学习的降维技术,它不仅用于降维,还用于分类。LDA 的目标是找到一个线性组合的特征空间,以最大化样本的类间可分性。LDA 假设数据集中的每个类都有一个多元高斯分布,且所有类的协方差矩阵是相同的。
LDA 的原理:
- 计算类内散度矩阵:对于每个类别,计算其数据点的散度矩阵,即类内数据点的协方差矩阵。
- 计算类间散度矩阵:计算不同类别间数据点的散度矩阵,即类中心之间的协方差矩阵。
- 计算特征值和特征向量:求解类内散度矩阵和类间散度矩阵的广义特征值问题,得到特征值和对应的特征向量。
- 选择主成分:根据特征值的大小,选择前几个最大的特征值对应的特征向量,这些特征向量定义了LDA的特征空间。
- 构造新特征空间:将原始数据投影到选定的LDA特征空间上,构造新的特征空间。
LDA 代码示例:
以下是使用 Python 的
scikit-learn
库实现 LDA 的示例代码:在这个例子中:
- 我们首先导入了
LinearDiscriminantAnalysis
类和必要的库。
- 使用
make_classification
创建了一些示例数据。
- 创建了
LDA
对象,并设置n_components
参数为2,表示我们希望保留2个主成分。
- 使用
fit_transform
方法对数据进行拟合和转换。
- 打印了原始数据的形状、降维后数据的形状、LDA的系数(特征向量),以及类别的均值、类内散度矩阵和类间散度矩阵。
请注意,LDA 是一种监督学习技术,因此需要类别标签来进行训练。在实际应用中,LDA 可以用于图像识别、语音识别、生物信息学等领域。此外,LDA 假设所有类别的协方差矩阵相同,这一假设在现实世界中可能不总是成立。如果这个假设不成立,可以考虑使用二次判别分析(QDA)作为替代。
神经网络实战
全连接神经网络(Fully Connected Neural Networks, FNN)、卷积神经网络(Convolutional Neural Networks, CNNs)和循环神经网络(Recurrent Neural Networks, RNNs)是三种不同类型的神经网络,它们处理的数据类型、结构和适用场景各有不同。
1. 全连接神经网络 (FNN)
处理的数据:
- 一般用于处理结构化数据,如表格数据。
- 数据通常需要是固定长度的向量。
特征:
- 每一层的每个神经元都与前一层的所有神经元相连。
- 没有考虑数据的空间结构或时间序列特性。
适用场景:
- 简单的模式识别任务,如垃圾邮件检测。
- 作为其他复杂网络(如CNN和RNN)的组成部分。
2. 卷积神经网络 (CNN)
处理的数据:
- 主要用于处理具有明显空间层次结构的数据,如图像。
- 可以处理非结构化数据。
特征:
- 使用卷积层来提取图像的局部特征。
- 通常包含池化层(Pooling Layers)来降低特征的空间维度。
- 能够利用数据的空间相关性,减少参数数量,提高训练效率。
适用场景:
- 图像识别和分类。
- 视频分析。
- 自动驾驶系统中的视觉感知。
3. 循环神经网络 (RNN)
处理的数据:
- 用于处理序列数据,如文本、时间序列或任何需要考虑时间依赖性的数据。
特征:
- 具有记忆功能,可以处理任意长度的序列。
- 通过在序列的不同时间点上维护隐藏状态来捕捉时间动态。
适用场景:
- 语言模型和文本生成。
- 语音识别。
- 预测时间序列数据,如股票价格。
4. 神经网络比较
表格形式呈现的全连接神经网络(FNN)、卷积神经网络(CNN)和循环神经网络(RNN)之间的比较:
在选择神经网络类型时,通常需要考虑数据的特点和任务的需求。例如,对于图像识别任务,CNN通常是首选,因为它们能够自动从图像中提取特征。而对于需要理解序列数据中时间依赖性的任务,如自然语言处理,RNN或其变体可能是更好的选择。全连接网络则可以作为其他复杂网络的组成部分,或者用于简单的模式识别任务。
总结
- FNN:适用于简单的、固定大小的输入数据,是神经网络的基础。
- CNN:特别适用于处理图像数据,能够自动并有效地提取空间层级的特征。
- RNN:适合处理序列数据,能够捕捉序列中的时间依赖性。
在实际应用中,这些网络可以根据具体任务的需求进行组合和扩展,形成更复杂的网络结构,如结合CNN和RNN来处理视频数据,或者使用FNN作为其他网络的组成部分。此外,还存在许多RNN的变种,如长短期记忆网络(LSTM)和门控循环单元(GRU),它们在处理长序列数据时更为有效。
集成学习算法
集成学习 (ensemble learning),是通过构建出多个模型(这些模型可以是比较弱的模型),然后将它们组合起来完成任务的机器学习算法。17|集成学习:机器学习模型如何“博采众长”?-零基础实战机器学习-极客时间
1. AdaBoost算法
2. XGBoost 算法
XGBoost 算法作为一种集成学习方法,在分类问题中具有超强的性能。 XGBoost 算法,可以说是目前最有名且最实用的集成学习算法了。18 | 增长模型:用XGBoost评估裂变海报的最佳受众群体-零基础实战机器学习-极客时间
选择合适的算法
面对新的问题以及需要分析、挖掘的数据,如何快速的定位最合适的机器学习算法呢?我们可以从问题本身、标签的类型、数据集的大小、特征的数量、计算时间的要求、以及模型的可解释性这些方面,来比较和选择算法。
1. 算法图谱

2. 监督or无监督

3. 回归or分类

4. 回归问题算法选择
当明确了问题本身属于回归问题后,我们就需要在线性回归、决策树、随机森林、XGBoost、朴素贝叶斯以及神经网络这些常见的回归算法中进行选择。这时候,我们就需要考虑数据集大小、特征的维度(也就是特征的多少)、训练所需的时间等因素。

总之,面对新数据集,通常最好先从简单模型开始,比如线性模型、朴素贝叶斯或最近邻 KNN,看能得到什么样的结果。对数据有了进一步了解之后,可以考虑构建集成学习算法,比如随机森林、XGBoost,在进一步在考虑使用深度学习算法。
5. 分类问题算法选择
对于分类问题,我更多是基于问题的性质来寻找合适的算法,而不是从数据集大小、特征数目的多少以及训练时间的快慢来考量。

6. 其他的考虑因素
6.1 训练数据大小

6.2 特征数量多少
当然,如果你要用其他的机器学习模型,可以使用 PCA 和特征选择技术来降低特征的维度,选择重要特征进行学习。

6.3 性能和可解释性的权衡

6.4 速度或训练时间
朴素贝叶斯、线性回归和逻辑回归这样的算法易于实现且运行迅速。
像 SVM 这样的算法涉及参数调整,需要更多时间,而神经网络和随机森林,也都需要大量时间来训练数据。
6.5 数据的线性程度
显示特征和标签之间的散点图,看看是否能够拟合出线性回归线;对于分类问题,我们先尝试逻辑回归或线性 SVM 并检查误差值和分类性能。如果误差值很高、分类性能差,则意味着数据不是线性的,需要复杂的算法来拟合。
参考资料
离开乏味的皮囊,自由的灵魂在路上
- Name: Alan Hsu
- Tag: 随感、技术、经验、旅行、推荐、生活、音乐、电影 etc.
- Email:xulanzhong521gmail.com
- Twitter:@AlanHsu521
- Telegram:@AlanHsu521
- WeChat: Alan_Hsu_521
- Github: https://github.com/xsoway/
- Blog: https://xmylog.com



- Author:Alan_Hsu
- URL:https://xmylog.com/article/articles_ML_test
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts