TowardsDataScience 博客中文翻译 2016~2018(七十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

深度学习的自定义损失函数:用 Keras 预测住宅价值

原文:https://towardsdatascience.com/custom-loss-functions-for-deep-learning-predicting-home-values-with-keras-for-r-532c9e098d1f?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: 4047259 at pixabay.com

我最近开始和 R 一起阅读“深度学习”,我对 R 对深度学习的支持印象深刻。书中介绍的一个用例是预测波士顿的房价,这是一个有趣的问题,因为房价可能会有很大的变化。这是一个机器学习问题,可能最适合经典方法,如 XGBoost,因为数据集是结构化的,而不是感知数据。然而,它也是一个数据集,深度学习提供了一个真正有用的能力,即编写新的损失函数的容易程度,这可能会提高预测模型的性能。这篇文章的目标是展示深度学习如何通过使用自定义损失函数来改善浅层学习问题。

[## 用 R 进行深度学习

使用 R 的深度学习介绍了使用强大的 Keras 库及其 R 语言的深度学习世界…

www.amazon.com](https://www.amazon.com/Deep-Learning-R-Francois-Chollet/dp/161729554X)

我在处理金融数据时遇到过几次的一个问题是,您经常需要构建预测模型,其中的输出值可能有很大的范围,跨越不同的数量级。例如,在预测房价时会发生这种情况,一些房屋的价值为 10 万美元,而其他房屋的价值为 1000 万美元。如果你在这些问题上使用标准的机器学习方法,如线性回归或随机森林,通常模型会过度拟合具有最高值的样本,以减少平均绝对误差等指标。但是,您实际需要的可能是用相似的权重处理样本,并使用相对误差等误差度量来降低用最大值拟合样本的重要性。

**# Standard approach to linear regression** fit <- lm(y ~ x1 + x2 + x3 + ... + x9, data=df)**# Linear regression with a log-log transformation** fit <- nls( log10(y) ~ log(x1*b1 + x2*b2 + ... + x9*b9), 
   data = df, start = list(b1=1, b2=1, ... , b9 = 1))

您实际上可以在 R 中使用诸如非线性最小二乘法( nls )之类的软件包显式地做到这一点。上面的代码示例显示了如何使用内置优化器构建线性回归模型,该优化器将对具有大标签值的样本进行加权,以及使用 nls 方法,该方法显示了如何对预测值和标签执行对数转换,这将给予样本相对相等的权重。第二种方法的问题是,您必须明确地说明如何使用模型中的特性,这就产生了一个特性工程问题。这种方法的另一个问题是,如果不编写自己的似然函数和优化器,它不能直接应用于其他算法,如随机森林。这是一个针对特定场景的,在该场景中,您希望将误差项排除在对数转换之外,而不是简单地将对数转换应用于标签和所有输入变量。

深度学习为处理这些类型的问题提供了一个优雅的解决方案,其中,您可以探索不同的内置和自定义损失函数,这些函数可以与提供的不同优化器一起使用,而不是编写自定义的可能性函数和优化器。这篇文章将展示如何在使用 Keras 时用 R 编写自定义损失函数,并展示如何使用不同的方法对不同类型的数据集有益。

下图是我将在这篇文章中涉及的内容的预览。它显示了在波士顿房价数据集上训练的四个不同的 Keras 模型的训练历史。每种模型使用不同的损失函数,但是根据相同的性能指标,平均绝对误差进行评估。对于原始数据集,自定义损失函数不会提高模型的性能,但在修改后的数据集上,结果更有希望。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Performance of the 4 loss functions on the original housing prices data set. All models used MAE for the performance metric.

用深度学习改善浅层问题

深度学习的一个很大的特点是,它既可以应用于感性数据的深度问题,如音频和视频,也可以应用于结构化数据的浅层问题。对于浅层学习(c 经典 ML )问题,通过使用提供有用信号的定制损失函数,你经常可以看到对浅层方法的改进,例如 XGBoost

然而,并不是所有的浅层问题都能受益于深度学习。我发现,在构建需要为不同数量级的数据创建预测的回归模型时,自定义损失函数非常有用。例如,预测某个地区的房价,该地区的房价可能会大幅波动。为了展示这在实践中是如何工作的,我们将使用 Keras 提供的波士顿住房数据集:

[## 数据集- Keras 文档

来自 IMDB 的 25,000 个电影评论的数据集,由情绪(正面/负面)标记。评论已经过预处理…

keras.io](https://keras.io/datasets/#boston-housing-price-regression-dataset)

这个数据集包括 20 世纪 70 年代波士顿郊区的房价。每条记录有 13 个描述房屋属性的属性,在训练数据集中有 404 条记录,在测试数据集中有 102 条记录。在 R 中,数据集可以如下加载:dataset_boston_housing()。数据集中的标签代表房屋的价格,以千美元计。价格从 5k 美元到 50k 美元不等,价格分布如左图所示。原始数据集具有相似数量级的值,因此自定义损失函数可能不适用于拟合该数据。右侧的直方图显示了标签的变换,这可能得益于使用自定义损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Boston data set with original prices and the transformed prices.

为了转换数据,我将标签转换回绝对价格,对结果求平方,然后除以一个大因子。这导致最高和最低价格之间的差别是 100 倍,而不是 10 倍。我们现在有一个预测问题,可以受益于自定义损失函数的使用。生成这些图的 R 代码如下所示。

x <- (train_targets*1000)^2/2500000
hist(train_targets, main = "Original Prices")
hist(x, main = "Transformed Prices")

Keras 中的损失函数

Keras 包括许多有用的损失函数,用于训练深度学习模型。像mean_absolute_error()这样的方法适用于数值数量级大致相等的数据集。还有像mean_squared_logarithmic_error()这样的函数,它们可能更适合转换后的房屋数据。以下是由 Keras 的 R 接口提供的一些损失函数:

keras::loss_mean_absolute_error()
keras::loss_mean_absolute_percentage_error()
keras::loss_mean_squared_error()
keras::loss_mean_squared_logarithmic_error()

中的功能损失。R 引用 Python 函数,为了真正理解这些函数是如何工作的,我们需要跳入 Python 损失代码。我们将探讨的第一个损失函数是均方误差,定义如下。该函数计算预测值和实际值之间的差值,对结果求平方(使所有值为正),然后计算平均值。注意,该函数使用了对张量对象而不是 Python 原语进行操作的后端操作。当在 R 中定义自定义损失函数时,将使用相同的方法

def mean_squared_error(y_true, y_pred):    
    return K.mean(K.square(y_pred - y_true), axis=-1)

我们将探讨的下一个内置损失函数基于预测值和目标值的自然对数之间的差异来计算误差。这里定义,如下图所示。该函数使用 clip 操作来确保负值不会被传递给 log 函数,并且将 1 加到 clip 结果确保所有 log 变换的输入都将具有非负的结果。这个函数类似于我们将在 r 中定义的函数。

def mean_squared_logarithmic_error(y_true, y_pred):    
    first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
    second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)    
    return K.mean(K.square(first_log - second_log), axis=-1)

我们将探讨的两个自定义损失函数在下面的 R 代码段中定义。第一个函数 mean log absolute error(MLAE)计算预测值和实际值的对数变换之间的差值,然后对结果取平均值。与上面的内置函数不同,这种方法不会平方误差。与上面的对数函数的另一个不同之处是,该函数对数据应用了一个显式的比例因子,将房价转换回其原始值(5,000 到 50,0000)而不是(5,50)。这很有用,因为它减少了将+1 加到预测值和实际值上的影响。

**# Mean Log Absolute Error** MLAE <- function( y_true, y_pred ) {
  K <- backend()
  K$mean( K$abs( K$log( K$relu(y_true *1000 ) + 1 ) - 
      K$log( K$relu(y_pred*1000 ) + 1)))
}**# Mean Squared Log Absolute Error** MSLAE <- function( y_true, y_pred ) {
  K <- backend()
  K$mean( K$pow( K$abs( K$log( K$relu(y_true *1000 ) + 1 ) - 
    K$log( K$relu(y_pred*1000 ) + 1)), 2))
}

像 Python 函数一样,R 的自定义损失函数需要对张量对象而不是 R 原语进行操作。为了执行这些操作,您需要使用backend()获得对后端的引用。在我的系统配置中,这将返回对 tensorflow 的引用。

第二个函数计算对数误差的平方,类似于内置函数。主要区别在于我使用的是relu操作,而不是clip操作,并且我在缩放值,这是特定于住房数据集的。

评估损失函数

我们现在有四个不同的损失函数,我们希望评估原始和转换后的住房数据集的性能。本节将介绍如何设置 Keras、加载数据、编译模型、拟合模型以及评估性能。本节的完整代码清单可在 github 上获得。

首先,我们需要建立深度学习的环境。这可以通过Keras包和install_keras功能完成。

**# Installation**
devtools::install_github("rstudio/keras")
library(keras)
install_keras(method = "conda")

安装完成后,我们将加载数据集并应用我们的转换来扭曲房价。最后两个操作可以注释掉使用原房价。

**# load the data set** library(keras)
data <- dataset_boston_housing()
c(c(train_data,train_targets), c(test_data,test_targets)) %<-% data**# transform the training and test labels** train_targets <- (train_targets*1000)^2/2500000
test_targets <- (test_targets*1000)^2/2500000

接下来,我们将创建一个用于预测房价的 Keras 模型。我已经使用了“用 R 进行深度学习”中的样本问题中的网络结构。该网络包括两层全连接的 relu 激活神经元和一个无变换的输出层。

**# The model as specified in "Deep Learning with R"** model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = "relu",
              input_shape = dim(train_data)[[2]]) %>%
  layer_dense(units = 64, activation = "relu") %>%
  layer_dense(units = 1)

为了编译这个模型,我们需要指定一个优化器、损失函数和一个度量标准。我们将对所有不同的损失函数使用相同的指标和优化器。下面的代码定义了一个损失函数列表,对于第一次迭代,模型使用均方误差。

**# Compile the model, and select one of the loss functions** losses <- c(keras::loss_mean_squared_error,  
    keras::loss_mean_squared_logarithmic_error, MLAE, MSLAE)model %>% compile(
  optimizer = "rmsprop",
  loss = losses[1],
  metrics = c("mae")
)

最后一步是拟合模型,然后评估性能。我使用了 100 个 epochs,批量大小为 5,20%的验证分割。在训练了训练数据集的模型之后,基于测试数据集上的平均绝对误差来评估模型的性能。

**# Train the model with validation** model %>% fit(
  train_data,
  train_targets,
  epochs = 100,
  batch_size = 5,
  verbose = 1,
  validation_split = 0.2
)**# Calculate the mean absolute error** results <- model %>% evaluate(test_data, test_targets, verbose = 0)
results$mean_absolute_error

我用不同的损失函数训练了四个不同的模型,并将这种方法应用于原始房价和转换后的房价。所有这些不同组合的结果如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Performance of the Loss Function of the Housing Price Data Sets

在原始数据集上,在损失函数中应用对数变换实际上增加了模型的误差。这并不奇怪,因为数据是正态分布的,并且在一个数量级内。对于转换的数据集,平方对数误差方法优于均方误差损失函数。这表明,如果您的数据集与内置损失函数不兼容,自定义损失函数可能值得探索。

转换数据集上四个不同损失函数的模型训练历史如下所示。每个模型使用相同的误差度量(MAE ),但不同的损失函数。一个令人惊讶的结果是,所有应用对数变换的损失函数的验证误差都要高得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Performance of the 4 loss functions on the transformed housing prices data set. All models used MAE for the performance metric.

深度学习对于浅层学习问题来说是一个有用的工具,因为你可以定义定制的损失函数,这可能会大大提高你的模型的性能。这并不适用于所有问题,但如果您有一个不能很好地映射到标准损失函数的预测问题,这可能是有用的。

本·韦伯意外收获数据的首席数据科学家,我们的任务是建立最准确和全面的净值模型。意外收获团队正在壮大,并正在招聘工程师数据科学家

用于梯度提升的定制损失函数

原文:https://towardsdatascience.com/custom-loss-functions-for-gradient-boosting-f79c1b40466d?source=collection_archive---------2-----------------------

优化重要的事情

作者:格罗弗王子Sourav Dey

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

梯度升压在工业上应用广泛,赢得过很多 Kaggle 比赛。互联网上已经有许多关于梯度增强的很好的解释(我们甚至在参考资料中分享了一些精选的链接),但我们注意到缺少关于自定义损失函数的信息:为什么、何时和如何。本文试图总结自定义损失函数在许多现实问题中的重要性,以及如何用 LightGBM 梯度增强包实现它们。

训练机器学习算法,使训练数据上的损失函数最小化。有许多常用的损失函数,这些函数在常见的 ML 库中很容易找到。如果你想了解更多,请阅读 Prince 在攻读数据科学硕士学位时写的这篇文章。在现实世界中,这些“现成的”损失函数通常不能很好地适应我们试图解决的业务问题。输入自定义损失函数。

自定义损失函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个客户损失函数很方便的例子是机场准时性的不对称风险。问题是决定什么时候离开家,这样你就能在正确的时间到达机场。我们不想走得太早,在门口等几个小时。同时,我们不想错过我们的航班。两边的损失是很不一样的:如果我们早到大门,真的没那么糟糕;如果我们到得太晚,错过了航班,那真是糟透了。如果我们使用机器学习来决定何时离开房子,我们可能希望在我们的模型中直接处理这种风险不对称,方法是使用一个定制的损失函数,该函数对晚期错误的惩罚远远超过早期错误。

另一个常见的例子发生在分类问题上。例如,对于疾病检测,我们可能认为假阴性比假阳性更糟糕,因为给健康人用药通常比不治疗病人的危害小。在这种情况下,我们可能希望优化 F-beta 分数,其中 beta 取决于我们希望给予假阳性的权重大小。这有时被称为尼曼-皮尔逊准则。

在流形,我们最近遇到了一个需要自定义损失函数的问题。我们的一个客户,Cortex Building Intelligence,提供了一个应用程序,帮助工程师更精确地操作建筑物的供暖、通风和空调(HVAC)系统。大多数商业建筑都有“租赁义务”,在工作日的工作时间内,将建筑物的室内温度调节在“舒适”的温度范围内,例如*,*,在上午 9 点到下午 6 点之间,温度在 70 到 74 度之间。同时,暖通空调是一栋建筑最大的运营成本。暖通空调高效运行的关键是在不需要的时候关闭系统,比如晚上,然后在清晨再次打开,以履行“租赁义务”。为此,Manifold 帮助 Cortex 建立了一个预测模型,以推荐建筑中开启 HVAC 系统的准确时间。然而,不正确预测的惩罚是不对称的。如果我们预测的开始时间早于实际要求的开始时间,那么建筑物将过早地达到舒适的温度,并且会浪费一些能量。但是,如果预测的时间晚于实际要求的开始时间,那么建筑物将过晚达到舒适的温度,租户将不会高兴——没有人愿意在冻结/沸腾的建筑物中工作、购物或学习。所以迟到比早到要糟糕得多,因为我们不希望租客(付$$$租金的)不高兴。我们通过创建一个定制的非对称 Huber 损失函数,将这种业务知识编码到我们的模型中,当残差为正对负时,该函数具有更高的误差。关于这个问题的更多细节可以在这个帖子中找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ignore what recovery time error means.

**要点:**找到一个与你的商业目标紧密匹配的损失函数。通常,这些损失函数在流行的机器学习库中没有默认的实现。没关系:定义你自己的损失函数并不难,用它来碾压你的问题。

定制培训损失和验证损失

在继续之前,让我们先明确一下我们的定义。许多术语在 ML 文献中用来指代不同的事物。我们将选择一组我们认为最清楚的定义:

  • **训练损失。**这是针对训练数据优化的函数。例如,在神经网络二元分类器中,这通常是二元交叉熵。对于随机森林分类器,这是基尼杂质。训练损失通常也被称为“目标函数”。
  • **验证失败。**这是我们用来评估训练模型在未知数据上的表现的函数。这往往不等同于培训损失。例如,在分类器的情况下,这通常是接收器工作特性(ROC)曲线下的区域,尽管这从未被直接优化,因为它是不可微的。这通常被称为“绩效或评估指标”。

在许多情况下,定制这些损失在建立更好的模型中可能是非常有效的。这对于梯度增强来说特别简单,如下所示。

培训损失

训练损失在训练过程中得到优化。对于某些算法来说很难定制,比如随机森林(见这里),但对于其他算法来说相对容易,比如梯度推进和神经网络。因为梯度下降的一些变体通常是优化方法,所以训练损失通常需要是具有凸梯度(一阶导数)和 hessian(二阶导数)的函数。它最好也是连续的、有限的和非零的。最后一点很重要,因为函数为零的部分会冻结梯度下降。

