监督机器学习模型:你在实践中必须做出的决定
聚在一起—选择哪种模式?要调整哪些超参数?如何评价?
虽然我提供了机器学习模型背后的一些直觉,但本文的重点不是解释机器学习模型背后的数学,而是它们的实际应用,即我将尝试回答使用什么、如何调优、如何评估等问题。本文讨论了数据科学家在尝试将模型与给定数据相匹配时需要考虑的任务、挑战、假设、利弊和注意事项。
通过 monkeylearn 生成的 Wordcloud
偏差-方差权衡
所有的模型都遭受这种权衡。理解这一点对于调整机器学习模型的性能来说是微不足道的。假设我们有一个数据集,我们已经拟合了一个 ML 模型。
一个好的模型应该是一致的,并且能够处理训练数据集中的任何变化,而本身没有太大的变化,也就是说,它应该已经对看不见的数据进行了推广(这是我们首先要达到的目标)。模型由于训练数据集中的变化而变化的量被解释为模型的方差。
偏差可以解释为模型倾向于较少的预测变量。具有非常高的偏差会使模型对数据的变化(较低的方差)不敏感,并导致对情况的不良近似。另一方面,较低的偏差会使模型利用所有不必要的信息,并允许较高的方差。
总之,考虑到模型和数据的需求和使用,这是一个数据科学家必须明智选择的权衡。
简单线性回归
让我们从简单开始,假设我们有一个斜率为 m、Y 轴截距为 c 的直线方程,给定这条直线,我们可以计算任意特定 X 值的 Y 值。简单 LR 旨在估计直线(称为回归线)的斜率和截距,该直线在某种程度上最适合所有数据点,即最小化残差平方和(称为最小二乘法)。
可能的情况是,我们将有一个零斜率(m)。这在某种程度上传达了 Y 对 X 值的独立性。我们使用零假设检验来检测这种行为,该检验确定 m 是否足够远离零。在实践中,我们使用 p 值,它在某种程度上告诉我们数据独立于预测变量的概率。我们从零假设假设的 t 分布中得到这个概率。最后,我们只需查看 p 值,如果它小于 0.05(一般情况下),我们可以拒绝零假设。
一旦我们拒绝零假设,我们想知道我们的模型有多好地符合数据。为此,我们使用 R 平方度量(我们也可以使用 RSE,但是 RSE 依赖于 Y 的单位,不能推广到任何数据)。R-square 接近 1 意味着我们的 LR 模型解释了 Y 的可变性,是一个很好的拟合。如果 R 平方接近于 0,那么可能有两个原因。(参考下面的可解释差异部分)
多元线性回归
如果我们有不止一个预测变量呢?我们可以将简单的 LR 从直线扩展到多维超平面来拟合数据。想象一下,假设我们有两个预测变量。现在,我们在 3D 空间中拟合一个平面,其中响应是这两个预测变量的函数,具有一些截距。这可以进一步扩展到更高维度。
我们使用 f 统计量来检验零假设。尽管我们有单个预测因子的 p 值,为什么我们要看总体的 F 统计量?当有大量预测因子(比如 100 个)时,那么只是偶然地,我们保证观察到至少一个 p 值低于 0.05 的预测因子,即使在预测因子和反应之间没有真正的联系。但是,f-statistic 不会受此影响,因为它会根据预测值的数量进行调整。
一旦我们拒绝零假设,我们可能不得不选择只有重要的预测,以减少计算需求。这是使用子集选择方法完成的。
我们使用 R-square 来评估模型的拟合度。然而,需要注意的一点是,当我们包含更多的预测因子时,R-square 会得到改善。由我们来决定计算需求和模型拟合之间的权衡。此外,以更高的 R 平方为目标可能会导致过度拟合问题。
多项式回归
它被认为是线性回归,因为它在预测系数中是线性的
观察多重 LR,我们看到两个主要假设。首先,特定预测变量的变化对响应 Y 的影响独立于任何其他预测变量。(加法假设)。第二,由于预测变量的单位变化引起的响应 Y 的变化是恒定的。(线性假设)。
然而,我们的数据可能并不总是如此。我们可能不得不考虑更高程度的预测变量来恰当地拟合数据(注意:这就是过度拟合和偏差-方差概念出现的地方。此外,了解协同效应(即预测变量之间的交互效应)也是值得的
我们必须选择什么程度的预测变量?这是我们作为数据科学家试图解决的问题,选择这个程度和交互术语(称为特征工程)取决于我们。没有直接的答案或解决方案来处理这个问题。但是,可以使用残差图采用试错法。
残差图中,残差(真实响应 — 估计响应)相对于估计响应值绘制,这将揭示关于假设模型的一些见解。如果残差图没有显示模式,那么假设的模型与数据吻合得很好。否则,假设的模型会有一些问题,我们可能需要调整多项式的次数。
一旦我们最终确定了我们的模型,我们使用 R-square 评估拟合。我们必须注意,拥有更高程度的预测变量可能会过度拟合数据(看看偏差-方差权衡)。
KNN 回归
到目前为止,我们一定已经理解了在线性回归设置中假设一个合适的模型来很好地拟合数据是非常重要的。KNN 回归消除了这种必要性,更加灵活。因此,如果预测准确性是我们的目标,给定足够的数据,KNN 优于线性回归。但是,这里有一个陷阱。“给定足够的数据”让我们陷入维度诅咒。KNN 回归是数据饥渴的,在更高的维度,实际上,永远不会有足够的数据,因此 KNN 比 LR 回归表现更差。此外,LR 更容易解释,因为它估计了每个预测因子对反应的影响。另一方面,KNN 是不可解释的,因为它只遵循数据,不关心预测。
当每个预测值的观测值较少时,参数方法往往优于非参数方法
逻辑回归
它特别用于两个类的分类设置中(可以调整为两个以上,但效率不高,因此这里不讨论)。它不是模拟响应 Y,而是利用逻辑函数来模拟 Y 属于特定类别的概率。这种分析可以用来观察特定预测变量的变化如何影响反应的几率。
通过最大化似然函数找到逻辑回归系数的估计。z 统计量类似于 t 统计量,用于执行零假设检验。较大的 z 统计量表示反对零假设的证据。使用分类错误率对逻辑回归模型进行评估。
当类被很好地分开时,逻辑回归不能在看不见的数据点上产生有希望的结果,即,即使对于数据中的小变化,它也是高度不稳定的。此外,在数据遭受“维数灾难”的更高维度中,由于缺乏足够的数据导致非常高的不稳定性,逻辑回归不能很好地执行。
贝叶斯分类器
它是一种理想的分类器,利用贝叶斯定理找出属于每一类的数据点的概率。数据点 X 的后验概率或类别 Y 的概率与类别 Y 的先验概率和 X 属于 Y 的类别条件概率的乘积成比例
它以最小的误差拟合数据。但不幸的是,我们不知道数据的确切类别条件概率和先验概率,我们试图在 LDA 和 QDA 的一些假设下进行估计。
线性判别分析:
LDA 可用于多类(> 2)分类设置。首先,我们分别对每一类中预测因子的分布进行建模。然后,我们利用贝叶斯定理找出数据点属于特定类别的概率。
可以使用属于相应类别的数据点的比例来找到每个类别的先验概率。然而,对于类别条件概率,我们必须假设从中提取数据点的分布。
我们假设数据点 X 是从多元高斯分布中提取的,该分布具有特定类别的均值向量和公共协方差矩阵。现在,我们的问题简化为估计每个类别和公共协方差的平均向量。判别方程在 x 上是线性的。
二次判别分析:
这类似于 LDA,除了关于所有类的预测变量的公共协方差的假设。这里,每个类都有自己的协方差矩阵。这导致判别方程在 x 上是二次的。
当决策边界是线性时,LDA 和逻辑回归方法往往表现更好。对于中度非线性边界,QDA 可能表现得更好。对于更复杂的决策边界,在有足够数据的情况下,选择好平滑参数的 KNN 表现得更好。
套索和岭回归
一般来说,我们最小化 RSS(称为最小二乘法)来估计回归设置中的预测系数。然而,由于拟合的灵活性,有时这些估计值可能会有很大的差异。
为了解决这个问题,我们通过向零收缩(正则化)一些预测系数估计值(在山脊的情况下)或通过使其正好为零(在套索的情况下)来惩罚预测系数估计值。岭和套索回归模型背后的直觉是,为了方差的更大减少,在模型偏差的轻微上升上进行妥协。
收缩量取决于一个参数(λ),这个参数必须由作为数据科学家的我们来决定。对于我们选择的每个λ值,产生一组不同的预测系数估计值,即对于每个λ,我们得到一个适合数据的不同模型。
从岭回归方程或套索回归方程中,我们可以观察到预测系数依赖于预测变量的尺度。因此,在对数据应用岭回归或套索回归之前,将数据中的每个预测值归一化至标准差为 1 是非常重要的。
我们使用训练数据的 R 平方值或测试数据的均方差(MSE)来比较每个模型。交叉验证方法可以用来决定λ的值。需要注意的是,在高维设置中,由于缺乏足够的数据,训练 R-square 具有很大的可变性,因此不应用于评估模型性能。
如果响应是许多系数大小大致相似的预测值的函数,则岭回归表现更好。如果少数预测因素主导了反应,那么套索回归表现更好。
决策树
基于树的方法将预测空间分割成多个框(树中的叶子),并对落入该框中的所有数据点进行相同的预测。在回归设置中,该预测通常是该框中所有训练观察的平均值,对于分类设置,多数投票被认为是预测对新数据点的响应。
在树中进行切割时,我们以具有最低可能 RSS(回归树)或分类误差(分类树)的方式决定预测变量及其切割点。对于分类设置,也可以使用像基尼指数和交叉熵这样的度量,因为它们对叶子(或盒子)的纯度更敏感。
作为一名数据科学家,我需要回答一个问题——什么时候我应该停止拆分树,或者我应该制作多少个盒子?
成本复杂度剪枝或者最薄弱环节剪枝:直观上,我们种一棵大树,然后剪枝,选择一棵导致误差最低的树。我们不是考虑所有可能的子树,而是使用一个调整参数α将树修剪到期望的水平。
对于每个阿尔法值,我们将有一个相应的树。随着 alpha 的增加,树被修剪的越来越多,导致分裂越来越少。分割越小,模型的方差越小,但偏差会有所增加。我们可以利用交叉验证来决定 alpha 的值,从而获得数据的最佳拟合。
Bagging(bootstrapped Aggregation):我们利用 bootstrap 方法生成多个数据集,并为每个 Bootstrapped 数据集生成一个深度 Bootstrapped 树。尽管每个自举树都有很高的方差,但是对所有生长的树进行平均将会减少方差。我们利用出包测试误差来评估树的性能。
当预测准确性是我们的目标时,我们使用 Bagging。然而,打包损害了模型的可解释性。另一方面,成本复杂度修剪方法生成可解释树。
**随机森林:**这是一个有趣而聪明的打包方法,可以去相关生成的树。在 Bagging 中,在构建决策树时,我们允许所有预测变量参与分裂。如果几乎没有主要的预测因素,这个过程可能会产生高度相关的树。
在随机森林中,在每次分裂时,我们允许 m 个预测者的随机样本(大约 sqrt(预测者的数量))参与,从而允许所有预测者参与并进而产生去相关的树。这种方法的优势是显而易见的,因为对不相关的树进行平均会大大降低方差。
支持向量分类器
在进入支持向量分类器之前,我们必须了解最大间隔分类器。最大间隔分类器生成分离两个类的超平面,使得它垂直于每个属于不同类的最近的数据点。这些指导最大间隔分类器的数据点被称为“支持向量”。有趣的是,我们发现分类器只依赖于这些支持向量,而不依赖于所有其他数据点。
最大间隔分类器对不可分数据集的推广是支持向量分类器。由于我们无法找到完美分类数据集的硬边界,我们不得不允许一些数据点被错误分类。问题—我们应该允许多少个数据点被错误分类?
我们引入一个调整参数或成本“C ”,它允许模型对点进行错误的分类。可以使用交叉验证来选择它。c 控制支持向量分类器的偏差-方差权衡。位于其类的边缘的错误侧的数据点和位于边缘的点是该分类器中的支持向量,因为只有这些考虑了支持向量分类器的形成。
较小的 C 值说明了数据的硬拟合,并且非常不稳定,即,即使支持向量有很小的变化,分类器也会变化。这导致高方差但低偏差。另一方面,较高的 C 值允许较宽的余量,并产生具有较高偏差但较低方差的灵活分类器。
我们可以通过在预测器空间中引入更高阶特征以及交互项来拟合非线性决策边界。核和支持向量机的概念是随着这个概念的复杂初始化而出现的,但是中心思想是相同的。
可解释的方差(RSS、TSS、R 平方)
**总平方和:**是数据反应中固有的方差总量。
残差平方和: RSS 测量数据响应中的方差,这种方差不能用我们用来拟合的模型来解释。
R-square: 可以用我们过去拟合的模型解释的数据响应中方差的比例。R-square 接近 1 表示模型很好。无法解释的差异可能是由两个原因造成的:a .考虑的模型不能准确表示数据(直线不能符合二次型-数据)b .数据中的固有误差(由于无法建模的噪声)。
当在训练数据上测量 R-square 时,试图通过增加模型复杂性来实现更接近 1 的 R-square 会导致数据的过度拟合,因为它利用了数据中存在的固有噪声。因此,总是建议报告我们使用的数据集以及评估指标。
参考资料:加雷斯·詹姆斯,丹妮拉·威滕,特雷弗·哈斯蒂,罗伯特·蒂布拉尼。《统计学习导论:在 r .纽约的应用》: Springer,2013 年。
用于异常检测的监督机器学习技术:逻辑回归
关于异常检测的小型数据科学文章
本·威克斯在 Unsplash 上拍照
这是我写的关于异常检测算法的系列文章的第 11 篇(也是最后一篇)。以下是之前的 10 篇文章,如果您想了解的话,每篇文章都侧重于不同的异常检测算法:
- 1。隔离林
- 2。k-最近邻(kNN)
- 3。支持向量机(SVM)
- 4。无监督算法
- 5。椭圆形信封
- 6。局部异常值因子(LOF)
- 7。z 分数
- 8。箱线图
- 9。统计技术
- 10。时间序列异常检测
仔细观察,你会发现所有这些算法要么是统计的,要么是无监督的 ML 技术。无监督的,但许多这些算法实际上是围绕监督分类理论(如 kNN,SVM 或 DBSCAN)建立的。今天,我将采用一种“纯粹的”机器学习方法来进行异常检测,这意味着数据集将具有 0 和 1 标签,分别代表异常和非异常。
那么为什么监督分类在这个领域如此晦涩难懂呢?这背后有几个原因,但一个关键原因是严重的类别不平衡,这意味着只有一小部分数据代表异常。异常是罕见的事件,找到它们就像大海捞针。对于监督算法来说,这是一个很大的障碍,因为没有足够的例子可以学习!
无论如何,下面我将使用一种流行的算法——逻辑回归,用公开可用的数据编写一个监督分类的实现。
在以前的文章中,我通常动态地创建一个小的合成数据集,并用最少的代码实现算法,以给出它们如何工作的直觉。今天会有所不同,因为这是一个监督分类问题,我必须遵循所有的基本步骤。正如您将看到的,光是数据准备就要占用相当多的空间。
步骤 1:导入库
我们需要相当多的库来进行数据辩论、准备模型输入、模型构建和验证——所有的库都来自三个大的包:pandas
、nunpy
和sklearn
。
# data wrangling
import pandas as pd
import numpy as np# inputs data preparation
from sklearn.preprocessing import RobustScaler
from sklearn.model_selection import train_test_split# modeling
from sklearn.linear_model import LogisticRegression# model validation
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
第二步:数据争论
我正在使用一个来自 Kaggle 的关于信用卡欺诈检测的流行数据集。欧洲持卡人在删除任何用户标识符后,在公共领域发布了该数据集。让我们导入并查看一下数据集,看看特征。
# import data
df = pd.read_csv("..\creditcard.csv")# view the column names
df.columns
# view the column names
df.columns>> Index(['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount', 'Class']
数据集有 31 列。第一列“时间”是交易时间戳,倒数第二列“金额”是交易金额,最后一列“类别”表示交易是否欺诈(欺诈= 1,非欺诈= 0)。其余的列,“V1”到“V28”是未知的特征,并且值被缩放。
现在看看欺诈和非欺诈案例的数量。
# number of fraud and non-fraud observations
frauds = len(df[df.Class == 1])
nonfrauds = len(df[df.Class == 0])print("Frauds", frauds); print("Non-frauds", nonfrauds)>> Frauds 492
>> Non-frauds 284315
正如我所说,这是一个相当不平衡的数据集,在 25 万个观察中只有 492 个欺诈案例。这只占所有交易中欺诈案件的 0.17%。
步骤 3:输入数据准备
数据集非常干净,所以在下一步中,我们将缩放“Amount”和“Time”列,以确保它们与其他列的格式相似。
## scaling the "Amount" and "Time" columns
rob_scaler = RobustScaler()df['scaled_amount'] = rob_scaler.fit_transform(df['Amount'].values.reshape(-1,1))
df['scaled_time'] = rob_scaler.fit_transform(df['Time'].values.reshape(-1,1))# now drop the original columns
df.drop(['Time','Amount'], axis=1, inplace=True)
现在让我们定义 X 和 y 输入变量。
# define X and y variables
X = df.loc[:, df.columns != 'Class']
y = df.loc[:, df.columns == 'Class']
由于这是一个不平衡的数据集,我们需要采取额外的步骤来进行子采样——称为欠采样——这样机器就不必大海捞针来学习示例。
# number of fraud cases
frauds = len(df[df.Class == 1])# selecting the indices of the non-fraud classes
fraud_indices = df[df.Class == 1].index
nonfraud_indices = df[df.Class == 0].index# from all non-fraud observations, randomly select observations equal to number of fraud observations
random_nonfraud_indices = np.random.choice(nonfraud_indices, frauds, replace = False)
random_nonfraud_indices = np.array(random_nonfraud_indices)# appending the 2 indices
under_sample_indices = np.concatenate([fraud_indices,random_nonfraud_indices])# undersample dataset
under_sample_data = df.iloc[under_sample_indices,:]# now split X, y variables from the under sample data
X_undersample = under_sample_data.loc[:, under_sample_data.columns != 'Class']
y_undersample = under_sample_data.loc[:, under_sample_data.columns == 'Class']
在将数据输入模型之前,将数据拆分为训练集和测试集。
# split dataset
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample, y_undersample, test_size = 0.3, random_state = 0)
步骤 4:模型构建
像往常一样,实际的模型构建只需要 3 行代码,就可以对给定的数据集进行实例化、拟合和预测。由于这只是为了演示,我们将使用默认参数,不做任何调整。
# instantiate model
model = LogisticRegression()# fit
model.fit(X_train_undersample, y_train_undersample)# predict
y_pred = model.predict(X_test_undersample)
第五步:模型评估
作为标准模型评估指标,我们正在制作分类报告和混淆指标。
classification_report = classification_report(y_test_undersample, y_pred)
confusion_matrix = confusion_matrix(y_test_undersample, y_pred)print("CLASSIFICATION REPORT")
print(classification_report)
print("CONFUSION MATRIX")
print(confusion_matrix)
离别赠言
本文的目的是展示一种用于异常检测的纯监督机器学习方法。由于严重的阶级不平衡,在这个领域很少使用监督技术。由于一个数据集中只有少数异常观测值,算法没有足够的例子可以学习。
到目前为止,我写的 11 个算法没有一个是绝对好或更好的,这都归结于数据集的性质和它来自的领域。通常,一个简单的统计算法(如箱线图)足以过滤可能的候选者,而在其他情况下,一个复杂的算法可能是无用的。
希望你觉得这个系列有用,欢迎在下面发表评论,关注我的媒体、推特或 LinkedIn 。
有监督和无监督机器学习的区别
数据科学概念
他们实际上是如何比较的
肖恩·奥尔登多夫在 Unsplash 上拍摄的照片
机器学习能够处理大量数据。这些数据可能以多种不同的形式出现,从图像到电子表格再到文本。这些数据可以包含许多不同类型的信息,如密码、地址,甚至颜色模式。说到机器学习,有两种不同的方法:无监督和有监督学习。
这两种不同类型的学习实际上有很大的区别。这些差异导致了独特的计算机算法来迎合每一种类型的学习。例如,分类机器学习算法,如能够将图像标记为苹果或橙子的算法,保留用于监督机器学习。聚类算法,例如能够根据书写风格将书籍分组的算法,是为无监督的机器学习而保留的。
我们将探索两种类型的机器学习之间的差异,并确定哪种学习形式最适合特定的数据集。
监督学习
比方说,你正在开发一个机器学习模型,它能够区分在不久的将来价格会上涨的好股票投资和在下个月会贬值的坏股票投资。
由 Austin Distel 在 Unsplash 上拍摄的照片
传统上,你会向专门从事股票投资的财务顾问寻求建议。这些财务顾问由经验丰富的老顾问来指导哪家公司值得投资。他们被告知,精选的公司信息会导致股票价值上升。他们挑选股票的表现由这些经验丰富的顾问监督。
有监督的机器学习以类似的方式工作。通过向算法输入精选的公司信息,并给这些信息贴上良好投资的标签,你正在教会机器哪只股票值得投资。标记数据的行为是监督学习的表现。用于该问题的机器学习算法的具体类型是一种 分类 算法。
监督学习的一个重要指标是用于训练机器学习算法的数据集。如果该数据集完全标记或识别了您希望算法得出的答案,那么这是一个很好的机会,您正在处理一个有监督的机器学习算法。
在选股机器学习模型的情况下,它可能处理的数据集包含公司财务信息,以及该信息是否会导致积极或消极的价格运动。如果你想看选股机器学习算法的例子,那么请查看下面的文章:
[## 我建立了一个机器学习模型,像沃伦·巴菲特一样交易股票(第一部分)
使用机器学习来分析股票的基本面
medium.com](https://medium.com/swlh/teaching-a-machine-to-trade-stocks-like-warren-buffett-part-i-445849b208c6)
上面的文章深入研究了基于监督学习的选股机器学习算法的开发。
无监督学习
对于无监督学习,假设你想开发一个约会应用程序,将约会档案分组在一起,以改善约会过程。然而,你不知道首先如何将它们组合在一起。应该按用户喜好分组还是按自身特点分组?也许根据他们的宗教或政治观点将他们归类?但是最终你仍然不能完全确定如何建立这些约会档案组。
这就是无监督机器学习的用武之地。如果你不确定在一个大的数据集中是什么将数据从另一个中区分出来,那么你可以利用无监督学习。这就是无监督学习的用途——在你不知道你在寻找的数据中找到相关性和相似性。
你可能知道,与监督学习不同,无监督机器学习利用未标记的数据。 聚类 是一种流行的无监督学习形式,它检查数据片段以找到相似性和差异,从而将它们聚类或分组在一起。关于约会应用程序的开发,无监督学习将发现约会简档之间的差异和关系,以根据这些简档进行分组或聚类。
如果您希望看到聚类的实际应用,请查看下面的文章,其中实现了无监督的机器学习来将约会档案分组在一起:
利用无监督的机器学习约会应用
towardsdatascience.com](/dating-algorithms-using-machine-learning-and-ai-814b68ecd75e)
哪种学习方式最好?
有监督的学习和无监督的学习之间没有更高级的学习形式。你只需要知道何时使用其中一个。因此,使用哪种形式的学习完全取决于我们在开发机器学习模型时面临的问题,或者我们将用于该模型的数据集。
取决于数据
关于数据集,您将使用的学习形式由以下因素决定:
- 标记数据集=监督学习
- 无标签数据集=无监督学习
如果数据集包含标签或标记,例如,一组带有相应名称(苹果、橘子、香蕉等)的水果图片。)然后我们将实现监督学习。然后,受监督的机器学习算法将基于图片的内容来学习哪个图片与每个标签相关联。
如果数据集不包含任何标签或标记,如水果示例,但没有相应的名称,那么我们将实现无监督学习。然后,无监督的机器学习算法将找到水果图片之间的差异和相似之处(颜色、形状、纹理等)。)将它们聚集在一起。
取决于问题
有时候,我们面临的问题决定了我们将使用哪种学习形式。在我们之前使用的例子中(选股模型和约会应用),我们面临的问题决定了我们将使用哪种类型的学习。
对于选股模型,我们需要根据公司的财务报表来了解股票的表现,无论股价是上涨还是下跌。这个基本事实导致我们使用监督机器学习模型。
对于约会应用程序,我们不知道如何区分个人资料。交友档案的聚类是没有事实根据的。这将把我们带到无监督机器学习模型的使用。
关闭
无监督学习和有监督学习之间的区别非常明显。监督机器学习模型被告知它应该如何基于标签或标记工作。一个无监督的机器学习模型被告知只是要弄清楚每一段数据是如何彼此不同或相似的。
使用其中一个的需要很大程度上取决于我们的数据是否有标签或标记。这也取决于我们所面临的问题,而问题通常会影响我们所面对的数据类型。
最终,在无人监督和有人监督之间没有一种更好的学习形式。你只需要知道何时何地应用它们。
科学史上的监督者
分析导师与学生的关系,发现谁是历史上最重要的导师。
来源:https://imgur.com/fmVmslS
这是对科学史上导师和学生关系的数据分析。我试图利用数据科学来发现谁是历史上最重要的管理者。
在你继续之前,让我建议你写下你期望在这个分析中发现的伟大科学家的预测。我敢打赌,你们大多数人会对结果感到惊讶。
数据
数据科学中的每个项目都包含一个需要解决的数据问题。在这种情况下,我们的数据集相当简单,到目前为止,它只包含主管和学生之间的关系。例如,我们有一个 Alfred Kleiner(主管)和 Albert Einstein(学生)之间的关系。总的来说,数据集有 7,070 个不同的人,6,517 个学生,2,862 个主管和 8,070 个关系。当然,很多人同时是主管和学生。
所有的数据都是使用简单的搜集技术从维基百科收集来的。该数据集包含了科学界重要人物库中可以接触到的所有人。细节不在本文讨论范围内,可以在 github 库上找到。
我想强调的事实是,数据集没有任何关于个人的个人信息。这些无害的关系将揭示关于科学史的非常有趣的信息。敬请期待!
背景
我将简要解释我们需要继续下去的几个概念。如果你没有任何数学背景— 宝贝不要离开我— 我保证会很简单。如果你有一些图论基础的背景知识,我建议你跳过这一节。我将回顾稍后会用到的概念。
图论是研究图形的数学领域(咄!).在这种情况下,图显然是我们正在寻找的结构,因为图是关系的模型。一个图是由一组通过边连接的节点(人)组成的(导师-学生关系)。
您可能已经在想,边只能在一个方向(有向图)或两个方向(无向图)连接节点。例如,监督学生表现为从监督者到学生的单向边。然而,如果我们认为监督者-学生关系是连接仅仅互相认识的人(例如,社交网络),那么边连接监督者和学生,反之亦然。
来源:阿尔伯特-拉斯洛·巴拉巴希的《网络科学》
这到底为什么重要?嗯,两个节点之间的路径对我们的分析至关重要,这两种不同的结构允许完全不同的路径。哪一个对你分析我们的数据更有意义?
无向图
首先,我们将关系建模为无向图。这个决定对分析有重要影响,因为它认为导师和学生同等重要。
组件
图中的连通分量是一个子图,其中所有的节点都可以从至少另一个节点到达。我们的图有 84 个连通分量,但最大的分量占所有节点的 95.81%。这已经相当令人印象深刻了,因为我们从不同领域(例如化学、计算机科学)的人才库中收集了数据。这表明所有这些领域如何有一个共同的祖先,这将被证明是数学领域。
学位
无向图中节点𝑣的度是连接𝑣和其他节点的边的数量(即连接到特定人的人数)。这是前十名的学位排名:
1 Arnold Sommerfeld: 44
2 David Hilbert: 37
3 Dimitris Bertsimas: 34
4 Robert Solow: 30
5 Max Born: 29
6 Felix Klein: 28
7 Alonzo Church: 27
8 Franz Boas: 27
9 Abdus Salam: 25
10 J. J. Thomson: 24
这个列表已经很有趣了,也许你知道其中的一些。把它们记在心里,因为它们以后会出现。除了前十个,这是图中所有节点的度数分布
我们可以观察到,大多数人只与他们的主管有联系,并且有一个学位,而少数人有许多联系。这在统计学中被称为幂律分布。
中间中心性
中间中心性衡量节点𝑣的中心性,即所有节点对中通过𝑣.的最短路径所占的比例在这种情况下,我们可以使用这种中心性度量来提取关于图中人的重要性的见解。如果一个节点发现自己处于连接其他节点的最短路径中,那么它对于该连接是必不可少的。排名:
1 David Hilbert: 0.159
2 Max Born: 0.152
3 Hans Reichenbach: 0.121
4 Arnold Sommerfeld: 0.120
5 Hermann Helmholtz: 0.085
6 E. H. Moore: 0.073
7 J. J. Thomson: 0.071
8 Solomon Lefschetz: 0.070
9 John von Neumann: 0.058
10 Ludwig Boltzmann: 0.055
他们所有人,除了赫尔曼·亥姆霍兹和约翰·冯·诺依曼,都生于 19 世纪,死于 20 世纪。亥姆霍兹几乎活到 20 世纪,冯·诺依曼在最开始就诞生了。他们在图表中(以及在科学史上)如此重要,因为他们是连接 18 世纪最伟大的数学家与 20 世纪和 21 世纪最伟大的科学家的一代人的一部分。
从左到右,从上到下:戴维·希尔伯特,梅克斯·玻恩,赫尔曼·亥姆霍兹,阿诺德·索末菲,赖欣巴哈,E. H .摩尔,J. J .汤姆森,所罗门·莱夫谢茨,约翰·冯·诺依曼,路德维希·玻尔兹曼
该奖项由戴维·希尔伯特获得!。希尔伯特出生于德国,是历史上最有影响力和普遍性的数学家之一。在希尔伯特的学生中,我们可以找到数学家赫尔曼·维尔和哈斯克尔·库里。
我们还可以看到诺贝尔奖获得者梅克斯·玻恩,德国物理学家和数学家,在量子力学的发展中起着至关重要的作用。在玻恩的学生中,我们找到了诺贝尔奖获得者:玛利亚·戈珀特-梅耶、恩利克·费密和马克斯·德尔布吕克。他的另一个学生是罗伯特·奥本海默,在曼哈顿计划期间洛斯阿拉莫斯实验室的负责人,第一颗原子弹就是在那里被研发出来的。
德国物理学家阿诺德·索末菲(Arnold Sommerfeld)是量子物理领域的先驱,是获得诺贝尔奖学生最多的前两名。我们已经看到索末菲在我们的图中拥有最多的连接数。索末菲的学生包括诺奖得主沃纳·海森堡、沃尔夫冈·泡利、汉斯·贝特、彼得·约瑟夫·威廉·德拜、莱纳斯·鲍林、伊西多·艾萨克·拉比和马克斯·冯·劳厄。事实上,阿尔伯特·爱因斯坦曾经告诉索末菲,他很钦佩他是如何从土壤中培养出这么多年轻人才的。索末菲可以说是科学史上最优秀的导师,以在家中或咖啡馆与学生见面而闻名。索末菲还拥有一个滑雪小屋,学生们被邀请在那里讨论物理。有趣的是,索末菲本人从未获得过诺贝尔奖,尽管他创下了 84 次提名的记录。
另一方面,我们还有英国物理学家、诺贝尔奖获得者 J. J .汤姆森,他是唯一一个在拥有诺贝尔奖的学生方面可以与索末菲相抗衡的人。由于发现了电子,汤姆森的学生中有诺贝尔奖获得者查尔斯·格洛弗·巴克拉、尼尔斯·玻尔、梅克斯·玻恩、威廉·亨利·布拉格、欧文·理查森、查尔斯·托马森·里斯·威尔逊、弗朗西斯·威廉·阿斯顿和欧内斯特·卢瑟福。事实上,汤姆森的儿子(乔治·佩杰特·汤姆生)获得了 1937 年的诺贝尔物理学奖,只有布拉格、玻尔和西格班取得了同样的成就。
俄罗斯数学家索罗门·莱夫谢茨,在代数拓扑和几何方面做了基础性工作,指导了人工智能的创始人之一约翰·麦卡锡和统计学的重要人物约翰·图基。
赫尔曼·赫尔姆霍茨是德国物理学家,在人类视觉、电动力学和热力学等几个领域做出了重大贡献。在他的学生中,我们可以找到诺贝尔奖得主阿尔伯特·迈克耳孙、威廉·维恩、马普和加布里埃尔·李普曼。
最后,在名单上我们还可以找到匈牙利数学家、物理学家和计算机科学家约翰·冯·诺依曼。冯·诺依曼可以说是地球上最聪明的人之一。他是我一直以来最喜欢的科学家之一,所以我不敢简要描述他的工作。我只能说,如果你不太了解他,那就值得一读。只是为了好玩,打开他的维基百科页面,在右边他的图片下面找到“知名”部分。
特征向量中心性
特征向量中心性是测量中心性的不同方式。在这种情况下,当一个节点与另一个重要节点相关时,它的重要性就会增加。这个概念类似于 Google 在其 PageRank 算法中使用的概念。再次排名:
1 Arnold Sommerfeld: 0.578
2 Max Born: 0.214
3 Werner Heisenberg: 0.213
4 Wolfgang Pauli: 0.162
5 Hans Reichenbach: 0.158
6 Rudolph E. Peierls: 0.154
7 David Hilbert: 0.140
8 Ferdinand von Lindemann: 0.119
9 Gregor Wentzel: 0.110
10 Linus Pauling: 0.109
如果你碰巧读过中间中心性这一节,那么你已经熟悉了列表中的大多数人。
令人着迷的是,通过这种中心性的衡量,我们可以在不了解他的学生的任何情况下,仅仅根据他的后代的性质,发现阿诺德·索末菲的重要性。名单上的大多数人实际上都与阿诺德·索末菲有直接关系。
有三位科学家是我们在之前的中心性测量中没有看到的。沃纳·海森堡监督的鲁道夫·佩尔斯;费迪南·冯·林德曼,阿诺德·索末菲和戴维·希尔伯特等人的上司;和由阿诺德·索末菲监督的格雷戈尔·温策尔。
令人惊讶的是,排名第 13 位的 J. J .汤姆森没有进入前十名,因为他指导过如此多的诺贝尔奖获得者。
桥梁
桥是删除后会断开图的边。一个节点的桥边的数量给了我们一个很好的度量,这个节点连接图的不同部分有多重要,这些部分可能与不同的字段相关。排名:
1\. Franz Boas: 25
2\. Robert Solow: 21
3\. Arnold Sommerfeld: 19
4\. Alonzo Church: 19
5\. David Hilbert: 18
6\. John Archibald Wheeler: 16
7\. Felix Klein: 15
8\. Salomon Bochner: 14
9\. Garrett Birkhoff: 13
10\. Richard Karp: 13
11\. John Tate: 13
12\. Elias Stein: 12
13\. Marvin Minsky: 12
14\. Noam Chomsky: 11
再次,有很多熟悉的面孔,这也是一个很好的迹象,表明我们正在做正确的事情。
弗朗茨·博厄斯非常有趣。他是一名德国人类学家,指导过许多学生,成为该领域的中坚力量。令人惊讶的是,人类学家出现在数据集中,然而,我们可以将弗朗茨·博厄斯追溯到亚伯拉罕·戈特瑟夫·卡斯特纳,他是卡尔·古斯塔夫·雅各布·雅各比的共同祖先。
美国经济学家、诺贝尔奖获得者罗伯特·索洛也是经济学领域的一个重要节点,有诺贝尔奖获得者乔治·阿克洛夫、约瑟夫·斯蒂格利茨、彼得·戴蒙德和威廉·诺德豪斯等学生。
其他像阿隆佐·邱奇、理查德·卡普、马文·明斯基和 T21 都是数学和计算机科学领域之间的重要纽带,最近的两位获得了图灵奖。
我们还发现了其他一些伟大的数学家,如所罗门·博克纳、菲利克斯·克莱因、加勒特·伯克霍夫、约翰·泰特和埃利亚斯·斯坦。费利克斯·克莱因在几个不同的数学领域的贡献而广为人知。作为我们将在本文结尾看到的剧透,费利克斯·克莱因是导师-学生这条非凡道路的一部分,这条道路始于拉格朗日,止于约翰·冯·诺依曼。
美国物理学家约翰·阿奇博尔德·惠勒曾负责重振人们对广义相对论的兴趣,他是诺贝尔奖获得者理查德·费曼和基普·索恩的导师。
在名单的最后,我们遇到了诺姆·乔姆斯基,他是数学和语言学领域之间的枢纽。乔姆斯基是唯一一个和索恩一起,我们提到过的,今天还活着的人。
有向图
现在,我们把这个模型变成一个无向图,这个无向图更重视监督者而不是学生。我们为什么要这么做?嗯,随着这种变化,我们期望发现数学的创始人比其他人更相关,仅仅因为他们在谱系树的顶端。
中间中心性
我们将执行与无向图相同的分析,因此,有关该度量的定义,请参考上一节。与前面分析的主要区别在于,在这种情况下,路径只在从主管到学生的方向上有效。排名(去除异常值):
1 Joseph-Louis Lagrange: 0.002
2 Leonhard Euler: 0.002
3 Johann Bernoulli: 0.002
4 Siméon Poisson: 0.001
5 Felix Klein: 0.001
6 Peter Dirichlet: 0.001
9 Rudolf Lipschitz: 0.001
10 Ferdinand von Lindemann: 0.001
11 Carl Gauss: 0.001
多好的清单啊,令人满意。事实上,我们已经找到了一些我们今天所知道的数学的创始人。在这种情况下,我们有 18 世纪和 19 世纪出生的数学家。
从左到右,从上到下:约瑟夫·路易斯·拉格朗日、莱昂哈德·欧拉、约翰·伯努利、西蒙·泊松、费利克斯·克莱因、彼得·迪里克莱、鲁道夫·利普希茨、费迪南德·冯·林德曼、卡尔·高斯
这些是一些最伟大的数学家,如果你接受过数学教育,我肯定你知道他们的大多数名字。也有许多伟大的早期数学家失踪,值得一提:波恩哈德·黎曼,亨利·庞加莱,皮耶·德·费玛,戈特弗里德·莱布尼茨,埃瓦里斯特·伽罗瓦,卡尔·魏尔斯·特拉斯,尼尔斯·阿贝尔,卡尔·雅可比,奥古斯丁·路易·柯西,约瑟夫·傅立叶和皮埃尔·西蒙·拉普拉斯,仅举几例。
路径
在图论中,路径是连接一系列节点的一系列边。正如在“桥梁”小节中所承诺的,这张图表中有一些值得观察的路径。
从莱昂哈德·欧拉到约翰·冯·诺依曼的树
结论
这有希望是对这个数据集的第一次分析。然而,为了将来的分析,我会努力收集人们的个人信息。我们已经看到了数学家的重要性,特别是德国和法国的数学家,随着我们绘制图表,随着时间的推移,我们可能会发现美国科学家的迅速变化。
我开始这个项目是因为我自己一直在寻找监督者,我想了解更多关于监督者的历史。正如我们今天所看到的,我确信找到一个合适的主管的重要性。其实如果你和我的情况差不多,我可以推荐读‘一个博士是不够的!’ 。
我想分享的最后一个想法是数学的重要性。一切都是数学,当它变得更具体时,就有了更具体的名称。
如果你对一个我没有提到的科学家特别感兴趣,或者你想和我评论什么,请在评论中告诉我。
参考
如果你有兴趣学习更多关于图论的知识,并以类似的方式应用它,我真的推荐阿尔伯特-拉斯洛·巴拉巴西的网络科学。它很棒,可以在网上以多种语言免费下载。
这是我为这个项目准备的 github 库,以防代码对你有用。请给它一颗星,如果你觉得这个项目有趣,我将非常感谢。
用计算机视觉补充财产数据库
对象检测模型为改进现有的数据收集工作开辟了新的可能性
物业和地块数据库为学术和商业市场研究提供了巨大的价值。然而,这些数据库的维护成本很高,而且往往包含大量缺失、不正确或过时的记录。计算机视觉模型,加上可访问的卫星和街道图像,可以识别不正确的数据,并在这些模型经过训练以检测财产特征时估算缺失的记录。这种方法为收集数据提供了一种低成本的替代方法,否则需要通过现场访问、物业经理或业主进行报告。
在 Res-Intel ,我们正在使用计算机视觉模型来识别建筑特征,这些特征可以揭示建筑的能源使用和改造潜力。配有耗电的泳池泵、热水器和照明设备的游泳池是一个可以显著增加酒店能源使用的特色。县税评税员记录哪些财产有一个游泳池,并将这些信息存储在一个公共数据库中。然而,我们发现这些记录往往不完整或与观察不符。
物体检测 vs .公共记录
在我们对圣地亚哥多户房产的分析中,我们发现税务评估员数据库没有为我们评估的近一半房产提供完整的池数据。为了填补报告空白,我们收集了所有多家庭房产的卫星图像数据,然后训练了一个对象检测模型,以在每个房产图像中找到池。我们成功地找到了丢失的记录,甚至在税务评估员的数据中发现了一些不一致的地方,否则这些数据会被忽略。
池的对象检测可以补充缺失的池记录并交叉验证现有记录。
在 10,714 个多户房产的样本中,42%的房产在税务评估员数据库中的“pool”字段中报告了缺失值。对象检测模型发现了 146 个在税务评估员记录中缺失的池,这可以在这张互动地图上查看。
税务评估员记录和模型的池检测置信度之间的不一致揭示了误报的池。(图片由作者提供)
大多数属性的预测具有接近 1 或 0 的置信度(注意纵轴上的对数标度)。零置信度意味着模型确定在资产处没有池。(图片由作者提供)
此外,一些评税员的记录似乎错误地报告了一处房产中存在一个游泳池:该模型在 114 处房产中检测到一个游泳池,评税员记录为“无游泳池”,而在 29 处房产中没有检测到一个游泳池,它记录为“游泳池”下面的卫星图像显示了一处多户房产,据估税员报告,该房产有一个游泳池。看起来好像在某个时期的房产确实有一个游泳池,但是它已经被水泥填满了,这表明评税员的记录已经过时了。
县税务评估员记录了这个地方的一个游泳池,但是很明显事情已经发生了变化。(图片由作者提供)
虽然对象检测方法经常在公共记录中发现错误,但重要的是要记住没有模型是完美的。事实上,我们对预测数据的手动检查导致我们发现了一些假阳性——模型预测存在一个水池,而实际上并没有。下图是一个例子,模型把铺在屋顶上的蓝色防水布误认为是游泳池。
该模型预测绿色边界框内的区域是具有 65%置信度的池。(图片由作者提供)
通过简单地限定如何使用预测,可以减轻甚至消除模型预测误差的影响。例如,在池检测模型与资产数据库记录相矛盾的情况下,我们可以选择仅当该模型以大于 90%的置信度预测池的存在时才相信该模型。
训练模特
我们用来查找酒店特征的对象检测模型是由 Joseph Redmon 开发的“你只看一次”( YOLO)模型,此处提供。目前有大量流行的对象检测模型,它们都是卷积神经网络(CNN)的扩展。CNN 通过提取一系列基于像素的基本特征并确定这些特征与一组对象类别之间的关系来对单个图像进行分类。水池、瓦片屋顶或汽车是可能在卫星图像中可见的对象类别的示例。经过训练的 CNN 模型可以预测像素集合代表一个池或任何其他可见对象的概率。一般来说,YOLO 模型和对象检测模型通过在更大图像内的提议区域上迭代其预测来扩展 CNN。
训练检测模型是校准分配给特征的权重的过程,这些特征用于预测图像中对象的存在。权重是通过梯度下降确定的,这是一个迭代过程,寻找使预测误差最小化的权重值(或与误差成比例的某个值)。
确定预测误差需要一个地面真实数据集,一系列手工标记物体的图像。我们的观察单位是单个物业的航拍图像,因此我们首先从高分辨率卫星图像光栅文件导出物业级别的图像。识别单个属性需要在栅格数据上叠加属性边界 shapefile。有了属性图像,我们使用 YoloLabel 来标记地面真实数据集,该数据集(正如您可以从名称中猜到的那样)以文本文件格式导出图像标签,该格式可以很容易地转换到 YOLO 模型。
手动标记图像的子集,并用于训练和验证模型。(图片由作者提供)
总共,我们标记了大约 2000 个池图像,并将它们分成验证和训练组。训练图像直接用于通过梯度下降来校准模型权重,而验证图像被搁置一边,稍后用于测量模型在它尚未看到的图像中检测对象的准确度。
用于模型训练的计算资源
训练神经网络模型是一项计算密集型任务。预处理 CNN 模型以提取有用的图像特征,减少了计算量;但是将这些特征连接到特定对象的数千个参数仍然可以通过迭代梯度下降过程进行优化。这种高度多维的优化问题通常需要高性能图形处理单元(GPU)提供的内存和计算能力。幸运的是,亚马逊网络服务(AWS)提供了远程弹性计算(EC2)服务器,这些服务器拥有强大的 GPU,可以以低廉的价格按小时租用。我们使用一个 p2.xlarge EC2 服务器,它带有一个 61 GB 内存的 GPU,以及一个预安装的 CUDA 和 TensorFlow 库,这些是利用 GPU 进行神经网络建模所必需的。训练池检测模型需要大约 18 个小时。
验证模型
对一个模型最重要的测试是它在图像中检测到它还没有遇到的物体的准确性。我们的验证集包括 268 处房产,69 处有泳池,199 处没有。除了两个验证属性(AUC = 0.997)之外,集合检测模型准确预测了集合的存在和位置。这两个不正确的预测是假阴性:尽管模型确实检测到了这些属性的池,但它报告的置信度略低于 50%。总而言之,池检测模型证明是非常可靠的。
由训练的 YOLO 模型预测的池边界框。(图片由作者提供)
通过将预测的边界框与地面真实情况进行比较来评估对象预测的质量也是常见的做法,地面真实情况由两者之间的重叠统计或归一化距离来测量。然而,这些统计数据并不总是有效地传达关于模型性能的直觉。或者,我们可以目视检查图像的子集,并验证池边界框是否在正确的位置形成。上面的动画展示了随机选择的模型生成的边界框,它们精确地形成在目标位置周围。
关于 Res-Intel 工作的更多信息:
Res-Intel 使用基于神经网络的对象检测模型,作为一种低成本工具,用于识别影响建筑能耗的属性特征。我们将这些数据与来自多个物业数据库的公共事业公司提供的汇总数据和记录相结合,以创建大规模的建筑级能源概况。我们与几家大型公用事业公司合作,构建和分析建筑组合,建立能耗数据模型,并设计研究来评估能效计划和技术。
供应链优化:值得还是不值得?
商业科学
数学优化的悖论不应该让你远离它的好处
优化是如今人工智能对企业的一个主要卖点。每个人都希望提高自己的效率、收入和其他关键 KPI。这些都是合理的目标,也是可以实现的目标。我们可以使用优化原则来显著提高性能。
完美的不可能
然而,无论您如何努力实现最佳性能,完全优化都是不可能的。没有一个模型能够解释所有的可能性或实现完美的预测。在可预见的未来,人工智能技术还没有先进到足以让这成为可能。
而且,定义什么是“最优” 提供了自己的挑战 。每个企业都有独特的需求,因此,优化不同的目标。对一家公司来说是最优的策略在另一种情况下不太可能表现得一样好。完美是一个移动的目标,不是简单的一刀切的答案。
engin akyurt 在 Unsplash 上拍摄的照片
这就是为什么优化是一个悖论。它的目的使它不可能。你越想给它下定义,它就变得越难以捉摸。
为什么我们喜欢悖论
直面悖论并不是什么新鲜事。我们每天都要面对矛盾,对于像我这样的数学家来说,这通常很有趣。只需考虑一下在互联网上再次出现的自相矛盾的问题:
如果你随机选择这个问题的一个答案,你答对的概率有多大?
A)25%
B)50%
C)0%
D)25%
乍一看,这似乎很容易回答。但是你越想,越多的可能性看起来像正确的答案。这些可能性使这些答案变得不正确。最终,你意识到问题没有答案。你必须打破数学原理和逻辑。这种问题可能会让你一头雾水,但是试图讲道理是磨砺批判性思维技能的绝佳方式。
沃洛德梅尔·赫里先科在 Unsplash 拍摄的照片
然而,最优化的悖论可能特别令人讨厌。虽然有效的优化将提供一个提升,但它永远不会实现它所设定的目标。你永远不会给出最佳结果。
然而,我认为,正是这一点让优化和其他思维练习一样有趣。你有机会挑战关于做生意的最佳方式的假设。优化打开了新的可能性,与解决上面的问题不同,你得到了一个切实的结果的满足感。比如 Boggi Milano 可能并没有通过优化完全完善他们的供应链,但即使是一个优化算法 的几次迭代也让库存效率提高了 18% 。解决悖论的回报在优化中要大得多——你总是可以一点点接近完美。
优化背后的数学
尽管如此,即使没有尝试最优化的不可能性的矛盾,最优化也是一个挑战。最优化的数学和算法设计极其复杂。看一下我使用的优化公式中的一小部分:
作者提供的图片(抄送并注明出处)
正是因为这个原因,许多人发现优化令人生畏。如果你所有复杂的编程和困难的计算甚至都不会给你最终的答案,那何必呢?
优化就像洋葱
如果这还不够复杂,任何优化算法都不会涉及单一的优化计算。比如妖怪和洋葱(还有冻糕!),优化有层次。您很少会有一个工作模型不包含至少几层相互依赖以给出结果的计算。
以 Evo 的 补给工具为例。补货可用于优化供应链,实现全系统商店级补货。可以想象,优化这个需要优化大量的个体因素。补充算法包含 3 个不同的优化循环:
1.一个是根据需求确定每个商店的最佳产品组合
2.一个在整个系统范围内满足这一需求的系统,平衡现有资源和其他地方的需求
3.一个是以最具成本效益的方式在商店之间和仓库之间运送货物
必须在这些优化中的每一个内进行多次计算,优化在这些更大的优化模型内使用的因子。单一模型需要层层优化。剥开它们,你会发现优化比你想象的还要复杂。随着时间的推移,这留下了大量的空间来完善和改进结果,对于像我这样的数据科学家来说,这是一个既令人沮丧又令人兴奋的过程。
总会有误差,但总会有方法来改进我的结果:简而言之就是最优化的悖论。
如果最优结果是不可能的,那么优化值得吗?
Johannes Plenio 在 Unsplash 上拍摄的照片
所以如果你永远无法做到完美,优化值得吗?任何高管都会很明显的说是。即使是微小的改进也会对底线产生重大影响,这对任何企业都有好处。
但是这并没有降低优化的复杂性。完美是不可能的,但我们必须不断努力实现它。我们不得不接受这个悖论。在尝试不可能的过程中,我们每天都离理想更近一步。
如果你对深入研究优化所需的计算或编程感兴趣,Evo 大学 有一门 优化课程 。我鼓励你查看一下,以便更深入地了解这个主题。
还没入学?现在是时候了!前往https://evo.ltd/join免费参观。
结论:值得
数学优化的许多功能和内在挑战不应该吓得你不敢抓住它的好处。
杰克·英格尔在 Unsplash 上的照片
毕竟不可能做到优于最优!你无法打败一个拥有高质量数据的设计良好的优化器。
我总是告诉我的父亲,尽管他一生都在 IBM 工作,但坐在方向盘后面时有一种意大利式的自豪感:谷歌地图导航将击败你的驾驶知识,除非你知道一些它不知道的东西。他今天还是不信任我,也许有一天?
PS 我定期写商业科学。推荐后续阅读:
机器学习和人类经理一起修复供应链
towardsdatascience.com](/94-perfect-the-surprising-solution-to-the-200-billion-inventory-problem-b6ba0bc1417a) [## 时尚被打破了。科学正在修复它
转变 5 个核心时尚流程
towardsdatascience.com](/fashion-is-broken-science-is-fixing-it-b771b1ab5b59)
Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)
供给、需求和工具变量:经济学家工具箱给数据科学家的教训
和我一起假装一会儿。
假装——你好心但厌恶数据的前大学室友来向你寻求建议。看,他有了下一个颠覆可穿戴设备行业的大玩意:智能脚链(智能手表的明确继任者)。智能脚链将拥有一切——健康监测器、足部按摩器和睡眠追踪器,它会告诉你的 Keurig 什么时候该排队去喝早上的咖啡了。
只剩下一个问题。你的朋友需要一些市场分析来说服种子投资者,他可以以他们愿意支付的价格将智能脚链带给世界各地的千禧一代。这就是你进来的地方。你开始在网上搜寻可穿戴设备行业的数据(Kaggle 这次不会放弃)。最后,你偶然发现一些市场研究数据,开始埋头苦干,利用经济学原理课上残留在你大脑中的信息,开始估算需求曲线。这项工作似乎很简单——一些基本的线性回归,不需要 Keras 或 LightGBM 或 XGBoost。
所以,你开始你的探索性数据分析。你希望你的散点图显示出价格和数量之间明显的负关系,并在回归模型中出现一致的负价格系数。
你知道,就像这样。
眼熟吗?(作者创作)
相反,您最终会得到类似这样的结果:
和你想的不太一样。(作者创作)
你心里想,“这完全违背了 200 年来的价格理论”。然后,当事情没有按照你希望的方式发展时,你会求助于两个可靠的朋友——谷歌和 StackExchange。像往常一样,你会发现很多人都有同样的问题。
事实证明,这个问题非常简单。价格由需求和供给曲线的交点决定。这种关系给了我们第一次见识。为了估计需求曲线,我们需要供给曲线的变化或移动。通过观察供给曲线与需求曲线相交时的变化,我们可以描绘出需求曲线。大概是这样的:
由作者创建
太好了,问题解决了。或者,如果在保持需求不变的同时改变供给曲线是一个简单的壮举,那就有可能了。看,虽然我们需要供应曲线移动,但是我们没有办法用普通的最小二乘法(OLS)来保持我们的需求曲线不变。我们无法保持需求不变,这给了我们关于价格对需求量的影响的有偏见和不一致的系数估计。也就是说,在这种情况下,OLS 给我们的估计可能很好地反映了价格-数量关系的真实性质,即使是在大样本中。相反,我们可能观察不到任何关系,如下例所示。
左图:真实发生的事情。|右:我们能看到的。(作者创作)
谢天谢地,我们在 StackExchange 的朋友有一个来自 Phillip 和 Sewall Wright 的解决方案:工具变量回归。看,在喧嚣的 20 年代末——当时髦的女孩们挤进她们的福特汽车去爵士俱乐部时——菲利普·赖特和他的儿子休厄尔正为估算植物油和动物油的需求这个同样令人兴奋的问题而苦恼。当然,他们的散点图展示了和你的散点图一样的价格和数量之间的微弱关系。因此,他们开创了现在所谓的工具变量回归。他们在 1928 年面临的问题与你今天面临的问题没有什么不同,除了你开始分析智能脚链数据,他们被黄油和橄榄油卡住了。
什么是工具变量?
先说内生性。当一个变量的值与误差项 u. 相关时,该变量可被描述为内生变量。由于与统计偏差相关的各种原因,该变量可能是内生变量。也许研究人员遇到的最常见的内生性来源来自被忽略的变量偏差。当试图确定某个变量 *X、*对我们的因变量 *Y、*的影响,而不包括另一个与 X 和 Y 都相关的解释变量 W 时,就会出现省略变量偏差
例如,吸烟和饮酒都是可能与预期寿命负相关的习惯。然而,吸烟和饮酒本身也可能是相互关联的。因此,如果我们创建一个模型来估计吸烟对预期寿命的影响,而不包括饮酒习惯,我们可能会夸大吸烟对预期寿命的影响。忽略在我们的模型中包括酒精消费会给我们一个有偏差的吸烟回归系数。
省略变量偏差有一个相对简单的解决方案——在模型中包含省略变量。然而,有时克服统计偏差变得更加困难。考虑省略变量偏差的情况,我们只是没有省略变量的数据。另一个常见的问题是同时因果偏差的情况——在这种情况下, X 影响 Y 但 Y 也会增加*X。*经济学家在试图确定警方资助对犯罪的影响时会遇到这个问题。更多的警察理论上应该会降低犯罪率,但是更高的犯罪率可能会吸引更多的警察资金来打击这些犯罪率。在这两种情况下,运行简单的线性回归将会得到有偏差的回归系数。我们没有理由相信我们在这些模型中观察到的系数反映了 X 对 Y. 影响的真实性质
这就是工具变量发挥作用的地方。
工具变量是一个允许我们规避内生性问题的变量(我们称之为 Z )。当我们实施工具变量回归时,我们主要关注内生变量,并将其分解为两个组成部分。第一部分是有问题的内生部分。这是变量中产生统计偏差的部分。在省略的可变偏差示例中,这是与酒精消耗相关的部分。在同步因果关系的例子中,这是高犯罪率导致警察经费增加的部分。
然而,第二部分是我们感兴趣测量的变量的不成问题的外生部分。如果我们能够捕捉到这部分变量的影响,我们就可以获得无偏回归系数,从而估计 X 对 y 的影响的真实性质
工具变量,或简称为工具,允许我们分离出内生变量中没有问题的部分。如果工具变量 Z,满足两个特定标准,那么工具变量回归将给出我们的回归系数的估计值,该估计值比简单的普通最小二乘法的估计值更接近其真值。
这两个标准如下:
- **工具相关性:**工具变量, *Z,*必须与我们的内生变量, X 相关。数学上表示,corr ( Z , X ) ≠ 0。直觉上,如果 Z 与 X 不相关,我们将无法根据我们的工具变量捕捉到 X 的任何变化。
- 工具外生性或**工具有效性:**工具变量 Z 必须是外生性的——与误差项不相关。数学上表示,corr ( Z ,u) = 0。如果 Z 与误差项相关,那么我们将违反高斯-马尔可夫定理,并且无法确定 X 和 y 之间的无偏且一致的回归系数。
一个合适的工具满足这个描述:变量 Z 与变量 Y 仅通过其与 x的相关性相关
为了进一步理解什么是好的工具,让我们看另一个经济研究的例子。劳动经济学家通常对学校教育的回报感兴趣,即多上一年学对个人工资的影响。然而,有几个混淆和不可观察的因素会影响一个人多上一年学的决定。一个不可观察的因素是天生的能力。先天能力水平较高的人更有可能多上一年学。因为多上一年学与能力相关,而我们无法在 OLS 模型中恰当地包含能力,所以受教育年限将是一个内生变量。
因此,像 Card (1995)这样的论文利用地理数据来估计学校教育-收入关系的真实性质。地理上靠近大学使得多上一年学更有可能。这满足了仪器相关性条件。与此同时,个人的父母通常决定住在哪里。只要地理邻近性与能力不相关,这可以通过控制父母教育和收入等可观察因素来实现,那么邻近性变量应该是外生的。这满足了仪器的有效性条件。在学校教育回报的背景下,地理上的邻近性与终生收入之间的关联仅仅通过它对获得额外教育的可能性的积极影响。这是一份相关和有效的文书的要素。
IV 回归是如何工作的?
OLS 回归只是简单地将 Y 回归到 X 上,而 IV 回归包含两步过程(这就是 IV 回归的另一个名称是两步最小二乘法的原因)。第一步,我们在 z 上回归 x。这给了我们一组预测值,X̂.在第二步中,我们对预测值 X̂.回归 y 下面是 IV 回归过程的演示。
第一步)
x̂=π0+π1(z)+v
其中 v 是误差项。
步骤 2)
Y = ß0+ß1(X̂)+ ε
其中,ε是误差项。
因为我们的工具变量必须是外生的,所以由 X 对 Z 的回归预测的 X̂值也将是外生的。因此,这第一步移除了我们解释变量中有问题的内生部分, X. 这允许我们在 X̂ 上回归 Y ,而不必担心内生性。
让我们暂时回到菲利普和休厄尔·赖特身上来。父子二人组意识到,要估计黄油的需求曲线,他们需要在保持需求不变的同时,隔离供应的变化。通过在供给变动时保持需求不变,莱特兄弟知道他们能够估计出各种供给曲线与需求曲线相交的所有点。为了做到这一点,莱特兄弟使用降雨作为他们的工具。父子二人推断,降雨量少会减少放牧,从而降低黄油产量。这将影响供应,但降雨应该不会对黄油需求产生任何有意义的影响。作为一种工具,降雨量满足相关条件——降雨量与黄油价格正相关。并且降雨满足外生条件——降雨只通过供给影响黄油价格。
菲利普和休厄尔·赖特为众多经济学家和聪明的分析师提供了有价值的见解。通过实施 IV 回归,使用改变供给而不是需求的变量作为工具,我们可以获得需求曲线的一致估计。我们现在准备带着真实数据的例子艰难前行。
数据
好吧,完全公开——我没有任何关于智能脚链或智能手表或智能任何东西的数据来分析这篇文章。然而,我所拥有的是 1960 年至 1999 年间肉鸡价格的一个非常令人兴奋的数据集。很有趣,我知道。然而,用于估计需求的 IV 回归原理适用于任何产品。
这些数据来自 Epple 和 McCallum (2006 年)。该数据集由鸡肉和牛肉价格、鸡饲料价格、人口、人均收入和通货膨胀的年度面板数据组成。
下面是对数数量和对数鸡肉价格的散点图(价格在 y 轴上,这是经济学的惯例)。
正如我们所看到的,这种关系似乎与需求曲线的方向相反,因为数量在价格上增加。因此,这个问题需要一个工具变量的方法。
识别需求曲线
正如我前面所讨论的,确定需求曲线需要保持需求不变,同时检测供给曲线的变化。正如前面 1700 左右的话应该已经说得很清楚了,这样做的关键是工具变量回归。具体来说,我们需要确定一个外生变量,它只通过对供应的影响来影响价格(T2)。
对于莱特兄弟和他们基于黄油的分析,选择的工具变量是降雨量。低降雨量减少了奶牛可以吃草的土地面积,从而降低了黄油产量。然而,没有理由相信降雨对黄油的需求有任何有意义的影响。对于我们的鸡肉或智能脚链数据,我们需要确定具有类似影响的变量——导致供应变化,同时对鸡肉/智能脚链需求没有任何影响。
寻找相关变量的第一个地方是输入。在我们的鸡肉数据中,我们有关于玉米和鸡饲料的信息。这些投入的价格通过它们对生产产出的成本的影响而与产出产品的价格相关联。当鸡饲料价格下降时,鸡肉价格也会下降,因为生产鸡肉变得更便宜。更便宜的投入意味着最终产品可以更便宜地生产。利润最大化的公司有动机生产更多,增加数量,同时降低价格。投入价格的变化导致供给曲线移动,使我们能够描绘出需求曲线。
这些原则很容易转移到智能脚链上——只需用钢铁、硅、铝和原油等类似投入材料的价格取代“鸡饲料”价格。
部署工具变量方法的第一步是回归我们工具的价格。大多数统计软件包都有计算 IV 回归的功能,而不必手动计算第一步 OLS 回归。然而,计算第一步回归允许我们诊断我们使用的工具是否是解决我们问题的有效工具。
一个重要的考虑是我们的工具是否相关。回想一下,当 corr(X,Z) ≠为 0 时,仪器是相关的。如果一个工具不能解释内生 X 变量的大部分变化,那么它就被认为是“弱工具”无需深究(更多信息可在此处找到),使用弱工具的 IV 回归结果可以创建偏向 OLS 方向的参数估计。不理想。然而,一个简单的经验法则是,只要第一阶段回归的 F 统计量超过 10,就可以认为一个工具是而不是弱的。因此,我们将手动计算回归的第一阶段。
我们的 IV 回归方法的第一步是在工具上回归对数鸡肉价格:对数鸡饲料价格和对数玉米价格,这样我们的方程看起来像:
ln(鸡价)= 0+1 * ln(鸡饲料)+2 * ln(玉米价格)。
下面是使用 jtools 包产生的第一阶段回归输出。287.95 的 F 统计量大大超过了判断我们的工具是否相关的经验法则。而且,调整后的-R 值 0.94 告诉我们,这些工具非常适合鸡肉价格。
因此,我们可以满怀信心地进入第二阶段。
在 IV 回归的第二阶段,我们根据内生自变量和任何其他外生自变量的预测值来回归因变量。在这种情况下,因变量是对数数量,预测变量是对数鸡肉价格。为了确保我们的回归系数不会因遗漏变量而有偏差,我们将包括额外的预测因素,如收入、通货膨胀、人口和牛肉价格。牛肉价格包括在内,因为它们代表了鸡肉的替代品。我们的模型被指定为:
ln(Q)= 0+1 * ln(Pred。小鸡价格)+2 * ln(Y)+3(CPI)+4(牛肉价格)+4(人口)
其中 Q 代表数量,Y 代表收入,CPI 代表消费价格指数。
所以让我们估计一下我们的模型。下面是一组 OLS 回归的模型估计,其中 I 没有实现工具变量。
正如我们在“仅价格”模型中看到的,价格对数量的影响是积极的,这与我们对需求曲线关系的预期相矛盾。然而,当我们在随后的两个模型中添加控制变量时,价格系数的符号会发生变化,以符合我们的预期。
然而,在咨询了菲利普和休厄尔·赖特之后,我们太聪明了,不会被这些有偏见的回归系数所迷惑。相反,我们需要实现我们的工具变量方法。当我们这样做时,用玉米和鸡饲料价格作为我们的工具,我们将获得无偏回归系数。以下是工具变量模型估计,控制变量与上述相同。
有趣的是,在没有额外控制的第一个模型中,价格变量的符号是错误的,就像上面的传统 ols 模型一样。这表明在价量关系中存在显著的遗漏变量偏差。然而,OLS 模型和 IV 模型之间的关键区别在于“全模型”规格。
OLS 模型表明,价格上涨 1%会导致鸡肉需求量下降 0.42%。然而,IV 模型表明,价格上涨 1%会导致鸡肉需求量下降 0.54%。IV 模型的结果表明 OLS 对价格-数量关系的估计偏向于零,因此低估了价格对数量的影响。
智能脚链行业的应用
在我们的例子中,有偏差的 OLS 结果和无偏差的 IV 结果之间的差异非常显著,尤其是对于快节奏鸡肉生产行业的数据科学家而言。对于你在智能脚链行业的朋友来说,这种差异也非常重要。
对于商业应用,对潜在市场的准确评估是很重要的。你的朋友希望将智能脚链引入可穿戴设备行业,他需要彻底了解消费者在决定购买哪种可穿戴产品时如何评估价格。如果你向你的朋友提供 OLS 结果,而不是我们上面例子中的 IV 结果,他会低估消费者对价格的敏感度。因此,他可能会把他的产品以过高的价格推向市场,超出消费者的支付能力。
因此,让我们回顾一下估算准确需求曲线的关键步骤。
步骤 1)识别您的乐器
回想一下,价格是在供给曲线和需求曲线的交叉点上确定的。正如 Philip 和 Sewall Wright 认识到的,我们可以通过保持需求不变,利用供给曲线的变化,并确定交点来描绘需求曲线。从统计学上来说,我们可以通过在 IV 回归过程中使用供应转移器作为工具来实现这一点。作为工具包括的关键变量是影响生产成本的变量,如投入材料的成本。在技术部门,这种投入可能包括硅、钴和铝。在肉类产品中,这些投入可能是玉米、小麦或农民为牲畜购买的其他商品的价格。在任何情况下,我们都需要批判性地思考,在我们感兴趣分析的任何市场中,是什么影响了生产商品的成本,然后在我们的模型中使用这些变量作为工具。
第二步)检查你的仪器
回想一下我们的两个条件:工具相关性和工具外生性。这些可以总结为一句话-Z 变量应该只通过它与 X 变量的关系来影响 Y 变量。就需求曲线而言,该工具应该只通过对供给曲线的影响来影响价格。也就是说,工具的变化不应对需求产生任何影响。这最后一部分与仪器的外生性有关,通常不是一个可测试的条件。这意味着,我们需要利用我们的行业专业知识和直觉来确定我们的工具是否只是按照预期转移供应。
在菲利普·赖特的问题中,降雨可以持久地影响需求和供给。更高的降雨量可能会阻止市场上的人离开舒适的小屋去买黄油。然而,利用我们的直觉,我们可以得出结论,这种关系可能很小,很难观察到,或者不存在。然而,要记住的重要一点是,我们必须批判性地思考我们的工具是否满足这两个必要条件。
步骤 3)考虑省略的变量和模型规格
正如联立方程被证明是确定需求曲线的一个问题一样,省略变量也是一个问题。正如我之前讨论的,省略变量会在我们的模型中引起统计偏差,这就是为什么使用控制变量很重要,即使在 IV 模型中也是如此。在估计需求曲线时,收入是一个关键变量。收入是需求转移因素——随着收入的增加,消费者倾向于以同样的价格要求更多的产品。对于市场分析师来说,了解消费者的收入和他们以一定价格购买产品的意愿之间的关系是一条关键信息。正如我们在上面的例子中看到的,包括收入和替代商品的价格等变量可以显著地改变回归系数,使其接近无偏的真实系数值。因此,我们应该努力追求并包括任何我们认为可能改变需求曲线的变量,作为我们模型中的外生变量。
此外,理解模型规范也很重要。两种最常见的规格是线性需求曲线和对数需求曲线。关于实现哪个规范的决定很大程度上取决于哪个解释更适合数据。在线性需求曲线中,价格每增加一个单位,需求量就会减少-1。同时,根据对数需求曲线,价格上涨百分之一会减少百分之一的需求量。在任何情况下,我们都可以通过估计两个模型来测试哪个模型更好地拟合数据——一个模型中的数量和价格是对数转换的,另一个不是——并比较拟合优度度量,如 R。
第四步走向世界
一旦您确定了潜在的工具,审查了它们的外来性和相关性,并考虑了您的模型规范,您就可以部署工具变量回归了。无论你是一家正在制定定价策略的初创公司,还是一家试图更好地了解你的客户群的老牌公司,工具变量都可以在你的数据科学武器库中扮演 工具 角色。
使用地理空间数据的实时供求差距
分析这些差距是弥补差距和优化机组经济性的第一步
今天,每个人都使用谷歌地图导航到任何地方。同样,为什么每个公司都不应该有自己的地图来了解其资产(人、自行车、滑板车、汽车、设备、产品)在哪里,以及它们应该在哪里?
“哪里”的问题。
如果你是一家在地面上有移动资产的公司,这些资产连接到互联网,并始终有一个唯一的位置——大约有 80%的数据有这个空间成分!
但是,我们都知道在 excel 表格中查看位置数据是没有用的。
为了理解纬度,你需要能够在地图上可视化它们,理解“它们从哪里来”,识别你的业务指标的空间模式,以及它们如何在一个城市和城市内的不同部门之间变化。
一件有趣的轶事!
电子商务(服装)公司最重要的问题之一是欺诈和滥用折扣。在绘制他们的数据时,他们发现即使是欺诈也有空间模式!
大多数案件发生在大学周边地区,这意味着可能有学生滥用优惠券代码。
是经济学 101!
在空间模式的基础上更进一步,可视化您的位置数据也有助于您分析您的供需缺口以运行各种空间模型。
这个流行语,供需! 定义因组织而异。对于 Grab 来说,单个供应单位是在线且空闲的司机,单个需求单位是查询乘车费用的用户。对于 Airbnb ,供应单位是一个 Airbnb 单位。
优步
如果你是一家超本地/拼车/酒店公司,你的目标应该始终是确保订购送货/服务/乘车的用户与最接近他们的司机/送货/服务合作伙伴相匹配,从而在最短的时间内弥合差距。换句话说,
供需匹配是您业务的核心和灵魂。
弥补这些差距必然会带来更多的单位收入,从而提高用户的效率和体验。
您可以实施计划措施以在高需求区域产生供应,或者检查假设情景以增加高供应区域的需求!
现在你知道了这些差距在哪里,你会怎么做?
为您的合作伙伴提供更多$$$价值!
动态定价
让这些数据具有可操作性并弥合差距的一个简单方法是将你的“过剩供应”导向高需求领域。
像 Grab、Swiggy这样的公司已经建立了合作伙伴应用程序,显示需求区域的热图。他们根据收取的费用“激励”合作伙伴。
如果你对优步的飙升定价感兴趣,你可以点击这里:
位置智能弥合供需差距
towardsdatascience.com](/how-location-data-helps-uber-decide-surge-in-price-7796ec9c8fba)
例如,在高需求时期,优步在其基础定价上增加了一个乘数,以确保司机涌入该地区赚取更多的钱,而负担得起的乘客可以乘坐,而其他人可以等到票价下降。
有道理,对吧?司机或合作伙伴不应该根据他们的直觉来估计他们空闲时要去哪里。那些动作背后应该有真实的数字,真实的地图做后盾!
事实证明,这在天气恶劣、交通繁忙、高峰时间或像除夕或排灯节这样的特殊事件时非常有效!
引诱你的潜在客户!
在拼车/拼车公司的情况下,偏离骑车人的原始路线是不太可能的。既然供给不能被篡改,那救市就有需求!
你可以向那些低需求地区的客户发送有针对性的促销信息——提供优惠和折扣来吸引他们。
每当你的供需比低于某个阈值时,将所有低需求区域聚集起来,并发送自动促销。尝试和构思,总结出在哪些地方、哪些类型的顾客身上有效的方法。
如果你想了解更多关于地理营销的信息,请查看:
你是一家希望识别回头客的打车公司,还是一家希望接触到……
blog.locale.ai](https://blog.locale.ai/things-you-need-to-know-about-geomarketing-in-2020/)
精心挑选下一条路线!
供需缺口也有助于确定新配送中心的位置,或将一个仓库分成多个中心,或将所有中心集中到一个公共位置。
了解您当前的订单是如何聚集的大有帮助!聚类基本上是指使用一定的分类标准将大量数据分成更小的组。
根据可以更有效地联系到您的客户的位置,可以轻松确定位置。
如果你的模式更像是班车服务,那么当你的路线确定后,你也可以进行同样的练习——确定你的取货点应该在哪里,或者应该采用哪组新路线!
阿扎韦亚
动需求玩神!
需求预测在跨公司的数据科学活动中非常常见。然而,这些模型不包含“位置”元素。
如果贵公司处理自行车、自行车等资产的分配。的情况下,不仅应根据历史供需缺口优化位置,还应根据固定时间间隔内该地区的预测需求量优化位置。
例如,优步知道什么时候、哪一天、哪个地区的需求量最大。他们对一个城市的过去数据进行 3-4 周的处理,然后根据一天中的每个小时和一周中的每一天进一步深入特定的中心/口袋。
夺取
Grab 走得更远——它在骑手应用程序上有一个旅行趋势小部件,供骑手了解未来的预测需求。其目的是鼓励对时间不敏感的乘客选择晚点乘车,为有更紧急需求的乘客服务。
对于一家拥有仓库的超本地公司来说,了解和预测需求有助于在城市的不同配送中心储备不同的产品。
即使是一线城市也有表现得像三线城市的口袋。需求预测是棘手的,虽然它与您的历史数据有很大关系,但它也涉及到在您的模型中使用外部数据源,如天气、交通等,以使您的模型更加精确和准确。
画画比较好的推荐!
爱彼迎(美国短租平台)
根据这篇 Airbnb 文章,
如果你没有基于位置的动态定价,你只是把大量的钱留在桌面上。
酒店公司有固定的供应或占用。这里的需求是季节性因素。即使在一个城市内,在一个吸引人的季节,需求也会根据分行所在的社区或位置而变化。
供需缺口有助于你设计好的推荐和定价策略。
底线
毕竟,在超本地和打车领域,你的最大目标是确保你的用户在他们需要的时间和地点尽可能快和早地获得乘车服务,同时为你的乘客提供优质服务,为你的合作伙伴提供更好的生计。
在一天中的不同时段进行基于位置的精细定价、促销和分配可以证明非常有利可图!
在未来几年,你的成功很大程度上要归功于能够处理数据,预测客户想要什么,他们何时想要,通过什么渠道,最重要的是,他们希望在哪里可以获得。
如果不将空间环境添加到您的算法中,您最终会将所有这些操作决策留给猜测。
在locale . ai,我们的使命是为每一家收集位置数据的公司带来与优步和 Grab 相同水平的粒度分析。
我们使用一个由 颗粒 六边形网格 组成的系统来做这件事,我们把它当作最小的地理单元。这充当了在位置环境中工作的每个算法、分析和服务的基础。
要了解我们的工作,请查看:
是什么让实时位置数据的分析与众不同?
towardsdatascience.com](/a-product-for-movement-analytics-using-geospatial-data-2aa95b18d693)
毕竟,每个公司都需要自己的谷歌地图。
如果你想进一步钻研,可以在LinkedIn或Twitter上与我取得联系。原来贴 在这里。**
收敛支持向量分类器和逻辑回归
我将展示一个逻辑回归的决策边界何时收敛到 SVC 的决策边界的例子(从左上到右下的图解),如这里在逻辑成本函数中减少正则化参数的步骤所示(C 是正则化的逆)。
介绍
支持向量分类器(SVC)和逻辑回归(LR)可以对齐到它们可以是完全相同的东西的程度。理解 SVC 和 LR 何时完全相同将有助于直观地了解它们到底有什么不同。
逻辑回归(LR)是一种使用 sigmoid 函数的概率分类模型,而支持向量分类器(SVC)是一种更具几何性的方法,可以最大限度地提高每类的利润率。它们的相似之处在于,它们都可以用决策边界来划分特征空间。我经常听到关于这两种机器学习算法之间差异的问题,对此的答案总是集中在 LR 中 log-odds 广义线性模型的精确细节以及 SVC 的最大边际超平面、软边际和硬边际上。
**我觉得看相反的情况很有用:**LR 和 SVC 什么时候完全一样?!
**答案:**当专门使用具有二元结果预测器的二元特征、没有正则化的 LR 模型和具有线性核的 SVC 时。
让我们简单回顾一下 LR 和 SVC,然后举例说明这些决策界限可以完全相同。
逻辑回归
让我们举一个例子,使用癫痫发作的样子(符号学)和我们在大脑扫描中发现的东西,尝试确定癫痫发作是来自大脑中的颞叶还是其他地方(颞外)。
**特征:**癫痫发作时会发生什么,例如手臂抖动或拨弄手指(符号学)以及脑部扫描异常,称为海马硬化(HS)(所有特征都是二元的)
目标预测因子:癫痫发作来自颞叶吗?(二进制)
图 1:逻辑回归总结
逻辑回归是一个分类模型,尽管它的名字。基本思想是给模型一组输入 x,它可以是多维的,并得到一个概率,如图 1 的右图所示。当我们希望二进制目标的概率在 0 和 1 之间时,这可能是有用的,而不是线性回归(图 1 的左图)。如果我们重新排列上面的 sigmoid 函数并求解 x,我们会得到 logit 函数(也称为 log-odds ),这是一个清晰的广义线性模型(图 1 中的底部方程)。
LR 是在该模型中寻找最佳(θ)系数,从而通过梯度下降将总误差(成本函数)降至最低(图 2):
图 2: LR 成本函数使用颞侧与颞外癫痫病灶作为目标预测因子。左边的图像用 cost = -y.log(p(x)) — (1-y)表示。log(1-p(x))。其中 y 是真正的二进制标签。右图显示了使用系数偏导数的梯度下降。
向成本函数添加正则化参数(1/C)(乘以系数的平方和):
等式 1:LR 的 L2 正则化的成本函数。L2 意味着θ系数是平方的。y 是真正的二进制标签。y’是模型预测的标签概率:p(x)。
Sklearn 有一个 LogisticRegression() 分类器,默认的正则化参数是 penalty=L2 和 C=1。这个术语惩罚过度拟合。不幸的是,在下面的特殊情况下,这也可能导致拟合不足,从而导致交叉验证性能变差。但是当这种规范化被移除时,对于下面的特殊情况,我们将看到它合并成与 SVC 相同的模型。
线性支持向量分类器
图 3:左边的线性决策边界。右图显示了从 SVC 优化得到的最大硬边界超平面。图片来自https://towards data science . com/SVM-feature-selection-and-kernels-840781 C1 a6 c
LR 将绘制一个单一的边界来分隔时间和时间外癫痫发作,而线性 SVC 首先找到两个支持向量,然后找到最佳超平面(图 3 的右图)。为了优化这一点,SVC 使用了一种带有这些约束的拉格朗日乘数方法:边缘超平面必须尽可能多地分离数据,并且两者之间的距离必须最大化。通过 svm 中确定核的方法。SVC(kernel=‘linear’) ,我们有一个线性 SVM。
当 SVC 和 LR 收敛时
现在让我们以 2D 二元特征空间分类问题为例:
图 4:当线性 SVC 和 LR 收敛时
SVC 模型的边缘线重合,因为右下角和左上角的所有数据都重合。因此,SVC 的最大裕量为零,其决策边界为黄色(图 4)。
LR 有一个正则化参数 1/C,它与对数损失成本函数(图 2,等式 1)相结合,可以降低系数的幅度(图 1 ),导致蓝色决策边界。通过将 C 设置为一个大的数字,从而将正则化减少到零,两者的决策边界(蓝色和黄色)开始收敛。
这将适用于大多数二进制特征数据。接下来是 Python 代码,因此您可以复制图 4 中的可视化的更简单版本,其中决策边界完全收敛。
代码和结论:
可以在 GitHub 上找到一些简单的代码,用于合成基本数据,并拟合 SVC 和 LR(有和没有正则化),以便我们可以看到它们的决策边界收敛和重合:
https://github.com/thenineteen/ML_intuition
最终结果:
图 5:(上图)SVC 决策边界。(下图)LR 决策边界作为其成本函数中的正则化参数被减少。
摘要
线性核 SVC 和逻辑回归可以产生相同的决策边界,即完全相同的模型,因此可以产生完全相同的性能指标,尽管使用完全不同的方法。当所有特征都是二进制的,目标变量是二进制的,并且 LR 的正则化参数设置为零时,会发生这种情况。
支持向量机
更简单直观的解释
支持向量机学习算法简称 SVM,常用于分类问题。这给了我们一个更好的方法来理解一个非线性的决策边界。
让我们首先考虑一个场景,在这个场景中,我们可能想要对以下数据进行分类—
用于说明简单 SVM 模型的数据集。
很明显,可以使用简单的线性判定边界将数据分成各自的类别。然而,有多个这样的决策界限可以用来区分这两个类别。事实上,有无限多的线性决策边界可以用来区分红色和蓝色类别。考虑以下决策界限—
可用于数据分类的可能决策界限。
- 左边的一个太接近蓝色类,暗示“每当有疑问时,将该点分类为红色”。
- 中间图形中的决策边界更接近红色类。接近红色类别的判定边界意味着,如果模型将一个点分类为红色,那么如果它将同一个点分类为蓝色,那么它对其判定更有把握,从而遵循“每当有疑问时将该点分类为蓝色”。此外,直觉告诉我们可以做得比完全直线的决策边界更好。
- 在最后一张图中,决策边界靠近红色和蓝色类的实例。
从上面的讨论中,我们可以得出结论,我们想要一个决策边界,它不要太靠近这两个类中的任何一个。为了帮助我们找到这样一条线,我们使用了 SVM。
支持向量机学习算法集中在两类中彼此接近的那些点上。这个想法是,如果一个分类器在分类具有挑战性的点方面做得很好,它很可能在数据上表现得更好。SVM 通过从这两个被称为支持向量的类中查找最近的点来做到这一点。一旦 SVM 找到了它的支持向量,它将试图找到一条距离这些点最远的线。在两点的情况下,垂直平分线是等距的线,因此离两点的距离最大。任何其他线都会比另一条线更靠近一个点。
我们还可以说,给定支持向量和多条线,我们将选择距离所有支持向量尽可能大的那条线作为我们的决策边界。
支持向量和超平面说明了 SVM 模型。
因此,SVM 试图找到一个超平面,将数据分为两类,同时试图最大化超平面和类的支持向量之间的距离。
n 维空间中的超平面是该空间的 n-1 维子集。它把空间分成两个独立的部分。在 1 维空间的情况下,点是超平面,在 2 维空间的情况下,线是超平面,在 3 维空间的情况下,平面是超平面,依此类推。
在实际场景中,数据并不像拟合线性决策边界那样简单。看一下下面的数据集——
用于 SVM 模型的数据集。
具有非线性决策边界的数据集。
对于数据集来说,使用直线作为决策边界绝对不是一个好的选择。
这里的解决方案是将我们的二维数据转换成一个更高的三维数据,从而使其可分离。让我们添加第三维度 z 作为 z=xy.*
这里应用的变换将一个二维数据集映射到一个更高的三维数据集以找到一个最佳超平面。这些变换被称为 SVM 的**内核技巧。**在内核技巧中,使用一个函数将数据映射到更高维度,以便数据变得可分离,并找到决策边界。
将数据转换到更高的平面。
观察到,通过应用核,蓝色类的所有点都被限制在 x-y 平面上,绿色类的所有点都被提升到 x-y-z 空间,从而给我们一个平面作为我们的最优超平面。
为了简单起见,让我们假设 z=1 是最佳决策边界。然而,SVM 将输出一个超平面,使得它与任一类的支持向量的距离最大。
变换数据上的超平面。
我们通过使用转换 z=xy* 将我们的 2D 数据映射到 3D 数据。现在我们将把决策边界 z=1 从 3D 空间映射到 2D 空间。这给了我们 xy=1。这就是 SVM 变换数据并输出决策边界的方式。*
映射的决策边界。
线性、径向基滤波器、多项式、Sigmoid 和拉普拉斯是几种常用的 SVM 核。
内核的详细讨论超出了本文的范围。然而,让我们简要地讨论一下 SVM 模型的两个基本参数
规范化
正则化参数解决了这样一个问题,您希望在多大程度上避免对训练数据进行错误分类。值越高,训练数据的错误分类就越少。然而,模型可能会过度拟合。在 sklearn 中用 C 表示。
左图:较小的 C 值给出了简单的广义边界。右图:C 值越大,边界越倾向于过度拟合。
微克
Gamma 决定将多少个样本作为支持向量。较小的值意味着只有更接近可能的超平面的实例将用于进一步拟合它。然而,大的值意味着在拟合超平面时也使用远离超平面的实例。
左图:Gamma 值越小,决策边界周围的实例数量越少。右图:gamma 值越大,意味着在拟合决策边界时包含的实例数量越多。
乍一看,你可能会认为 SVM 类似于逻辑回归,但是最优超平面由 SVM 中的支持向量控制,而不是逻辑回归中考虑的所有数据点。此外,逻辑回归遵循统计方法并输出概率,然而 SVM 是由几何方法支持的。SVM 旨在通过最大化支持向量之间的距离来输出最优超平面,从而降低错误率。
建议从逻辑回归开始,然后用线性核进行 SVM。在跟踪所选性能指标的同时,可以进一步尝试其他内核,如 RBF。
这是一个将癌症分为恶性或良性的例子。该示例使用具有线性核的 SVM,并使用准确度作为性能度量。请随意尝试不同的内核,并试验模型的超级参数。
基于支持向量机的癌症分类
colab.research.google.com](https://colab.research.google.com/drive/1WfnJQ4z3tXVst7ZJxVjGBCtDHNeRdwPE?usp=sharing)
SVM 已在以下文件中详细讨论过—
[## 1.4.支持向量机-sci kit-学习 0.23.2 文档
在高维空间有效。在维数大于…的情况下仍然有效
scikit-learn.org](https://scikit-learn.org/stable/modules/svm.html)
我希望这篇文章能帮助你对 SVM 背后的直觉和相关参数如核、正则化和伽玛有一个公平的理解。
支持向量机
对 SVM 模式的深入探究
在这篇文章中,我们将讨论使用支持向量机(SVM)作为分类模型。我们将从探索其背后的思想开始,将这个思想转化为一个数学问题,并使用二次规划(QP)来解决它。
先从分析模型背后的直觉开始。线性分类算法的目标是将输入空间划分为由不同类别标记的区域。这样,我们可以根据任何新数据点所属的区域来预测它的类别。不同的统计模型在如何找到这个决策边界上存在分歧,在本帖中,我们将讨论 SVM 使用的策略。
下面我们有一个包含两个类的数据集。这里我们展示了由线 1 和线 2 表示的两个决策边界。很容易看出,有许多其他线可以以所有观察值都被正确分类的方式划分输入空间——事实上,有无限多条线。
那么 SVM 是如何选择路线的呢?主要有两个思路。注意点 A 离线 1 有多远。根据线 1 定义的决策边界,我们似乎可以直观地得出这样的结论:预测点 A 属于圆类比预测点 b 属于圆类更有把握。SVM 旨在最大化其在训练集中的预测可信度。还要注意,有许多点非常靠近第 2 行:这意味着对决策边界参数的任何调整都可能导致不正确地预测其中一些点的类别。这两个想法结合起来形成了 SVM 背后的直觉。
注意:在这篇文章中,你会看到超平面这个词的使用。超平面只是一个比其周围空间少一个维度的子集的花哨名称,SVM 决策边界就是这种情况。这意味着,如果输入空间在ℝᵖ,则决策边界具有(p-1)维。例如,在下图中,输入空间位于ℝ,因此 SVM 决策边界是一维的:一条线。
作者图片
利润
SVM 是一个线性分类模型。对于输出 y ∈ {-1,1},我们可以将假设函数写成输入的线性组合:
我们预测:
直觉上,假设值离零越远,我们对自己的预测就越有信心。如果 h(x) = 10,我们比 h(x) = 0.1 时更有信心预测 y=1。
这可能会导致这样的想法,即我们希望找到参数( w ,b),当 y⁽ⁱ⁾ = 1 时,该参数将最大化 h 的值,而当 y⁽ⁱ⁾ = -1 时,该参数将最小化 h 的值。换句话说,我们可能倾向于最大化功能边际 γ̂:
但这有一个问题:注意预测的类如何只依赖于 h 的符号。这意味着我们可以缩放参数,例如( w ,b) → (10 w ,10b),而不改变预测的类。这会将 h 的值缩放 10 倍,并给出一个错误的想法,即我们的模型对其预测有 10 倍的信心。
这就是几何余量概念的由来。几何余量 γ̂被定义为第 I 次观察到判定边界的距离。与功能裕度不同,该度量对于参数的缩放是不变的。毕竟 w ᵀ x + b = 0 定义的超平面和 10wᵀx+10b = 0 定义的超平面是一模一样的。
SVM 寻找离每个类最近的成员尽可能远的超平面。看下面的图,我们可以看到 P₁和 P₂是每个班级最接近的观测值。SVM 判决边界与 P₁和 P₂等距,即 d₁ = d₂.最后也是最重要的一点是,在对训练集中的每个观察值进行正确分类的所有决策边界中,支持向量机具有最大的最小距离 d₂).min(d₁
换句话说,如果我们定义γ =最小γ⁽ⁱ⁾,SVM 寻找具有最大γ值的超平面。
SVM 旨在最大化最小几何余量。
作者图片
在继续之前,我们需要谈论一件处理 SVM 时非常重要的事情:特征缩放。由于 SVM 优化的目标是基于几何距离,具有非常不同的缩放比例的轴使模型倾向于具有最大值的方向。
例如,在下图中,我们可以看到,在缩放要素之前,SVM 会寻找一个决策边界,以使距离矢量 d₁具有尽可能大的垂直分量。这就是为什么我们应该在拟合 SVM 之前应用要素缩放。
在拟合 SVM 之前,请始终缩放要素
作者图片
非线性分类
正如我们之前所说,SVM 是一个线性模型,这意味着它擅长在数据中寻找线性关系。但是正如你所想象的,大多数真实世界的数据集不是线性的。虽然我们不能改变 SVM 本身的性质,但我们可以改变输入模型的内容。让我们看看为什么以及如何帮助。
下图很好地说明了更改输入如何帮助 SVM 模型建立非线性关系。在左边,数据显然不是线性可分的,也就是说,我们找不到一个点,它的右边是一个类,而左边是另一个类。
但是,让我们看看当我们向这个数据集添加一个额外的特征时会发生什么:即,每个观察到点(0)的距离。这意味着在原始输入空间上由(-3)定义的点现在由对(-3,3)表示;类似地,由(5)表示的点变成(5,5)。我们正在将输入空间从一维重新映射到二维。正如您在右图中看到的,这个强大而简单的技巧使数据在ℝ中可以线性分离,因此更适合 SVM。
我们可以通过对原始特征应用非线性变换来避开模型的线性限制。
作者图片
实现这一思想的一种常见方式是向训练集添加更高次的多项式。下图显示了一个具有两个要素(x₂x₁)的数据集,该数据集在ℝ显然不是线性可分的。
我们需要以一种数据变得线性可分的方式来转换输入(不要忘记在之后缩放它!).我们将添加三次多项式特征,重新映射从ℝ到ℝ ⁰的输入空间,使得(x₁,x₂)变成(1,x₁,x₂,x₁x₂,x₁,x,x。不幸的是,我们看不到很酷的 10 维图,所以我们满足于用原始特征来表示 2D。请注意,要对新数据点进行预测,我们需要在将其输入 SVM 之前应用相同的多项式变换。
作者图片
另一种解决 SVM 线性限制的方法是使用相似性度量,它是量化两个数据点之间相似性的简单函数。最常见的相似性函数之一是高斯径向基函数 (RBF),其定义为:
我们可以选择几个标志点,并将输入重新映射到包含到每个标志点的距离的向量。因此,如果我们有三个标志点( l ₁、 l ₂、 l ₃),并且我们正在使用径向基函数相似度函数ϕ,那么原本由 x 表示的观察结果就变成了(ϕ( x 、 l ₁)、ϕ( x 、 l ₂)、ε(x、)
但是我们如何挑选数据点作为地标呢?一种策略是只选择训练集中的每一点。这显然不能很好地扩展,因为我们为每个新的观察值创建一个额外的特征,这样一个具有 500 个观察值和三个特征的训练集就变成了一个具有 500 个观察值和 500 个特征的训练集(假设我们丢弃了原始特征)。
在这篇文章的后面,我们将介绍一种以更加优雅和高效的方式实现这个想法的方法。现在,我们可以在下面看到这个概念的一个更简单的实现,使用训练集中的每个观察值作为一个标志,以及它如何影响 SVM。
作者图片
模型背后的数学原理
如前所述,SVM 是一个线性分类模型,我们可以将其假设函数写成输入的线性组合:
我们预测:
现在是时候将寻找最大几何余量的 SVM 目标转化为一个数学问题了。给定一个点 x ⁽ⁱ⁾,它到由 w ᵀ x + b = 0 定义的决策边界的距离是多少?嗯,我们知道 w 是这个超平面的法向量,也就是说它垂直于平面。而如果 w 是法向量,那么 w /|| w ||就是垂直于平面的单位向量。
作者图片
现在让γ是从 x 到超平面的距离——我们可以说x-γ*(T24)w/| |w| |)落在超平面上(在上图中用 p 表示)。最后由于 p 是超平面上的向量,这意味着它必须满足超平面的方程 w ᵀ p + b = 0。这给了我们下面的方程组:
而如果我们求解γ,我们发现一个点 x ⁽ⁱ⁾到 SVM 判决边界的距离由γ⁽ⁱ⁾=(wᵀx⁽ⁱ⁾+b)/| |w| |给出。注意这个等式只对与法向量 w 方向相同的点有效,因为我们从 x 中减去了它;否则我们将不得不添加γ w /w ||。稍微调整一下,我们可以将广义的几何余量 γ写成:
我们可以再次验证,如前所述,几何余量对参数的缩放是不变的。还要注意,如果|| w ||= 1,那么几何余量和功能余量是相同的。
硬边际 SVM
硬边界 SVM 假设数据是线性可分的,它强制模型对训练集上的每个观察值进行正确分类。如果第 I 个观察值的功能裕度大于零,则该观察值被正确分类:
还记得我们说过预测的类只依赖于 h 的符号,几何边界对于参数的缩放是不变的吗?这意味着我们可以在不影响模型的情况下向参数添加任意约束。对于任何拟合的 SVM,我们可以施加一个约束,如|| w || = 1,然后我们需要做的就是重新调整其参数,模型保持不变。
我们可以使用这个结果以及当|| w || = 1 时几何和功能裕度相等的事实来写出硬裕度 SVM 的优化目标:
第一个约束迫使每个观察值被正确分类。第二个约束迫使γ不仅是功能裕度的下限,而且是几何裕度的下限。这正是硬边际 SVM 的优化目标:
为了在没有任何错误分类的情况下最大化最小几何余量
如果我们有工具来解决这个约束优化问题,我们就可以到此为止了。但是不幸的是,|| w || = 1 是一个非凸约束,所以我们需要做一些修改来使这个问题变得更加友好。
我们可以通过将目标除以范数来摆脱讨厌的约束——如果γ是功能裕度的下界,那么γ/|| w ||是几何裕度的下界。所以我们的新问题可以写成:
现在是目标函数非凸,但是我们又近了一步。记住最后一次,我们可以给参数添加任意约束。因此,我们可以设置γ = 1,同样,这不会改变模型,只需重新调整参数即可满足要求。
我们新的优化目标是最大化 1/|| w ||,这相当于最小化|| w ||。最后,由于|| w ||在 0 处不可微,我们将最小化(1/2)*|| w ||取而代之,它的导数就是 w 。优化算法在可微分函数上工作得更好。
最后,我们将硬边际 SVM 优化目标定义为:
既然我们已经以一种可以有效估计的方式定义了 SVM 优化目标(一个二次目标和线性约束),我们就可以编写代码来解决它了。通读下面的代码(或者在这个 repo 中)或者尝试使用 SciPy 的最小化函数自己实现它。如果你阅读文档,你会看到要最小化的目标函数以一个列表作为参数,所以我们将把 w 和 b 放在同一个向量中。它还需要一个 constraints 参数,该参数可以表示一个等式(约束函数必须返回 0)或一个不等式(约束函数必须返回非负值)。我们将把广义约束重写为 y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b)——1≥0,以符合 SciPy 的规范。
现在我们可以看到我们模型与 SKLearn 的实现进行对比时的表现。不算太差!
作者图片
软利润 SVM
硬边际 SVM 有两个非常重要的局限性:
-它只对线性可分数据有效;
-对异常值非常敏感。
如果我们想要更多的灵活性,我们需要为模型引入一种允许错误分类的方法,我们使用松弛变量的概念来实现这一点。每个观察都有自己的松弛度量,它代表了特定数据点违反边界的程度。我们的新约束可以改写为:y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b)≥1-ϵ⁽ⁱ⁾.请注意,我们现在需要为每个观察值估计一个额外的变量。
现在只有一个问题。如果我们仍然试图最小化|| w ||,我们可以简单地让ϵ → ∞并且确保新的约束将被遵守。我们需要新的目标函数来表示软利润 SVM 冲突目标:我们仍然希望利润尽可能宽,我们希望松弛变量尽可能小,以防止利润违规。这为我们提供了软边缘 SVM 分类器目标:
我们引入了一个新的超参数 C,让我们控制冲突目标之间的权衡。随着 c 的增长,它迫使优化算法为ϵ.寻找更小的值下面你可以看到不同的 C 值是如何影响 SVM 的。
作者图片
在我们对软利润 SVM 的实现进行编码之前,我们需要引入一个新概念。
二次规划
二次规划(QP)是一个解决特定类型的优化问题的系统,其中目标函数是二次的,约束是线性的-正是我们一直在处理的问题类型!
不同的算法如何解决 QP 优化超出了本文的范围。相反,我们将专注于推导 SVM 优化问题,该问题由像 libsvm 这样的库来解决。
给定 QP 问题定义为:
我们需要做的就是找出代表 SVM 问题的 P,q,G,h 的值,然后我们可以使用一个求解器(稍后我们将使用 cvxopt 来得到参数的估计值。
注意,我们需要重写 SVM 约束来适应 QP 约束的形状。它们将是:
因此,对于软余量 SVM ,让 X 是由 m×(n+1)矩阵(m 个观察值和 n 个特征)表示的训练集,用 1 列向量为截距进行左填充。然后 SVM·QP 问题被定义为:
为什么由于我们需要估计 b, w ,和 ϵ ,QP 问题的向量 u 就变成了【b,w₁,…,wₙ,ε₁,…,εₘ].然后:
-p矩阵用恒等式把 w 弄回来,用零抵消 b 和ϵ;
——q向量将 b 和 w 乘以 0,将 ϵ 乘以 c,这样我们就有了优化目标的第二部分——∑ᵢ₌₁ᵐε⁽ⁱ⁾;
——k矩阵给我们-y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b ),它右边的-Iₘ减去εᵢ. G 矩阵的底行代表-ϵ⁽ⁱ⁾≤0;
-最后 h 向量有-1 和 0,就像约束条件一样(≤ -1 和≤ 0)。
现在我们所要做的就是把这些值给 QP 软件,我们就有了软边际 SVM 的参数。你可以查看下面实现这个想法的代码(或者在这个 repo 里)。我们已经取得了很大进展,但我们还没有完成。
还记得我们在本文前面讨论过相似性度量作为解决 SVM 线性限制的一种方法吗?事实证明,对于这个问题,有一个比明确地将每个观察作为一个标志并转换输入更优雅和有效的解决方案。
我们接下来将讨论拉格朗日对偶。这将导致我们对软边际 SVM 优化问题的不同表示(称为其对偶形式)。我们将能够以更有效的方式在输入空间中应用非线性变换,使得 SVM 即使在非常高的维度中也能很好地工作。
拉格朗日对偶
拉格朗日方法的总体思想是通过将约束移入目标函数,将约束优化问题(原始形式)转化为无约束优化问题(对偶形式)。将 SVM 最优化问题写成对偶形式有两个主要原因:
-
内核技巧:SVM 的训练和预测将仅通过它们的内积依赖于数据点。这个强大的结果允许我们对训练集应用任何变换(甚至将其重新映射到无限维空间!)只要我们能计算出那个内积;
-
支持向量:预测将仅依赖于训练集上称为支持向量的几个点。对偶形式给了我们一个简单的方法来识别这些点。
希望在这篇文章结束时,这些原因会变得清晰。现在,让我们暂时把 SVM 放在一边,考虑一下如何解决下面这样的约束优化问题。
为简单起见,我们将分析一个只有不等式约束的问题(如 SVM),但结果可以很容易地扩展到等式。重写这个问题的一种方法是使用无限阶跃函数 g(u):
然后,我们可以将原问题改写为:
请注意,如果任何原始约束不满足,我们用正无穷项惩罚 J(x)。并且当所有的约束条件都满足时,那么 g(fᵢ(x)) = 0 ∀ i 和 J(x) = f₀(x).所以最小化 J(x)等价于原问题,但是我们还不能真正解决这个新的优化——阶跃函数既不连续也不可微。
如果我们用一个像 g(u) = α u 这样的线性函数代替无限阶跃函数会怎么样?如果我们强制α ≥ 0,那么当不满足约束时(α u > 0),惩罚至少是在正确的方向上。此外,g 现在是连续可微的:更适合于最优化问题。
因此,如果我们在上面的 J(x)方程中代入新的线性惩罚,我们得到 x 和α的函数,称为拉格朗日函数:
注意,如果我们最大化关于α的拉格朗日函数,我们会得到 j(x):αᵢ= 0 如果 fᵢ(x) < 0 (since αᵢ ≤ 0) and αᵢ → ∞ if fᵢ(x) > 0。所以原来的问题现在可以写成拉格朗日函数:
最后,由于对于任何函数 f,最小最大 f ≥最大最小 f,我们有:
minₓ L(x, α )称为对偶函数,它的最大值是原(原始)优化问题的一个下界。此外,可以证明,在某些条件下:
这样我们就可以解决对偶问题,而不是原始问题。幸运的是,SVM 满足这些条件(特别是 Slater 条件):目标函数和约束函数是凸的且连续可微的。
由于 SVM 满足正则性条件,如果原始问题有解,它必然在满足卡鲁什-库恩-塔克(KKT)条件的拉格朗日函数的驻点(x* ,α *)之间。此外,在 SVM(凸可微)的情况下,KKT 条件不仅是必要的,而且是最优性的充分条件。
KKT 条件是什么?如果原问题有解 x* ,α 是对偶问题的解,那么 L(x ,α ) = f₀(x).那么必须满足 KKT 条件:
SVM 双重形态
下面我们有软边际 SVM 优化问题:
如果我们将这两个约束重写为:
拉格朗日量可以写成:
记住,由于 SVM 最优化问题满足一些特殊的条件(目标和约束函数是凸的和连续可微的),拉格朗日函数的任何解都是原始最优化的解,并且它必须满足 KKT 条件。从 KKT 我们有:
从双重可行性条件,我们有:
因此,基于 b 上的偏导数,基于 w 上的梯度,以及基于对偶可行性条件,我们导出对偶问题的约束:
我们快到了!回到拉格朗日函数,让我们用从 w 梯度得到的结果(w=∑ᵢ₌₁ᵐα⁽ⁱ⁾y⁽ⁱ⁾x⁽ⁱ⁾)代入拉格朗日和的最后一项:
让
然后把所有东西都代入拉格朗日方程:
最后,由于∑α⁽ⁱ⁾y⁽ⁱ⁾=λ⁽ⁱ⁾-α⁽ⁱ⁾= 0,我们终于有了软裕度 SVM 的对偶形式(在乘以-1 并将最大化转化为最小化问题之后):
现在我们只需要从拉格朗日乘数 α 中取回权重矢量 w 和偏差项 b。对于权重,我们可以简单地使用这样的事实:w =α⁽ⁱ⁾y⁽ⁱ⁾x ⁽ⁱ⁾.注意,我们只关心α⁽ⁱ⁾为 0 的指数。
为了让 b 回来,让我们最后看一下 KKT 的条件——从免费的宽松,我们有:
从第一个等式中,我们看到,当αᵢ* > 0 时,第 I 个约束必须有效,也就是说,它必须满足等式:
基于λ⁽ⁱ⁾ ϵ⁽ⁱ⁾ = 0 和 C - α⁽ⁱ⁾ - λ⁽ⁱ⁾ = 0,我们得到 0 < α⁽ⁱ⁾ < C => λ⁽ⁱ⁾ > 0 => ϵ⁽ⁱ⁾ = 0。我们将对训练样本的这个子集进行平均,以计算 b。如果 0 < α⁽ⁱ⁾ < C, we have:
where M is the subset of the training sample that satisfy 0 < α⁽ⁱ⁾ < C and nₘ is its size. Last, to make a prediction about a new observation x ,我们需要计算:
这是一个漫长的旅程,但我们刚刚导出了流行的库 libsvm 解决的精确优化问题!稍后我们将使用一个标准的 QP 求解器,但是如果你对他们如何更有效地求解它感兴趣,你可以看看这篇论文,其中他们展示了 libsvm 库所基于的序列最小优化(SMO)算法。
双重形式结论
有两个非常重要的结果需要强调:
1.SVM 预测仅依赖于α⁽ⁱ⁾ > 0 的观测值。这些点代表训练样本的一个非常特殊的子集,称为支持向量。
一旦模型被训练,我们通常可以丢弃大部分训练集,只保留支持向量。
2.在训练和进行预测的过程中,我们只能通过内积来依赖数据点(x⁽ⁱ⁾)ᵀ x⁽ʲ⁾.这个美丽而重要的结果就是允许内核欺骗。
内核
在非线性分类部分,我们讨论了在拟合 SVM 之前对原始要素应用非线性变换。这个简单的技巧允许线性 SVM 捕捉数据中的非线性关系。
例如,假设ϕ是一个特征映射函数,如下所示:
我们希望使用ϕ( x ,而不是使用原始特征(x₁、x₂)来拟合 SVM。我们已经看到,当使用对偶形式时,SVM 仅通过它们的内积依赖于数据点。这意味着我们只需要计算:
这就是内核的用武之地。在机器学习中,内核是仅基于原始向量( x ⁽ⁱ⁾、 x ⁽ʲ⁾).)计算内积ϕ(x⁽ⁱ⁾)ᵀϕ(x⁽ʲ⁾的函数不需要计算变换ϕ( x )甚至不需要知道它!
让我们看一个简单的例子。设ϕ( x 为如下定义的特征映射函数:
那么两个向量a=【a₁,a₂】和 b =[b₁,b₂】在应用变换ϕ后的内积为:
这是一个非常有趣的结果。变换向量的内积等于原始向量的内积的平方。您根本不需要应用转换!
如果我们要对此数据进行 SVM 拟合,我们可以简单地取原始向量的内积的平方,事实上,我们将为转换后的向量拟合一个模型。
内核的另一个例子是我们之前提到的 RBF 函数。原来,嵌入在 RBF 核中的转换将每个训练实例映射到一个无限维空间。
这是内核如何有用的一个完美例子:它允许 SVM 在一个高(或无限!)维特征空间,而只需要计算原始向量的核函数。
这都回避了一个问题:每个函数都可以用作内核吗?可以证明,如果一个函数 K( a , b )满足几个条件(默瑟条件,那么存在一个函数ϕ,它将 a 和 b 映射到另一个空间,这样:K( a ,b)= ϕ(a)ᵀϕ(b)。然后我们可以用 k 作为核,因为我们知道ϕ存在。所以只要一个函数满足 Mercer 的条件,就可以作为内核使用。
最后一点注意:如果我们使用核,我们通常不能从拉格朗日乘数得到权重向量。发生这种情况是因为,在转换输入后,w=∑ᵢα⁽ⁱ⁾y⁽ⁱ⁾ϕ(x⁽ⁱ⁾)和ϕ不一定是已知的。但是这没有问题,因为在其他地方我们只需要计算ϕ(x⁽ⁱ⁾)ϕ(x⁽ʲ⁾)= k(x⁽ⁱ⁾, x ⁽ʲ⁾).
最终代码
既然我们知道了如何推导和解决 SVM 优化问题,我们就可以理解它背后的代码了。原始代码可在本报告中获得——唯一的变化是通过对 0 < α⁽ⁱ⁾ < C(而不是 0 < α⁽ⁱ⁾).)的实例进行平均来估计 b
就是这样!我希望你和我一样通过写这篇文章学到了很多。你可以在这里找到一个笔记本来玩我们在这个帖子中编码的三个模型。
参考文献
——【http://cs229.stanford.edu/notes/cs229-notes3.pdf
-https://www-cs . Stanford . edu/people/David Knowles/la grangian _ duality . pdf
——https://gist.github.com/mblondel/586753
——Christopher Bishop——模式识别和机器学习(链接)
- Géron,aurélien-使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习,第二版(链接)
支持向量机—解释
详细的理论解释和代码示例
支持向量机(SVM)是一种监督机器学习算法,主要用于分类任务。它也适用于回归任务。
监督学习算法试图使用特征(自变量)来预测目标(因变量)。根据目标变量的特征,它可以是分类(离散目标变量)或回归(连续目标变量)任务。预测是通过将自变量映射到因变量的映射函数来完成的。SVM 的映射函数是一个判定边界,它区分两个或多个类别。如何绘制或确定决策边界是 SVM 算法中最关键的部分。
在创建决策边界之前,在 n 维空间中绘制每个观察值(或数据点)。“n”是使用的特征数量。例如,如果我们使用“长度”和“宽度”来对不同的“细胞”进行分类,则观察值被绘制在二维空间中,而决策边界是一条线。
二维空间中的 SVM
这是一个非常简单的例子,只是为了说明 SVM 的想法。你在现实生活中遇到这样的任务的可能性极小。在这种情况下,决策边界是一条线。如果我们使用 3 个特征,则判定边界是三维空间中的平面。如果我们使用 3 个以上的特征,决策边界就变成了一个超平面,很难可视化。
支持向量
主要动机是绘制一个决策边界,使支持向量的距离最大化。以到支持向量的距离最大化的方式绘制决策边界。如果决策边界离支持向量太近,会对噪声高度敏感,不能很好地泛化。即使独立变量非常小的变化也可能导致错误分类。
决策边界的错误选择
数据点并不总是线性可分的,如上图所示。在这些情况下,SVM 使用了核技巧,它测量高维空间中数据点的相似性(或接近度),以使它们线性可分。下面的图更容易理解。如你所见,二维空间中两个不同的类不能用一条线分开。使用内核技巧可以使它们线性分离:
在我详细讲述内核技巧之前,我想提一下 c 参数和 T2 的概念。
软余量 SVM 和 C 参数
真实数据是有噪声的,并且在大多数情况下不是线性可分的。一个标准的 SVM 试图将所有的正面和负面例子(即两个不同的类)分开,不允许任何点被错误分类。这导致过度拟合模型,或者在某些情况下,无法使用标准 SVM 找到决策边界。过度拟合的 SVM 在训练集上取得了很高的精度,但在新的、以前未见过的样本上表现不佳。为了解决这个问题,1995 年,Cortes 和 Vapnik 提出了“软边界”SVM 的概念,它允许一些例子被错误分类或位于决策边界的错误一侧。软边际 SVM 通常会产生更好通用模型。当确定决策边界时,软裕度 SVM 试图解决具有以下目标的优化问题:
- 增加决策边界到类别(或支持向量)的距离
- 最大化训练集中正确分类的点数
这两个目标之间显然有所取舍。决策边界可能必须非常接近一个特定类,才能正确标记训练集中的所有数据点。然而,在这种情况下,测试数据集的准确性可能会较低,因为决策边界对噪声和独立变量的微小变化过于敏感。另一方面,决策边界可能被放置在尽可能远的每个类,代价是一些错误分类的异常。这种权衡由 c 参数控制。
C 参数为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。
内核函数
核函数是一种相似性度量。输入是原始特征,输出是新特征空间中的相似性度量。这里的相似性是指接近的程度。将数据点实际转换到高维特征空间是一个代价很高的操作。该算法实际上并不将数据点转换到新的高维特征空间。内核化 SVM 根据高维特征空间中的相似性度量来计算决策边界,而不实际进行变换。我想这也是为什么又叫内核绝招的原因吧。
scikit-learn 中可用的核函数有线性、多项式、径向基函数(RBF)和 sigmoid。
RBF(或高斯 RBF)是一种广泛使用的核函数。它由伽马参数定义,该参数基本上控制单个训练点的影响距离。低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。对于高 gamma 值,这些点需要彼此非常接近,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。以下可视化更好地解释了这个概念:
随着灰度系数的降低,分隔不同类别的区域变得更加一般化。非常大的 gamma 值会导致太特定的类别区域(过度拟合)。
伽玛与 C 参数
对于线性核,我们只需要优化 c 参数。然而,如果我们想要使用 RBF 核,则需要同时优化 c 和γ参数。如果γ很大,c 的影响可以忽略不计。如果 gamma 很小,c 对模型的影响就像它对线性模型的影响一样。c 和γ的典型值如下。然而,根据应用可能存在特定的最佳值:
0.0001 < gamma < 10
0.1 < c < 100
对于 SVM 来说,记住输入数据需要归一化以使要素具有相同的比例和兼容性是非常重要的。
SVM 的利与弊
优点:
- 在维数大于样本数的情况下有效
- 当找到决策边界时,它使用训练点的子集而不是所有点,因此它是内存高效的
- 多才多艺,它提供了不同类型的内核函数,也可以创建自定义的内核函数
缺点:
- 需要小心规范化
- 难以理解预测背后的逻辑
- 当我们拥有大型数据集时,训练时间会增加,这会对性能产生负面影响
sci kit-学习示例
我想通过一个简单的案例来展示语法和应该遵循的步骤。让我们从导入我们需要的库开始:
Scikit-learn 还提供实践数据集。乳腺癌数据集适合我们的任务:
我们需要使用 scikit-learn 的 train_test_split 函数来拆分用于训练和测试的数据集。然后,我使用线性核创建用于分类的支持向量机对象,并使用训练数据集对其进行训练:
使用我们训练的模型,我们可以预测测试数据集中的目标变量,并测量模型的准确性:
95%是一个相当不错的准确率,但是对于分类任务,还有另外两个衡量标准:精度和召回。这些术语非常重要,可以成为另一篇文章的主题。事实上,它们在谷歌的机器学习速成班中有明确的解释。
这是一个简单的线性可分的任务。对于不可线性分离的情况,我们可以使用 SVC 的核参数(即 kernel = 'rbf ')来使用核。我没有指定 c 参数,所以使用了默认值(c=1)。为了找到最佳参数,我们可以使用 scikit-learn 的 GridSearchCV() 函数。
感谢您的阅读。如果您有任何反馈,请告诉我。
我的其他帖子
参考
- https://datafrakankur . com/machine-learning-kernel-functions-3d-visualization/
- https://www . science direct . com/science/article/pii/b 9780128113189000272
- https://datatuts.com/svm-parameter-tuning/
- https://jakevdp . github . io/python datascience handbook/05.07-support-vector-machines . html
支持向量机(SVM)用于异常检测
用于异常检测的小数据科学
一级 SVM:简介
作为机器学习的专家或新手,你可能听说过支持向量机(SVM)——一种经常被引用并用于分类问题的监督机器学习算法。支持向量机使用多维空间中的超平面来将一类观察值与另一类分离。自然,SVM 用于解决多类分类问题。
然而,SVM 也越来越多地用于一类问题,其中所有数据都属于一个类。在这种情况下,算法被训练来学习什么是“正常的”,以便当显示新数据时,算法可以识别它是否应该属于该组。如果不是,新数据被标记为异常或异常。要了解更多关于一级 SVM 的信息,请查看 Roemer Vlasveld 的这篇长文。
最后要提的是,如果你熟悉sklearn
库,你会注意到有一个算法是专门为所谓的“新奇检测”设计的。它的工作方式与我刚刚在使用一类 SVM 的异常检测中描述的方式类似。在我看来,只是上下文决定了是否称之为新奇检测或异常检测或类似的东西。
今天的文章是我的异常、异常值和欺诈检测算法系列的继续,并附有实际操作的示例代码。我之前的 7 篇文章谈到了异常检测领域中可用的不同工具和技术,如果您有兴趣了解它们,请访问以下链接:
下面是一个用 Python 编程语言编写的单类 SVM 的简单演示。请注意,我将异常值和异常值互换使用。
步骤 1:导入库
对于这个演示,我们需要三个核心库——数据处理库python
和numpy
,模型构建库sklearn
和可视化库matlotlib
。
# import libraries
import pandas as pd
from sklearn.svm import OneClassSVM
import matplotlib.pyplot as plt
from numpy import where
步骤 2:准备数据
我使用的是网上著名的虹膜数据集,所以你可以跟着练习,不用担心从哪里得到数据,如何清理这些数据。
# import data
data = pd.read_csv("[https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv](https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv)")# input data
df = data[["sepal_length", "sepal_width"]]
第三步:建模
与其他分类算法中的超参数调整不同,一类 SVM 使用 nu 作为超参数,用于定义数据的哪一部分应被归类为异常值。 nu = 0.03 表示算法会将 3%的数据指定为异常值。
# model specification
model = OneClassSVM(kernel = 'rbf', gamma = 0.001, nu = 0.03).fit(df)
第四步:预测
预测数据集将具有 1 或-1 值,其中-1 值是算法检测到的异常值。
# prediction
y_pred = model.predict(df)
y_pred
步骤 5:过滤异常
# filter outlier index
outlier_index = where(y_pred == -1) # filter outlier values
outlier_values = df.iloc[outlier_index]
outlier_values
步骤 6:可视化异常
# visualize outputs
plt.scatter(data["sepal_length"], df["sepal_width"])
plt.scatter(outlier_values["sepal_length"], outlier_values["sepal_width"], c = "r")
红色的数据点是异常值
摘要
在这篇文章中,我想温和地介绍一下单类 SVM——一种用于欺诈/异常值/异常检测的机器学习算法。我展示了一些简单的步骤来建立直觉,但是当然,现实世界的实现需要更多的实验来发现什么对特定的环境和行业有效,什么无效。
感谢你的关注,要了解更多关于我的工作,你可以在推特或 LinkedIn 上关注我
支持向量机和回归分析
如何在回归问题中使用支持向量机
来源:图片由作者创建—基于 Aurélien Géron 的“使用 Scikit-Learn 和 TensorFlow 进行机器学习”中的视觉模板
一个常见的误解是,支持向量机只在解决分类问题时有用。
使用支持向量机解决回归问题的目的是定义一个如上图所示的超平面,并在该超平面内尽可能多地拟合实例,同时限制边界违规。
以这种方式,以这种方式使用的 SVM 不同于分类任务,在分类任务中,目标是在两个单独的类之间拟合最大可能的超平面(同时还限制边界违反)。
事实上,支持向量机可以非常有效地处理回归建模。我们以酒店预订为例。
预测酒店顾客的平均每日房价
假设我们正在构建一个回归模型来预测酒店预订的平均每日价格(或客户平均每日支付的价格)。模型由以下特征构成:
- 取消(无论客户是否取消预订)
- 原产国
- 细分市场
- 存款类型
- 客户类型
- 所需的停车位
- 抵达周
请注意,还会为取消预订的客户填充 ADR 值—本例中的响应变量反映了如果客户继续预订将支付的 ADR。
Antonio、Almeida 和 Nunes (2016)的原始研究可从下面的参考资料部分获得。
模型结构
使用如上所述的特征,在训练集(H1)上训练和验证 SVM 模型,将预测与测试集(H2)上的实际 ADR 值进行比较。
该模型被训练如下:
>>> from sklearn.svm import LinearSVR
>>> svm_reg = LinearSVR(epsilon=1.5)
>>> svm_reg.fit(X_train, y_train)LinearSVR(C=1.0, dual=True, epsilon=1.5, fit_intercept=True,
intercept_scaling=1.0, loss='epsilon_insensitive', max_iter=1000,
random_state=None, tol=0.0001, verbose=0)>>> predictions = svm_reg.predict(X_val)
>>> predictionsarray([100.75090575, 109.08222631, 79.81544167, ..., 94.50700112,
55.65495607, 65.5248653 ])
现在,对测试集中的特征使用相同的模型来生成预测的 ADR 值:
bpred = svm_reg.predict(atest)
bpred
让我们在平均绝对误差(MAE)和均方根误差(RMSE)的基础上比较预测 ADR 和实际 ADR。
>>> mean_absolute_error(btest, bpred)
29.50931462735928>>> print('mse (sklearn): ', mean_squared_error(btest,bpred))
>>> math.sqrt(mean_squared_error(btest, bpred))
44.60420935095296
注意,SVM 对额外训练实例的敏感度由**ε(ϵ)**参数设置,即参数越高,额外训练实例对模型结果的影响越大。
在这种情况下,使用了大幅度的 1.5 。以下是使用 0.5 裕量时的模型性能。
>>> mean_absolute_error(btest, bpred)29.622491512816826>>> print('mse (sklearn): ', mean_squared_error(btest,bpred))
>>> math.sqrt(mean_squared_error(btest, bpred))44.7963000500928
我们可以看到,通过修改 ϵ 参数,MAE 或 RMSE 参数实际上没有变化。
也就是说,我们希望确保 SVM 模型不会过度拟合。具体来说,如果我们发现当 **ϵ = 0,**时达到最佳拟合,那么这可能是模型过度拟合的迹象。
这是我们设置ϵ = 0 时的结果。
- 美:31.86
- RMSE:47.65 英镑
鉴于当ϵ = 0 时,我们没有看到更高的精度,似乎没有任何证据表明过度拟合是我们模型中的一个问题——至少从这个角度看不是。
SVM 的性能与神经网络相比如何?
当使用相同的功能时,SVM 的性能精度与神经网络相比如何?
考虑以下神经网络配置:
>>> model = Sequential()
>>> model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='elu'))
>>> model.add(Dense(1669, activation='elu'))
>>> model.add(Dense(1, activation='linear'))
>>> model.summary()Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 8) 72
_________________________________________________________________
dense_1 (Dense) (None, 1669) 15021
_________________________________________________________________
dense_2 (Dense) (None, 1) 1670
=================================================================
Total params: 16,763
Trainable params: 16,763
Non-trainable params: 0
_________________________________________________________________
模型被训练跨越 30 个时期,批量大小为 150 :
>>> model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
>>> history=model.fit(X_train, y_train, epochs=30, batch_size=150, verbose=1, validation_split=0.2)
>>> predictions = model.predict(X_test)
在测试集上获得了以下 MAE 和 RMSE:
- 梅: 29.89
- RMSE:43.91 美元
我们观察到,当 SVM 模型的ϵ 设置为 1.5 时,MAE 和 RMSE 分别为 29.5 和 44.6。在这点上,SVM 在测试集上的预测精度与神经网络相当。
结论
一个常见的误解是,支持向量机只适合处理分类数据。
然而,我们在这个例子中已经看到,SVM 模型在预测神经网络的 ADR 值方面非常有效。
非常感谢您的阅读,并感谢任何问题或反馈。
本例的 Jupyter 笔记本和数据集可在 MGCodesandStats GitHub 存储库获得。其他相关参考资料如下。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
参考
- 安东尼奥、阿尔梅达、努内斯。酒店预订需求数据集
- Aurélien Géron:使用 Scikit-Learn 和 TensorFlow 进行机器学习
- ResearchGate:支持向量回归的回归问题中ε= 0 有什么问题?
- 走向数据科学:基于回归的神经网络——预测酒店的平均日房价
支持向量机解释
来自像素的图像。
了解关于支持向量机的一切
在本帖中,我们将 揭开发生在 SVM*身上的所有魔法,并讲述它们的一点历史 ,并阐明它们何时该用,何时不该用。*
我们将浏览支持向量机的理论和直觉 ,看到理解万物如何工作所必需的最少的数学量,而不深入细节。
言归正传!
1。简介
支持向量机或 SVMs 是一个广泛使用的机器学习模型家族,它可以解决许多 ML 问题*,如线性或非线性分类、回归,甚至异常值检测。*
话虽如此,最好的应用是在应用于小型或中型复杂数据集的分类时。贯穿本文,将会清楚为什么。
为了理解支持向量机是如何工作的,我们最好先研究一下线性支持向量机、硬边界和软边界分类。
2.线性 SVM 分类
假设我们有以下一组数据,只有两个特征(特征 1 和特征 2 ,代表两个不同的类别(A 类和B 类))。
我们数据的散点图
一个正常的线性分类器会试图画一条线,完美地分开我们的两类数据。但是,从下图可以看出,有很多行可以做到这一点。我们该选哪个?
使用线性分类器分离两类
之前的决策边界将训练数据完全分离,然而它们如此接近训练实例(红色和紫色的点,周围有黑色圆圈),以至于它们可能会对新数据*(图中的新样本)进行非常糟糕的概括。*
硬边界和软边界分类器
支持向量机分类器试图通过对模型拟合一条线来解决这个问题,该线试图最大化到最近训练实例(称为支持向量*)的距离,以便平行于决策边界线的余量尽可能宽。*
将决策边界想象成乡村道路的中心,将数据想象成树,道路的每一侧都有不同类型的树。支持向量机试图做的是找到尽可能宽的道路来分隔我们的两种树,这样我们就可以安全地开车穿过它,同时感到安全。它通过试图最大化利润来做到这一点。
如果我们现在考虑之前的数据集,对其拟合线性支持向量分类器(线性 SVC ),并绘制决策边界及其余量,我们会得到下图:
线性 SVC 的判定边界
在这种类型的 SVC 中,没有点被允许越过边界:我们正在谈论一个 硬边界分类器 。当一些点被允许穿过边缘线,允许我们适应更宽的街道时,我们谈论的是一个软边缘分类器*。*
有趣的是,对于这个硬边界分类器*,来说,拟合只取决于支持向量 的位置:向我们的训练数据添加不接触街道(但在正确的一侧)的点,将使决策边界和边界保持不变。*
边界由这些关键支持向量点完全定义或支持*,给它们和算法命名。 硬边界分类器 然而,只有当数据以线性方式完全可分时才起作用,并且对异常值也非常敏感。*
为了解决这个问题,我们进入了 软边界分类器 ,这是一种更加灵活的模型,它允许一些点穿过边界,这使我们在街道有多宽以及有多少边界违规*(位于街道内部或决策边界错误一侧的点)之间达成妥协。下图显示了一个线性软边距分类器。*
软边界分类器
在大多数 SVC 实现中,我们用模型(Scikit-Learn 中的 C)的超参数来控制它。此参数的值越低,意味着我们的利润越大,违反利润的情况也越多,因此模型更加灵活,可以更好地概括。通过减少 C,我们可以调整我们的模型,如果我们认为它可能是过度拟合。
增加 C 的值将我们引向硬边界分类器。下图显示了这种行为:随着 C 值的减小,街道变宽了,但是我们有更多的点穿过它。
当我们减小 c 的值时,SVC 分类器的裕量发生变化。
非线性 SVM 分类器
然而,大多数时候,数据集并不是线性可分的,软化我们的利润并不完全奏效。
使非线性可分离数据集成为可分离数据集的一种方法是包括从原始数据集中得到的附加特征,例如使用多项式特征或相似性特征技术,如 径向基函数 (RBF)。
下图显示了如何使用二次多项式将只有 1 个要素的数据集转换为 2 个要素的数据集,从而线性分离两个现有的类。
将一个非线性可分离的数据集转换成一个可以用二次多项式线性分离的数据集
这里的问题是,随着要素数量的增加,计算高次多项式要素的计算成本急剧增加,使得模型运行缓慢。
另一种使数据集可线性分离的方式是前面提到的**径向基函数 。下面的例子显示了我们如何将一个非线性可分的数据集转换成一个可以使用 RBF 轻松划分的数据集:
具有两个特征的两个不可分离类的散点图。
现在,如果在前面图像所示的数据集上,我们使用以原点为中心的径向基函数计算第三个特征、**,并且我们将这个新特征与前两个特征一起绘制,我们的数据集被转换成下面的数据集,它可以被新特征r上高度为 0.7 的水平面线性分隔。**
先前数据的表示,带有使用 RBF 计算的附加特征
然而,在前面的例子中,我们选择了一个点来集中我们的 RBF,这给了我们很好的结果,在大多数情况下这不是一件小事。大多数情况下所做的是使用原始特征计算从数据集中的每个点到所有其他数据点的径向基函数,并使用这些径向基函数计算的距离作为新特征。
这里的问题是,如果我们有一个大的训练集,计算所有这些特征是非常计算昂贵的。当试图使用线性 SVC 来分离非线性数据时,我们再次遇到问题。
在这些问题的解决方案中,支持向量机的真正力量在于:内核。
内核技巧
在前面的两个例子中,为了能够分离我们的数据,我们需要计算一个变换(一个多项式变换,和一个 RBF 相似性函数),正如我们所看到的,这是一个计算量非常大的过程。
机器学习中的内核是一个数学函数,它允许我们计算两个向量的变换的点积,而实际上不必计算变换本身。
下面的公式说明了内核背后的思想。
公式 1:向量 a 和 b 的核
*前面公式中的 K(a,b) 代表向量的核 a 和 b (一个随机核,后面我们会看到有很多不同的)。我们可以看到,这个内核等于 ϕ(a) 和 ϕ(b) *,的点积,其中 ϕ 表示作为参数提供给它的向量的特定变换(可以是多项式,也可以是 RBF 变换)。
为了理解这如何极大地简化了我们的问题,并且通过使用核,我们可以使用支持向量机来对非线性可分数据集进行分类,我们最好先看看支持向量机是如何被训练的。
训练 SVM:另一个优化问题
最后,训练一个 SVM 分类器,归结为解决一个优化问题,称为对偶问题*。SVM 像任何其他分类器一样进行预测:它获取输入向量 x ,将其乘以某个权重向量 w ,并添加一个偏差项 b ,如以下公式所示。*
公式 2:预测方程。
如果这个操作给出的结果大于某个阈值(在我们的例子中是 0),那么这个样本被分类为阳性实例(1)。如果它产生的结果低于阈值,那么它被归类为负实例(0)。
为了获得权重和偏差向量,我们必须解决一个优化问题,该问题试图最大化我们谈到的街道的利润,同时限制利润违规。从数学上来说,这被转化为找到满足某个模糊条件或松弛*(多少次以及有多严重的余量可以被越过)的权重向量的最小值。*
这个优化问题可以使用普通的 QP 求解器来解决,因为它是一个凸二次问题。这个问题解决的最终方程如下
公式 3:优化。
然而,公式 3 并不完全正确。 α 应该是大于或等于 0 ,对于每个不是支持向量的数据点取这个最后的值。
不要在意 t(i) 或 t(j) ,关于这个方程有两件重要的事情:一旦我们求解它并得到 α 的值,我们就可以计算权重和偏置向量。另一件要注意的事情是橙色虚线内的术语:两个训练实例的点积,我们必须对所有训练集重复这个术语。
***这就是我们之前谈到的内核技巧派上用场的地方:*如果我们使用任何类型的转换来转换我们的训练实例,使它们可以分离,我们将不得不计算每个训练实例上的转换,做点积……从计算的角度来看,这将是非常昂贵的。这显示在下面的公式中。
公式 4:对我们的数据计算变换,并用它们代替内核。
如果像上面一样,我们使用一个内核,那么我们不需要实际计算变换*。酷吧?让我们看看一些最流行的内核:*
一些最流行的内核。
请注意,对于我们应用了 d 次多项式变换的两个向量的点积,理论上我们会增加数据的 n 个特征,从而增加复杂性,我们可以使用内核来避免计算该变换,只需计算 (γaTb+r)d.
这就是支持向量机的魅力所在。我们可以训练它们并做出预测,这有利于对我们的数据进行运算,而不需要实际计算这些运算。
现在让我们结束吧,看看这些预测是如何做出的。
用 SVM 进行预测:支持向量
正如我们之前看到的,为了进行预测,我们必须计算权重向量和新数据点 x(n) 的点积,并添加一个偏差项。为此,如果我们将通过求解优化问题获得的 w 的值代入公式 2 的方程,我们得到:
公式 5:用 SVM 预测
现在,还记得我们怎么说 α 对于所有不是 支持向量的数据点都是 0 吗? 这意味着,为了进行预测,我们只需计算支持向量的核和我们的新数据点,并添加偏差项。牛逼吧?
内核和支持向量机再次展示了它们的魔力。最后,这里有一些使用支持向量机的实用技巧和诀窍。
其他提示和技巧:
- ***在拟合 SVM 之前标准化或规范化数据。*在训练 SVM 之前,应用某种缩放技术是很重要的。如果我们的特征具有非常不同的比例,我们的‘街道’将看起来非常怪异,并且我们的算法将不会很好地工作。
- 根据经验,在拟合 SVM 时,首先使用线性核,尤其是当训练集非常大或者它具有大量特征时。如果你对结果不满意,试试 RBF 核;它往往工作得很好。然后,如果你有稀疏的时间和计算能力,尝试另一种交叉验证的内核。
- 支持向量机也可用于回归和异常值检测。
- 然而,它们的最佳结果出现在用于复杂但较小数据集的分类任务时。
结论
仅此而已!我们已经了解了支持向量机背后的直觉,以及它们如何工作的一些数学知识。
关于机器学习和数据科学的更多资源,请查看以下资源库: 如何学习机器学习 !有关职业资源(工作、事件、技能测试),请访问AIgents.co——一个面向数据科学家的职业社区&机器学习工程师 。
保重,享受人工智能!
感谢阅读!
用 Python 例子解释支持向量机
如何在分类问题中使用支持向量机?
支持向量机(SVM)是一种有监督的机器学习技术。而且,即使它主要用于分类,它也可以应用于回归问题。
支持向量机定义了一个决策边界和一个最大间隔,将几乎所有的点分成两类。同时也为错误分类留下了空间。
支持向量机是对最大间隔算法的改进。它最大的优点是可以通过使用核函数来定义线性或非线性的决策边界。这使得它更适合于现实世界的问题,在现实世界中,数据并不总是可以用一条直线完全分离的。
分离超平面
SVM 的主要目标是定义一个超平面,将点分成两个不同的类。超平面也称为分离超平面或决策边界。
所以让我们从超平面开始。可视化超平面最简单的方法是考虑一个二维数据集。
将点完全分成两个不同类的超平面。
将会有无限数量的超平面将点分成两类。但是,由于我们在二维空间中工作,我们定义的任何超平面将总是具有(2–1)= 1 维。所以,我们可以用一条简单的回归线来表示超平面。
定义了决策边界后,我们现在可以根据点相对于决策边界的位置对点进行分类。
基于向量相对于决策边界的位置进行分类。
如果你在处理两个以上的维度,比如,你的特征向量 X 有两个以上的特征,你在分类向量,而不是点。
因此,概括地说,所有低于决策边界的向量都属于第 1 类,如果它们高于决策边界,则属于第 1 类。
使用余量增加预测可信度
我们使用训练数据来定义决策边界。但是测试集的预测质量如何呢?
如果一个向量远离决策边界,我们可以确信它的类别,即使模型有一些误差。但是,当我们对一个向量进行分类并且它非常接近决策边界时,会发生什么呢?我们如何确定分配哪个类?
为了解决这个问题,支持向量机还在决策边界周围画了一个边界。这个余量的目标是尽可能地将向量与决策边界分开。其背后的直觉是,一个保证金给我们更多的信心,我们的预测。因为向量距离决策边界至少有边缘的长度,所以分类过程中的模糊性更小。
使用最接近决策边界的向量来定义边缘的位置。这就是为什么位于页边空白顶部的向量是支持向量。
有了边缘作为缓冲,我们可以根据它们相对于边缘的位置对向量进行分类。其中 M 是页边距的宽度。
基于向量相对于边距的位置的分类。
一些错误分类的空间
边缘的增加提高了测试集中预测的质量,但是它假设类是完全可分的。
但是,在大多数现实世界的问题中,数据是杂乱的,并且通常不是完全可分的。
这就是为什么 SVM 和它之前的算法——支持向量分类器——有一个重要的共同特征。它允许算法出错,并将错误的类分配给一些向量。
支持向量分类器的决策边界和余量,以及相应的支持向量。
因此,SMV 没有试图将向量完全分成两类,而是进行了权衡。它允许一些向量落在边缘之内,并落在决策边界的错误侧。
支持向量机在学习过程中允许一些错误分类。因此,它们可以更好地对测试集中的大多数向量进行分类。
除了利润,我们的模型现在还包括松弛变量,这将告诉我们两件事:
- 如果测试观察分类错误,
- 其中观察相对于决策边界和裕度。
时差变量可能有三个值:
并且误分类向量的数量受参数 c 的限制
基于向量相对于边际的位置的分类,包括松弛变量。
我们可以看到这个模型捕捉到了更多的细微差别。但是它仍然建立在最大间隔分类器之上。例如,如果您将参数 C 设置为零,这意味着它允许零松弛变量,它会退回到最大间隔分类器。因此,你有一个线性的决策边界,一个尽可能大的边界,在它里面不允许有任何向量。
松弛变量的数量越多,允许的错误分类向量的数量就越多。这会影响边距的宽度,因为选择了不同的支持向量。它还控制模型的偏差-方差权衡。
松弛变量的数量如何控制偏差-方差权衡。
有一些错误分类的空间使得 SMVs 更加灵活,但是它只适用于有限的问题集。
在大多数现实世界的问题中,很难用线性决策边界将数据分成两类。即使有出错的余地。
支持向量机
支持向量机共享它之前的边缘分类器的特征。它们的独特之处在于它们如何定义线性和非线性决策边界。
为了支持非线性决策边界,SMV 使用函数将原始特征空间变换到新的空间,可以表示那些非线性关系。
例如,假设您用其特征的平方来增加原始特征空间。在这种情况下,您对原始要素集应用了二次函数来创建这些要素的平方。现在你有了你的原始特征和它们的二次版本,在这个扩充的空间里。因此,隐含地,有一个映射这两个特征空间的函数。
用原始特征的二次版本扩充特征空间。
如果你试图在原始特征空间中画出判定边界,它具有二次形状。但是如果你在增强的特征空间中训练你的模型,你会发现一个线性的决策边界来区分这两个类。因为它是一种变换,所以原始特征空间中的二次边界对应于扩充特征空间中的线性边界。
定义这些转换的函数被称为内核。它们作为训练集和测试集中观察值之间的相似性函数。
使用线性核(右)和多项式核(左)确定 SVM 的边界和余量,以及相应的支持向量。
只要你有一个用内积表示的模型,你就可以插入一个内核函数。例如,线性核与对特征空间应用线性变换是一样的。在这种情况下,它与支持向量分类器相同,因为决策边界是线性的。
使用多项式核,您可以将原始特征空间投影到多项式特征空间中。因此,用高阶多项式来定义分隔类别的判定边界。
核的使用是支持向量分类器区别于支持向量机的地方。它们为解决更复杂的问题提供了可能性。但是增加特征空间可能意味着额外的计算需求。因为,对于足够大的特征空间,拟合一个模型在时间和资源方面都可能是昂贵的。
尽管增加了特征空间,内核还是带来了显著的优势。支持向量机实际上并不计算每个观察值到扩充空间的变换。他们使用一个技巧,而不是在增广空间中计算观察值的内积,这在计算上要便宜得多。这就是所谓的内核把戏。
最后,支持向量机做出两个重要假设:
- 数据是线性可分的。即使线性边界在扩充的特征空间中。
- 该模型使用内积表示,因此可以使用内核。
让我们看几个例子
为了查看支持向量机的运行情况,我生成了一个随机数据集,并将其分成两个不同的类。下面是生成和绘制数据的代码片段。
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdef generate_random_dataset(size):
*""" Generate a random dataset and that follows a quadratic distribution
"""
* x = []
y = []
target = [] for i in range(size):
# class zero
x.append(np.round(random.uniform(0, 2.5), 1))
y.append(np.round(random.uniform(0, 20), 1))
target.append(0) # class one
x.append(np.round(random.uniform(1, 5), 2))
y.append(np.round(random.uniform(20, 25), 2))
target.append(1) x.append(np.round(random.uniform(3, 5), 2))
y.append(np.round(random.uniform(5, 25), 2))
target.append(1) df_x = pd.DataFrame(data=x)
df_y = pd.DataFrame(data=y)
df_target = pd.DataFrame(data=target) data_frame = pd.concat([df_x, df_y], ignore_index=True, axis=1)
data_frame = pd.concat([data_frame, df_target], ignore_index=True, axis=1) data_frame.columns = ['x', 'y', 'target']
return data_frame # Generate dataset
size = 100
dataset = generate_random_dataset(size)
features = dataset[['x', 'y']]
label = dataset['target']# Hold out 20% of the dataset for training
test_size = int(np.round(size * 0.2, 0))# Split dataset into training and testing sets
x_train = features[:-test_size].values
y_train = label[:-test_size].valuesx_test = features[-test_size:].values
y_test = label[-test_size:].values# Plotting the training set
fig, ax = plt.subplots(figsize=(12, 7))# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)# adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
ax.scatter(features[:-test_size]['x'], features[:-test_size]['y'], color="#8C7298")plt.show()
在进行任何分类之前,训练集是这样的。
随机训练集。
两组数据点之间有一点空隙。但是越靠近中心,越不清楚哪个数据点属于哪个类。
二次曲线可能是分离这些类的一个很好的候选。因此,让我们用二次多项式核来拟合 SVM。
from sklearn import svm
model = svm.SVC(kernel='poly', degree=2)
model.fit(x_train, y_train)
要查看拟合该模型的结果,我们可以绘制决策边界和边界以及数据集。
分类后的数据集,用圆圈标记决策边界(实线)、边界(虚线)和支持向量。
下面是绘制决策边界和边距的代码。
fig, ax = plt.subplots(figsize=(12, 7))# Removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)# Create grid to evaluate model
xx = np.linspace(-1, max(features['x']) + 1, len(x_train))
yy = np.linspace(0, max(features['y']) + 1, len(y_train))
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).Ttrain_size = len(features[:-test_size]['x'])# Assigning different colors to the classes
colors = y_train
colors = np.where(colors == 1, '#8C7298', '#4786D1')# Plot the dataset
ax.scatter(features[:-test_size]['x'], features[:-test_size]['y'], c=colors)# Get the separating hyperplane
Z = model.decision_function(xy).reshape(XX.shape)
# Draw the decision boundary and margins
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])# Highlight support vectors with a circle around them
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k')plt.show()
如果我们根据测试集计算这个模型的准确性,我们会得到一个很好的结果,假设数据集非常小并且是随机生成的。
具有二次多项式核的 SVM 模型的精度。
from sklearn.metrics import accuracy_score
predictions_poly = model.predict(x_test)
accuracy_poly = accuracy_score(y_test, predictions_poly)print("2nd degree polynomial Kernel\nAccuracy (normalized): " + str(accuracy_poly))
精确度不错,但是让我们看看更简单的方法是否能解决我们的问题。为了用线性核来拟合 SVM,我们只需要更新核参数。
model = svm.SVC(kernel='linear')
model.fit(x_train, y_train)
用我们之前的方法画出决策边界。
分类后的数据集,用圆圈标记决策边界(实线)、边界(虚线)和支持向量。
现在看起来页边空白内的点更少了,错误分类的点也更少了。计算该模型的精度,它比多项式核模型的精度略高。
线性核 SVM 模型的精度。
因此,对于这个问题,一个更简单的模型,一个线性核的 SVM,是最好的解决方案。
希望你喜欢这些例子,并且你对支持向量机有了更好的理解,以及它们可以应用于什么样的问题。
感谢阅读!