人工智能
一场可以载入人类史册的人机大战发生在 2016 年 3 月 9 日-2016 年 3 月 15 日。这一次比赛双方是世界顶级围棋棋手李世石和 Google 的人工智能 AlphaGo。赛前有很多人并不看好 AlphaGo,认为 AlphaGo 会惨败。没想到AlphaGo 最终以 4:1 大胜李世石,从而一战成名。由于 AlphaGo 的胜利,AlphaGo 用到的深度学习(Deep Learning)技术以及人工智能(Artificial Intelligence)也成为了当下最热门的技术话题。
人工智能(Artificial Intelligence),英文缩写 AI。AI 第一次被提出来是在 1956 年,是由四位图灵奖得主、信息论创始人和一位诺贝尔得主在美国达特茅斯会议(DartmouthConference)上一同定义出来的。人工智能只是一个抽象概念,它不是任何具体的机器或算法。任何类似于人的智能或高于人的智能的机器或算法都可以称为人工智能。
在人工智能的早期阶段,计算机的智能通常是基于人工制定的“规则”,我们可以通过详细的规则去定义下棋的套路,推理的方法,以及路径规划的方案。但是我们却很难用规则去详细描述图片中的物体,比如我们要判断一张图片中是否存在猫。那我们先要通过规则去定义一只猫,如图 1.1 所示。
观察图 1.1 中的猫,我们可以知道猫有一个圆脑袋,两个三角形的耳朵,又胖又长的身体,和一条长尾巴,然后可以定义一套规则在图片中寻找猫。这看起来好像是可行的,但是如果我们遇到的是这样的猫该怎么办?
猫可能只露出身体的一部分,可能会摆出奇怪的造型,那么我们又要针对这些情况定义新的规则。从这个例子中大家应该能看得出来,即使是一只很普通的家养宠物,都可能会出现无数种不同的外形。如果我们使用人工定义的规则去定义这个物体,那么可能需要设置非常大量的规则,并且效果也不一定会很好。仅仅一个物体就这么复杂,而现实中常见的各种物体成千上万,所以在图像识别领域,使用使用人为定义的规则去做识别肯定是行不通的。很多其他的领域也同样存在这种问题。
由于人们没有办法设计出足够复杂的规则来精确描述世界,所以 AI 系统需要具备自我学习的能力,即从原始数据中获取有用的知识。这种能力被称为机器学习(Machine Learning)
人工智能是抽象的概念,而机器学习是具体的可以落地的算法。机器学习不是一个算法,而是一大类具体智能算法的统称。使用机器学习算法我们可以解决生活中如人脸识别,垃圾邮件分类,语音识别等具体问题。
机器学习其实与人类学习的过程类似。打个比方:假如我们现在都是原始人,并不知道太阳和月亮是什么东西。但是我们可以观察天上的太阳和月亮,并且把太阳出来时候的光线和温度记录下来,把月亮出来时候的光线和温度记录下来(这就相当于是收集数据)。观察了 100天之后,我们进行思考,总结这 100 天的规律我们可以发现,太阳和月亮是交替出现的。出太阳的时候光线比较亮,温度比较高。月亮出来的时候光线比较暗,温度比较低(这相当于是分析数据,建立模型)。之后我们看到太阳准备落山,月亮准备出来的时候我们就知道温度要降低可能要多穿树叶或毛皮,光线也准备要变暗了(预测未来的情况)。机器学习也可以利用已有的数据进行学习,获得一个训练好的模型,然后可以利用此模型预测未来的情况。
人工智能、机器学习,神经网络以及深度学习之间的关系
-
人工智能
- 我们先说说人工智能,人工智能是这几个词中最早出现的。人工智能其实是一种抽象的概念,并不是指任何实际的算法,而指的是这类技术。
-
机器学习
- 机器学习是最近 20 多年兴起的一门多领域交叉学科,涉及概率论、统计学、计算复杂性理论等多门学科。机器学习包含很多具体的算法。既然人工智能是抽象的概念,那我们就需要一些具体的算法使得人工智能可以落地应用,而一般来说,这些在人工智能领域的具体的智能算法可以统称为机器学习算法。
-
神经网络
- 神经网络是众多机器学习算法中的其中一个,是模仿人类大脑神经结构构建出来的一种算法,构建出来的网络称为人工神经网络(Artificial Neural Networks,ANN)。神经网络算法在机器学习中并不算特别出色,所以一开始的时候并没有引起人们的特别关注。神经网络的发展已经经历了三次发展浪潮,直到 2006 年神经网络重新命名为深度学习,再次兴起。
-
深度学习
- 深度学习(DL,Deep Learning)是机器学习(ML,Machine Learning)领域中一个新的研究方向。深度学习的基础其实就是神经网络,由于神经网络相关算法的扩展,机器学习逐步转变为深度学习领域。
初始机器学习
什么是机器学习?
官方解释:
- 机器学习就是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。
需要明确几点:
-
机器学习最终进行预测出来的结果其实都是通过相关的算法计算出来的结果,所以说在机器学习中算法是核心,数据是计算的基础,算法和数据是重要的组成部分。
-
找准定位:大部分复杂模型的算法设计都是顶尖的算法工程师在做,而我们可以做到的:
- 学会分析问题,使用机器学习相关算法完成对应的需求
- 掌握算法的基本思想,学会对不同问题选择对应的算法去解决
- 学会利用框架和库解决问题
-
机器学习的价值体现
- 价值体现在各个方面:医疗,航空,教育,物流,电商…
- 让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。例如:汽车销售在对新车进行推广的时候,一般都是将宣传手册投放给了所有的客户,从中进行目标客户的定位。但是如果使用机器学习对客户进行指定分类,然后将手册可以根据分类投放到不同类别的客户中,则这样就大大增加了商业机会。
机器学习算法分类
1.有监督、无监督:
有监督学习(有标签数据,通常用于分类和回归问题)和无监督学习(无标签数据,用于聚类、降维、关联分析等问题)
有监督学习:
决策树(Decision Trees)
支持向量机(Support Vector Machines)
朴素贝叶斯(Naive Bayes)
K最近邻算法(K-Nearest Neighbors)
线性回归(Linear Regression)
随机森林(Random Forest)
深度学习算法(Deep Learning)
无监督学习:
K均值聚类(K-Means Clustering)
层次聚类(Hierarchical Clustering)
主成分分析(Principal Component Analysis, PCA)
关联规则挖掘(Association Rule Mining)
2.分类、回归、聚类:
分类和回归问题定义的区别
分类算法基于的是【标签数据】为【离散型】数据,回归算法基于的是【标签数据】为【连续型】数据
- 结论:在社会中产生的数据必然是离散型或者是连续型的数据,对数据所产生的需求也无非是分类问题或者回归问题。
分类问题应用:
- 在银行业务中,构建一个客户分类模型,对客户的贷款风险大小进行分类
- 在图像处理中,分类可以用来检测图像中是否有人脸出现、人脸的表情反映了什么样的情绪等
- 在手写识别中,分类可以用于识别手写的数字
回归问题应用:
- 房价预测、股票预测等
聚类问题
- 聚类问题属于无监督学习,即数据集没有任何的标签,即在没有预先标记的数据中发现模式。
- 聚类可用于识别社交网络中的社群或群体,帮助理解社交网络中的关系和用户行为。
- 聚类算法可以用于对文本进行主题建模、文档分类等任务。
- 虽然聚类和分类都涉及将数据划分为组,但它们的方法、目标和问题上下文是不同的。在聚类中,我们试图找到数据中的自然结构或模式,而在分类中,我们依赖已知的类别来预测新的数据点所属的类别。
分类算法举例
决策树(Decision Tree,DT)
支持向量机(Support Vector Machines,SVM)
朴素贝叶斯(Naive Bayes,NB)
K最近邻算法(K-Nearest Neighbors,KNN)
逻辑回归(Logistic Regression,LR)
回归算法距离
线性回归(Linear Regression,LR)
多项式回归(Polynomial Regression)
支持向量机回归(Support Vector Machines,SVM)
决策树回归(Decision Tree,DT)
随机森林回归(Random Forset,RF)
集成方法
集成方法通常可以分为Stacking和Boosting这两个主要子类
Stacking(堆叠):
在堆叠方法中,多个基本学习器(也称为初级模型)的输出结果被用作输入,然后通过训练一个元学习器(也称为次级模型)来融合这些基本模型的预测。元学习器的任务是将初级模型的预测组合起来以提供更准确的最终预测。Stacking可以通过多层堆叠来实现,其中不同级别的元学习器可以堆叠在一起。
Boosting(提升):
Boosting是一种迭代的集成方法,它通过依次训练一系列弱学习器(通常是决策树)来改善模型的性能。在每一轮迭代中,它会调整数据样本的权重,使先前轮次中被错误分类的样本在下一轮中得到更多关注,从而集中注意力解决错误分类的问题。代表性的Boosting算法包括AdaBoost、梯度提升(Gradient Boosting)和XGBoost等。
数据集中的处理类型
离散型变量
离散型变量通常指的是那些只能取特定值的变量,这些值通常是可数的整数。离散型变量的特征是不连贯,不能取任意值,而是有明确的间隔或者限制。它们通常用于计数。
例如:
- 投掷一枚骰子的结果(可能的值为1、2、3、4、5、6)
- 一家餐厅每天的顾客数量
- 错误代码(可能的值为预定义的错误类型编号)
- 产品的缺陷数量
离散型变量可能是有序的(例如:满意度评级,有好坏,先后等之分),也可能是无序的(例如:邮政编码)。
连续型变量
连续型变量可以在某个范围内取任意值,这些变量可以是任何实数,包括小数。连续型变量通常用于测量。
例如:
- 一个人的身高(可以从数值上非常精确地进行测量)
- 汽车速度(可以非常精细地测量)
- 时间(理论上可以无限精细地测量)
- 温度(可以根据需要测量到非常精确的数值)
连续型变量可以被划分成较小的单位,并且可以无限细分下去,如以米、厘米、毫米等不同单位来测量长度。
在实际应用中,尽管理论上连续型变量可以取无限精确的值,但由于测量工具的限制,我们通常只能获取到有限的精度。此外,为了数据处理的方便,有时连续型变量会被离散化,即将其范围划分成几个区间,并用代表各个区间的值来近似原始变量值。
数据挖掘标准流程
数据挖掘是一种从大规模数据中提取有用信息的过程,通常包括以下标准流程步骤:
1. 理解业务目标:
在进行数据挖掘之前,首先要明确业务目标和问题,确定你希望从数据中获得什么信息,以便为决策提供支持。
2. 数据收集:
收集与业务问题相关的数据。这可以包括从各种数据源获取数据,包括数据库、日志文件、传感器数据、社交媒体等等。
3. 数据清洗和预处理:
数据通常会包含噪音、缺失值和不一致性。在进行数据挖掘之前,需要清洗和预处理数据,包括处理缺失值、去除异常值、数据变换等。
4. 探索性数据分析(EDA):
在深入挖掘数据之前,进行探索性数据分析,以了解数据的特点、分布和关联性。这有助于识别潜在的模式和趋势。
5. 特征工程:
特征工程是创建新特征或选择最相关特征的过程,以用于建立模型。这包括特征选择、特征提取和特征转换。
6. 数据建模:
在这个阶段,选择合适的数据挖掘算法,如决策树、支持向量机、神经网络等,建立聚类模型、回归预测模型或分类预测模型。
7. 模型评估:
评估模型的性能,通常使用交叉验证、ROC曲线、混淆矩阵等指标来衡量模型的准确性和鲁棒性。
8. 模型优化:
根据评估结果,对模型进行调优,可能需要调整模型参数、选择不同的算法或重新进行特征工程。
9. 结果解释和报告:
解释模型的结果,向业务利益相关者提供可理解的解释,生成报告并提供决策建议。
- 以上流程是一个通用的数据挖掘标准流程,具体的项目可能会根据业务需求和数据特点进行适当的调整。数据挖掘是一个迭代过程,需要不断改进和优化,以确保模型的有效性和可靠性。
模型评价指标
回归模型评价
- 均方误差
- 均方根误差
- 平均绝对误差
- R平方
分类模型评价
欠拟合和过拟合
欠拟合和过拟合是模型拟合后出现的两个问题,都需要相对应的解决方案。
正则化
正则化系数(Regularization Coefficient)是机器学习和统计模型中用于防止过拟合的一种技术。正则化通过在损失函数中添加一个惩罚项来限制模型的复杂度,从而提高模型的泛化能力。
正则化的类型
- L1正则化(Lasso):
- 在损失函数中添加权重绝对值的和。
- 公式:
L1 = λ * Σ|w_i|
- 作用:可以使一些权重变为零,从而实现特征选择。
- L2正则化(Ridge):
- 在损失函数中添加权重平方和。
- 公式:
L2 = λ * Σ(w_i^2)
- 作用:防止权重过大,使模型更加平滑。
- 弹性网络(Elastic Net):
- 结合了L1和L2正则化。
- 公式:
Elastic Net = α * L1 + (1 - α) * L2
- 作用:同时具有L1和L2的优点。
正则化系数的意义:
正则化系数(通常用λ表示)控制正则化项的强度。选择合适的正则化系数是模型训练中的一个重要步骤:
- λ值较大: 强制模型的权重较小,可能导致欠拟合。
- λ值较小: 正则化效果不明显,可能导致过拟合。
通过交叉验证等方法,可以选择最优的正则化系数,从而在防止过拟合和保持模型复杂度之间取得平衡。
数据集的划分
定义
- 训练集:(Training Dataset)帮助我们训练模型,即通过训练集的数据让我们确定拟合曲线的参数。
- 验证集:(Validation Dataset) 用来做模型选择,即做模型的最终优化及确定的,用来辅助我们的模型的构建,验证集的作用体现在训练的过程中,但是是非必须的
- 测试集:(Test Dataset) 验证模型的泛化能力
机器学习划分训练集和测试集的方法
机器学习常见步骤
1.对数据集进行划分,分为训练集和测试集两部分;
2.对模型在测试集上面的泛化性能进行度量;
3.基于测试集上面的泛化性能,依据假设检验来推广到全部数据集上面的泛化性能。
测试集的比例
训练集数据的数量一般占2/3到4/5。在实际应用中,基于整个数据集数据的大小,训练集数据和测试集数据的划分比例可以是6:4、7:3或8:2。对于庞大的数据可以使用9:1,甚至是99:1。具体根据测试集的划分方法有所不同。
常见的划分方法
留出法
直接将数据集D划分为两个互斥的的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=S∪T, S ∩ T = 空集。在S上训练出模型后,用T来评估其误差。
需要注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入的额外的偏差而对最终结果产生影响。例如在分类任务中,至少要保持样本的类别比例相似。从”采样”的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为“分层采样”。例如从1000个数据里,分层采样获得70%样本的训练集S和30%样本的测试集T,若D包含500个正例,500个反例,则分层采样得到的S应包含350个正例,350个反例,T应包含150个正例,150个反例;若S、T中样本比例差别很大,则最终拟合的误差将会变大。
一般,在用留出法划分集合的时候,会通过若干次随机划分、重复实验评估后取平均值作为留出法的评估结果,减少误差。留出法还有一个问题就是,到底我们训练集和测试集应该按照什么比例来划分呢?如果我们训练集的比例比较大,可能会导致训练出的模型更接近于用D训练出的模型,同时T较小,评价结果又不够准确;若T的比例比较大,则有可能导致评估的模型与之前有较大的差别,从而降低了评估的保真性。这个问题没有完美的解决方案,常见的做法是将大约2/3~4/5的样本用于训练。
交叉验证法
将数据集D划分为k个大小相似的互斥子集,即D=D1∪D2∪…∪Dk,Di ∩ Dj = 空集(i ≠j) 每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。
交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为了强调这一点,通常把交叉验证法称为”k折交叉验证”(k-fold cross validation),k通常取10—10折交叉验证。
)
交叉验证的好处就是从有限的数据中尽可能挖掘多的信息,从各种角度去学习我们现有的有限的数据,避免出现局部的极值。在这个过程中无论是训练样本还是测试样本都得到了尽可能多的学习。
交叉验证法的缺点就是,当数据集比较大时,训练模型的开销较大。
特征工程
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程的本质就是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。特征工程就是在确定模型之前对于已有数据的处理和操作,使得后续模型得到的结果更加合理
通过总结和归纳,常见的特征工程包括以下方面:
在不同情况下,有不同的方法可以选择,下面是关于各个方面的具体的常见操作:
特征缩放
特征缩放是用来标准化数据特征的范围。特征缩放是针对多特征情况的,特征向量的参数可能会变化范围很大,从而主导整个梯度下降的过程,使得整个收敛轨迹变得复杂,让收敛的时间更长。因此,我们可以将所有特征向量的变化范围维持在一个标准化范围之中,就能减小该特征向量的影响程度,加快梯度收敛速度。
特征变换
特征变换主要就是针对一个特征,使用合适的方法,对数据的分布、尺度等进行变换,以满足建模时对数据的需求。特征变换特指的是数据的特征变换。如,对数变换、指数变换等
特征编码
标签编码
将类别型特征从字符串转换为数字,对于定序类型的数据,使用标签编码更好,虽然定序类型也属于分类,但是其有排序逻辑
对数值大小不敏感的模型(如树模型),建议使用标签编码,把逻辑上的关系转化为数值大小的关系
独热编码
采用N位状态寄存器来对N个可能的取值进行编码,每个状态都由独立的寄存器来表示,并且在任意时刻只有其中一位有效。适用于定类类型的数据,该类型数据是纯分类,不进行排序,互相之间也没有逻辑关系,对数值大小敏感的模型,必须使用独热编码
解决了分类器不好处理分类变量的问题,同时也可以扩展特征
编码后的属性是稀疏的,存在大量的零元分量
当类别非常多时,特征空间会非常大,容易导致维度灾难的问题
特征生成
当特征的个数很少,每个特征的背后还有挖掘的空间,可以生成子特征,增加特征表达能力,提升模型效果。
特征选择
为了增强模型的拟合性,有些特征混合在一起,导致拟合效果不好,因此有些特征我们就应当舍去,从而增加整个模型的拟合性。