在梯度推进的情况下,训练损失是使用梯度下降优化的函数,例如,梯度推进模型的“梯度”部分。具体来说,训练损失的梯度用于改变每个连续树的目标变量。(如果你对更多细节感兴趣,请看这篇帖子。)注意,即使训练损失定义了“梯度”,每棵树仍然使用不依赖于该定制损失函数的贪婪分割算法来生长。

定义一个自定义的训练损失通常需要我们做一些微积分的工作来寻找梯度和 hessian。正如我们接下来将看到的,通常首先更改验证损失更容易,因为它不需要太多的开销。

验证损失

验证损失用于调整超参数。它通常更容易定制,因为它不像培训损失那样有很多功能需求。验证损失可以是非凸的、不可微的和不连续的。因此,从定制开始通常更容易。

比如在 LightGBM 中,一个重要的超参数就是助推轮数。验证损失可用于找到最佳助推轮数。LightGBM 中的这种验证损失称为eval_metric。我们可以使用库中可用的验证损失[之一,或者定义我们自己的自定义函数。既然它如此简单,如果它对您的业务问题很重要,您就应该进行定制。

具体来说,我们通常使用 early_stopping_rounds 变量,而不是直接优化 num boosting rounds。对于给定数量的早期停止轮次,当验证损失开始增加时,它停止提升。实际上,它通过监控样本外验证集的验证损失来防止过度拟合。如下图所示,将停止轮次设置得较高会导致模型运行更多的推进轮次。](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst/#metric-parameters)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Blue: Training loss. Orange: Validation loss. Both training and validation are using the same custom loss function

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k-fold cross validation. Each test fold scored with validation loss

请记住,验证策略也非常重要。上面的训练/验证分割是许多可能的验证策略之一。可能不适合你的问题。其他包括 k-fold 交叉验证和嵌套交叉验证,我们在 HVAC 开始时间建模问题中使用了它们。

如果适合业务问题,我们希望为我们的训练和验证损失使用自定义函数。在某些情况下,由于自定义损失的函数形式,可能无法将其用作培训损失。在这种情况下,只更新验证损失并使用像 MSE 这样的默认训练损失可能是有意义的。您仍将受益,因为 hyper 参数将使用所需的自定义损耗进行调整。

在 LightGBM 中实现自定义损失函数

让我们看看这在实践中是什么样子,并在模拟数据上做一些实验。首先,让我们假设高估比低估要糟糕得多。此外,让我们假设平方损失是我们在任一方向上的误差的良好模型。为了对此进行编码,我们定义了一个自定义的 MSE 函数,它对正残差的惩罚是负残差的 10 倍。下图显示了我们的自定义损失函数与标准 MSE 损失函数的对比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据定义,不对称 MSE 很好,因为它很容易计算梯度和 hessian,如下图所示。注意,hessian 在两个不同的值上是恒定的,左边是 2,右边是 20,尽管在下面的图上很难看到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LightGBM 提供了一种实现定制训练和验证损失的简单方法。其他梯度增强包,包括 XGBoost 和 Catboost,也提供此选项。 这里的 是一个 Jupyter 笔记本,展示了如何实现一个定制的训练和验证损失函数。详细信息记录在笔记本中,但在较高层次上,实现略有不同:

  • **训练损失:**在 LightGBM 中定制训练损失需要定义一个函数,该函数接受两个数组,目标和它们的预测。反过来,该函数应该返回每个观测值的梯度和 hessian 的两个数组。如上所述,我们需要使用微积分来导出 gradient 和 hessian,然后用 Python 实现。
  • **验证损失:**在 LightGBM 中定制验证损失需要定义一个函数,该函数接受相同的两个数组,但返回三个值:一个带有要打印的度量名称的字符串、损失本身以及一个关于值越高越好的布尔值。

在 LightGBM 中实现自定义丢失的代码

Defining custom validation and training loss functions

Incorporating training and validation loss in LightGBM (both Python and scikit-learn API examples)

自定义损失函数的实验

Jupyter notebook 还对默认随机森林、默认 LightGBM 与 MSE 以及 LightGBM 与定制训练和验证损失函数进行了深入的比较。我们使用 Friedman 1 合成数据集,其中包含 8000 个训练观测值、2000 个验证观测值和 5000 个测试观测值。验证集用于找到优化验证损失的最佳超参数集。下面报告的分数是根据测试观察值评估的,以评估我们的模型的可推广性。我们做了一系列实验,总结如下表所示。 注意,我们关心的最重要的分数是不对称 MSE,因为它具体定义了我们的不对称惩罚问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Our experiments and results

让我们来看一些详细的比较。

随机森林→ LightGBM 使用默认设置,LightGBM 在该数据集上的表现优于随机森林。随着更多的树和更好的超参数组合,随机森林也可能给出好的结果,但这不是这里的重点。

LightGBM →带定制训练损失的 LightGBM with】这说明我们可以让我们的模型优化我们所关心的东西。默认的 LightGBM 正在优化 MSE,因此它给出了更低的 MSE 损失(0.24 对 0.33)。具有自定义训练损失的 LightGBM 正在优化不对称 MSE,因此它对不对称 MSE 的性能更好(1.31 对 0.81)。

LightGBM →使用 MSE 调整早期停止回合的 LightGBM with】两种 LightGBM 模型都在优化 MSE。我们看到默认 MSE 分数有了很大的改进,只是使用了早期停止回合的小调整(MSE: 0.24 vs 0.14)。因此,我们应该让模型使用早期停止超参数来决定最佳增压轮数,而不是将增压轮数限制为默认值(,100)。超参数优化至关重要!

使用 MSE 调整早期停止回合数的 light GBM→使用自定义 MSE 调整早期停止回合数的 light GBM 这两个模型的得分非常接近,没有实质性差异。这是因为验证损失仅用于决定何时停止升压。在这两种情况下,梯度都在优化默认 MSE。每个后续的树为两个模型产生相同的输出。唯一的区别是,具有自定义验证损失的模型在 742 次提升迭代时停止,而另一个模型运行更多次。

使用定制 MSE 调整提前停止的 LightGBM→针对定制损失训练的 light GBM 和使用 MSE 调整提前停止的 light GBM 仅定制训练损失而不改变验证损失会损害模型性能。只有定制训练损失的模型比其他情况增加了更多回合(1848)。如果我们仔细观察,这个模型具有非常低的训练损失(0.013),并且在训练集上高度过拟合。每次梯度提升迭代使用训练误差作为目标变量来生成新的树,但是提升仅在验证数据的损失开始增加时停止。当模型开始过度拟合时,验证损失通常开始增加,这是停止构建更多树的信号。在这种情况下,由于验证和训练损失彼此不一致,模型似乎没有“得到消息”,这导致过度拟合。这种配置只是出于完整性考虑,在实践中不应该使用。

具有带 MSE 的调整的早期停止回合的 LightGBM→根据定制训练损失训练的 light GBM 和具有定制验证损失的调整的早期停止回合最终模型使用定制训练和验证损失。它以相对较少的提升迭代次数给出了最佳的不对称 MSE 分数。损失与我们所关心的一致!

让我们更仔细地看看残差直方图,了解更多细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Histogram of residuals on predictions from different models.

请注意,与随机森林模型相比,使用 LightGBM(即使使用默认的超参数)可以提高预测性能。具有自定义验证损失的最终模型似乎在直方图右侧做出更多预测,即实际值大于预测值。由于不对称的定制损失函数,这是预料之中的。使用残差的核密度图可以更好地可视化残差的这种右侧偏移。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Comparison of predictions from LightGBM models with symmetric and asymmetric evaluation

结论

所有的模型都有误差,但是许多商业问题并没有平等地对待低估和高估。有时,我们有意希望我们的模型将我们的误差偏向某个方向,这取决于哪个误差代价更大。因此,我们不应该用普通 ML 库中“现成的”对称损失函数来限制自己。

LightGBM 提供了一个简单的接口来整合定制的训练和验证损失函数。在适当的时候,我们应该利用这个功能来做出更好的预测。同时,你不应该立即使用自定义损失函数。最好采用精益迭代方法,首先从简单的基线模型开始,比如随机森林。在下一次迭代中,您可以移动更复杂的模型,如 LightGBM,并进行超参数优化。只有当这些基线稳定后,才有意义去定制验证和训练损失。

希望有用!快乐定制!

更多推荐阅读

如果你不清楚一般的渐变提升是如何工作的,我推荐阅读特伦斯·帕尔如何解释渐变提升,以及普林斯的从零开始的渐变提升。关于如何在不同的 GBM 框架中调优超参数,有大量的文章。如果您想使用这些软件包中的一个,您可以花一些时间来了解要搜索哪个范围的超参数。这一期的 LightGBM GitHub 给出了一个大概的取值范围。 Aarshay Jain 写了一篇很好的博客关于调优 XGBoost 和 sklearn 渐变提升。我认为可以写一篇关于调优 LightGBM 的博文。

要获得哪个渐变增强包适合您的情况的一些直觉,请阅读 Alvira Swalin 的CatBoost vs . Light GBM vs. XGBoost,以及 Pranjan Khandelwal 的哪个算法摘得桂冠:Light GBM vs . XGBoost?

关于流形

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Manifold 是一家全方位服务的人工智能咨询公司,提供全面的人工智能工程服务,包括机器学习、数据科学、数据工程、devops、云和 edge。我们拥有设计、构建、部署和管理复杂数据应用程序的成熟能力。Manifold 深受全球 500 强和高增长公司的首席技术官、首席信息官和总经理的信任。我们的工作横跨消费电子、工业、无线、在线商务、数字健康等行业。Manifold 经验丰富的工程师在谷歌、高通、麻省理工学院和成功的风险投资创业公司等机构拥有创新记录。我们的顾问委员会包括斯坦福大学和哈佛大学深度学习领域的领先研究人员,我们有一个广泛的专家网络,我们可以利用工业和工程子专业。

想研究这样的东西吗?向 sdey@manifold.com 伸出援手!我们正在雇佣数据科学家。

TensorFlow 中的自定义优化器

原文:https://towardsdatascience.com/custom-optimizer-in-tensorflow-d5b41f75644a?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

当对非结构化数据建模时,例如在语言或图像处理中,神经网络起着非常重要的作用。这种网络的想法是使用节点和边来模拟大脑的结构,这些节点和边具有由激活函数处理的数字权重。这种网络的输出主要产生预测,例如分类。这是通过使用一些优化损失函数对给定目标进行优化来实现的。

之前的一篇文章中,我们已经讨论了定制这个损失函数的重要性,对于梯度推进树的情况。在本帖中,我们将讨论如何定制优化器来加速和改进寻找损失函数(局部)最小值的过程。

优化者

虽然神经网络的架构在从数据中提取信息时起着重要作用,但所有(大多数)都是通过基于损失函数梯度的更新规则来优化的。

更新规则由优化器决定。不同优化器的性能和更新速度可能会有很大差异。梯度告诉我们更新的方向,但是我们可能采取多大的一步还不清楚。小步让我们保持在正确的轨道上,但是可能要花很长时间才能达到(局部)最小值。大步加快了这个过程,但它可能会把我们推离正确的方向。

亚当【2】和rms prop【3】是两个非常流行的优化器,仍然在大多数神经网络中使用。两者都使用梯度及其平方的指数衰减平均值来更新变量。

通过生成固定的数值更新或代数规则,已经进行了寻找新的优化器的研究。

使用控制器递归神经网络,一个团队[1]发现了两种新的有趣的优化器,PowerSign 和 AddSign,它们都是高性能的,并且比当前流行的优化器(如 Adam)需要更少的资源。

在 TensorFlow 中实现优化器

Tensorflow 是一个流行的用于实现神经网络的 python 框架。虽然文档非常丰富,但要找到阅读它的方法通常是一个挑战。

在这篇博文中,我将解释如何实现 PowerSign 和 AddSign。

优化器包括两个重要步骤:

  • compute_gradients() 更新计算图形中的梯度
  • apply_gradients() 更新变量

在运行 Tensorflow 会话之前,应该启动一个优化器,如下所示:

tf.train.GradientDescentOptimizer是类GradientDescentOptimizer的对象,顾名思义,它实现了梯度下降算法。

方法 minimize() 以“成本”作为参数被调用,由两个方法 compute_gradients()apply_gradients() 组成。

对于这篇文章,以及 AddSign 和 PowerSign 的实现,我们必须仔细看看这最后一步 apply_gradients()

该方法依赖于我们将要创建的(new) Optimizer(类)来实现以下方法: _create_slots()_prepare()_apply_dense()_apply_sparse()

_create_slots()_prepare() 创建并初始化附加变量,如动量。

_apply_dense()_apply_sparse() 实现实际的 Ops,更新变量。Ops 一般都是用 C++写的。您无需自己更改 C++头文件,仍然可以通过这些方法返回一些操作的 python 包装器。

这是按如下方式完成的:

现在让我们把所有东西放在一起,展示 PowerSign 和 AddSign 的实现。

首先,您需要以下模块来添加 Ops,

现在让我们实现 AddSign 和 PowerSign。这两个优化器实际上非常相似,都利用了动量的符号

mg进行渐变更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The momentum and gradient, respectively.

PowerSign

对于 PowerSign,变量的更新工作如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下代码中的衰减率f_n被设置为 1。我不会在这里讨论这个问题,我可以参考文献[1]了解更多细节。

添加标志

AddSign 与 PowerSign 非常相似,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化器的性能测试

Rosenbrock 函数是一个著名的优化算法性能测试。该函数是非凸的,定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成的形状绘制在下图中。正如我们所见,它在 x = 1 和 y = 1 时有一个最小值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rosenbrock function

以下脚本通过给定优化器在每个时期生成真实最小值与近似最小值的欧几里德距离。

下面绘制了运行 4000 个时期的每个优化器的性能比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然性能因超参数的选择而有很大差异,但需要注意 PowerSign 的极快收敛。下面,已经绘制了几个时期的近似值的坐标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终讨论

Tensorflow 允许我们创建自己的定制程序。最近的研究进展产生了两个新的有前途的优化器,即 PowerSign 和 AddSign。PowerSign 的快速早期收敛使其成为一个有趣的优化器,可以与 Adam 等其他优化器结合使用。

参考:

  1. 有关 PowerSign 和 AddSign 的更多信息,请参见 arxiv 论文“具有强化学习的神经优化器搜索”,Bello 等人。艾尔。,https://arxiv.org/abs/1709.07417.
  2. 金马博士和巴律师事务所(2015 年)。亚当:一种随机优化方法。学习表征国际会议,1-13。
  3. 未发表过的
  4. 通过这篇 StackOverflow 帖子,我发现了很多有用的信息,并试图将其捆绑到这篇帖子中。

自定义 Vim 函数来格式化你的文本

原文:https://towardsdatascience.com/custom-vim-functions-to-format-your-text-b694295f7764?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Vim 是一个了不起的文本编辑器,多年来,它让我在编写代码或编辑文本时效率大大提高。虽然最初的学习曲线有点陡峭,但花时间学习不用鼠标导航和编辑文件是非常值得的。但是使 Vim 更加强大的是它是可破解的——如果您发现自己为某些任务反复执行一系列按键,您可以创建自己的函数,在整个 Vim 中使用。

有时我会收到客户的 Excel 电子表格,他们希望我查看与他们在 Excel 列中提供给我的一系列数字相关的数据。如果我将这些数字粘贴到 Vim 中,我将得到如下所示的内容:

300418944
300404780
300482301
300354016
300295311
300417275
300409184
300480616
300478444
300491475
300478160
300482299
300482959
300154869

如果我要在 SQL 查询的WHERE子句中使用这个数字列表作为 SQL 列表,我需要用引号将所有数字括起来,并在每个数字的末尾加上一个逗号。最后,我需要将所有的行折叠成一行,并用括号将那一行括起来。本质上,我需要获取这些数字并创建一个元组。所以我想要这样的东西:

(‘300418944’, ‘300404780’, ‘300482301’, ‘300354016’, ‘300295311’, ‘300417275’, ‘300409184’, ‘300480616’, ‘300478444’, ‘300491475’, ‘300478160’, ‘300482299’, ‘300482959’, ‘300154869’)

手动操作会花费相当多的时间,尤其是在给定一个包含数百个数字的列表的情况下。这就是 Vim 的亮点——我们可以在我们的vimrc文件中创建一个函数来为我们处理这些步骤。

“ convert rows of numbers or text (as if pasted from excel column) to a tuplefunction! ToTupleFunction() range
    silent execute a:firstline . “,” . a:lastline . “s/^/’/”
    silent execute a:firstline . “,” . a:lastline . “s/$/’,/”
    silent execute a:firstline . “,” . a:lastline . “join”
    silent execute “normal I(“
    silent execute “normal $xa)”
    silent execute “normal ggVGYY”
endfunctioncommand! -range ToTuple <line1>,<line2> call ToTupleFunction()

这个函数不仅会格式化你的文本,还会将结果复制到你的剪贴板,这样你就可以将它粘贴到你使用的任何 SQL 查询编辑器中。

让我们分解函数体的每一行。

silent execute a:firstline . “,” . a:lastline . “s/^/’/”

对于所有可视选择的行,上面的行跳转到每一行的开头,并插入一个单引号。

silent execute a:firstline . “,” . a:lastline . “s/$/’,/”

这一行位于每一行的末尾,并插入一个单引号和逗号。

下一行代码将所有的文本行合并成一行:

silent execute a:firstline . “,” . a:lastline . “join”

现在我们在行首添加一个左括号:

silent execute “normal I(“

然后插入结束的那个:

silent execute “normal $xa)”

该函数的最后一行选择整个文本,并将其复制到剪贴板(我有一个自定义的映射,用于复制到剪贴板:vnoremap YY "*y)。

最后,下面是实际运行的函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您希望有一个类似的函数来创建一个数组,那么您只需要对ToTupleFunction做一点小小的修改,并给这个函数起一个新名字。

“ convert rows of numbers or text (as if pasted from excel column) to an arrayfunction! ToArrayFunction() range
    silent execute a:firstline . “,” . a:lastline . “s/^/’/”
    silent execute a:firstline . “,” . a:lastline . “s/$/’,/”
    silent execute a:firstline . “,” . a:lastline . “join”
    " these two lines below are different by only one character!
    silent execute “normal I[“
    silent execute “normal $xa]”command! -range ToArray <line1>,<line2> call ToArrayFunction()

就是这样!希望这是有帮助的,如果你们有任何很酷的 Vim 函数,你们经常用来写代码或者只是写一般的东西,请在评论中告诉我!

[## 想在数据科学方面变得更好吗?

当我在我发布独家帖子的媒体和个人网站上发布新内容时,请单击此处获得通知。](https://bobbywlindsey.ck.page/5dca5d4310)

原载于 2017 年 7 月 30 日【bobbywlindsey.com】

顾客评论:借助网络搜集、数据分析和基本的自然语言处理,找出你的优势和劣势

原文:https://towardsdatascience.com/customer-reviews-identify-your-strengths-and-weaknesses-with-the-help-of-web-scraping-data-b87a3636ef55?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo: https://pixabay.com/en/stars-rating-travel-four-hotel-1128772/

客户反馈是描述用户对公司及其服务体验的重要信息来源。就像在产品开发中一样,有效利用反馈可以帮助识别和优先考虑公司进一步发展的机会。

多亏了互联网,今天我们可以接触到无数的资源,在那里人们愿意与不同的公司和服务分享他们的经验。为什么不利用这个机会提取一些有价值的信息,并获得一些可操作的见解,以提供最佳的客户体验?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我在 Flixbus 担任数据科学孵化团队的产品负责人,flix bus 是一家主要的欧洲电动汽车公司,在欧洲各地提供城际巴士服务。Flixbus network 每天为 28 个国家的 1,700 多个目的地提供 120,000 多次连接,最近还将其业务扩展到了美国市场。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://www.flixbus.com/bus-routes

虽然该公司已经建立了收集客户反馈的流程,但我还是决定看看除此之外万维网还能提供什么。这就是我如何遇到 Trustpilot.com 的,在这个平台上,用户可以与世界上几乎任何一家公司分享他们的经验。令我惊讶的是,我发现在过去的几年里有超过 2000 条关于 Flixbus.com 的顾客评论。这个数字每天都在增长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://www.trustpilot.com/

每条评论都包含:1-5 分等级的评分,表示客户对服务的总体满意度、评论发布的日期、有用的评论者信息(如国家位置)以及带标题的自由格式文本评论本身。虽然评级表明总体客户情绪,但包含描述客户体验主要痛点的极有价值信息的是评论。

通过收集所有这些评论,我们可以收集大量的定量和定性数据,对其进行分析,并确定需要改进的地方。幸运的是,python 提供了库来轻松处理这些任务。

删除评论

对于网络抓取,我决定使用 BeautifulSoup 库,它可以完成这项工作,而且使用起来非常简单。如果你以前没有抓取网页的经验,但是你想自己尝试,我强烈推荐你阅读这篇伟大的文章:“用 Python 和 BeautifulSoup 抓取网页”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://www.trustpilot.com/review/flixbus.com

好的……所以在研究了 Trustpilot 网站的结构后,我列出了可能需要收集的数据点:

  1. 审查人姓名
  2. 审核标题
  3. 审查机构
  4. 日期
  5. 审查者的国家/地区

虽然这可能看起来是一个有限的数据列表,但它足以进行深入的数据分析,这将在后面进行。

作为第一步,我想分享一个自定义功能,从一个特定的 Trustpilot.com 公司的评论页面抓取所有评论:

你可以简单的复制粘贴,用这个功能给同一个点评平台上的任何其他公司刮点评。你所需要做的就是指定一个链接(链接到一个页码,其中页码将被变量 p 替换),循环浏览的评论页数,并且你可以改变睡眠时间(包括以防万一,以避免节流)。

df = scrape_reviews(PATH = '[https://www.trustpilot.com/review/flixbus.com?languages=all&page='](https://www.trustpilot.com/review/flixbus.com?languages=all&page='),
                   n_pages = 80)

运行刮擦功能会为我们提供以下数据框架:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果,我们有来自 100 个不同国家的 2080 条评论!是不是很牛逼?😃

数据分析

有了这些信息,我们可以从定量分析开始。为了便于理解,我们来看看 Flixbus.com 的评分分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯,看起来我们有两个极端,非常高兴的顾客和不幸遇到我们服务问题的顾客。不过看到正面评价超过负面评价还是很棒的。

此外,我们可以看到平均月评分是如何随着时间的推移而发展的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管在 2015 年底有一个良好的开端,但平均评级在接下来的两年中不断下降,在 2017 年 9 月达到历史最低点,约为 2.8。从那时起,评级趋势为横向通道,目前的平均评级为 3.2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就每月的评论数量而言,我们看到了明显的季节性增长趋势。我们观察到每年 8 月和 9 月左右的本地高峰,这很可能与公共汽车旅行的旺季有关。

考虑到我们还收集了每个评论者的国家位置,我们可以将这些信息可视化,以查看大多数评论来自哪里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(countries with more than 10 reviews displayed in the graph above)

由于 Flixbus 是一家总部设在德国的公司,所以毫不奇怪德国名列榜首,其次是英国、意大利、丹麦和法国。

接下来,让我们关注占所有数据 70%的评论数量排名前 10 位的国家。

按年份划分评论,我们看到大多数评论都是在 2017 年产生的,其中最大一部分来自德国。2018 年,类似的帖子数量持续增长,然而,现在英国在发布评论的数量上处于领先地位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了更好地了解每个国家的总体情绪,让我们来看看评级的份额:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图所示,意大利、美国和捷克共和国获得五星好评的比例最高,其次是德国、法国和比利时。相反,丹麦以 1 星评级的最大份额脱颖而出。

现在,为了理解评论的内容,我们将应用一些基本的 NLP。

自然语言处理

以前,我们认为丹麦是负面评价最多的国家之一。因此,在把所有国家放在一起看之前,让我们先试着了解一下丹麦的具体情况。

作为第一步,我们必须使用 python 的 googletrans 库将评论从丹麦语翻译成英语。在这项工作中,我只关注了 1 星评论,总共有 93 条评论,以确定来自该国的客户提到的主要痛点。

一旦翻译完成,在 nltk 库的帮助下,我们可以对文本进行标记,删除停用词并对它们进行词条化,以避免不必要的不一致。最后一步,我们统计单词,并使用 nltk 的频率分布图绘制出 30 个最常提到的单词。

正如你所看到的,我们有很多词并没有真正指出具体的问题。很自然,我们经常看到客户提到“巴士”和公司名称。然而,我们也能发现一些经常使用的词,如票、时间、服务、司机、钱等等。这可能在一定程度上说明了问题,但仍不清楚这些问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了获得更多的上下文,我们可以继续使用二元模型,它提供了以下结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 bi-grams,我们可以获得更清晰的上下文,并可以轻松识别一般问题,包括:客户服务、退款(或退款)、延误、公交车站、公交车司机的问题以及公交车上的空调。因此,只需几秒钟,我们就可以总结客户在 93 条评论中提到的主要问题!

现在,让我们对所有 10 个国家和 1 星评级的评论使用相同的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您会注意到,结果与我们在前面的图表中看到的没有很大的不同,但是,二元模型的排名略有变化。一个具有领域知识的人会立即识别许多客户体验方面,包括:

  1. 客户服务
  2. 公交车司机
  3. 退款
  4. 延误(迟到和/或离开)

有了这个结果,我们现在已经确定了 4 个需要进一步深入研究的主要领域,以发现改善客户体验和我们服务满意度的机会。

另一方面,我们可以对 5 星评价进行同样的分析,以了解客户最喜欢我们服务的什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看上面的图表,很高兴看到许多评论者特别指出:

  1. 我们公共汽车的清洁和舒适
  2. 我发现用我们的平台订票很容易
  3. 欣赏物有所值
  4. 愿意向他人推荐我们的服务

结论

上面描述的方法非常简单,远没有发挥出它的全部潜力。然而,如果有数以千计的各种语言的评论,它可以在几分钟内提供一些有价值的见解,帮助理解客户问题并得出主要的棘手问题。

希望这对你有用,你可以将这里分享的一些知识应用到你自己的工作中!

Arvato 金融解决方案的客户细分报告

原文:https://towardsdatascience.com/customer-segmentation-report-for-arvato-financial-solutions-b08a01ac7bc0?source=collection_archive---------10-----------------------

【Udacity 数据科学家纳米学位的顶点项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简介

在这个项目中,监督和非监督学习技术用于分析德国一家邮购销售公司的客户的人口统计数据,与普通人群的人口统计信息进行对比。这个项目的目标是描述客户群体的特征,并建立一个能够为 Arvato 金融解决方案预测客户的模型。

这个项目的数据由贝塔斯曼 Arvato Analytics 的 Udacity partners 提供,代表了一项现实生活中的数据科学任务。它包括一般人群数据集、客户细分数据集、带有回复的邮寄活动数据集以及需要进行预测的测试数据集。

问题陈述

该项目有四个主要部分:

  1. 数据预处理

在这一部分,我们需要对数据进行预处理,以便进一步分析。

将按列和行分析缺失值,数据将按类型划分,然后进行后续转换。

2.客户细分

在这一部分,我们需要分析一般人群和客户细分数据集,并使用无监督学习技术进行客户细分,确定最能描述公司核心客户群的人群部分。

我将使用主成分分析(PCA)技术进行降维。然后,使用肘形曲线来确定 KMeans 算法的最佳聚类数。最后,我将应用 KMeans 对人口和客户进行细分,并确定公司目标群的描述。

3.监督学习模型

在这一部分中,我们需要使用营销活动的响应来建立机器学习模型,并使用模型来预测哪些个人最有可能转变为公司的客户。

我将使用几个机器学习分类器,并使用学习曲线分析选择最好的。然后,我将参数化模型并进行预测。

4.卡格尔竞赛

这部分的结果需要提交给 Kaggle 比赛

指标

预测概率的受试者操作特征曲线( ROC_AUC )下的面积将用于评估模型的性能。ROC 曲线是通过在各种阈值设置下绘制真阳性率(TPR)对假阳性率(FPR)来创建的。AUC 提供了对所有可能的分类阈值的综合绩效衡量。解释 AUC 的一种方式是模型对随机目标人的排序高于随机非目标人的概率。因此,ROC 分析提供了为客户预测任务选择可能的最佳模型的工具。

结果与讨论

数据预处理

与本项目相关的有两个数据描述 Excel 电子表格和四个数据文件:

  • 德国普通人口的人口统计数据。它有 891211 个人(行)和 366 个特征(列)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Descriptive statistics for the first few attributes of AZDIAS data set

  • CUSTOMERS:邮购公司客户的人口统计数据。它有 191652 行和 369 个特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Descriptive statistics for the first few attributes of CUSTOMERS data set

  • MAILOUT_TRAIN:作为营销活动目标的个人的人口统计数据;42982 人和 367 个特征,包括人的响应。
  • MAILOUT_TEST:作为营销活动目标的个人的人口统计数据;42833 人和 366 个特征。

不幸的是,这些数据集中有许多缺失值,并且并非所有列出的特性都在给定的 Excel 电子表格中有解释。

分析缺失值的列和行

首先,我创建了 python 缺失值代码字典,其中“键”中的键是:值对是属性,值是从 DIAS attributes-Values 2017 . xlsx 解析的缺失代码列表。

有趣的是,字典中的 366 个条目中只有 275 个,这意味着有许多特性没有在给定的属性描述文件中列出,并且一些缺少值的属性根本没有输入并在数据集中作为 numpy 而不是数字(np.nan)列出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

First three items from missing keys dictionary

接下来,与 AZDIAS 数据集的缺失值代码相对应的值被转换为 np.nan 值,并对每个属性分析缺失值的最终数量。

分析表明,大多数列的缺失数据不到 30%,而有 41 个属性的缺失数据超过 30%(参见下面这些列中缺失值的分布)。这 41 个属性已从分析中删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Attributes with more than 30% of missing values dropped from analysis

此外,基于以下原因删除了其他列:

  • 具有唯一值的列,LNR
  • 具有超过 10 个类别的分类列,以避免一次性编码后的许多附加属性(CAMEO_INTL_2015 除外)
  • 具有来自另一特征的重复信息的列(例如 fein vs grob)
  • 一些属性,没有给出描述,并且很难预测列的含义和类型(分类对顺序对混合)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按行对缺失值的集合表明,删除列后,每行中缺失数据的最大数量是 303 个属性中的 233 个属性。每行中缺失数据量的分布表明,大多数行的缺失属性少于 25 个。因此,数据被分成两个子集:azdias,带有<=25 missing attributes (737235 rows) and azdias with > 25 个缺失属性(153986 行)。对 6 个随机选择的列的值分布的比较表明,在两个数据集中有相似的分布(见下面的 6 个不同属性的条形图,这些属性具有很少的 nan 和许多 nan 数据集)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Comparison of distribution of values between dataset with few missing values (blue) vs dataset with many missing values (orange)

分配属性类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Part of the manually created table with attributes types and actions.

为了进行数据工程和转换步骤,所有的属性应该被分配到以下类型:分类的、数字的、顺序的、二进制的、混合的。对于这一步,我已经手动创建了 attribute_types.csv 文件,其中包含属性名称、类型、操作(保留、删除、单热或工程)和删除原因列。

由于不是所有的列都提供了描述,我必须通过名称找到相似的列,并猜测它的类型,这样的列在类型前面用问号列出(例如?分类)。与任何列出的属性都不相似的缺失描述属性的类型也被视为分类属性。

OST_WEST_KZ 特征对于 OST 编码为 0,对于 WEST 运动模式编码为 1。时间功能 EIGEFUEGT_AM 已转换为年份格式。四个混合功能重新设计如下:

  • PRAEGENDE _ jugendjhre–>运动(1:主流,2:前卫)和世代十年(4:40,5:50,6:60,7:70,8:80,9:90)
  • CAMEO_INTL_2015 —>财富(1:富裕家庭,2:富裕家庭,3:舒适家庭,4:不太富裕家庭,5:较贫困家庭)和寿命(1:未成家夫妇和单身,2:有孩子的年轻夫妇,3:有学龄儿童的家庭,4:老年家庭和成熟夫妇,5:退休老人)
  • WOHNLAGE—> RURAL _ neighborhood(0:非农村,1:农村)
  • plz 8 _ BAUMAX—> plz 8 _ BAUMAX _ FAMILY(0:0 家庭,1:主要是 1-2 家庭住宅,2:主要是 3-5 家庭住宅,3:主要是 6-10 家庭住宅,4:主要是 10+家庭住宅和 PLZ8_BAUMAX_BUSINESS (0:不是商业,1:商业)

标准化和应对困难

在我们对数据应用降维技术之前,我们需要执行特征缩放,以便主成分向量不受特征在尺度上的自然差异的影响。对于这一步,所有缺失的 np.nan 数据都需要丢弃或估算。对付南人有几种策略。用 nan 删除数据点的简单选择会导致大量信息的丢失(约 30%)。一个更好的策略是用平均值或最频繁值对缺失值进行插补。在大多数情况下,估算值不会完全正确,但会系统地高于或低于实际值。但是,通常它会比完全删除数据点或列给出更准确的结果。

因此,我选择的策略是用最频繁的值来估算二进制数据,用列中的中值来估算数值数据。分类缺失值在转换为虚拟列后将被赋值为零。然后使用标准化程序来缩放特征。标准化程序的优点是,它不会将值限制在特定的范围内,并且受异常值的影响要小得多。

数据转换管道

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Distribution of skewed data for ANZ_HAUSHALTE_AKTIV attribute (skew=8.3)

首先,我使用倾斜阈值为 1.0 的熊猫倾斜方法识别倾斜的数值连续属性。这些属性被指定为 log_attributes ,并通过以下步骤为这些属性创建管道:自然对数转换、中值插补和标准缩放。二进制属性( bin_attributes )仅通过最常用值进行插补。dummiestratransformation类是为分类属性的转换而创建的( cat_attributes )。在这种转换中,没有删除多余的虚拟列,以保留关于由零编码的丢失值的隐藏信息。所有其他数值和顺序属性( num_attributes )转换被合并到管道中,通过中值插补和使用标准缩放器缩放。最后,创建了 ColumnTransformer 对象,它将几个特征转换管道合并成一个转换器。这个对象进一步用于所有部分的数据转换。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Column transformation scheme for pipeline column transformer

transformers = [('log ',log_pipeline,log_attributes),
('binary ',binary_pipeline,bin_attributes),
('cat ',cat_pipeline,cat_attributes),
('num ',num_pipeline,num_attributes)]

CT = sk learn . compose . column transformer(transformers = transformers)

关于异常值的快速说明

我使用了 Tukey 规则来检测四分位数范围(IQR)之外的异常值:IQR = Q3 — Q1。然而,仅移除经历了对数变换的六个属性的异常值会导致大约 30%的数据丢失。所以,我决定保留那些点。

数据预处理汇总

总之,所有数据集都经历清洗过程( clean_data 函数),该过程:(1)删除列和行,(2)重新设计 4 个混合类型特征,以及(3)通过由流水线特征联合组成的列变换器进行变换。值得注意的是,流水线的使用极大地方便了转换和建立机器学习模型。它可以防止可能导致算法过度拟合的数据泄漏,改进代码组织,并降低在训练集和测试集中混淆列的风险。

总体而言,在提取转换加载(ETL)管道步骤之后,AZDIAS 数据被转换为 737235 行 x 410 列,客户数据被转换为 134245 行 x 410 列数据集。

客户细分

PCA

主成分分析对数据进行降维处理。我绘制了累积解释方差与多个主成分的关系(用线表示)以及解释方差柱状图(见下文)。大约 175 个成分后,解释的变化明显减少。这一数量的转换特征导致 92%的解释方差。因此,项目的聚类部分保留了 175 个变换后的特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The plot of fraction of explained variance in the data represented by each principal component vs number of principal components.

第一、第二和第三主成分分别具有 8.0%、6.0%和 5.0%的方差,并且与接下来的三个潜在特征相关:

  1. 最突出的特征是 CAMEO_DEUG_2015,HH_EINKOMMEN_SCORE,财富和最突出的负面特征是 MOBI_REGIO,KBA13_ANTG1,KBA05_ANTG1。因此,第一个主成分与规模、财富和家庭类型有关。家庭越大,收入和财富所对应的成分越高。负值:该部分与和其他家庭共用单元的概率较高和流动性较低成反比。
  2. 最突出的特征是 KBA13_HERST_BMW_BENZ,KBA13 _ SEG _ OBEREMITTELKLASSE,KBA13_MERCEDES,KBA13_BMW 最突出的负面特征是 KBA13_SITZE_5。这种成分与拥有昂贵的汽车有关。
  3. 最突出的特点是世代 _ 十年,CJT_TYP_1,CJT_TYP_2,金融 _SPARER。最突出的负面特征是孔比亚尔特和 CJT_TYP_5。这一部分与年龄、客户和金融类型有关。较高的成分与年龄较大的人和存钱的人的概率较高有关。

K-均值聚类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Average sum of squared errors (SSE) vs number of clusters

方法被用于在 PCA 转换的数据上识别用于k-均值聚类的理想聚类数。将组内距离的误差平方和(SSE)的平均值对从 1 到 30 的组数作图。在此图中,聚类是使用 MiniBatchKmeans 方法创建的,批处理大小=40000。

该图表明,分数在前 16 个聚类中快速下降,然后在 17 个聚类中上升,然后在更大数量的聚类中继续下降,但是斜率更低。因此,选择 16 个类作为 k-means 聚类的理想数目。

无监督机器学习流水线

无监督学习管道由以下步骤组成:数据转换、PCA 和 KMeans(见下文)。

cluster _ Pipeline = Pipeline([
(’ transform ',ct),
('pca ',PCA(n_components=175)),
('kmeans ',KMeans(n_clusters=16) )
))

cluster _ pipeline . fit(azdias _ cleaned)
general _ predictions = cluster _ pipeline . predict(azdias _ cleaned)customers _ predictions = cluster _ pipeline . predict(customers _ cleaned)

拟合和预测方法应用于 AZDIAS 数据,预测方法应用于客户数据。

客户数据与 AZDIAS 数据的比较

使用每组中的人口比例对普通人群和 AZDIAS 数据的聚类结果进行相互比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Proportion of people for the general population and the customer data

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Difference in proportion between customers and general audience: positive is overrepresented and negative is underrepresented

比较每个集群中普通受众和客户受众的比例和比例差异(customers _ ratio-general _ ratio ),表明存在客户代表过多和不足的集群。在客户数据中,客户和一般受众之间的比例具有最高正差异的聚类过多(感兴趣的聚类#6 和#8)。客户和普通受众之间比例负差异最大的聚类在客户数据中代表性不足(无兴趣聚类#0 和#7)。它们的潜在特征中的聚类中心被映射到原始特征以识别人的类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Comparison table of attribute values for overrepresented and underrepresented clusters.

因此,使用邮购公司的人(#6 和#8)是富有的,年龄在 45-60 岁之间(altersketoporie _ GROB = ~ 3.4),平均年龄为 60 岁(GENERATION_DECADE 分别= 6.1 和 6.6),是存钱的人或投资者的概率很高(FINANZ_SPARER 分别=1.3 和 1.6)。在代表性不足的群体中,他们是高收入者(LP_STATUS_GROB=4)对低收入者(1.2 和 2.3)。这些人具有低运动模式(MOBI _ 区域=4.2)。这些人也有宗教信仰和传统观念。

在诸如 D19_GESAMT_DATUM (8.2 对 2.8)、D19_KINDERARTIKEL (0.6 对 2.2)、D19_VERSAND_DATUM (9.0 va 3.3)、D19_KONSUMTYP_MAX (6.1 对 2.1)等类别中,两个过度表示的集群之间也存在一些差异。并非所有列出的特性都有说明,但总体 D19_*特性与使用某组产品的频率有关。因此,该方法区分了具有高和低交易活动的两组。

另一方面,在公司中任职人数不足的人最高达 45 岁(altersketagorie _ GROB = 1.8 和 1.9)。这些人出生于 80、90 年代(GENERATION_DECADE = 8.6),金融兴趣不高(FINANZ _ MINIMALIST = 1、2)。这些人是穷人,他们是概率极低的存钱者(FINANZ_SPARER > 3.9)。其中一个聚类表明,这些人具有高移动模式(MOBI _ 雷吉欧=1.9),这意味着他们没有自己的家,另一个具有中等移动模式(MOBI _ 雷吉欧=3.8)。这些人很可能是感性的;宗教和传统思想的可能性很小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Comparison bar plot for SEMIO_REL, GENERATION_DECADE, WEALTH and FINANZ_SPARER feature in four clusters

监督学习模型

现在,我们准备分析 MAILOUT 数据集,并建立一个监督学习模型,能够预测该人是否成为客户。“邮件发送”数据文件中的每一行都代表一个具有“响应”列的邮件发送活动的目标个人。值得注意的是,MAILOUT_TRAIN 数据集中只有约 1.2%是客户。这里,应用了类似的转换管道和清理,只是没有删除任何行以避免信息丢失(在 clean_data 函数中使用 test_set=True 属性)。

通常,为了建立监督模型,我们需要将数据分成训练和测试数据集,在训练数据集上建立监督模型,并在测试数据集上进行预测。在我们的例子中,我们已经得到了 MAILOUT_TEST 数据集,可以通过将它提交给 Kaggle competion 来评估模型的性能。因此,在这一部分有两种可能的途径可走:

  • 将数据集拆分为训练集和验证集
  • 使用交叉验证技术

我决定使用交叉验证,因为只有 532 名(1.2%)客户。在分割数据集的情况下,该值将减少 20%。因此,我使用 5 重交叉验证(Scikit-learn 0.2 版本中的默认值)来获得学习曲线,并使用 GridSearchCV 参数化模型。

监督学习管道

监督学习管道由两个步骤组成:之前引入的列转换器和分类器。

管道=管道([
(‘变换’,ct),
(‘分类器’,分类器)
))

pipeline . fit(maiout _ train _ cleaned)
预测= pipeline . predict _ proba(maiout _ train _ cleaned)

量词

使用默认参数测试了几种集成方法,以选择最佳分类器。集成学习是在其他模型的基础上建立一个模型的方法。Scikit-learn 中的随机森林分类器、Adaboost 分类器和梯度提升分类器都是建立在决策树模型之上的集成分类器(默认)。
这些集成模型对于分类和回归问题都非常有效,通常具有以下优势:

  • 提高机器学习算法的稳定性和准确性;
  • 减少一个模型的单个估计值的方差,因为它们合并了几个模型的几个估计值;
  • 有助于避免过度拟合。

分类器评估
用于模型评估采用学习曲线法。学习曲线显示了不同数量的训练样本(训练数据的 10%-100%)的估计量的验证和训练分数。它是一种工具,可以发现我们从添加更多的训练数据中获益多少,以及估计量是更容易受到方差误差还是偏差误差的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Learning curves for three different classifier, score = roc_auc score

对学习曲线的分析表明,随机森林分类器在训练集上具有微小的误差(roc_auc 得分=53%),这意味着该模型严重过拟合数据。验证集的误差(roc_auc 得分=53%)很大,这是一个高偏差模型。注意,曲线已经收敛,添加更多数据不会改进分类器。这是一个高偏差模型。

Adaboost 分类器表现出更好的性能。虽然随着训练集大小的增加,训练 roc_auc 分数降低了高达 84%,但是对于验证集,它增加了高达 72%。两条曲线几乎是收敛的,并且分数不会随着训练集中点数的增加而显著提高。

梯度提升分类器的验证分数提高了 76%,而训练分数降低了 92%。两条曲线不收敛,增加更多的点可以进一步提高分数。因此,梯度推进是最佳模型,并将用于 GridSearch 参数化。

分类器参数化

梯度推进分类器的参数化使用网格搜索来执行。网格搜索使用交叉验证测试指定超参数的所有可能组合,然后在验证集上选择具有最高分数(roc_auc)的模型。下面给出了在网格搜索中测试的具有不同超参数的梯度推进流水线的初始化。

gbc _ pipeline = SML . make _ pipeline(CT,GradientBoostingClassifier())

parameters = { ’ classifier _ _ learning _ rate ‘:[0.1,0.2],’ classifier _ _ n _ estimators ‘:[100],’ classifier__max_depth’: [3,5],’ classifier _ _ min _ samples _ split ':[2,4]}

grid _ obj = GridSearchCV(gbc _ pipeline,parameters,scoring = 'roc_auc ')

最佳分类器具有以下超参数:learning_rate=0.1,n_estimators=100,决策树 max_depth=3,决策树 min_sample_split=4(默认值=2)。使用参数化模型在训练集上计算的分数明显高于默认模型(0.8976 比 0.8968)。

特征重要度图表明,最重要的特征是 D19_SOZIALES,遗憾的是没有关于它的描述。下一个重要特征与消费类型(D19_KONSUMTYP_MAX)和运动年份 EINGESOGENAM_HH_JAHR(信息不可用)相关。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Feature importances plot

Kaggle 比赛

最后将监督模型应用于 MAILOUT_TEST 数据。获得的成为顾客的概率被提交给 Kaggle competition。最终得分为 0.789,仅比本届冠军得分低 0.009。

结论

在这个由 Bertelsmann Arvato Analytics 的 Udacity partners 提供的项目中,分析了德国人口和客户群的真实人口统计数据。

  • 在第一部分中,对数据进行了评估和预处理。这一部分是必须完成的最困难的步骤之一,因为有 366 个列要分析,并且不是所有的列都有描述。发现了许多缺失值和缺失的属性信息。创建了列转换管道,该管道进一步用于受监督和不受监督的部分。
  • 在无监督的部分,使用 PCA 对描述 92%的解释方差的 175 个潜在特征进行维数减少。k 均值聚类为 16 个聚类,识别出 2 个聚类是公司的目标客户。这些都是 45-60 岁的传统意义上的富人。
  • 最后,选择梯度推进分类器并参数化,建立监督模型,在 KAGGLE 上的测试数据集上进行预测。监督学习算法的最终性能为 78.9%。

这个项目可能有一些改进。例如,有其他方法预处理数据:为删除行和列选择另一个阈值,为列选择不同的转换,应用最小最大缩放器而不是标准缩放器,以另一种方式估算数据。

监督模型的改进可以通过使用 PCA 降维来测试。我们还可以选择在过度表示和不足表示数据的聚类中具有最大差异的属性,并仅使用这些属性构建监督模型。

最后,我想尝试的一个技巧是随机地将客户数据集中的数据添加到 MAILOUT_TRAIN 数据集中,使得客户和非客户的数量相等。由于现在我们在这个数据集中只有 1.2%的客户,在 50%的数据集上训练的模型可以是更好的预测器。

环境计算世界中的客户服务

原文:https://towardsdatascience.com/customer-service-in-a-world-of-ambient-computing-8e90c5ccbe5?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很快将有一个额外的应用内客户服务渠道。

到目前为止,我们有一堆服务渠道,其中大多数都要求用户离开应用程序

  • 拿起电话打电话
  • 浏览自助服务
  • 打开一个额外的聊天窗口
  • 利用社交媒体渠道
  • 继续使用 messenger 应用程序
  • 坐进你的车去商店怎么样?

然后,客户可能会在这些渠道之间来回移动,很可能会失去对事件状态的跟踪,并且跨渠道客户服务仍然会引起摩擦。

毫无疑问,提供应用内支持是快速解决问题的最佳选择。它可以从应用程序中提供遥测信息,识别用户,从而提供大量相关背景信息,使服务代理能够更轻松地帮助客户,避免不必要的延迟。谷歌的研究也发现了消费者对“现在”的重视。

并非所有设备都是智能手机

但是,如果客户不能拿起电话进行打字对话,该怎么办呢?客户可能正在玩虚拟现实游戏,或者正在驾驶汽车,或者处于无法自由行动的任何情况下。

也许客户只是不想接电话?

如果这款应用除了一盏指示‘我有空’的小灯之外,根本不提供用户界面,那该怎么办?这将例如是在周围环境中感测到人的存在并相应地采取行动的情况。

像这样的环境将主要通过亚马逊的 Alexa、谷歌 Home、苹果的 HomePod 或微软即将推出的 Home Hub 等设备进行语音和手势控制。类似这样的系统最多将键盘作为访问服务和支持的辅助手段。

但是没有必要看得那么远。想象一个游戏场景。无论是 Xbox,还是 Playstation,或者任何其他主要的控制器都没有提供键盘。在这些或 VR 或 AR 游戏的情况下,用户会握着控制器,没有足够的余地去拿键盘。

那么,他们为什么要提供一个键盘来实现对话式(或其他)应用内支持呢?没有理由。

相反,用户将通过基于手势、视图和语音的界面与服务系统和代理交互。

下一个应用内支持渠道是语音

语音识别技术正在迅速成熟,并开始在理解至少英语语言方面达到人类水平的准确性。

人类的理解水平大约是百分之五的单词错误率(WER),这意味着人类平均每一百个单词中有五个是由于错误识别、漏掉一个单词或错误插入一个单词而造成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器达到人类的语言理解水平;来源 2017 互联网趋势报告

机器达到人类的语言理解水平;来源 2017 互联网趋势报告

虽然亚马逊没有给出 Alexa 能力的任何数字,但微软宣布在 2016 年 10 月达到了 5.9%的单词错误率(WER); IBM 在 2017 年 3 月以 5.5%的 WER 击败了他们。谷歌在 2017 年 5 月宣布,其 WER 达到了 4.9%。

在这样的水平上使用语音识别技术,结合自然语言处理(NLP)和自然语言生成(NLG),应用内服务对话可以获得两者,非常个性化,非常身临其境。

而且非常有效。说话是人类最容易的交流方式。说话和对话是紧密相连的。

最后但同样重要的是,这也是一种非常有效的提供客户服务的方式,因为人类交流信息的能力在说话时是最高的。

把人带回客户服务

现在,客户服务 2.0,客户服务的自动化,似乎正在从通过自助服务的呼叫偏转,然后机器人转向客户服务 3.0。

在自然语言处理和意图检测技术日益成熟的帮助下,这种迭代将把机器人从第二排移到第一排。它们将成为主要的客户支持界面。客户将通过聊天界面向机器人寻求帮助,而不是在 FAQ 上使用搜索框。然后,机器人本身将能够使用例如 FAQ 或数据库来回答问题,或者将问题升级到人类操作员。自助服务和辅助客户服务之间的区别将首先变得模糊,然后消失。机器处理较简单的问题,人处理较困难的问题。

随着自然语言处理、文本到语音、语音到文本技术和意图检测的进一步完善,打字将再次让位于语音,然后引入客户服务 4.0。

客户服务将完全转变为对话,无论是同步还是异步都不再重要。

客户服务是由机器人还是由人来提供也不再重要,但看起来会像人一样。这可能会对呼叫中心及其运营本身产生影响,我们将在另一篇文章中讨论。

底线是:客服会再次人性化。

如何定制你的 RStudio 主题(最后)

原文:https://towardsdatascience.com/customize-your-rstudio-theme-914cca8b04b1?source=collection_archive---------7-----------------------

按照这些简单的步骤在 RStudio 中安装自定义主题-包括主题!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我的大脑在一个数据科学的早晨疲惫不堪后被挖掘出来时,我的浏览器将会不可避免地指向一个被 RescueTime 归类为“娱乐”的大杂烩网站来自 Stack Overflow 上的热点网络问题页面(“问题:为什么恶魔的治愈速度比天使快?”)去调查哈德利过去六个月的承诺。

在我感觉我已经看完了整个互联网之后,我有时会开始摆弄我的 IDE 主题,好像改变我的函数调用的十六进制颜色实际上会改进我的工作。这并不是说我目前的字体或配色方案不完美,这是一个有趣的合理化,如果我有一些 dope 连字,我实际上会工作得更快。

我通过提醒自己奥利佛·文德尔·霍马斯早在 19 世纪说过的话来强化我对这些细枝末节的痴迷;据说是关于他的 Win95 设置:

“一瞬间的洞察力有时抵得上一生的经验”

所以也许,所有这些磨利斧头的行为,可以说,实际上是有益的。也许,这让我们对积极的黑天鹅更加敏感。好了,这是一个健康的合理化!

多么甜蜜的更新!

我经常在 RStudio 中工作,虽然大多数 ide 和文本编辑器都有优秀的主题和样式,如 Sublime、Atom、Visual Studio Code,但我们 RStudio 人在这方面一直很有限。我们有一些基本的主题,仅此而已。

好吧,几个月前一切都变了。RStudio v1.2xxx 预览版于 10 月发布,具有大量新功能,包括:

  • D3 功能
  • 能够在后台运行 R 作业
  • 更多 SQL 功能
  • 酷派 plumbr API 工具

但对我们来说,最可爱的功能是能够导入我们自己的主题!本文将快速介绍如何在 RStudio 中复制 Panda 语法主题

我们开始吧。

用 get 获取主题

RStudio 现在允许您上传。 tmThemes 和。 rsThemes 文件。我黑了一个类似熊猫的主题,放在一个回购中供你下载。我还在 repo 中加入了一个很棒的字体,叫做“Fira Code iScript ”,我们稍后会讲到。用这个 git 命令下载文件:

git clone [https://github.com/bradlindblad/rstudio-panda.git](https://github.com/bradlindblad/rstudio-panda.git)

安装字体

Fira Code iScript 是由 Ken Crocken 制作的一款优秀字体,它是 Fira Code 和 Script12 的混搭。这种字体在有斜体的地方使用 Script12 字样,在其他地方使用 Fira 代码。要安装它,双击*。您下载的 tff* 文件,然后在您的系统中安装字体,这将因每个操作系统而异。

它最终会看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很酷,是吧?要在 RStudio 中使用这种字体,请按照下列步骤操作:

  • 如果你还没有打开 RStudio
  • 导航到工具>全局选项>外观
  • 使用编辑器字体框选择 Fira 代码脚本

注意,按照这个过程,你可以安装几乎任何你想要的字体。

安装熊猫主题

接下来我们将安装熊猫主题。跟随:

  • 导航到工具>全局选项>外观
  • 在编辑器主题框下,单击添加
  • 导航到您克隆的 panda.thTheme 文件
  • 打开

现在你所需要的只是快速重启,你就可以开始一个新的甜蜜主题了!这是它在我的系统中的样子(Linux Mint 19,深色):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不错!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Obi Wan is pleased

制作你自己的主题

如果熊猫主题不适合你,你可以用这个在线编辑器制作你自己的。这允许你制作任何你想要的自定义主题。你只需要从网站上下载主题,然后像上面那样上传到 RStudio。

祝你在拖延中好运!

使用 Python Matplotlib 自定义地块

原文:https://towardsdatascience.com/customizing-plots-with-python-matplotlib-bcf02691931f?source=collection_archive---------3-----------------------

通过漂亮的可视化效果获得更好的洞察力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据科学和数据分析的核心部分是如何可视化数据。你如何利用可视化工具在定义你如何交流见解方面有着重要的作用。

我选择的探索和可视化数据的语言是 Python。

在这篇文章中,我想向您介绍我的框架,从可视化原始数据到拥有一个漂亮的情节,不仅引人注目,而且强调您想要传达的核心见解。

在这个例子中,我将使用在上一篇文章中使用的一组锻炼时间。它看起来像这样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Workout Dataset, where day category = 0/1 corresponds to weekday/weekend

一个简单的散点图应该是这样的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以用下面的代码复制它

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
  ax.scatter(x, y) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

对我来说,通常的下一步是标记轴并添加标题,这样每个图都被适当地标记。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码变化很小,但绝对有所不同。

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
  ax.scatter(x, y)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)') plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

去掉那个盒子怎么样?

为了改变图周围的缺省框,我们必须实际移除一些图的边界。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
  ax.scatter(x, y)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)')

  #removing top and right borders
  ax.spines['top'].set_visible(False)
  ax.spines['right'].set_visible(False) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

主要网格线

我通常喜欢在我的图中添加一些主要的网格线。它通过减少白色背景的数量来提高可读性。你可以调整它的宽度linewidth和透明度alpha

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
  ax.scatter(x, y)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)')

  #removing top and right borders
  ax.spines['top'].set_visible(False)
  ax.spines['right'].set_visible(False) #adds major gridlines
  ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

美学

你可以看到图中的一些重叠。为了进一步提高可读性,我们可以调整‘透明度——alpha

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5)) #customizes alpha for each dot in the scatter plot
  ax.scatter(x, y, alpha=0.70)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)')

  #removing top and right borders
  ax.spines['top'].set_visible(False)
  ax.spines['right'].set_visible(False) #adds major gridlines
  ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

仍然有一点重叠,但至少透明度提高了大部分点的可读性。

颜色;色彩;色调

由于我们有了天类别,我们也可以尝试用不同的颜色来标识我们图中的每个点。

为此,您可以从两种不同的方法中进行选择:

#1 定义您自己的调色板

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim):
  x = df[x_dim]
  y = df[y_dim]fig, ax = plt.subplots(figsize=(10, 5))

  #defining an array of colors  
  colors = ['#2300A8', '#00A658'] #assigns a color to each data point
  ax.scatter(x, y, alpha=0.70, color=colors)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)')

  #removing top and right borders
  ax.spines['top'].set_visible(False)
  ax.spines['right'].set_visible(False)#adds major gridlines
  ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)

#2 使用 Python 绘制彩色地图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了根据天类别绘制每个点,我需要在代码中引入一些新的组件

  • 导入颜色映射库
  • 天类别作为参数,可以映射出相应的颜色
  • 使用scatter方法中的参数c分配颜色序列
  • 使用参数cmap指定要使用的颜色图。我将使用彩色地图
import pandas as pd
import matplotlib.cm as cm
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim, category):
  x = df[x_dim]
  y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5)) #applies the custom color map along with the color sequence
  ax.scatter(x, y, alpha=0.70, c= df[category], cmap=cm.brg)

  #adds a title and axes labels
  ax.set_title('Distance vs Workout Duration')
  ax.set_xlabel('Distance (Km)')
  ax.set_ylabel('Workout Duration (min)')

  #removing top and right borders
  ax.spines['top'].set_visible(False)
  ax.spines['right'].set_visible(False) #adds major gridlines
  ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’, ‘day_category’)

传说

到目前为止,我们一直使用原生的scatter方法来绘制每个数据点。为了添加一个图例,我们需要稍微修改一下代码。

我们将不得不

  • 日类别作为参数,这样我们就有了自己的标签
  • 将数字(0,1)标签转换为分类标签(工作日、周末)
  • 遍历数据集,为每个数据点分配一个标签

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import matplotlib.cm as cm
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim, category):
   x = df[x_dim]
   y = df[y_dim] #converting original (numerical) labels into categorical labels
   categories = df[category].apply(lambda x: 'weekday' if x == 0 else 'weekend') fig, ax = plt.subplots(figsize=(10, 5)) #assigns a color to each data point
   colors = ['#2300A8', '#00A658'] #iterates through the dataset plotting each data point and assigning it its corresponding color and label
   for i in range(len(df)):
     ax.scatter(x.ix[i], y.ix[i], alpha=0.70, color = colors[i%len(colors)], label=categories.ix[i]) #adds title and axes labels
   ax.set_title('Distance vs Workout Duration')
   ax.set_xlabel('Distance (Km)')
   ax.set_ylabel('Workout Duration (min)') #removing top and right borders
   ax.spines['top'].set_visible(False)
   ax.spines['right'].set_visible(False) #adds major gridlines
   ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
   #adds legend
   ax.legend(categories.unique())
   plt.show()scatterplot(df, 'distance_km', 'duration_min', 'day_category')

现在你知道了!定制的散点图,现在可以更容易地理解数据并获得一些见解。

感谢阅读!

前沿的人脸识别很复杂。这些电子表格使它变得更容易。

原文:https://towardsdatascience.com/cutting-edge-face-recognition-is-complicated-these-spreadsheets-make-it-easier-e7864dbf0e1a?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Excel 中为正常人构建深度卷积神经网络的 9 个步骤。

机器学习可能很复杂……而且刚开始学的时候很吓人。另一方面,电子表格很简单。它们并不*性感,*但是它们去除了干扰,帮助你以直观的方式可视化代码背后发生的事情。

通过一步一步的电子表格(可以使用下面的链接查看或下载),我将向您展示计算机视觉中使用的卷积神经网络(“CNN”)是如何工作的。有一点数学,但你可以遵循电子表格中的所有公式:

【https://drive.google.com/open? id = 1 tjxppq 6 cz-4kvrxtsrbj 4 u 4 orcaamtpgvy 58 yujbzhk

电子表格模型查看图片,分析其像素,并预测它是否是埃隆马斯克,杰夫·贝索斯,或 rrrr 琼恩·雪诺…显然是天网的最大威胁。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Terminator Vision — Creating a convolutional neural net in a spreadsheet

这篇文章将涵盖上述 9 个步骤,并对每个步骤进行类比,以帮助增强你的直觉。

目标是给你一个简单的方法来开始机器学习,并向好奇的头脑展示尖端人工智能如何通过易于遵循的电子表格“在引擎盖下”工作。如果这对你有帮助,请考虑通过点击下面的注册我的电子邮件列表,我将向你发送更多电子表格,帮助你开始机器学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算机视觉是脸书面部识别系统、中国奥威尔式大规模监控以及很快你的汽车:

大图类比:CNN 就像夏洛克·福尔摩斯

让我们先假设在终结者的大脑里住着一位名叫“夏洛克·卷积·福尔摩斯”的特殊侦探他的工作是仔细观察证据(输入图像),并利用他敏锐的眼睛和推理能力(特征检测),他预测照片中的人并破解案件(正确分类图像)。

以下 9 个步骤中的每一个都是这个大图类比的一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Convolutional neural net architecture

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入——一张图片胜过一千个数字

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Skynet’s biggest threat, Elon Musk

当我看这张照片时,我看到了一个幻想家。一个人在改善地球的同时建造了一个火箭来逃离它,以防终结者试图炸毁它。与计算机不同,我看不到像素值,也看不出图片只是红、绿、蓝光的叠加组合:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一方面,计算机(即天网)是盲目的…它只能看到数字。

把一张数码照片想象成 3 个电子表格(1 个红色,1 个绿色,1 个蓝色)堆叠在一起,每个电子表格都是一个数字矩阵。拍照时,您的相机会测量照射到每个像素的红色、绿色和蓝色光量。然后,它按照 0-255 的范围对每个像素进行排序,并将它们记录在电子表格中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Computers see spreadsheets

在上面的 28x28 图像中,每个像素由 3 行(1 行红色、1 行蓝色和 1 行绿色)表示,其值为 0–255。像素已经基于它们的值被有条件地格式化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Terminator doesn’t see an eye, he sees a bunch of numbers

如果我们将每种颜色分成单独的矩阵,我们有 3 个 28x28 矩阵,每个矩阵都是我们用来训练神经网络的输入:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Model inputs

***** 侧栏:如果你想学习如何在大约 30 秒内将任何图片转换成条件格式的 Excel 文件,请访问:

http://think-maths.co.uk/spreadsheet

你将学会如何拍一张你的电子表格同事会喜欢的“前照片”……相信我,他们会在电子表格中看到你(或他们)的照片而开怀大笑🤳(小图片效果最好)。

培训概述—有其父必有其子

当你出生的时候,你知道什么是狗吗?不,当然不是。但是随着时间的推移,你的父母会给你看书籍、漫画、现实生活中的狗的照片,最终…你可以指着那些四条腿的毛茸茸的动物说“狗”你大脑中数十亿神经元之间的联系变得足够强大,以至于你能认出狗。

终结者学会了用同样的方式看待伊隆。通过一个叫做监督训练的过程,向它展示了数千张埃隆·马斯克、杰夫·贝索斯和琼恩·雪诺的照片。起初,它有 1/3 的机会猜出来是谁…但就像一个孩子一样…随着时间的推移,它会在训练中看到更多的图像。网络的连接或“权重/偏差”随着时间的推移而更新,使得它可以基于像素输入来预测图像输出。这就是在第一部分中讨论的学习过程(梯度下降)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CNN learning to see — the training loop

那么是什么使得卷积神经网络不同于普通的神经网络呢?

一言以蔽之:翻译不变性。

是啊…那对我来说也毫无意义。让我们来解构:

  • 翻译=将某物从一个地方移到另一个地方
  • 不变性=它不会改变

对于计算机视觉来说,这意味着无论物体在图像中被移动到哪里(平移),都不会改变该物体是什么(不变性)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Translation Invariance (Plus scale invariance to exaggerate the point)

必须训练卷积神经网络来识别 Elon 的特征,不管他在图像中的什么位置(平移),也不管他的大小(比例不变)。

CNN 擅长识别图像任何部分的模式,然后将这些模式一个接一个地堆叠起来,构建更复杂的模式……就像人类一样。

在正常的神经网络中,我们会将每个单独的像素作为模型的输入(而不是 3 个矩阵),但这忽略了一个事实,即靠近在一起的像素具有特殊的意义和结构。使用 CNN,我们查看相邻的像素组,这允许模型学习局部模式,如形状、线条等。例如,如果 CNN 看到一个黑色圆圈周围有许多白色像素,它会将这个图案识别为一只眼睛。

为了让 CNN 完成翻译差异,他们依赖于其功能侦探夏洛克卷积福尔摩斯的服务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

认识一下夏洛克·康科利·福尔摩斯——特写侦探

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sherlock searching for features

夏洛克活在终结者的脑海里。他用放大镜一次仔细观察一幅图像的一部分,并找到该图像的重要特征或“线索”。当他收集像简单的线条和形状这样的线索时,他把它们一个接一个地堆叠起来,开始看到像眼睛或鼻子这样的面部特征。

每个卷积层都有一堆相互依赖的特征图或“线索”。在案件结束时,他把所有这些线索放在一起,他能够破解案件,并正确识别他的目标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Each feature map is like another “clue”

网络的每个卷积层都有一组特征图,这些特征图能够以如下所示的分层方式识别日益复杂的模式/形状。

CNN 使用数字的模式识别来找出任何图像最重要的特征。由于它将这些图案堆叠在更多的层上,因此可以构建非常复杂的特征地图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现实生活中的 CNN 做着和夏洛克完全一样的事情:

Convolutional neural net detecting features

让 CNN 如此神奇的是,他们自己学会了这些特征…一个工程师不会写代码说寻找一组两个眼睛,一个鼻子,一张嘴,等等。

这样,工程师就更像建筑师了。他们告诉夏洛克,“我给你两叠(“卷积层”)空白特征地图(“线索”),你的工作是分析图片并找到最重要的线索。第一个堆栈有 16 个特征地图(“线索”),第二个堆栈有 64 个特征地图…现在去把你的侦探技能派上用场,破案吧!”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了让夏洛克找到案件中的“线索”(即“计算特征图”),他依赖于他的侦探工具包中的几个工具,我们将逐一介绍:

  • 滤镜 —夏洛克的放大镜🔍
  • 卷积数学 —滤波器权重 x 输入图像像素
  • 大步走 —在输入图像周围移动滤镜🔍 ➡️ 🔍 ➡️
  • 填充材料——像“犯罪现场胶带”一样保护线索🚧

夏洛克放大镜/滤光镜

毫无疑问,夏洛克非常敏锐,具有敏锐的观察能力,但如果没有他收集的特殊放大镜或“过滤器”,他就无法完成工作他使用不同的放大镜来帮助他填写每个空白特征地图的细节。所以,如果他有 16 张地图…他会有 16 个放大镜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个放大镜由多层玻璃组成,每层玻璃由不同的重量组成。玻璃的层数,我们的“过滤深度”,总是与他正在看的输入层的层深度相匹配。

首先,夏洛克在看我们的输入图像,它有三层——红色、绿色和蓝色。所以…我们的放大镜也有 3 层。

当我们构建 CNN 时,我们的层深度增加,因此我们的放大镜也会变得更厚。

为了让夏洛克构建一个特征图或“线索”,他首先拿出一个放大镜,放在输入图像的左上方。红色玻璃层只能看到红色输入图像,绿色玻璃看到绿色图像,蓝色玻璃看到蓝色图像。

现在是数学问题。

卷积数学

我们特征图中的每个像素都是线索的一部分。为了计算每个像素,夏洛克必须做一些基本的乘法和加法。

在下面使用 5x5x3 输入图像和 3x3x3 滤波器的示例中,1 个像素需要 27 次乘法运算:

  • 3 层 x 每层 9 个乘法卷积= 27
  • 27 个数字中的每一个都加在一起。
  • 将 27 个计算值加在一起后,我们再加一个数字——我们的偏差。

Convolution Calculation — Sherlock building his feature maps or “clues”

让我们放大来看看数学。一个像素由 27 个乘法运算组成(3 层 x 每层 9 个乘法运算),下面的屏幕截图显示了 27 个乘法运算中的 9 个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Element-wise multiplication — calculating 1 piece of a clue

就偏向而言,你可以把它想象成每个放大镜的手柄。像权重一样,它是模型的另一个参数,在每次训练运行时都会进行调整,以提高模型的准确性并更新特征图细节。

过滤权重——在上面的例子中,我将权重设为 1 和 0,以简化计算;然而,在一个正常的神经网络中,你可以用随机的较低值来初始化你的起始权重…比如使用钟形曲线或正态分布类型的方法在 0.01 和 0.1 之间的值。要了解更多关于重量初始化的信息,请查看此简介

大步走——移动放大镜

计算完特征图的第一个像素后,夏洛克下一步把放大镜移到哪里?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Striding — Moving magnifying glass 1 pixel at a time

答案取决于步幅参数。作为建筑师/工程师,我们必须告诉夏洛克,在他计算特征图中的下一个像素之前,他应该将放大镜向右移动或“移动”多少像素。2 或 3 的步幅在实践中是最常见的,但是为了简单起见,我们将坚持使用 1。这意味着夏洛克将他的眼镜向右移动 1 个像素,然后他将执行与之前相同的卷积计算。

当他的眼镜到达输入图像的最右边时,他将放大镜向下移动 1 个像素,一直移动到左边。

为什么你的步幅会超过 1?

优点:

  • 通过减少计算量和存储在内存中的计算量来加快模型的速度。

CONS:

  • 您会丢失关于图片的信息,因为您会跳过像素,并可能错过看到图案。

步长为 2 或 3 通常是有意义的,因为相邻像素通常具有相似的值,但如果它们相距 2-3 个像素,则对于特征图/模式来说很重要的像素值更有可能发生变化。

如何防止信息丢失(丢失线索)

为了让夏洛克破案,他需要大量的线索。在上面的例子中,我们拍摄了一个 5x5x3 的图像,或 75 像素的信息(75 = 5 x 5 x 3),我们最后只得到一个 3x3x2 的图像,或第一个卷积层后的 18 像素(18 = 3 x 3 x 2)。这意味着我们失去了证据,这让他的搭档约翰·沃森非常不安。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 CNN 的前几层,夏洛克喜欢看到许多微小的图案(更多的线索)。在后面的图层中,当夏洛克堆叠微小的线索并查看更大的图案时,可以“向下采样”并减少我们的像素总量(更少的线索)。

那么,我们如何在 CNN 的开头防止这种信息丢失呢?

#1:填充——我们必须在图像周围用“填充”来保护犯罪现场。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Padding

在我们的例子中,在到达右边之前,我们只能移动过滤器 3 次…从上到下也是一样。这意味着我们得到的输出高度/宽度是 3x3,我们从左到右损失了 2 个像素,从上到下移动滤镜又损失了 2 个像素。

为了防止这种信息丢失,通常用零“填充”原始图像(称为“零填充”或“相同填充”)…有点像犯罪现场磁带,以确保没有人篡改这样的线索:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

填充后,如果夏洛克再次使用他的放大镜,他的两个特征图将都是 5x5 而不是 3x3。

这意味着我们将剩下 50 个像素的信息,因为这个卷积的新输出是 5x5x2 = 50。

50 像素比 18 像素好。但是记住…我们从 75 像素开始,所以我们仍然缺少一些线索。

那么,我们还能做些什么让夏洛克和约翰·沃森开心呢?

#2:更多的过滤器——通过在我们的卷积层中添加至少一个特征地图,给夏洛克更多的线索

我们的模型拥有的特征地图或“线索”的数量没有限制…这是一个我们可以控制的参数。

如果我们将特征图从 2 个增加到至少 3 个(5x5x 2…到…5x5x3),那么我们的总输出像素(75)与我们的输入像素(75)相匹配,并且我们确保没有信息丢失。如果我们把地图增加到 10 个,那么当夏洛克找到他的线索时,我们会有更多的信息需要他整理(250 像素= 5×5×10)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,前几层的总像素信息通常高于我们的输入图像,因为我们想给夏洛克尽可能多的微小线索/图案。在我们的网络的最后几层中,向下采样和具有较少像素是常见的,因为这些层识别图像的较大模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

非线性模式识别— ReLUs

在一个案件中给夏洛克足够的信息是重要的,但是现在是真正的侦探工作的时候了——非线性模式识别!比如耳朵的弯曲或者鼻子的鼻孔。

到目前为止,夏洛克已经做了大量的数学运算来构建他的特征地图,但每次计算都是线性的(获取输入像素并对每个像素执行相同的乘法/加法),因此,他只能识别像素的线性模式。

为了在 CNN 中引入非线性,我们使用一个激活函数,称为整流线性单元或简称“ReLU”。在我们从第一次卷积计算出我们的特征图之后,每个值都通过这个函数来查看它是亮着还是被“激活”

如果输入值是负的,那么输出变成零。如果输入为正,则输出值保持不变。ReLU 就像一个开/关开关,当您通过 ReLU 运行特征图的每个值后,您就创建了非线性模式识别。

回到我们最初的 CNN 示例,我们将在卷积后立即应用 ReLU:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ReLU = Rectified Linear Unit

虽然有许多非线性激活函数可用于将非线性引入神经网络(sigmoids、tanh、leaky ReLU 等)。),ReLUs 是目前 CNN 中最常用的,因为它们计算效率高,学习速度更快。查看 Andrej Karpathy 关于非线性激活函数的概述,了解每个函数的优缺点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大化共享——把关键的几个放在大脑阁楼里

既然夏洛克已经有了一些特征图,或者“线索”,可以开始查看,他如何确定哪些信息是关键的,哪些是不相关的细节呢?最大池化。

夏洛克认为人脑就像一个空荡荡的阁楼。傻瓜会把各种各样的家具和物品放在那里,这样有用的信息最终会在混乱中丢失。聪明的人只储存最重要的信息,以便在需要时能迅速做出决定。这样,max pooling 就是夏洛克版的大脑阁楼。为了让他快速做出决定,他只保留最重要的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Max Pooling is like Sherlock Holmes ‘Brain Attic’

使用 max pooling,他查看像素邻域,并且只保留“最大”值或“最重要”的证据。

例如,如果他在看一个 2×2 的区域(4 个像素),他只保留具有最高值的像素,而丢弃其他 3 个像素。这种技术让他学得很快,也帮助他归纳(相对于“记忆”)线索,他可以为将来的图像存储和记忆。

类似于我们前面的放大镜过滤器,我们也控制最大池的步幅和池的大小。在下面的例子中,我们假设步幅为 1,池大小为 2x2:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Max pooling — picks the “maximum” value in a defined neighborhood of values

在最大池化之后,我们已经完成了一轮卷积/ReLU/最大池化。

在一个典型的 CNN 中,在我们到达我们的分类器之前,会有几轮卷积/ReLU/pooling。对于每一轮,我们会在增加深度的同时压缩高度/宽度,这样我们就不会在途中丢失证据。

第 1-5 步的重点是收集证据,现在是夏洛克查看所有线索并破案的时候了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有了证据,让我们开始理解这一切…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当夏洛克到达一个训练循环的末尾时,他有一个分散在各处的堆积如山的线索,他需要一种方法来一次查看所有的线索。每条线索都是一个简单的二维数值矩阵,但是我们有成千上万条这样的线索堆积在一起。

作为一名私人侦探,夏洛克在这种混乱中茁壮成长,但他必须将他的证据带到法庭上,并为陪审团组织起来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Feature maps prior to flattening

他使用一种简单的变换技术来实现这一点,这种技术叫做展平:

  1. 每个二维像素矩阵变成 1 列像素
  2. 我们的二维矩阵的每一个都放在另一个的上面。

这是人眼看到的变形的样子…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回到我们的例子,这是计算机看到的…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然夏洛克已经组织好了他的证据,是时候让陪审团相信证据明确指向一名嫌疑人了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在全连接层中,我们将证据与每个嫌疑人联系起来。从某种意义上说,我们通过向陪审团展示证据和每个嫌疑人之间的联系,为他们“连接线索”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fully connected layer — connecting the evidence to each suspect

使用我们的数字示例,计算机会看到以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fully connected layer

在展平层中的每个证据和 3 个输出之间是一堆权重和偏差。像网络中的其他权重一样,当我们第一次开始训练 CNN 时,这些权重将被初始化为随机值,随着时间的推移,CNN 将“学习”如何调整这些权重/偏差,以产生越来越准确的预测。

现在是夏洛克破案的时候了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 CNN 的图像分类器阶段,模型的预测是得分最高的输出。目标是让正确的输出得到高分,让不正确的输出得到低分。

该评分功能有两个部分:

  1. Logit 分数—原始分数
  2. soft max-0–1 之间每个输出的概率。所有分数之和等于 1。

第 1 部分:逻辑——逻辑分数

每个输出的 logit 得分是一个基本的线性函数:

Logit 得分=(证据 x 权重)+偏差

每条证据都乘以将证据与输出关联起来的权重。所有这些乘法加在一起,我们在最后加上一个偏差项,最高分就是模型的猜测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Logit score calculation

那么我们为什么不就此打住呢?2 个直观原因:

  1. 夏洛克的自信程度 —我们想知道夏洛克有多自信,这样我们就可以在他高度自信并且正确的时候奖励他……在他高度自信并且错误的时候惩罚他。当我们最后计算损失(“夏洛克的准确性”)时,这个奖励/惩罚被捕获。
  2. 夏洛克的置信加权概率 —我们希望有一种简单的方法将这些概率解释为 0-1 之间的概率,并且我们希望得到与实际输出(0 或 1)相同的预测分数。实际正确的图像(Elon)具有 1,而其他不正确的图像(Jeff 和 Jon)具有 0。把正确的输出变成 1,不正确的输出变成 0 的过程叫做一键编码

夏洛克的目标是让他的预测尽可能接近 1,以获得正确的输出。

第二部分:soft max——夏洛克的置信加权概率得分

2.1.夏洛克的自信程度:

为了找出夏洛克的信心水平,我们用字母 e(等于 2.71828…)乘以 logit 分数。高分成为非常高的置信度,低分成为非常低的置信度

这个指数计算也确保了我们没有任何负的分数。因为我们的 logit 分数“可能”是负的,所以假设的 logit 分数在取幂之后会发生什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The “Confidence” Curve

2.2 夏洛克的置信加权概率:

为了找到置信度加权概率,我们将每个输出的置信度度量除以所有置信度得分的总和,这给出了每个输出图像的概率,其总和为 1。使用我们的 Excel 示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Softmax

这个 softmax 分类器很直观。夏洛克认为,终结者看到的照片有 97%的可能性是埃隆·马斯克。

我们模型的最后一步是计算我们的损失。这一损失告诉我们一个侦探夏洛克到底有多好(或多坏)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个神经网络都有一个损失函数,我们将预测值与实际值进行比较。随着我们训练 CNN,随着我们调整网络的权重/偏差,我们的预测会提高(夏洛克的侦探技能变得更好)。

CNN 最常用的损失函数是交叉熵损失。在谷歌上搜索交叉熵会出现几个带有大量希腊字母的解释,所以很容易混淆。尽管描述各不相同,但在机器学习的背景下,它们都意味着相同的事情,因此我们将在下面介绍 3 种最常见的方法,以便为您提供帮助。

在处理每个公式变体之前,下面是它们各自的工作:

  • 比较正确类别的概率(Elon,1.00)与 CNN 对 Elon 的预测(他的 softmax 得分,0.97)
  • 当夏洛克对正确类别的预测接近 1 =低成本时,奖励他👏
  • 当夏洛克对正确类别的预测接近 0 时,惩罚他=高成本👎

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

These all result in the same answer! 3 different interpretations…

#1 解释——测量实际概率和预测概率之间的距离

距离捕捉了这样一种直觉:如果我们对正确标签的预测接近于 1,那么我们的成本就接近于 0。如果对于正确的标签,我们的预测接近于 0,那么我们会受到很大的惩罚。目标是最小化正确类的预测(Elon,0.97)和正确类的实际概率(1.00)之间的“距离”。

在解释#2 中讨论了奖励/惩罚“对数”公式背后的直觉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cross Entropy — 1. Distance Interpretation

#2 解释——最大化对数可能性或最小化负对数可能性

在 CNN 中,“log”实际上是“自然对数(ln)”的意思,它是 softmax 的步骤 1 中完成的“取幂/置信度”的逆运算。

不是采用实际概率(1.00)减去预测概率(0.97)来计算成本,而是对数计算指数地惩罚夏洛克,他的预测离 1.00 越远。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cross Entropy — 2. Log Loss Interpretation

#3 解释— KL 分歧

KL (Kullback-Leibler)散度衡量我们的预测概率(softmax 得分)与实际概率的偏离程度。

该公式分为两部分:

  1. 我们实际概率的不确定性。在机器学习的监督训练的背景下,这总是零。我们 100%确定我们的训练形象是埃隆·马斯克。
  2. 如果我们使用我们预测的概率,我们会丢失多少“信息”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. Cross-Entropy — KL Divergence Interpretation

包扎

在我们的特别卷积侦探夏洛克·福尔摩斯的帮助下,我们给了终结者一双眼睛,所以他现在有能力寻找并摧毁自由世界的保护者…埃隆·马斯克(抱歉埃隆!).

虽然,我们只训练终结者区分埃隆,杰夫和乔恩…天网有无限多的资源和训练图像在它的处置,所以它可以利用我们已经建立和训练终结者看到任何人或事。

订阅更多并分享

如果你喜欢这一点,并希望获得更多优秀的学习和备忘单直接发送到您的收件箱,请点击下面并输入您的电子邮件地址(它们都是免费的)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他资源—交互式

在这场对抗机器的战争中,我们未来的命运掌握在你的手中😜

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Terminator Vision

切断绳索:预测电信公司的客户流失

原文:https://towardsdatascience.com/cutting-the-cord-predicting-customer-churn-for-a-telecom-company-268e65f177a5?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以在这里找到 Github 项目库中的代码,或者在这里查看的最终演示幻灯片。

为什么要研究客户流失?

客户流失是大多数企业面临的最大问题之一。根据哈佛商业评论发现一个新客户的成本是留住一个现有客户的 5 到 25 倍。换句话说,你现有的客户价值连城!

防止客户流失是一项重要的业务职能。这也是一个经常用漫无目的的、粗略的方法来处理的问题。通过建立一个模型,用机器学习算法预测客户流失,理想情况下,我们可以将不满意的客户问题扼杀在萌芽状态,并保持收入流动。

背景

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我使用了来自 Kaggle.com 的数据集,其中包括一家名为 Telco 的电信公司的 7033 条独特的客户记录。每个条目都有关于客户的信息,包括以下特征:

服务—客户订购的服务(互联网、电话、有线电视等。)

每月账单总额

任期——他们成为客户多长时间了

基本的人口统计信息——他们是否是老年人,是否有家属,等等。

在我们的研究中,因变量是客户在过去一个月中是否有过“搅动”。事实上,我们有整整 27%的客户被贴上了上个月离开公司的标签。随着流失率如此之高,如果我们不干预,公司失去大部分客户只是几个月的事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Churn!

假设

出于我们分析的目的,我们做了两个假设:

  1. **对于每个离开公司的客户,电信公司需要花费 500 美元来替换该客户。**营销、广告、活动和外展——成本不断增加。
  2. 我们可以通过投资 100 美元留住每个可能流失的客户。这可以通过折扣、改善服务(例如提升网速)或提供额外津贴来实现。

树立标杆

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Let’s make our model better.

为了宣告胜利,我们需要知道成功是什么样子的!我们成功的主要衡量标准是我们的模型相对于默认的虚拟模型的表现如何。请将此视为“维持现状”选项。因为我们知道花 100 美元留住一个客户从长远来看会为我们节省 500 美元——但是我们不知道哪些客户可能会流失——**我们默认的“虚拟”模式就是在我们所有的*客户身上花 100 美元,以确保我们抓住那些流失的客户。***这是我们想要击败的模式。

方法学

对于我们的模型,我们首先查看了几种不同的机器学习算法,以确定应该使用哪种算法。我们的第一步是使用训练-测试-分割将我们的数据分割成训练集和测试集,这将允许我们稍后交叉验证我们的结果。**我们还对训练-测试-分割进行了分层,**以确保我们的目标变量在训练和测试集中的比例相同。

# Stratify our train-test-split so that we have a balanced split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=40, stratify=y)

我们还使用了一些少数过采样来平衡我们的数据集。由于我们数据库中只有大约 27%的记录被标记为“搅动的”,在没有过采样的情况下将我们的数据输入我们的算法会导致它对我们的目标变量分类不足。我们使用 imblearn 的 SMOTE 使我们的少数民族类达到数据集的 50%

sm = SMOTE(random_state=42, ratio=1.0)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)

现在我们的数据已经平衡了,我们接着执行另一个训练测试分割——这一次只是在我们的训练数据上。这样做的原因是为了不违反交叉验证的基本原则——根据测试数据提供的结果做决定。

X_train_2, X_test_2, y_train_2, y_test_2 = train_test_split(X_train_res, y_train_res, test_size=0.33, random_state=20)

在所有这些辉煌的数据管理之后,我们绘制了一条 ROC 曲线,以比较每个算法在识别真阳性(灵敏度)和假阳性(特异性)方面的表现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The ROC Curve, in all its glory.

基于这个图,我们决定用 4 个主要的分类模型前进:逻辑回归、梯度推进、随机森林和 AdaBoost。我们着手调整这些模型,以充分利用它们。

对于我们的分析,召回是我们的目标指标。我们最关心的是用我们的模型捕捉尽可能多的真阳性(可能流失的人),我们不太关心我们可能会把一些假阴性(没有流失的人)一起扫进去。

了解了这一点,我们然后使用 Sci-Kit Learn 的 GridSearchCV 函数,它允许我们调整我们的模型。我们将召回率设置为优化的评分标准,然后使用不同超参数的组合来找到最适合的模型。我们的目标是从我们的模型中挤出最后一点召回,不能少!

pipe = Pipeline([('scaler', StandardScaler()),
                 ('clf', RandomForestClassifier())])
​
param_grid = [{'clf__max_depth': [4, 5, 6],
               'clf__max_features': [5, 10, 15, 20],
               'clf__n_estimators': [50, 100, 150]}]
​
gs = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='recall')
gs.fit(X_train_res, y_train_res)

GridSearchCV 还包括一个方便的交叉验证功能(这就是 CV 的含义!),所以我们在每个模型的新参数通道上执行分层 K 折交叉验证。不用说,我们在试图避免过度拟合我们的模型时非常仔细。

最后,我们分析的很大一部分与创建一个**“节省的净美元”函数**有关,该函数将确定我们在留住客户上花了多少钱,而不是因为不必替换他们而节省了多少钱。这和回忆一起,构成了我们判断是否有一个成功模型的决策标准。

结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

All of our models performed well.

调整了我们的模型后,结果是 3 个模型并驾齐驱。**我们的最后一步是调整每个模型的概率阈值(在 i = .01 和 i = 1 之间)。**这让我们能够优化“节省的净美元”功能。本质上,对于每个概率阈值 i ,我们要求我们的模型预测客户是否会流失——即使是非常低和非常高的 I 值。当然,当 i 接近 0 时,我们的模型基本上会预测每个人都会流失——相反,当它接近 1 时,没有人会流失。通过绘制这个函数,我们能够看到优化我们的“净节省美元”函数的确切概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Making money by keeping customers.

最终,Logistic 回归模型胜出。它显示了 81%的出色召回率,并且最大化了我们的“净节省美元”功能。总的来说,我们的模型为我们节省了 272,200 美元,轻松击败了“现状”模型。这种模式只节省了(微不足道的)16.2 万美元。

感谢阅读!如果你喜欢这个帖子,在 LinkedIn 上找到我,在 Medium 上给我鼓掌,或者在这里给我发电子邮件。向前向上,朋友们!

【CVPR 2014 /论文摘要】显著对象分割的秘密

原文:https://towardsdatascience.com/cvpr-2014-paper-summary-the-secrets-of-salient-object-segmentation-9c777babdc5?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gif from this website

我已经知道什么是分割,但是我不知道什么是显著对象分割。因此,我决定通过阅读 2014 年 CVPR 上发表的一篇论文来改变这一现状。

请注意,这篇文章是为了让未来的我回顾并记住这篇文章的内容。

显著物体检测/注视预测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from this website

显著的 →最显著的或最重要的。(来自谷歌搜索)

因此,从上面的图像中,我们可以得出结论,显著对象检测是一个用于分割图像中最重要的对象的术语。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from this paper

从上面的论文中我们可以得出结论,当我们希望预测人眼在观看图像时看得最多的地方时,使用术语注视预测。

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇文章声称,我们目前评估显著对象基准的方式存在巨大的偏差(称为数据集偏差)。(请记住,本文发表于 2014 年。)此外,本文还介绍了一种显著对象分割的新方法,该方法优于现有的模型。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以在我们继续之前,我们需要知道一个术语。

数据集设计偏差 →一种特殊类型的偏差,由实验者对数据集图像的非自然选择引起。(更多信息请点击此处)

这篇论文的作者告诉我们两件事。计算机视觉中的显著性不是一个明确定义的术语,它可以被理解为 a)分割,其中我们分割图像中最重要的对象,或者 b)眼睛注视预测。然而,现有的方法存在两个问题。

  1. 如果一个模型专注于一个问题,它往往会忽略与另一个问题的联系。
  2. 如果一个模型在一个数据集上进行基准测试,它往往会过度适应该数据集,从而产生固有的偏差。

相关作品

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该论文再次描述了每个问题是什么,例如注视预测是眼睛凝视预测,并且对于显著对象分割是试图分割给定图像中最重要的对象的任务。本文还讨论了对象识别任务(我们试图在它们各自的每一类中找到对象)与显著对象分割之间的联系。最后,作者讨论了一个数据集偏差,这在视觉显著性分析中心偏差是一个巨大的问题。这是当实验参与者专注于观看图像的中心,而摄影师想要将焦点对准图像的中心时的原因。

数据集分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这一节的题目是巨大的,主要是因为它是本文的核心贡献之一。我不得不说,我不知道他们做的所有统计分析的细节,但是,一旦我研究了他们。我一定会再写一篇博文。

在帕斯卡数据集 上的心理物理实验在这里,作者进行了一些实验来收集用于注视预测的地面真实数据帕斯卡 2010 数据 se t 上

评估数据集一致性
为了比较不同标注者(来自之前的实验)之间的一致程度,作者进行了一些广泛的分析,以了解受试者之间的一致性。(对于显著对象分割以及注视预测)。作者发现一个有趣的事实是……(如下所示)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基准测试 在这里,作者比较了许多执行显著对象分割的先进算法,并发现当算法没有在 FT 数据集上训练时,它们的性能显著下降。

数据集设计偏差 作者在这一节真的是全力以赴,他们进行了很多统计分析,比如比较局部颜色对比度、全局颜色对比度、局部 gPB 边界强度、对象大小等。他们把建国总结成一段话

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本上,在 FT 数据集中,在我们想要分割的对象和该对象的背景图像之间存在强烈的对比。这使得模型更容易学习如何分割对象,但不能很好地概括。

注视和 F-measure
这里作者讨论了中心偏差问题的影响,以及许多最先进的算法抵消中心偏差问题的方法。例如,在 AWSSIG 中,他们在 s-AUC 中对其算法性能进行了基准测试,消除了中心偏差问题。

从注视到显著物体检测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于这一部分,上面的图片,一步一步地描述了作者的方法来执行显著的对象分割,这是一个惊人的工作。(他们声称这很简单,但在我看来真的一点也不简单…)

  1. 使用 CPMC 执行无监督分割方法
  2. 获得对象内注视的空间分布
  3. 具有一个函数,其中给定一个建议的对象候选遮罩及其固定图(来自步骤 1 和 2),估计该区域相对于地面实况的重叠分数(交集/并集)。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,本文已经证明了在注视预测和显著对象检测之间存在强相关性的事实。使用这种知识,他们提出了一种执行显著对象分割的新方法,其中他们首先执行片段生成过程,然后使用注视预测的显著性评分机制。最后,本文还描述了数据集中的偏差,这在视觉显著性分析中心偏差是一个巨大的问题。

遗言

这篇论文包含了大量的信息,并且作为显著对象分割任务以及眼睛注视跟踪的非常好的介绍。非常有趣…

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 李,杨,侯,x,科赫,c,瑞格,J. M .,,尤耶,A. L. (2014)。显著对象分割的秘密。佐治亚理工学院。
  2. MSRA10K Salient Object Database. (2014). 南开大学媒体计算实验室. Retrieved 28 April 2018, from https://mmcheng.net/msra10k/
  3. (2018).Arxiv.org。检索于 2018 年 4 月 28 日,来自https://arxiv.org/pdf/1611.09571.pdf
  4. 如何识别 AI 中的排斥—微软设计—中?(2017).中等。检索于 2018 年 4 月 28 日,来自https://medium . com/Microsoft-design/how-to-recognize-exclusion-in-ai-EC 2d 6d 89 f 850
  5. 帕斯卡视觉对象类挑战 2010 (VOC2010)。(2018).Host.robots.ox.ac.uk 检索 2018 年 4 月 28 日,来自http://host.robots.ox.ac.uk/pascal/VOC/voc2010/
  6. 频率调谐显著区域检测。(2018).Ivrlepfl.ch 于 2018 年 4 月 28 日检索,来自 http://ivrlwww.epfl.ch/supplementary_material/RK_CVPR09/
  7. 图像签名:突出稀疏的显著区域。(2018).Ieeexplore.ieee.org。检索于 2018 年 4 月 28 日,来自 https://ieeexplore.ieee.org/document/5963689/
  8. 加西亚-迪亚兹,a .,莱博兰,v .,Fdez-Vidal,x .,和帕尔多,X. (2012 年)。光学可变性、视觉显著性和眼睛注视之间的关系:一种计算方法。视觉杂志,12(6),17–17。doi:10.1167/12.6.17

【CVPR 2017 /论文摘要】用于密集图像标注的门控反馈细化网络

原文:https://towardsdatascience.com/cvpr-2017-paper-summary-gated-feedback-refinement-network-for-dense-image-labeling-8746a3e1889b?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

我一直想读的论文之一。

请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于密集标记问题,重要的是考虑图像中的局部和全局信息。在本文中,作者提出了门控反馈细化网络,该网络最初进行粗略预测,然后在细化阶段通过有效地整合局部和全局上下文信息来逐步细化细节。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在要求像素级精度的图像密集标记中,保持空间分辨率非常重要,因为我们需要创建一个分割掩模。这些任务中的大多数都有一个解码器部分,它逐渐恢复类别的像素级规范。在编码阶段的最深处,神经元可能缺乏空间信息(由于下采样),然而,它通常具有最丰富的可能特征表示。并且在更早的层中,每个神经元将具有更大的空间局部性,但是可能区分度更低。(如上图。).因此,为了克服这个问题,本文的作者介绍了一种新的架构,其中编码器和解码器通过门控单元连接。(因此利用了来自早期层的空间信息以及较深层中丰富的特征表示。).该模型的一个优点是这种类型的方法可以应用于任何编码器-解码器类型的神经网络。

背景

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,作者简要描述了编码器-解码器类型网络的基础知识,并给出了一些具有类似结构的示例论文。接下来,作者讨论了编码器和解码器之间跳过的连接。一个有趣的事实是,对于密集标记任务,对诸如小平移或光照等有害因素不变的特征地图的高表示并不理想。因为一些重要的关系可能被抽象掉。

门控反馈细化网络

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所示,该网络是 VGG 16 的修改版本,其中去掉了 softmax 层,并增加了两个额外的卷积层。最后,在编码器阶段结束时,特征映射具有 HWC 的维数,其中 C 是类的数量。(上采样是通过双线性上采样完成的)。并且使用解码器来恢复空间分辨率。作者工作的新颖性主要在于编码器和解码器之间的门控连接,而不是通过直接连接直接连接两者,他们使用门控机制来调制信息。

门单元

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,选通单元接收两个特征图作为输入,并且由于每个特征图的维数彼此不同,所以它们应用一系列操作,随后是逐元素的点积。(操作顺序是与批量标准化和 ReLU 卷积)。最后,门控单元的输出被馈送到门控细化单元。

门控细化单元

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

遵循类似的策略,给定的特征图首先通过批量归一化的卷积(在这之后,通道大小 C 与类的数量相同)。)接下来,特征图 mf 与阶段标签图 Rf 连接。最后,通过应用 3 × 3 卷积来生成细化的标签映射 R`f。(数学上我们可以总结如下。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阶段性监督

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然我们最感兴趣的是最终阶段生成的掩码,但是隐藏标签可能会提供有用的信息,并且可以对模型进行早期监督。因此,使用具有交叉熵损失的调整大小的地面真相掩模,作者引入了多个损失函数。我们可以看到上面的逐级损失函数的效果。

实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Caffe 来实现网络,并在三个数据集上训练网络,剑桥驾驶标记视频(CamVid),PASCAL VOC 2012 和马牛解析。

上面可以看到 Cam Vid 数据集的每类 IoU 和平均 IoU。我们可以立即注意到,G-FRNet 在平均 IoU 得分方面获得了最高分。下面是分割图的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 PASCAL VOC 2012 数据集,在修改类似于 resnet 的网络并在最终预测的基础上应用条件随机场之后,作者能够实现最先进的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,即使对于 Horse-Cow 解析数据集,当与不同的现有技术网络相比时,该模型也能够实现最高的 IoU 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面可视化的底部图表显示了消融分析的结果,其中作者通过省略一个或多个组件调查了网络的每个提议组件的贡献。他们发现包含门单元可以提高整个网络的整体性能。

讨论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于 G-FRNet 的两个令人印象深刻的事实是,随着网络的发展,对象的丢失部分被恢复,并且在分段掩码中错误标记的部分被纠正。此外,与其他先进网络相比,G-FRNet 的参数数量只有其 12%到 25 %,但性能却极具竞争力。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,本文的作者介绍了一个新的密集标记任务的框架。其中编码器-解码器型网络跳过了连接和逐级监督,以逐步产生更精细分辨率的密集标记。

遗言

这种类型的架构也可以应用于许多不同的 CNN。

参考

  1. 伊斯兰,m .,罗昌,m .,那霸,s .,布鲁斯,n .,,王,Y. (2018)。用于由粗到细的稠密语义图像标注的门控反馈细化网络。Arxiv.org。检索于 2018 年 7 月 14 日,来自 https://arxiv.org/abs/1806.11266

CVPR 2018。印象和 15 篇有趣的论文

原文:https://towardsdatascience.com/cvpr-2018-impressions-and-15-interesting-papers-37fcc1b5b449?source=collection_archive---------5-----------------------

从认识新朋友和与其他人一起去虚拟化的角度来看,这个 CVPR 很棒。关于新的很酷的结果——没那么多。我的意思是,很多好论文,但没有什么开创性的,至少在我感兴趣的领域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fun in posters 😃

0)如果您展示与图形相关的海报,例如去模糊、超分辨率等,请不要将其印在布上。尤其是在粗糙织物上。
深度图像去模糊的尺度递归网络做得很好,但是由于布料纹理你什么都看不到:(

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Poster material matters.

  1. GANs、领域适配、自动驾驶和非常次要的架构小技巧无处不在。

2)东欧的代表性仍然很差,但在增长。匈牙利、乌克兰、罗马尼亚、波兰、土耳其。论文不多,但至少有一些,而且数量还在增加。太棒了。

3)工作坊“做好 CVPR 市民”出奇的酷。尤其是 Vladlen Koltun 的“什么是好的研究”和 Devi Parikh 的“日历,而不是列表”。所有幻灯片和视频都可以通过上面的链接获得

4)我发现了各种风格的图形神经网络。迈克尔·布朗斯坦的好教程

5)车间论文“马尔可夫链神经网络”。简单的想法——添加额外的随机输入变量来控制期望的输出,然后您可以在测试时有条件地控制输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Markov chain neural networks poster

6)三个版本的可区分 SLAM:
MapNet:一个用于映射环境的以所有人为中心的空间内存来自牛津
— NVIDIA MapNet " 用于摄像机定位的地图的几何感知学习
—salakhutdinov‏集团 deep slam:基于注意力的 RNNs 全局姿态估计

  1. RANSAC 还在进步。两篇很酷的论文:潜然萨克图切然萨克

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Latent RANSAC and Graph-Cut RANSAC

8)关于大规模地标识别的研讨会:关键提示信息:全局特征已经足够好了,但是池化和集成还有待改进。如果你需要本地特色——选择 DELF。以下是推特翻译:https://twitter.com/ducha_aiki/status/1008815959291777025

https://twitter.com/ducha_aiki/status/1008818384664838145

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8)相比之下, InLoc:密集匹配和视图合成的室内视觉定位Benchmarking 6DOF 变化条件下的室外视觉定位论文说的不一样:局部特征很酷,但是你需要密集,而不是稀疏

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

InLoc and 6DOF bench papers

9)地方特色-相关论文线程—https://twitter.com/ducha_aiki/status/1009192898061979648

我喜欢的其他论文:

P.S .另一份来自 CVPR 2018 的有趣报道https://olgalitech . WordPress . com/2018/06/30/cvpr-2018-recap-notes-and-trends/

【CVPR 2018 /论文摘要】去相关批量归一化

原文:https://towardsdatascience.com/cvpr-2018-paper-summary-decorrelated-batch-normalization-6917d2a8fcf6?source=collection_archive---------19-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

标准化有多种不同版本,如实例标准化或组标准化。这是一种新的方法,其中该层对给定数据执行统计白化。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

批量标准化是一种标准化给定小批量的技术,在这项工作中,作者将这一概念扩展到去相关批量标准化,其中执行 ZCA 白化。并且 ZCA 白化是为了白化数据而使用的白化技术。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

批量规范化用于加速深度网络的训练,从它的出现开始,就被广泛应用于深度学习的各个领域。(而且方程式如上图。)需要注意的一点是,在训练期间,我们使用数据均值和方差,但在测试期间,我们使用移动平均均值和方差。众所周知的事实是,如果我们白化输入,训练变得更有效,因为协方差矩阵的更好条件导致在更新权重时更好地调节 Hessian,使得梯度下降更新更接近牛顿更新。然而,典型的批处理规范执行标准化,然后白化数据。因此,本文的作者开发了一个新的层,在其中执行给定数据的白化。(作者解决了反向传播的问题,用于执行数据白化的技术的选择,以及在执行白化操作时如何决定批量大小。)

相关工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

众所周知,归一化数据有助于深度神经网络的收敛。BN 的一个问题是,我们需要一个合理的批量大小来估计平均值和方差,为了解决这个问题,开发了层归一化。还有其他尝试,如批量重新规范化和流规范化。作者的工作与自然神经网络密切相关,然而作者指出了他们的方法更稳定的事实。获得去相关数据的另一种方法是添加额外的正则化项。然而,这些方法并不是为了加速训练。

去相关批量标准化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,数学上我们可以定义去相关操作(其中输入维度和输出维度是相同的。).然而,上述白化操作并不是唯一的,因为 sigma 协方差矩阵仅定义到旋转(单击此处的以获得更多解释),并且由于这种现象,作者称之为随机轴交换,这是不可取的。随机轴交换会导致输入维度的随机排列,这会混淆学习算法并损害性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,我们可以看到,如果发生随机轴交换,网络将无法很好地运行。(甚至根本没有。)为了克服这个问题,作者使用了 ZCA 美白。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ZCA 白化将 L2 距离下的白化引入的失真最小化。并且相对于西格玛值的反向传播可以在下面看到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们对输入值 x 求导时,它可以是下面这样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与批量标准化类似,作者使用了 sigma 和平均值的运行平均值以及可学习参数 alpha 和 beta 的概念。DBN 的完整算法如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,如引言部分所讨论的,作者将特征分成组并对每个组执行白化,而不是一起白化整批。

实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如上面看到的所有实验,如条件分析以及不同数据集上训练损失的比较,我们可以看到 DBN 表现出最好的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当作者将 VGG-A 架构与 BN 或 DBN 进行比较时,我们可以看到 DBN 在一般化方面表现更好。(最右边的结果是在非线性之后应用 BN/DBN 时的结果。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,当网络使用 DBN 而不是 BN 时,训练更加稳定。(更容易优化)。我们也可以更积极地设定学习率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

跳过所有需要的贪婪的细节,作者能够通过使用 DBN 的网络超越基线性能。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,作者介绍了去相关批处理标准化,其中给定数据的性能白化。(而不是标准化)。此外,他们能够超越基线表现。最后,他们发现使用 PCA 美白并不是一个好的选择。

最后的话

最后,如果有人感兴趣的话,我已经链接了斯坦福讲座的 pdf,其中也包含了这个主题。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。

参考

  1. (2018).Cs231n.stanford.edu。检索于 2018 年 8 月 19 日,来自http://cs 231n . Stanford . edu/slides/2018/cs 231n _ 2018 _ lecture 07 . pdf
  2. (2018).Arxiv.org。检索于 2018 年 8 月 19 日,来自https://arxiv.org/pdf/1804.08450.pdf
  3. 美白?,W. (2018)。ZCA 美白和 PCA 美白有什么区别?。交叉验证。检索于 2018 年 8 月 19 日,来自https://stats . stack exchange . com/questions/117427/zca-whiting-and-PCA-whiting 的区别是什么

【CVPR 2018 /论文摘要】TextureGAN:用纹理补片控制深度图像合成

原文:https://towardsdatascience.com/cvpr-2018-paper-summary-texturegan-controlling-deep-image-synthesis-with-texture-patches-50040c0e5cf?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

有不同类型的 GAN 的,今天我将看看一个 GAN,它能够生成不同纹理的真实图像。

请注意,这个姿势是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文的作者是第一个在生成合成图像时尝试纹理控制的人。用户可以控制纹理的方式是通过在包含用户想要生成的目标纹理的草图中放置一个补丁。通过消融研究,研究人员展示了他们的方法是多么有效。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算机视觉的最大挑战之一是让普通用户生成逼真的图像。相关的研究已经持续了 20 多年。由于 GAN 和可变自动编码器,使用端到端数据管道生成图像的技术有了很大的提高,但尽管如此,在纹理生成方面的研究仍然有限。纹理生成很难的几个原因是:1)获取细节很难,2)保持在边界内很难,3)包围 3D 对象形状很难。在本文中,作者提出了新的损失,并使用大量的数据来克服这一问题。

相关工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像合成是计算机视觉中的一个巨大课题,主要有两种方法来实现。(非参数和参数方法)。非参数方法有很长的历史,并且使用更传统的技术。诸如深度学习之类参数方法已经给出了有希望的结果。(包括泛化)。GAN 可用于创建假图像,对于图像合成,这意味着它可以生成逼真的假图像。并且为了使 GAN 更能被人类理解,提出了有条件的 GAN。在计算机视觉中,纹理合成和风格转换密切相关。给定一个图像,纹理合成创建一个具有相似纹理的新图像,对于样式转换,模型尝试转换样式,同时保持图像的上下文相同。(最后,作者解释了他们的工作如何不同于传统的或其他众所周知的方法。)

质感甘

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这一节中,作者提出了纹理 GAN,一个条件生成网络,它能够从具有覆盖纹理的输入草图生成逼真的图像。他们的模型的一个优点是,用户可以直接将目标纹理片放在草图中。(关于这种 GAN 的一个令人印象深刻的事实是,它知道确切的边界,例如,点状纹理只能出现在裙子上,而不能出现在腿上。).注意作者使用了 LAB 色彩空间而不是 RGB 色彩空间,他们使用了“ Scribbler:用草图和颜色控制深度图像合成 ”中介绍的网络架构。

作者首先训练纹理 GAN 来再现地面真实图像,如包或鞋。然后,他们微调网络,使其能够生成逼真的纹理。(见上图)。

地面实况预训练

在这一节中,作者讨论了他们用来成功训练网络的各种损失函数。总之,有……

**特征损失:**使用更深层的 VGG 19 和 L2 损失函数,尝试捕捉结构相似性。

**对抗性损失:**损失函数,使甘的画面更加清晰逼真。(但仅在灰度图像上,L 通道在实验室空间上。)

**风格损失:**鼓励甘再现纹理细节的损失函数。(仅在 L 声道上)。通过匹配来自 VGG 19 的特征矩阵的 Gram 矩阵来完成。

像素损失/颜色损失:损失函数,帮助生成更忠实于用户输入纹理片的纹理细节,并添加颜色约束(仅在 AB 通道上)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上是预训练阶段的总损失函数。

外部纹理微调

关于纹理 GAN 的训练的一个困难是作者没有应用不同纹理的同一物体的地面真实图像。(网络擅长生成高级特征,但机器人擅长生成低级纹理细节。)为了克服这一点,作者对网络进行了微调,以复制和传播他们没有地面真实输出的纹理。因此,作者保留了除样式损失之外的所有内容,并修改了像素和颜色损失。(带有附加损失函数)

**局部纹理损失:**一个损失函数(由三项组成),只适用于输出图像的小局部区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**局部对抗性损失:**损失函数,强制该对具有相同的纹理。
局部风格损失和像素损失:类似于上一节的像素和颜色损失,但仅适用于局部。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上是外部微调级的最终损耗函数。

训练设置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用了三个不同的数据集,其中包含了颜色、材料和图案的巨大差异。(对于从网络输出的图像,图像从 LAB 空间转换到 RGB,对于网络的输入,地面真实图像被处理以提取 5 通道图像。)

分割遮罩

由于作者只希望输出纹理的样本与输入纹理的样本相匹配,所以他们从图像的前景中采样小块。(所以背景纹理不再是问题)

预处理数据生成

对于草图生成,作者使用了 deep edge detection、Canny edge detection、xDoG,甚至包括合成草图。对于纹理补片,他们从地面真实图像中随机裁剪特定区域,并将其放置在随机调整大小的分割区域内。

用于微调的数据生成

此外,他们甚至通过谷歌搜索“皮革”一词并手动选择图像来收集更多数据。

培训详情

对于预训练,他们使用学习率为 1e-2 的 Adam Optimizer 进行微调 1e-3。损失函数的权重如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果和讨论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,当作者关闭了原始损失函数中的一些损失项时。所生成图像的图像质量开始下降,这表明为了生成逼真的图像,需要所有的损失函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,作者还发现,对于变化较少的图像(如鞋子),GAN 即使没有外部纹理微调也能生成逼真的图像。然而,具有更复杂结构的图像,如手提包,外部纹理微调变得至关重要。(如上图。)下面是一些生成的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,本文作者提出了一种利用输入草图和纹理片控制深度图像合成的方法。他们的纹理 GAN 在生成各种不同纹理的真实图像方面做得非常好。这是由于复杂的损失函数和转换 RGB 图像到 LAB 颜色空间。

最后的话

由于神经网络是通用函数逼近器,设计一个好的损失函数是至关重要的。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。

参考

  1. (2018).Arxiv.org。检索于 2018 年 7 月 15 日,来自https://arxiv.org/pdf/1706.02823.pdf
  2. (2018).Scribbler.eye.gatech.edu。检索于 2018 年 7 月 15 日,来自http://scribbler.eye.gatech.edu/paper.pdf

[ CVPR 2018 /论文摘要]利用周期和形状一致性生成对抗网络翻译和分割多模态医学卷

原文:https://towardsdatascience.com/cvpr-2018-paper-summary-translating-and-segmenting-multimodal-medical-volumes-with-cycle-and-e6381b4a2690?source=collection_archive---------14-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

最有才华的研究员之一的有趣的论文之一。

请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。

Paper from this [website](http://Translating and Segmenting Multimodal Medical Volumes with Cycle- and Shape-Consistency Generative Adversarial Network)

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

合成的医学数据(例如 CT 图像)有许多不同的用例。它可以用来增加训练数据的数量,也可以用来为放射治疗计划提供 x 射线衰减图。本文作者提出了一种跨通道合成方法,可以实现多通道的合成。
1)根据不成对的数据创建合成的 3D 逼真图像
2)确保一致的解剖结构
3)通过使用有限训练样本上的合成数据改进体积分割。

一个非常有趣的事实是,上述所有目标都可以通过端到端模型实现,该模型由互利的生成器和分段器组成。生成器通过对抗损失、循环一致性损失以及形状一致性损失来训练,这由分割器来监督。(以配合目标 2)。从分段器的角度来看,生成器创建了更多的训练数据供模型学习。并且作者表明,将该任务作为耦合网络来解决比试图单独解决更有益。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前在临床领域中,非常需要开发一种跨模态图像传输分析系统来辅助临床治疗。在医学领域,很难收集某些类型的数据,这不仅是因为患者的隐私问题,而且是因为在临床实践中还没有很好地建立新的成像模式。本文针对这两个问题,首先进行跨模态图像传输,其次利用生成的图像提高分割性能。

作者使用 GAN 的生成图像,但是,有几个问题。首先,必须保留图像中存在的器官的形状,因为它们捕获医疗信息;其次,从一开始就缺乏训练 gan 的数据会导致许多问题。本文的作者提出了一种通用的解决方案,其中,给定两种模态中的两组不成对的数据,网络通过利用从另一个域以端到端的方式翻译的合成数据,同时学习用于跨域体积到体积翻译的生成器和更强的分割器。他们使用了 4496 张核磁共振成像和计算机断层成像的心血管三维图像

相关工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

医学图像合成主要有两个目标,第一是从不同领域生成逼真的图像,第二是使用从不同领域生成的数据来提高分类任务的性能。并且在这方面已经做了相当多的工作,然而,还没有探索从未配对的跨域数据中学习。最后,一些其他研究包括对抗性学习被用作对分割或检测网络的额外监督。

提议的方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这一节中,作者首先从解释图像到图像的转换开始,然后转到卷到卷的转换。

未配对数据的图像到图像转换

最近,GAN 已被用于执行图像生成,如风格转移或有条件的 GAN。然而,对于正确的损失计算,成对数据并不总是可获得的。CycleGAN 和其他方法已经提出推广有条件 GAN。

不成对卷到卷翻译中的问题

缺乏直接监督是一个大问题,因为它在几何变换方面具有固有的模糊性。简而言之,当几何失真被平移回原始域时,它可以被恢复,而不会引起数据保真度成本的任何损失。

卷对卷循环一致性/形状一致性

首先,为了训练 GAN,作者使用了如下所示的成本函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,该论文的作者引入了更多的损失函数,包括分段网络,以保持由循环 GAN 生成的数据的形状。和下面的损失函数,也作为 GANs 的正则化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多模态体积分割/目标

在 GAN 的训练期间,分割网络也被训练,并且当 GAN 创建更真实的数据时,分割器利用这些图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终的损失函数可以在上面看到,λ和α是要调整的超参数,所有其他成本函数都在上面解释过。

网络架构和细节/培训细节

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

网络实际上对体数据使用 3D 卷积运算。因此,与 2D 卷积运算网络相比,训练要困难得多。此外,作者使用了实例规范化。本文的发电机网络受 U-Net 的影响较大,但下采样操作不太积极。鉴别器受 PatchGAN 影响,且对于分割网络,再次使用 U-Net 型网络。如上所述,我们可以看到作者的生成器网络在生成合成图像方面比纯循环 GAN 做得更好。

对于优化器,作者使用 Adam,他们在分割网络之前预训练生成器和鉴别器。最后,作者还降低了训练后期的学习率。

实验结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用了来自各种心血管疾病患者的 4354 次对比心脏 CT 扫描,以及 142 次采用新压缩传感扫描协议的心脏 MRI 扫描。(域 A 设置为 CT,域 B 设置为 MRI。)

跨域翻译评测

如上图所示,生成的图像没有显示任何几何变换,看起来非常逼真。此外,作者提出了一种 S-core 来评估合成图像的形状变化质量。较高的分数意味着在给定的图像中有较少的变换,我们可以看到作者的网络优于比较的网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分割评估

这里作者训练了两个分割网络,并遵循不同的方法来衡量性能。这两种不同的方法是临时方法和作者(端到端)方法。(如下图所示)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用骰子点数,作者测量了不同方法的性能差异。并且我们可以观察到作者的方法给出了最佳性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面是一个分割蒙版的例子,下面是性能图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

合成数据与真实数据之间的差距

减少真实数据和生成数据之间的分布差距是这个项目的关键。如下所示,与仅给出真实数据的基线骰子得分相比,作者的方法具有显著更小的差距。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,本文作者成功地展示了在进行跨模态翻译时如何对医学图像进行分割的方法。这是通过具有从不成对的数据中学习、保持一般结构的 GAN 和能够利用所生成的合成数据的分段网络来实现的。

遗言

光是这一篇论文所做的实验数量就非同一般,难怪张是其中的佼佼者。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。

参考

  1. 张中,杨,李,郑,于(2018)。基于周期和形状一致性生成对抗网络的多模态医学卷翻译和分割。Arxiv.org。检索于 2018 年 7 月 10 日,来自https://arxiv.org/abs/1802.09655
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值