TowardsDataScience 博客中文翻译 2020(八百三十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

基于 SMOTE 机器学习的电信客户流失预测

原文:https://towardsdatascience.com/telecom-customer-churn-prediction-using-smote-powered-machine-learning-a7354d54380d?source=collection_archive---------42-----------------------

当生活给你不均衡的数据时,打败它,和 Kappa 统计交朋友!

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

照片由 Nick Fewings 在 Unsplash 上拍摄

本博客和项目由 维谢哈·巴塔查尔吉 (纽约哥伦比亚大学商业分析硕士)& 皮尤什·贝里(SCMHRD 浦那商业分析 MBA)。

T 电信服务行业正在迅速成为最难生存的市场之一。最初只专注于通信技术的行业如今已经过渡到了云技术时代。如果有的话,这给该行业现有的困境增加了更多压力,因为今天的公司需要迅速调整其业务模式,以满足物联网、智能设备和增强现实等领域的客户需求。的确,数字化转型帮助电信公司从灭亡走向繁荣

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

照片由尼克·费因斯Unsplash 上拍摄

生存是关键,所有电信公司都必须更好地了解他们的客户,并限制(如果不能防止的话)所谓的“流失”现象的发生。有了正确的方法来分析客户流失,公司就可以发现客户服务政策甚至营销和定价策略中可能存在的问题。

客户获取成本 (CAC)由营销费用、广告费用、销售费用等构成。并且一般总计为(CRC)的价值的 5 倍。因此,将高价值客户留在国内非常重要。

对于客户因非自愿原因流失的情况,电信公司无能为力,但公司完全有理由尝试识别自愿流失 T2 的客户,并为他们提供优惠,防止他们离家出走。

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

为了预测可能流失的客户,我们利用了公开可用的数据集“IBM 电信客户流失”

该数据集具有以下特征以及指示特定客户是否已经从该公司的服务中流失的目标变量:

  • ****客户订购的服务:电话、多条线路、互联网、在线安全、在线备份、设备保护、技术支持以及流媒体电视和电影。
  • ****客户的账户信息:成为客户的时间、合同、支付方式、无纸化账单、每月费用和总费用。
  • ****客户的人口统计信息:性别、年龄范围以及他们是否有伴侣和家属。

使用 SMOTE(合成少数过采样技术)处理类不平衡

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

在桌面上完成的可视化

一轮快速的探索性数据分析(EDA)将我们引向左侧的图表,该图表向我们展示了各行业中与客户流失相关的一个常见问题;阶层失衡。一类数据的总数远小于另一类数据的总数是机器学习中的一个问题。IBM 电信客户流失数据集的“未流失”类别代表率过高(73%),而“流失”类别代表率过低(27%)。

但是阶级不平衡的问题是什么呢?为什么一个分析师在创建预测模型的时候要如此担心呢?

**事实证明,大多数用于分类的机器学习算法都被隐式地调整为在数据类别平均分布的情况下工作得最好。在类别分布不均匀的情况下,得到的分类模型表现出较差的性能,特别是对于代表性不足的类别,也称为少数类别。在我们的电信客户流失预测案例中,少数族裔或已经流失的客户是更重要的类别,而的高错误分类错误 会破坏首先识别他们的目的。

出击救援!

SMOTE(合成少数过采样技术) 工作原理是对数据的少数类进行过采样。有几种方法可以做到这一点,比如简单地复制少数数据样本,但 SMOTE 通过创建新的原始样本来工作。****

简而言之,新值是通过考虑位于 特征空间 中少数类的随机选择样本附近的样本而创建的。使用一条线来连接这些样本,然后通过在这条线上随机选择一个点来创建一个新值。****

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

SMOTE 的图示

用于 SMOTE 应用和用于流失预测的数据预处理的 R 代码:

***library(pROC) # for AUC calculations
library(DMwR) # for smote implementation
library(ggplot2)
library(dominanceanalysis)
library(caret) # for model-building
library(dplyr) # for data manipulation
library(plyr)#reading data into data frame
df_telecom = read.csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")#### Data Overview #####No. of observations and attributes and the head data for each attribute
glimpse(df_telecom)  # No. of observations(rows) : 7043 #No. of attributes(columns) : 21#Datatypes of different columns of the dataframe
sapply(df_telecom,class)#check the column with NA values
sapply(df_telecom, function(x) sum(is.na(x))) #totalCharges has 11 na values#### Data Manipulation #####dropping NA values because the tenure is also 0 for those customers
df_telecom = df_telecom[complete.cases(df_telecom), ]#Converting Senior Citizen Column values to Yes and No
df_telecom$SeniorCitizen <- ifelse(df_telecom$SeniorCitizen==1,"Yes","No")#Converting Tenure to categorical column
df_telecom %>%
  mutate(tenure_year = case_when(tenure <= 12 ~ "0-1 year",
                                 tenure > 12 & tenure <= 24 ~ "1-2 years",
                                 tenure > 24 & tenure <= 36 ~ "2-3 years",
                                 tenure > 36 & tenure <= 48 ~ "3-4 years",
                                 tenure > 48 & tenure <= 60 ~ "4-5 years",
                                 tenure > 60 & tenure <= 72 ~ "5-6 years")) -> df_telecom#converting column value "No Internet Service" to "No" for columns OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV, StreamingMoviescols_r <- c(10:15)
for (i in 1:ncol(df_telecom[,cols_r]))
{
  df_telecom[,cols_r][,i] <- as.factor(mapvalues(df_telecom[,cols_r][,i],
                                                 from=c("No internet service"),to=c("No")))
}#converting column value "No phone Service" to "No" for column MultipleLinesdf_telecom$MultipleLines <- as.character(df_telecom$MultipleLines)
df_telecom$MultipleLines[df_telecom$MultipleLines == "No phone service"] <- "No"
df_telecom$MultipleLines <- as.factor(df_telecom$MultipleLines)#Applying SMOTE
df_telecom_c = data.frame(df_telecom[,-c(1,20)])
df_telecom_c$SeniorCitizen <- as.factor(df_telecom_c$SeniorCitizen)
df_telecom_c$tenure_year <- as.factor(df_telecom_c$tenure_year)
df_telecom_c$Churn <- as.factor(df_telecom_c$Churn)
df_telecom_c <- SMOTE(Churn ~ ., df_telecom_c, perc.over = 100, perc.under=200)
prop.table(table(df_telecom_c$Churn))***

选择最佳模型:欢迎科恩的 Kappa 统计!

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

使用 ezgif 创建的 GIF

当涉及到处理多类分类和类不平衡分类问题时,通常的性能度量如可能会产生误导。通常,在类别不平衡数据的情况下,由于其中一个类别的过度表示,精度被过度报告。

在这种情况下,科恩的 Kappa 统计是一个方便的指标。Kappa 统计量可以很好地处理上述两种情况,并提供一个真实表示模型性能的稳健值。

科恩的卡帕定义为:

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

使用 MS Word 上的公式创建器创建的公式

其中 po 为观察一致,pe 为预期一致**。简而言之,当与根据每个类别的频率随机猜测的分类器相比较时,该统计有助于理解我们的分类器的性能。因为 Cohen 的 Kappa 考虑到了分类器之间偶然发生一致的可能性,所以它给出了模型性能的更加健壮的视图。******

****根据 兰迪斯和科赫(1977) 对科恩的 Kappa 的解读方式如下:

  • 轻微一致=小于 0.20
  • 公平协议= 0.200.40
  • 适度一致= 0.400.60
  • 基本一致= 0.600.80
  • 几乎完全一致= 0.801.00

我们使用 R 中的以下代码来生成 Kappa 统计数据和其他指标,如准确性、ROC、AUC 等。评估分析的最佳模型。可以在 CARET 库下选择各种模型进行进一步分析。

****#K-fold cross-validation ---2 (Ensemble Bagging Algorithm)
# Define training control
set.seed(123)#With Accuracy as the metric
train.control <- trainControl(method = "cv", number = 10,
                           savePredictions = TRUE,classProbs = TRUE)model <- train(Churn ~., data = df_telecom_c, method = "treebag",
               trControl = train.control,metric = "Accuracy")print(model)  #Accuracy - 0.8442996  Kappa - 0.6886018#With ROC as the metric
train.control <- trainControl(method = "cv", number = 10,summaryFunction = twoClassSummary,
                              repeats = 3,savePredictions = TRUE,classProbs = TRUE)model <- train(Churn ~., data = df_telecom_c, method = "treebag",
               trControl = train.control,metric = "ROC")
print(model)  
#ROC        Sens       Spec     
#0.9190668  0.8686399  0.8081906****

成绩来了!

看一下在这种情况下使用的模型的准确性和 Cohen 的 Kappa 统计,获得了以下数据。

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

在 SMOTE 之前和之后,比较各种模型的模型精度和 Cohen 的 Kappa 统计量

注意,在实施 SMOTE 之前,模型的精确度相当高。但是考虑到阶级的不平衡,Kappa 提出了不同的建议(低值)

实施 SMOTE 后,模型的 Kappa 增加,现在属于上述“基本一致”的范围。还要注意精度的提高。

现在,让我们来看看上面使用的各种型号的 接收机工作特性曲线 (ROC 曲线)。首先,我们将看到没有实施 SMOTE 的模型的 ROC 曲线。

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

无 SMOTE 模型的 ROC 曲线

现在,实施 SMOTE 后模型的 ROC 曲线为:

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

SMOTE 后模型的 ROC 曲线

从上述 ROC 曲线中可以注意到,在实施 SMOTE 后,曲线下的面积显著增加。****

因此,为了电信公司的客户流失预测模型的目的,我们使用随机森林模型,它提供了最高的精确度、ROC 曲线下的面积,以及最重要的 Kappa 统计数据**。******

分析在商业中的应用

在这个媒体故事的开头提到了一个事实,即客户获取成本(CAC)是客户保留成本(CRC)的 5 倍。记住这一点,我们可以使用这个模型来分析和设计客户保持策略(感谢我们的低错误分类错误!).使用有针对性的营销活动,优惠和策划计划可以推出,以防止这些客户翻腾。

因此,当生活给你不均衡的数据时,击垮它,和 Kappa 统计交朋友!

邀请您查看 GitHub 回购,了解上述分析!

****** [## visha kha-b18/电信客户流失

客户流失意味着客户在一段时间后离开公司的服务或订阅…

github.com](https://github.com/vishakha-b18/Customer-Churn-in-Telecom)

在 LinkedIn 上与我们联系!

[## vishakha Bhattacharjee——助教——哥伦比亚商学院| LinkedIn

目前在纽约哥伦比亚大学攻读商业分析硕士学位。前商业情报分析师在…

www.linkedin.com](https://www.linkedin.com/in/vishakha-bhattacharjee/) [## Piyush Beri 工商管理硕士商业分析-SCMHRD,浦那

www.linkedin.com](https://www.linkedin.com/in/piyush-beri/)******

电话绘画

原文:https://towardsdatascience.com/telephone-paintings-a7ef662f50a9?source=collection_archive---------39-----------------------

在艺术(莫霍利-纳吉)和甘斯之间

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

斯佩拉福特电话绘画/(默兹曼施截图)

在 Instagram 出现之前很久,一位名叫的园艺家和包豪斯艺术家拉斯洛·莫霍利-纳吉(1895-1946)就用手机进行艺术创作。甚至在电话出现之前。但是如果没有这种远距离交流的工具,他的作品“电话图片”就不可能出现。

这个系列是怎么创作出来的?在当时常见的艺术过程中,艺术家通过触摸、用刷子、用锤子等方式直接创作出艺术品。但是莫霍利-纳吉使用了当时完全不同寻常的东西:一部电话:

1922 年,我通过电话向一家标牌厂订购了五幅搪瓷画。我面前有工厂的颜色图表,我在绘图纸上画了草图。在电话的另一端,工厂主管把同样的纸分成方块。他把听写的图形记在正确的位置上。(这就像通信下棋)…因此,这些照片没有“个人触摸”的优点,但我的行动正是针对这种过分强调。(来源:拉斯洛·莫霍利-纳吉,《新视野》(1947),引自《 电话绘画:挂上莫霍利 》作者路易·卡普兰)

莫霍利-纳吉用这个项目批评了艺术中“个人风格”的古典冲动。在这里,两个参与者制作了艺术品:艺术家按照他的指示,工厂按照他们的指示。

这位包豪斯艺术家甚至放弃了在自己的作品上签名:

我把带有必要数据的数字和字母放在画布的背面,就好像它们是汽车、飞机或其他工业产品一样。(资料来源:莫霍利-纳吉,同上)

这位艺术家消失在他的作品后面。在这种情况下,交流是艺术创作的方式。

甘斯的电话绘画。

一位数字艺术家兼游戏设计师 史蒂文·西奇 和视频艺术家 蒂莫西·托马森 用通讯的方式表达了他们对莫霍利-纳吉的敬意,标题同为“电话绘画”:

[## 电话绘画

按键盘或屏幕上的 1、2、3 来放大和缩小。滑动音量以提高或降低速度。它是这样的…

spelafort.itch.io](https://spelafort.itch.io/telephone-paintings)

随着游戏类型“无尽的卷轴”,你正沿着一个永恒的程序生成的艺术画廊前进,有各种光线条件,一些建筑工地工具和墙上的绘画。这些画都有标题和描述。

而一切都是利用生成性对抗网络做出的。在这种情况下,艺术不是由一个叫生产的艺术家创造的,而是由 GANs 之间的交流创造的:

1。艺术品创作:StyleGAN。 这里用了一个 StyleGAN(或者 StyleGAN2?)模特,受过艺术品方面的训练。我想知道是阿甘还是维基亚特训练的。更多信息请点击此处:

[## 数据集的不可背叛性

ArtGAN 和 WikiArt:用人工智能创造艺术。用艺术制造 AI。

towardsdatascience.com](/the-non-treachery-of-dataset-df1f6cbe577e)

2。对象检测:(YOLOv3) 对于模式识别和对象检测,作者使用了 YOLO 网络(你只看一次,在版本 3 )。该网络在抽象图像中发现物体(这已经是一个挑战——不仅对机器,对人类也是如此)。

3。讲故事(GPT-2) open ai 的 NLP 框架用它来提示作者和背景的简短描述。新艺术家的传记是在一个复杂的过程中创建的,包括微调博物馆描述的 GPT-2,以及程序性的名称生成。这就是为什么结果是一致的,鼓舞人心的,令人信服的。

我想,如果你愿意,使用 GPT-3 甚至可以生成一个博物馆指南,将作者组合成一个概念展览。

艺术体验不是即时的(现在实时使用 GANs 仍然是未来的事情),大约有 3000 件艺术作品被生成并随机呈现——如果你在这里足够长的时间,你可能会偶然发现已经看过的绘画。但是增加新作品的可能性是存在的——半永恒是可能的。

一种全新的艺术。

在展览中前进,你没有太多的选择,但要观看无止境的艺术展示,放大画面并阅读描述。但是,这正是你参观博物馆的目的。

如果你准备好投入进去,接受这出戏,你将享受独特艺术的快乐。因为这是你瞥见由人工智能生成的另一个现实的唯一机会。

这里只是我喜欢的一些艺术品和描述。

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

斯佩拉福特电话绘画/(Merzmensch 截图)

请注意,德国医生和艺术收藏家 Ona Tymes,“用色彩的力量揭示了本体的潜在结构”。

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

斯佩拉福特的“电话绘画”(Merzmensch 截图)

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

如果你真的想,你会看到蓝猫。但这里有一个问题,这是否只是另一个盲目崇拜。

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

斯佩拉福特的“电话绘画”(Merzmensch 截图)

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

艾不仅观察到了“城市与工业景观的交汇点”,还观察到了“椅子上的一只猫”(大概是猫在物体探测 YOLOv3 中独领风骚,就像谷歌梦境中的恶犬)。

然后是这个:

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

斯佩拉福特的“电话绘画”(Merzmensch 截图)

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

斯泰西·莫亚似乎是个奢侈的家伙。他相信“找到上帝”并成为“圣经中的第一人称叙述”。然而:“注意猫的倒影”。对我来说,这个头看起来像猫眼。

Every time you explore a new artwork, it will soon disappear, with its visuals, background story, and artist. Trascience of art and all things, “mono no aware” (物の哀れ).

Spelafort 的电话绘画是对过去的 lászlo Moholy-Nagy 的美丽致敬,也是对未来的展望。以新的方式对生成艺术、阐释、玻璃透镜状的审美体验是艺术的未来和存在。

您将在此处找到 Unity 和 GAN 驱动的虚拟图库(在您的浏览器中运行):

[## 电话绘画

按键盘或屏幕上的 1、2、3 来放大和缩小。滑动音量以提高或降低速度。它是这样的…

spelafort.itch.io](https://spelafort.itch.io/telephone-paintings)

你会发现哪些新世界和艺术品?

电视和数据科学:这很复杂

原文:https://towardsdatascience.com/television-and-data-science-its-complicated-2c6f7d62c638?source=collection_archive---------54-----------------------

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

衡量电视广告的效果可能是数据科学家工作的一部分

数据科学在媒体行业仍未得到充分利用。用于时间序列分析的回归建模仍然需要找到它的方法来获得显著的地位。

当我第一次开始寻找数据科学工作时,我非常确定我会在一家无聊的工程公司结束。我将不得不忘记我作为一名通讯科学家所学到的东西。

我越是高兴地发现有几个适合沟通数据科学家的领域,比如为受众研究做因素分析。另一个用例似乎更有趣。虽然,我现在不急着填。

电视广告的效率

在我为几家媒体机构工作期间,我偶尔会看一下我们的客户为电视广告支付的账单。德国一家大型知名频道对十几秒钟的电视广告收费至少 5 位数。

难怪,广告商想要评估电视广告的效果,并将其与成本相匹配。

如果我们只有一个电视频道,只有电视作为一个频道,只有一个电视节目,只有一种格式,等等。我们只需看看电视广告前后的销售情况。然后从之后的利润中减去之前的利润,再减去广告费用,就得到我们从广告活动中获得的利润。

但是我们还要考虑几个变量。

我无法描述最终计算的所有方面。但其中之一,与我们生活的数字化有关,我想谈谈。它与电子商务业务有关。

电视和电子商务

虽然还没有证明这是一个 100%可靠的方法,但是有一些统计模型可以帮助测量电视广告引起的网站流量的上升。

主要的假设是,在看完一个电视节目后,一些用户在网上搜索品牌、产品、公司或其他任何东西,或者通过输入直接访问网站。当然,最后一个要求你有一个短而吸引人的网址。

因此,在该节目播出后,搜索量会激增。一家电子商务公司很乐意接受这些额外的点击,甚至可能是线索和转换,并将它们与完整的客户旅程相匹配。

电视广告被认为是提升品牌知名度的一种方法。然而,一个特定的点,尤其是如果顾客看了 X 次,或者已经有了另一个品牌的接触点,触发网上购买的决定也不是完全不可能的。

为了将电视广告数据和用户数据整合在一起,并从中得出合理的结论,数据科学小组开始发挥作用。

效率建模

时间序列是最流行的(老实说,也是我唯一知道的)进行这种分析的方法。

你把网站流量(或线索)放在时间轴旁边,然后标记电视广告的时间戳。每次电视广告播出后,你应该会看到曲线上升,但会有一点延迟。这一次,人们需要接触他们的手机或台式机。

看起来是这样的:

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

时间轴上的点击和斑点

你在问自己,为什么你还需要在这里进行分析?就拿即时时间戳之后的点击量来说,对吗?

号码

需要牢记的因素

出于我将要提到的许多原因,你们将面临一个基本问题的挑战:

哪些点击实际上受到了点的影响?

上升趋势不会急剧下降。它正在逐渐变回黑子之前的状态。你必须模拟低迷曲线,以获得所有相关点击。否则,你可能会高估或低估电视广告的效果。

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

时间轴上的点击和斑点:衰退曲线。

这就是为什么你想使用回归模型。此外,在建模过程中,你或你的数据专家必须确保一系列额外的独立变量及其影响被正确地考虑在内。

电视观众的日常生活,比如上班、吃饭、放松等等。影响他们为广告产品牺牲时间的意愿。这些客观因素包括:

-白天

-星期几

-频道及其受欢迎程度

-光斑的长度

-电视节目,现场集成在

-周围或其他频道上的任何重大事件

同样的光点表现不同,取决于这些变量的存在。

真正的挑战就在这里

还有另外两个令人头疼的问题。

首先,一些点可以彼此靠得很近,它们的效果会重叠。你需要把效果分开。

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

重叠斑点

第二,很明显,你不能认为所有的点击都是随机产生的。即使不看电视广告,用户也会来到你的网站。巧合的是,他们中的许多人在现场运行后就这样做了。

独立于电视广告的用户数量被称为基线。你需要计算你的基线及其与变量相关的变化,如上所述,然后从点击量中扣除基线。剩下的叫做提升。

基本上,你只模拟上升,而不是所有的点击。

节省数据工程师的时间

除了以上所述,在开始任何建模之前,您必须确保您有干净的数据可以使用。

有时,如果你的产品有一个非常具体的目标受众,或者你没有多少钱,你会在一些便宜的渠道预订航班,这些渠道的覆盖面有限。它们不会造成很大的流量。隆起会很小,很难定位。不知何故,你必须决定是否从你的数据中过滤掉这样的点,或者让它们存在并破坏你的模型。

如果您只有很小的通道,估计任何影响通常都是具有挑战性的。预订不太贵的航班比大量的廉价航班更有意义。

你还需要一个可靠的跟踪技术来捕捉所有的点击和线索。这需要将跟踪像素集成到 HTML 代码中。但追踪是如今电子商务的普遍必备,所以那应该不算新奇。

进一步的考虑

你必须区分点击,这取决于单次点击在网页上的来源。有些人键入一个网址,或点击一个附属链接,而大多数人会去搜索引擎,键入一个关键字。这里还有一个十字路口:一些用户点击你的搜索引擎广告,而另一些用户花时间滚动和访问你的网站,而不会为你产生额外的费用。

我在这里做一个简短的题外话来强调重要性。电子商务公司需要了解人们如何与他们的产品互动,为什么和如何购买,以及为什么一些用户不购买。这种互动历史被称为客户之旅。

顾客之旅由接触点组成。这些是用户与产品互动的场合。可以是他读到的关于产品的博文。然后一个搜索引擎广告。然后是电视广告。在最好的情况下,用户访问网站几次,然后产生一个线索。

一些在线渠道比其他渠道更有可能处于客户旅程的末端。因此,不同在线渠道的贡献是不平等的。它决定佣金。这就是为什么你的回归模型应该根据点击的来源来区别对待。有鉴别力,不是吗?

简短的后记

回归建模非常耗时耗力。你的数据越多,你的结论就越好。几个月后,模型变得越来越珍贵,但广告商不喜欢长时间的等待。

因此,没有多少媒体公司能负担得起回归建模。有时,电视巨头承担这项任务,以吸引他们的客户预订更多的位置。

差不多三年前,我进入了一家提供这种电视广告估算服务的小公司。很快他们不得不宣布裁员措施。还有一次,我去一家电视公司面试。这给了我一种感觉,那会是一个非常混乱的工作环境,所以我不想继续下去。

在电视市场特别大的国家,如美国,通信数据科学家可以成为一个稳定的职业道路。在德国,你也有一个严格的数据保护法规,这是特别困难的收获用户数据。如果人工智能的历史有了新的转折,事情可能会改变。

就目前而言,即使在大多数西欧国家,这种工作模式仍相当不成熟。

给我讲个笑话——如何给你的 Power 虚拟代理聊天机器人添加闲聊支持。

原文:https://towardsdatascience.com/tell-me-a-joke-how-to-add-small-talk-support-to-your-power-virtual-agents-chatbot-6a0eba974de2?source=collection_archive---------19-----------------------

微软 POWER 平台解决方案

闲聊是每个聊天机器人的基本特征。在 QnA Maker 和 Power Automate 的帮助下,我们将这一功能添加到任何使用微软 Power 虚拟代理构建的聊天机器人中

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

梁杰森Unsplash 上的照片

不管你的聊天机器人是为了什么而设计的,也不管它的目的有多清晰或简单,你的用户总是会首先尝试聊天。

了解了这一点,即使是最简单的聊天机器人也必须具备得体的聊天技巧。但是这可能是一个挑战——特别是当您使用像 Power Virtual Agents (Power VA)这样的低代码产品时,因为这样的产品可能没有开箱即用的良好聊天功能。

在本指南中,我将向您展示如何使用 QnA Maker 作为 Azure 认知服务套件的一部分,向任何 Power VA 聊天机器人添加聊天功能,并在 Power Automate 的帮助下将这两种产品结合起来。

如果你是 Power VA 的新手,我在 Medium 上为你提供了一个简单的分步介绍这里

让我们开始吧。

创建 QnA Maker 闲聊知识库

在微软 QnA Maker 的帮助下,我们可以为我们的聊天机器人创建一个知识库,其中包含大约 100 个聊天场景的预填充数据集,包括响应和样本查询。我们可以选择 5 种不同的性格和 9 种语言。你可以在 GitHub 上了解更多。

要创建我们的闲聊知识库,请转到https://www.qnamaker.ai/,登录并点击创建知识库

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

点击创建 QnA 服务按钮,重定向到 Azure 门户,创建您自己的 QnA Maker 实例。

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

在 Azure 门户中,你必须命名一些资源。为创建的每个服务选择适当的名称和位置。

如果你没有 Azure 订阅,先注册一个 Azure 免费试用

此外,如果你不是 Azure 专家,这可能会有点混乱。别担心,使用和我一样的设置。只需将西欧替换为您最近的位置,将 MyBot 替换为您聊天机器人的名称。其余部分遵循一些命名和简单部署的最佳实践。

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

在向导的最后点击,最后一次验证你的设置,然后点击创建

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

等待您的部署已完成消息,并在浏览器中跳转回 QnA Maker 门户。

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

返回 QnA Maker 门户,单击刷新按钮,并从下拉列表中选择之前创建的 Azure QnA 服务实例。请注意,这可能需要您刷新(F5)多次,或者再等几分钟,实例才会出现。

像我一样,给你的 QnA Maker 知识库起一个响亮的名字。

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

现在我们可以添加一些闲聊的场景,并在 5 种不同的性格中进行选择。

准备好后,点击创建您的知识库

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

当你的知识库准备好了,我们可以有选择地稍微调整一下。例如,你可以搜索“*你是谁?”*并更改其响应,以包含来自您的聊天机器人的个性化欢迎消息。

还可以添加新的 QnA 对,就像您企业的基本常见问题一样。玩玩它,当你觉得准备好的时候点击保存和训练

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

现在我们可以转到发布选项卡并点击发布按钮。

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

发布成功后,门户向我们提供了必要的详细信息,如知识库 id主机、端点密钥。保持此页面打开,因为我们稍后需要此信息。

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

将聊天添加到您的 Power VA 聊天机器人

在 Power VA 管理门户,打开你的聊天机器人,点击齿轮图标,选择系统回退

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

通过点击添加按钮,我们启用回退系统主题。这取代了自动提示信息的默认行为,并允许我们挂接自定义逻辑。

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

添加回退系统主题后,点击转到回退主题打开设计器。

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

首先,我们使用每个画布上的三个点删除默认消息和升级重定向。

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

点击连接器末端的 + 图标,选择调用动作,点击创建流程

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

这将启动 Power Automate 管理门户,为 Power VA 提供一个触发器和输出操作。

首先,我们点击**+Add a Input**,为我们的触发器添加一个新的输入。选择一个文本输入并将其命名为Question

同样,我们使用 + 图标添加了**生成答案(预览)**动作。

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

在下一步中,我们必须配置到 QnA Maker 实例的连接。我们需要您之前在 QnA Maker 中发布知识库时显示的连接详细信息(请参考上面的截图)。

根据需要输入一个连接名—将 API 键映射到端点键并将站点 URL 映射到主机。再次验证您的设置并点击创建

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

在下一步中,生成 应答动作再次要求相同的参数。我们还需要知识库 Id ,它只是 QnA Maker 门户中部署细节的 GUID 部分。

最后,我们将问题字段映射到上面触发器的新问题输入。

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

QnA Maker 可能会对一个问题给出多个答案。这就是为什么我们用接下来的两步从回答中“挑选”最佳答案。

首先,我们添加一个初始化变量的步骤,并创建一个名为BestAnswer的新对象。我们用从生成答案动作获得的第一个答案条目初始化对象。为此,我们使用下面的简单表达式。

first(outputs('Generate_answer')?['body/answers'])

这个表达式选择上面的第一个答案。

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

现在我们有了这个答案,我们添加一个解析 JSON 动作来从我们的最佳答案构造一个对象。为此,我们使用下面的 JSON 模式,您可以将它复制并粘贴到动作的模式字段中。

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

作为流程的最后一步,我们添加了两个输出。

首先,我们添加一个名为答案文本输出,并将其映射到最佳答案的答案属性。

其次,我们添加一个名为 Score数字输出,并分别将其映射到 score 属性。分数是一个置信度值,表示 QnA Maker 对响应的确信程度。我们将在稍后使用这个值。

在点击保存之前,给你的流起一个更好的名字。

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

回到 Power VA 中的回退系统主题,我们现在可以添加新的流并将UnrecognizedTriggerPhase变量链接到流的问题输入。这样,我们只需将用户所说的传递给我们的流。

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

之后,我们使用连接器末端的 + 图标添加一个新条件。

我们测试分数变量是否大于 0 。在这种情况下,我们确保我们从 QnA Maker 收到了一个正确的答案,这个答案值得向用户显示,我们用一个使用 Answer 变量的简单消息来完成。

对于任何其他情况,我们用静态消息进行响应,表明即使我们的 QnA Small Talk 数据库也完全不知道用户说了什么。

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

最后,点击保存按钮,我们就可以测试我们聊天机器人的聊天技能了。只需抛出一堆愚蠢的问题,然后看看聊天机器人的反应。

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

就是这样。我们的聊天机器人表现得非常自然,可以回答许多最常见的问题。即使是一个不完美的答案也能带来令人捧腹的幽默对话。你的聊天机器人肯定会经受住你的第一次用户交互,并且总是有机会通过添加新的 QnA 对来改善结果。

👉,
塞巴斯蒂安

告诉我一个故事,艾。一个我喜欢的。

原文:https://towardsdatascience.com/tell-me-a-story-ai-one-that-i-like-4c0bc60f46ae?source=collection_archive---------42-----------------------

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

书的形象:Pixabay。代码图像:Unsplash。

编写一个强化学习系统来讲述你会喜欢的故事

既然我们都被孤立了,我们比以往任何时候都更需要故事。但并不是所有的故事都让我们感兴趣——喜欢浪漫的人可能会对神秘故事嗤之以鼻,反之亦然。有谁比 AI 更适合给我们讲为我们量身定做的故事?

在这篇文章中,我将通过给我们讲故事来指导你编写一个人工智能的过程和代码,使隔离变得更加有趣和有趣——这些故事是为我们的口味量身定制的。

这篇文章将被分成几个部分:

  • *1 |蓝图。*项目的鸟瞰图以及项目的组成部分。
  • 2 |程序演示。在所有东西都被编码后,系统能力的演示,作为某种预览。
  • *3 |数据加载和清洗。*加载数据并准备好进行处理。
  • 4 |寻找最有鉴别力的情节。项目的第一个组成部分,使用 K-Means 寻找最能区分用户对故事品味的情节。
  • 5 |总结剧情。使用基于图形的摘要来获得每个情节的摘要,这是 UI 不可分割的一部分。
  • 6 |推荐引擎使用简单的预测机器学习模型来推荐新故事。
  • 7 |汇集一切。规划生态系统结构,将所有部分结合在一起。

1 |蓝图

我们希望人工智能给我们讲故事。理想情况下,在真正的技术复兴时尚中,我们希望训练一个递归神经网络或其他一些生成方法。然而,根据我处理文本生成的经验,它们要么需要花费非常非常长的时间来训练,要么最终过度适应数据,从而违背了“原始文本生成”的目的。另外说明一下,在 Kaggle 上,训练一个表现良好的模型所需的时间超过了 8 个小时,即操作时间限制,而 ka ggle(据我所知)是训练深度学习模型最高效的免费平台。

相反,我希望这个项目是快速和通用的,每个人都可以实现。这个人工智能不是训练 RNN 或生成模型,而是在“故事数据库”中搜索人类创造的故事,并找到最好的一个。这不仅保证了基本的常识和故事质量(由人类制作,为人类服务),而且速度更快。

对于我们的“故事数据库”,我们将使用 Kaggle 上的维基百科电影情节数据集。拥有 35000 部电影的故事,包括所有类型、国家和时代,这是你能找到的最好的故事数据库。

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

在这些列中有发行年份、标题、电影的国籍、类型和情节的文本描述。

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

现在我们有了数据,我们可以开始设计一个粗略的大纲/蓝图。

  1. 该程序打印出五个左右最具鉴别性的故事的快速摘要(对这些故事的看法将更好地区分用户的口味。例如,像《教父》这样几乎每个人都喜欢的故事在品味上不会很有鉴赏力,因为每个人都喜欢它)。
  2. 用户对他们是否喜欢、不喜欢或者对每个故事概要保持中立进行评级。
  3. 该程序接受用户对这五个有区别的故事的品味,并输出完整长度故事的摘要。如果用户感兴趣,程序输出完整的故事。在每个完整的故事之后,程序会询问用户的反馈。该程序从实时反馈中学习,并试图提出更好的建议。(强化学习系统。)

请注意,选择大约五个最有区别的故事是为了用有限的数据量给模型提供尽可能多的信息。

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

我们强化学习系统的基本路线图。就是不断的学习!

2 |系统演示

最初,这个程序会询问你对三个故事快照的看法。在程序看来,这三个故事最能代表数据中的每个分类。

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

在你回答了前三个问题以大致判断你的口味后,模型将开始生成它认为你会喜欢的故事。

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

如果你对某个故事的片段感兴趣,程序会打印出整个故事供你阅读。

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

你是否喜欢一个故事被添加到模型的训练数据中,以改进它的推荐。当你阅读故事时,这个模型不断地学习。如果你不喜欢一个片段,程序不会打印出完整的故事,并继续生成一个新的。

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

在对几个谋杀和警察片段做出“1”反应后,该程序开始学习,并开始向该方向推荐越来越多的故事。

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

这个程序就像蒙特卡罗树搜索一样,开始朝着优化回报的方向前进,当它走得太远(也许它已经偏离你喜欢的故事类型太远)而无法优化你的体验时,它就会撤退。

3 |数据加载和清理

我们将用pandasload_csv加载数据。

import pandas as pd
data = pd.read_csv('/kaggle/input/wikipedia-movie-plots/wiki_movie_plots_deduped.csv')
data.head()

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

我们有电影的发行年份、片名、国籍、导演、演员、类型、该电影的维基百科页面的 URL 以及情节的文本描述。我们可以摆脱导演和演员——对于我们的推荐算法或聚类方法来说,有太多的类(确切地说,有 12593 个独特的导演和 32182 个演员)无法从中获得任何东西。然而,这种类型是有用的,有少量的类别——30 个类别的电影超过 100 部——代表 80%的电影(其余的属于更小的子类别,可以简单地标记为“其他”)。因此,我们可以放弃导演和演员。

data.drop(['Director','Cast'],axis=1,inplace=True)

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

我们遇到的另一个问题是括号引用。正如你所熟悉的,维基百科引用其来源时会在括号内加上一个与来源相对应的数字(例如[3])。

"Grace Roberts (played by Lea Leland), marries rancher Edward Smith, who is revealed to be a neglectful, vice-ridden spouse. They have a daughter, Vivian. Dr. Franklin (Leonid Samoloff) whisks Grace away from this unhappy life, and they move to New York under aliases, pretending to be married (since surely Smith would not agree to a divorce). Grace and Franklin have a son, Walter (Milton S. Gould). Vivian gets sick, however, and Grace and Franklin return to save her. Somehow this reunion, as Smith had assumed Grace to be dead, causes the death of Franklin. This plot device frees Grace to return to her father's farm with both children.[1]"

例如,在上面的字符串中,我们想要删除[1]。对此最简单的解决方案是创建一个包含每个括号值([1]、[2]、[3]、[98]、[99])的列表,并从字符串中删除它们。这是可行的,因为我们可以确定没有一篇文章的引用次数超过 99 次。虽然不是最有效的,但它可以完成混乱的字符串索引或拆分工作。

blacklist = []
for i in range(100):
    blacklist.append('['+str(i)+']')

这就产生了“黑名单”——一个充满我们不需要或不想要的引用的列表。

def remove_brackets(string):
    for item in blacklist:
        string = string.replace(item,'')
    return string

使用黑名单,我们可以创建一个应用于该列的函数remove_brackets

data['Plot'] = data['Plot'].apply(remove_brackets)

这就结束了我们的初级数据清理。

4 |汇总情节

我们系统的一个关键要素是总结情节。因为故事通常太长而无法阅读,所以总结故事很重要,这样用户就可以选择是否继续阅读。

我们将使用基于图形的摘要,这是最流行的文本摘要方法。它创建一个文档单元图(而大多数其他方法使用句子作为基本单元),然后选择具有适合该场景的 PageRank 版本的节点。Google 最初的 PageRank 版本使用类似的基于图形的方法来查找网页节点。

PageRank 算法计算图中节点的“中心性”,这在测量句子中的相关信息内容时很有用。该图是使用单词袋特征序列和基于余弦相似度的边权重构建的。

我们将使用gensim库来总结长文本。与前面的示例一样,实现起来很简单:

import gensim
string = '''
The PageRank algorithm outputs a probability distribution used to represent the likelihood that a person randomly clicking on links will arrive at any particular page. PageRank can be calculated for collections of documents of any size. It is assumed in several research papers that the distribution is evenly divided among all documents in the collection at the beginning of the computational process. The PageRank computations require several passes, called “iterations”, through the collection to adjust approximate PageRank values to more closely reflect the theoretical true value.
Assume a small universe of four web pages: A, B, C and D. Links from a page to itself, or multiple outbound links from one single page to another single page, are ignored. PageRank is initialized to the same value for all pages. In the original form of PageRank, the sum of PageRank over all pages was the total number of pages on the web at that time, so each page in this example would have an initial value of 1\. However, later versions of PageRank, and the remainder of this section, assume a probability distribution between 0 and 1\. Hence the initial value for each page in this example is 0.25.
The PageRank transferred from a given page to the targets of its outbound links upon the next iteration is divided equally among all outbound links.
If the only links in the system were from pages B, C, and D to A, each link would transfer 0.25 PageRank to A upon the next iteration, for a total of 0.75.
Suppose instead that page B had a link to pages C and A, page C had a link to page A, and page D had links to all three pages. Thus, upon the first iteration, page B would transfer half of its existing value, or 0.125, to page A and the other half, or 0.125, to page C. Page C would transfer all of its existing value, 0.25, to the only page it links to, A. Since D had three outbound links, it would transfer one third of its existing value, or approximately 0.083, to A. At the completion of this iteration, page A will have a PageRank of approximately 0.458.
In other words, the PageRank conferred by an outbound link is equal to the document’s own PageRank score divided by the number of outbound links L( ).
 In the general case, the PageRank value for any page u can be expressed as: i.e. the PageRank value for a page u is dependent on the PageRank values for each page v contained in the set Bu (the set containing all pages linking to page u), divided by the number L(v) of links from page v. The algorithm involves a damping factor for the calculation of the pagerank. It is like the income tax which the govt extracts from one despite paying him itself.
'''
print(gensim.summarization.summarize(string))

[输出]:

In the original form of PageRank, the sum of PageRank over all pages was the total number of pages on the web at that time, so each page in this example would have an initial value of 1\. 
The PageRank transferred from a given page to the targets of its outbound links upon the next iteration is divided equally among all outbound links. If the only links in the system were from pages B, C, and D to A, each link would transfer 0.25 PageRank to A upon the next iteration, for a total of 0.75\. Since D had three outbound links, it would transfer one third of its existing value, or approximately 0.083, to A.

总结是有意义的(如果你愿意阅读整篇文章的话)。图表汇总是最有效的汇总方法之一,我们将在我们的图表中使用它。让我们创建一个函数summary,它接收文本并输出摘要。然而,我们需要满足两个条件:

  • 如果文本的长度小于 500 个字符,那么只返回原始文本。总结会使它过于简短。
  • 如果文本只有一个句子,genism不能处理它,因为它只选择文本中的重要句子。我们将使用TextBlob对象,它有一个属性。将文本拆分成句子的句子。如果一篇课文的第一句话等于正文,那么这篇课文就只有一句话。
import gensim
from textblob import TextBlobdef summary(x):
    if len(x) < 500 or str(TextBlob(x).sentences[0]) == x:
        return x
    else:
        return gensim.summarization.summarize(x)
data['Summary'] = data['Plot'].apply(summary)

如果不满足这两个条件中的任何一个,它将返回文本的摘要。然后,我们将创建一个列Summary来总结这些图。

这需要几个小时来运行。但是,这是一次性成本,有一个总结可以节省以后的时间。

让我们看看它在数据集的一些示例文本上的表现:

"The earliest known adaptation of the classic fairytale, this films shows Jack trading his cow for the beans, his mother forcing him to drop them in the front yard, and beig forced upstairs. As he sleeps, Jack is visited by a fairy who shows him glimpses of what will await him when he ascends the bean stalk. In this version, Jack is the son of a deposed king. When Jack wakes up, he finds the beanstalk has grown and he climbs to the top where he enters the giant's home. The giant finds Jack, who narrowly escapes. The giant chases Jack down the bean stalk, but Jack is able to cut it down before the giant can get to safety. He falls and is killed as Jack celebrates. The fairy then reveals that Jack may return home as a prince."

总结为

'As he sleeps, Jack is visited by a fairy who shows him glimpses of what will await him when he ascends the bean stalk.'

为什么,这是一个伟大的完整的故事的结果!这些摘要读起来很快,并能让你对电影情节中的重要句子有一个很好的了解。这已经很好地解决了。

应用于真实数据集的可分叉笔记本中的代码可以在这里找到。

5 |寻找最具鉴别力的故事情节

为了找到最有区别的故事情节,我们将使用 K 均值将情节的文本聚类到最佳数量的聚类中。文本的聚类标签以及电影的国籍、类型和年份将被聚类以在电影中找到聚类。最接近每个质心(聚类中心)的电影应该最能代表它们的聚类,因此最具歧视性。这个想法背后的主要思想是

询问用户有多喜欢那些最具歧视性的电影,对于一个之前没有用户口味信息的模型来说,应该提供了最多的信息。

电影的国籍、类型和年份都代表了电影在文本中可能传达的方面,这有助于我们快速找到合适的推荐。理论上,最“准确”的建议是非常非常长的图的矢量化之间的某种相似性,但这需要很长时间。相反,一个图可以用它的属性来“表示”。

对文本进行聚类是一次性的事情,它不仅为我们提供了用于对电影进行聚类的附加特征,还提供了在我们实际进行推荐时用作电影属性的特征。

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

我们开始吧!首先,我们需要删除所有的标点符号,并使所有的文本小写。我们可以使用正则表达式创建一个函数clean()来做这件事。

import string
import re
def clean(text):
    return re.sub('[%s]' % string.punctuation,'',text).lower()

使用pandas.apply(),该功能可以应用于所有的地块。

data['Cleaned'] = data['Plot'].apply(clean)

现在,让我们对数据进行矢量化。我们将使用术语频率逆文档频率(TF-IDF)矢量器。这个矢量器还可以帮助区分重要的单词和不重要的单词,从而得到更好的聚类。矢量器强调在一个文档中出现较多但在整个语料库中出现较少的单词(更有鉴别能力),而不强调在所有文档中出现的单词。

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words='english',max_features=500)
X = vectorizer.fit_transform(data['Plot'])

我们将把非常非常稀疏的矩阵保存到变量X中。因为 K-Means 是基于距离的,这意味着它会受到维数灾难的影响,我们应该通过将向量中的最大元素数设置为 500 来尽最大努力降低矢量化文本的维数。(当我没有实现max_features限制时,文本将除了集群 2 中的一个文本和集群 3 中的一个文本之外的所有文本分类为集群 1。这是 K-Means 上的维数灾难的结果——距离是如此扭曲,以至于在 TF-IDF 的词汇中可能有成千上万个维度,除了离群值之外的一切都被归入一个类别。

出于同样的原因,在我们将数据输入 K-Means 模型之前,对数据进行缩放是一个好主意。我们将使用StandardScaler,它将数据放在-11的范围内。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

现在,是时候训练 K 均值模型了。理想情况下,集群的数量(我们需要问的问题的数量)将在 3 到 6 之间,包括 3 和 6。

因此,我们将对列表[3, 4, 5, 6]中的每个聚类数运行 K-Means 模型。我们将评估每个分类的轮廓分数,并找出最适合我们数据的分类数。

首先,让我们初始化两个列表来存储聚类数和轮廓分数(我们的图的 xy ):

n_clusters = []
scores = []

接下来,我们将导入sklearnKMeanssilhouette_score

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

然后,对于四个可能的聚类中的每个聚类数,我们将使用 n 个聚类来拟合 KMeans 模型,然后将该聚类数的轮廓分数附加到列表scores

for n in [3,4,5,6]:
    kmeans = KMeans(n_clusters=n)
    kmeans.fit(X)
    scores.append(silhouette_score(X,kmeans.predict(X)))
    n_clusters.append(n)

从这里,我将在 Kaggle 上单击“Commit ”,让它自己运行——运行一遍需要几个小时。

最后发现表现最好的聚类数是三个聚类,轮廓得分最高。

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

现在我们有了文本标签,我们可以开始将电影作为一个整体进行聚类。然而,我们确实需要采取一些措施来清理数据。

比如Release Year从 1900 年代开始计时。如果取字面上的整数值,会使模型混乱。相反,让我们创建一个返回电影年龄的列Age,它就是 2017 年(数据库中最年轻的电影)减去电影发行的年份。

data['Age'] = data['Release Year'].apply(lambda x:2017-x)

现在,年龄从 0 开始计数,实际上意味着一些东西。

Origin/Ethnicity专栏很重要——一个故事的风格和味道通常可以追溯到它的来源。然而,这个列是绝对的,这意味着它的形式是[‘American’, ‘Telegu’, ‘Chinese’]。要把它转换成机器可读的东西,我们需要一次性编码,用 sklearn 的OneHotEncoder很容易做到。

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown=’ignore’)
nation = enc.fit_transform(np.array(data[‘Origin/Ethnicity’]) .reshape(-1, 1)).toarray()

现在,nation 存储每一行的独热编码值。一行的每个索引代表一个惟一的值——例如,第一列(每行的第一个索引)代表‘American’

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

然而,目前,它只是一个数组——我们需要在数据中创建列,以便将信息真正转化为我们的数据。因此,对于每一列,我们将命名该向量的列对应的国家(enc.categories_[0]返回原始列的数组,nation[:,i]索引数组中每行的第i个值)。

for i in range(len(nation[0])):
    data[enc.categories_[0][i]] = nation[:,i]

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

我们已经成功地将每个故事的国籍数据添加到我们的数据中。让我们对故事的类型做同样的处理。这可能比国籍更重要,因为它传达了关于故事在某种程度上讨论什么的信息,而机器学习模型根本不可能识别这些信息。

然而,有一个问题:

data[‘Genre’].value_counts()

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

部分剪断;类别比较多。

似乎很多流派都不为人知。不要担心,我们稍后会解决这个问题。现在,我们的目标是对这种类型进行编码。我们将遵循与之前类似的过程,但略有不同——因为有太多的流派因名称不同而被视为不同(例如,“戏剧喜剧”和“浪漫喜剧”),但几乎相同,我们将只选择最受欢迎的 20 个流派,并将其余的归入 20 个流派中的一个。

top_genres = pd.DataFrame(data['Genre'].value_counts()).reset_index().head(21)['index'].tolist()
top_genres.remove('unknown')

请注意,我们最终从列列表中删除了’unknown’,这就是最初选择前 21 个流行流派的原因。接下来,让我们根据top_genres处理流派,这样,如果一个流派不在前 20 个最流行的流派中,它将被替换为字符串值“unknown”。

def process(genre):
    if genre in top_genres:
        return genre
    else:
        return 'unknown'
data['Genre'] = data['Genre'].apply(process)

然后,像以前一样,我们将创建一个一键编码器的实例,并将它对数据的转换以数组形式保存到变量genres中。

enc1 = OneHotEncoder(handle_unknown='ignore')
genres = enc1.fit_transform(np.array(data['Genre']).reshape(-1, 1)).toarray()

为了将数组集成到数据中,我们将再次创建列,其中数据中的每一列都用数组中的一列填充。

for i in range(len(genres[0])):
    data[enc1.categories_[0][i]] = genres[:,i]

太好了!我们的数据是一次性编码的,但是我们仍然有一个未知值的问题。现在所有的数据都被一次性编码了,我们知道列unknown的值为 1 的行需要估算它们的类型。因此,对于每个需要估算类型的索引,我们将用一个nan值替换它们的类型,这样我们稍后使用的 KNN 估算器就可以识别出它是一个缺失值。

for i in data[data['unknown']==1].index:
    for column in ['action',
       'adventure', 'animation', 'comedy', 'comedy, drama', 'crime',
       'crime drama', 'drama', 'film noir', 'horror', 'musical', 'mystery', 'romance', 'romantic comedy', 'sci-fi', 'science fiction', 'thriller', 'unknown', 'war', 'western']:
        data.loc[i,column] = np.nan

既然所有缺失值都被标记为缺失,我们可以使用 KNN 估算值。然而,除了发行年份和国籍,恐怕没有太多的数据来估算这些数据。让我们使用 TF-IDF 矢量器,从故事中选择前 30 个单词,作为 KNN 正确分配体裁的额外补充信息。

文本必须总是事先清理,所以我们将使用正则表达式删除所有标点符号,并使一切小写。

import re
data['Cleaned'] = data['Plot'].apply(lambda x:re.sub('[^A-Za-z0-9]+',' ',str(x)).lower())

我们将设置英语标准停用词,并将最大功能数设置为 30。清理后的矢量化内容将以数组的形式存储到变量X中。

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words=’english’,max_features=30)
X = vectorizer.fit_transform(data[‘Cleaned’]).toarray()

像前面一样,我们将把数组X中的每一列信息转移到我们的数据中的一列,用X中的列所对应的单词来命名每一列。

keys = list(vectorizer.vocabulary_.keys())
for i in range(len(keys)):
    data[keys[i]] = X[:,i]

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

这些词将为故事内容提供更多的语境,有助于推断故事类型。最后,是时候估算一下流派了!

from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
column_list = ['Age', 'American', 'Assamese','Australian', 'Bangladeshi', 'Bengali', 'Bollywood', 'British','Canadian', 'Chinese', 'Egyptian', 'Filipino', 'Hong Kong', 'Japanese','Kannada', 'Malayalam', 'Malaysian', 'Maldivian', 'Marathi', 'Punjabi','Russian', 'South_Korean', 'Tamil', 'Telugu', 'Turkish','man', 'night', 'gets', 'film', 'house', 'takes', 'mother', 'son','finds', 'home', 'killed', 'tries', 'later', 'daughter', 'family','life', 'wife', 'new', 'away', 'time', 'police', 'father', 'friend','day', 'help', 'goes', 'love', 'tells', 'death', 'money', 'action', 'adventure', 'animation', 'comedy', 'comedy, drama', 'crime','crime drama', 'drama', 'film noir', 'horror', 'musical', 'mystery','romance', 'romantic comedy', 'sci-fi', 'science fiction', 'thriller','war', 'western']imputed = imputer.fit_transform(data[column_list])

我们的估算器将识别标记为缺失值的np.nan值,并自动使用关于国籍和数据中的单词的包围数据,以及电影的年代来估算类型。结果以数组的形式保存到一个变量中。像往常一样,我们将转换数据:

for i in range(len(column_list)):
    data[column_list[i]] = imputed[:,i]

在删除了我们已经一次性编码或不再需要的列之后,比如用于Genre或分类Genre变量的Unknown列…

data.drop(['Title','Release Year','Director','Cast','Wiki Page','Origin/Ethnicity','Unknown','Genre'],axis=1,inplace=True)

…数据准备就绪,没有丢失值。KNN 插补的另一个有趣的方面是,它可以给出十进制值——也就是说,一部电影有 20%是西方的,还有其他一些是另一种类型,或者几种类型。

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

这些特性都将很好地服务于集群。结合之前实现的文本聚类标签,这些特征应该是一个很好的指标,表明一个故事在人们的偏好领域中所处的位置。最后,我们可以开始聚类——像以前一样,我们将故事分成 3、4、5 或 6 个聚类,看看哪一个表现最好。

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
Xcluster = data.drop(['Plot','Summary','Cleaned'],axis=1)
score = []
for i in [3,4,5,6]:
    kmeans = KMeans(n_clusters=i)
    prediction = kmeans.fit_predict(Xcluster)
    score = silhouette_score(Xcluster,prediction)
    score.append(score)

绘制分数时…

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

…像以前一样,三个集群表现最好,具有最高的轮廓分数。让我们仅在三个集群上训练我们的 KMeans:

from sklearn.cluster import KMeans
Xcluster = data.drop(['Plot','Summary','Cleaned'],axis=1)
kmeans = KMeans(n_clusters=3)
kmeans.fit(Xcluster)
pd.Series(kmeans.predict(Xcluster)).value_counts()

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

每个集群都有相对均匀的电影分布,这很好。让我们得到聚类中心,可以用.cluster_centers_方法访问它:

centers = kmeans.cluster_centers_
centers

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

部分剪断。

首先,让我们给每个项目分配标签。

Xcluster['Label'] = kmeans.labels_

对于每个聚类,我们希望找到在欧几里德距离方面最接近聚类中心的数据点。这将是该集群中最具代表性的一个。两点 pq 之间的距离由 pq 对应尺寸的差的平方和的平方根给出。你可以在这里找到我对欧几里德距离的证明(多维度中的勾股公式)

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

因为欧几里德距离是 l2 范数,这可以用numpy的线性代数能力:np.linalg.norm(a-b)很容易地计算出来。

让我们查看整个代码以计算代码,并找到与分类具有最小欧几里得距离的故事。

for cluster in [0,1,2]:
    subset = Xcluster[Xcluster['Label']==cluster]
    subset.drop(['Label'],axis=1,inplace=True)
    indexes = subset.index
    subset = subset.reset_index().drop('index',axis=1)
    center = centers[cluster]
    scores = {'Index':[],'Distance':[]}

这将初始化搜索。首先,我们存储其标签等于我们当前正在搜索的分类的故事。之后,我们从子集中删除’【T3]'。为了存储原始索引供以后参考,我们将把索引存储到一个变量indexes中。之后,我们将重置subset上的索引以确保平滑的行索引。然后,我们将选择当前聚类的中心点,并启动一个包含两列的字典:一个列表用于存储主数据集中某个故事的索引,另一个列表用于存储得分/距离。

for index in range(len(subset)):
   scores['Index'].append(indexes[index])
   scores['Distance'].append(np.linalg.norm(center-np.array( subset.loc[index])))

这段代码遍历子集内的每一行,记录当前索引,并计算和记录它与中心的距离。

scores = pd.DataFrame(scores)
    print('Cluster',cluster,':',scores[scores['Distance']==scores['Distance'].min()]['Index'].tolist())

这将分数转换成熊猫数据帧用于分析,并打印出离中心距离最近的故事的索引。

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

看起来具有最近欧几里德距离的第一个分类有四个故事,但是分类 1 和分类 2 只有一个故事。让我们来看看这些是什么故事。

集群 0:

data.loc[4114]['Summary']

[输出]:

'On a neutral island in the Pacific called Shadow Island (above the island of Formosa), run by American gangster Lucky Kamber, both sides in World War II attempt to control the secret of element 722, which can be used to create synthetic aviation fuel.'

集群 1:

data.loc[15176]['Summary']

[输出]:

'Jake Rodgers (Cedric the Entertainer) wakes up near a dead body. Freaked out, he is picked up by Diane.'

集群 2:

data.loc[9761]['Summary']

[输出]:

'Jewel thief Jack Rhodes, a.k.a. "Jack of Diamonds", is masterminding a heist of $30 million worth of uncut gems. He also has his eye on lovely Gillian Bromley, who becomes a part of the gang he is forming to pull off the daring robbery. However, Chief Inspector Cyril Willis from Scotland Yard is blackmailing Gillian, threatening her with prosecution on another theft if she doesn\'t cooperate in helping him bag the elusive Rhodes, the last jewel in his crown before the Chief Inspector formally retires from duty.'

太好了!我们已经得到了三个最有区别的故事情节。虽然它对人类来说可能不那么有歧视性,但在我们的机器学习模型的头脑中,这些将立即给它提供最多的信息。

6 |推荐引擎

推荐引擎将只是一个机器学习模型,预测哪些电影情节有更高的机会被用户高度评价。该引擎将接受电影的特征,如其年龄或国籍,以及一个 TF-IDF 矢量化版本的摘要,限于 100 个特征(不同的词)。

每个电影情节的目标将是 1 或 0。模型将根据可用数据(用户已评级的故事)进行训练,并预测用户对故事进行正面评级的概率。接下来,最高概率图将被推荐给用户,并且用户对该故事的评级将被记录,并且该故事将被添加到训练数据列表中。

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

作为训练数据,我们将简单地使用每部电影的数据属性。

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

我们可能会想要一个决策树分类器,因为它可以进行有效的预测,快速训练,并开发一个高方差的解决方案,这是推荐系统努力的方向。

在下一部分中,我们将把我们之前的工作整合在一起。

7 |将所有这些整合在一起

我们先从用户对三部最具歧视性的电影的评分进行编码开始。对于每个输入,程序确保输出为 0 或 1。

import time
starting = []
print("Indicate if like (1) or dislike (0) the following three story snapshots.")print("\n> > > 1 < < <")
print('On a neutral island in the Pacific called Shadow Island (above the island of Formosa), run by American gangster Lucky Kamber, both sides in World War II attempt to control the secret of element 722, which can be used to create synthetic aviation fuel.')
time.sleep(0.5) #Kaggle sometimes has a glitch with inputs
while True:
    response = input(':: ')
    try:
        if int(response) == 0 or int(response) == 1:
            starting.append(int(response))
            break
        else:
            print('Invalid input. Try again')
    except:
        print('Invalid input. Try again')print('\n> > > 2 < < <')
print('Jake Rodgers (Cedric the Entertainer) wakes up near a dead body. Freaked out, he is picked up by Diane.')
time.sleep(0.5) #Kaggle sometimes has a glitch with inputs
while True:
    response = input(':: ')
    try:
        if int(response) == 0 or int(response) == 1:
            starting.append(int(response))
            break
        else:
            print('Invalid input. Try again')
    except:
        print('Invalid input. Try again')print('\n> > > 3 < < <')
print("Jewel thief Jack Rhodes, a.k.a. 'Jack of Diamonds', is masterminding a heist of $30 million worth of uncut gems. He also has his eye on lovely Gillian Bromley, who becomes a part of the gang he is forming to pull off the daring robbery. However, Chief Inspector Cyril Willis from Scotland Yard is blackmailing Gillian, threatening her with prosecution on another theft if she doesn't cooperate in helping him bag the elusive Rhodes, the last jewel in his crown before the Chief Inspector formally retires from duty.")
time.sleep(0.5) #Kaggle sometimes has a glitch with inputs
while True:
    response = input(':: ')
    try:
        if int(response) == 0 or int(response) == 1:
            starting.append(int(response))
            break
        else:
            print('Invalid input. Try again')
    except:
        print('Invalid input. Try again')

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

这个很好用。接下来,让我们将数据存储到训练数据集 DataFrame 中,并从数据中删除这些索引。

X = data.loc[[9761,15176,4114]].drop( ['Plot','Summary','Cleaned'],axis=1)
y = starting
data.drop([[9761,15176,4114]],inplace=True)

现在,是时候创建一个循环了。我们将在当前的训练集上训练一个决策树分类器。

from sklearn.tree import DecisionTreeClassifier
subset = data.drop(['Plot','Summary','Cleaned'],axis=1)
while True:
    dec = DecisionTreeClassifier().fit(X,y)

然后,对于数据中的每一个指标,我们都会做一个概率预测。

dic = {'Index':[],'Probability':[]}
subdf = shuffle(subset).head(10_000) #select about 1/3 of data
for index in tqdm(subdf.index.values):
     dic['Index'].append(index)
     dic['Probability'].append(dec.predict_proba(  np.array(subdf.loc[index]).reshape(1, -1))[0][1])
     dic = pd.DataFrame(dic)

为了确保快速选择,我们将随机选择大约 1/3 的数据,方法是随机排列数据并选择前 10,000 行。该代码将索引保存到数据帧中。

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

最初,它以概率 1 对许多电影进行评级,但随着我们的进步和模型学习更多,它将开始做出更高级的选择。

index = dic[dic['Probability']==dic['Probability'].max()] .loc[0,'Index']

我们将把表现最好的电影的索引保存到变量index中。

现在,我们需要从data中获取关于index的信息并显示出来。

print('> > > Would you be interested in this snippet from a story? (1/0/-1 to quit) < < <')
print(data.loc[index]['Summary'])
time.sleep(0.5)

在验证用户的输入是 0、1 或-1 之后,退出…

while True:
        response = input(':: ')
        try:
            if int(response) == 0 or int(response) == 1:
                response = int(response)
                break
            else:
                print('Invalid input. Try again')
        except:
            print('Invalid input. Try again')

…我们可以开始增加我们的训练数据。然而,首先,如果用户想退出,我们必须打破这个循环。

if response == -1:
        break

此外,不管用户喜欢还是不喜欢这部电影,我们仍然要将它添加到训练数据中(目标只是不同):

X = pd.concat([X,pd.DataFrame(data.loc[index].drop(['Plot','Summary','Cleaned'])).T])

最后,如果响应等于 0,我们将把 0 附加到 y 上。用户不想喜欢这个故事。

if response == 0:
        y.append(0)

然而,如果用户喜欢,程序将打印完整的故事。

else:
        print('\n> > > Printing full story. < < <')
        print(data.loc[index]['Plot'])
        time.sleep(2)
        print("\n> > > Did you enjoy this story? (1/0) < < <")

我们将再次收集用户的输入,并确保它是 0 或 1,

while True:
      response = input(':: ')
      try:
          if int(response) == 0 or int(response) == 1:
              response = int(response)
              break
          else:
              print('Invalid input. Try again')
      except:
          print('Invalid input. Try again')

…并相应地给 y 加 0 或 1。

if response == 1:
      y.append(1)
else:
      y.append(0)

最后,我们将从数据中删除这个故事,这样用户就不会再看到同一个故事。

data.drop(index,inplace=True)

我们已经完成了!每次迭代,训练数据都会更新,模型会越来越精确。

感谢阅读!

我希望你喜欢!也许你会用这个程序来阅读几个有趣的情节,或者可能会检查情节所属的电影。在这个孤立的时期,处理数据中的问题和挑战,创造一些东西来娱乐我们,这很有趣。

如果你想玩玩这个程序,你可以在这里找到它。它仍然可以得到显著的改进,所以我对你们可以用这些代码做什么很感兴趣!

使用数据讲述故事——应遵循的 10 大策略

原文:https://towardsdatascience.com/tell-stories-using-data-top-10-strategies-to-follow-ee886f73d26c?source=collection_archive---------47-----------------------

学习如何让你的故事更吸引人

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

You X VenturesUnsplash 上拍摄的照片

简介:

创建图表和图形很容易。从这些图表中提取故事很有挑战性。因此,数据分析师的角色不是制作吸引人的视觉效果;平面设计师可以做到这一点。数据分析师的重要部分是确保受众能够通过这些图表唤起精确的信息。不是每个人都能读取数据。作为数据分析师,我们有责任用一个激动人心的故事来解释这些图表。

以下是使用这些视觉材料制作图表和讲述故事时应遵循的一些策略:

  1. 让观众好奇——这是要遵循的第一步也是最重要的一步。呈现数据就像向观众展示一部电影。引言决定了整部电影的精髓。所以花更多的时间准备完美的介绍。
  2. 如何建立好奇心?——每个人都知道介绍必须引人入胜,令人好奇。但是怎么做呢???这是一个简单的经验法则。给观众提供一个需要解决的问题。不要描绘你的解决方案。让他们想出自己的想法。
  3. 使用类比/隐喻——不是每个人都能从你的角度看待问题。为了与观众建立联系,使用例子/类比/隐喻。
  4. 使用第二人称词“你/你的”而不是“我/我”——坦白!没有人会因为听到你无聊的想法而兴奋。所以站在他们的立场上说这些故事。这对你的故事影响很大。
  5. 不要这么严肃——你不会以一种严厉的心态赢得比赛。与你联系的观众友好相处。
  6. 创造一个虚构的人物 —如果有故事,就必须有一个扮演这个故事的人物。没有那,它只是一个句子的形成。因此,创建一个虚构的角色来代表客户(或者数据是关于谁的)。
  7. 讲故事时使用“细节”——如果你的数据含糊不清,听众就不会对它们感兴趣。保留一些琐碎的细节,这样人们就可以在脑海中虚拟地播放这个故事。
  8. 相信你所说的话——不要只是想出你不相信的故事。尽管你是一个优秀的演讲者,但如果你不相信你的话,听众就无法感受到你的光环。
  9. 消除分散注意力的视觉效果——你的最终目标是让观众理解你的见解。如果你觉得图表分散了人们听你故事的注意力,那就扔掉它。
  10. 让你的内容更人性化——不要用“即将到来的顾客趋势”这样的标题,而要用“人们会买什么?”

**额外提示:**让一切变得简单。简单导致伟大的思想。

结论:

这些策略给了我很多启发。我从 Linkedin 的一个名为“学习数据科学:用数据讲故事”的学习课程中获得了这些见解,该课程由道格·罗斯主讲。我强烈推荐查看这个免费的课程,以获得更多的见解。在评论里补充一些我漏掉的你的想法。

联系我:

我的电子邮件—hpprasad2000@gmail.com

我的 Linkedin 个人资料— 点击此处

用数据讲故事:数据科学中的交流

原文:https://towardsdatascience.com/tell-stories-with-data-communication-in-data-science-5266f7671d7?source=collection_archive---------13-----------------------

数据故事可以推动受众参与,并将见解转化为行动或业务成果。

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

照片由 Unsplash 上的 Dmitry Ratushny 拍摄

在数据科学的世界里,一个人必须擅长数据创造、怀疑和交流。来自数据分析的有趣见解必须与高层决策者和关键利益相关者分享,以实现最大的影响。

通过创造引人入胜的故事,向科学数据分析领域之外的受众有效展示和交流发现的能力,是任何成功的数据科学家的决定性特征。好消息是,用数据寻找和讲述故事是一门艺术,跨越学科,任何人都可以学习。

为什么沟通很重要?

数据科学家的工作不仅仅局限于数据库。作为一名数据科学家,你不会仅仅花几个小时钻研数据集、处理数字或解释关键发现来得出结论。您还必须:

  • 解释一下你是如何得出特定结论的
  • 理性地证明你为什么以一种特定的方式处理一个问题
  • 传达有趣的见解以某种方式让人们以不同的方式思考或行动
  • 说服你的听众,你的结果是决定性的,可以转化为可操作的东西
  • 表达你的发现为何有价值,以及它们如何融入整体图景

这需要大量的沟通。

数据科学家必须具有说服力、说服力和可信度,而做到这一点的最佳方式就是**“数据故事”**。《有效的数据故事讲述:如何用数据、叙述和视觉效果推动变革》一书的作者 Brent Dykes 认为,数据故事讲述是一种传达数据洞察力的结构化方法,包含三个关键要素:数据视觉效果叙述

在本文中,我们将讨论后两个元素。叙述可能有助于向你的听众解释数据表明了什么,以及为什么见解很重要。视觉效果——图形、图表、图示——可以用来以电子表格和仪表板无法做到的方式突出洞察力。

叙事和视觉的结合可以用来吸引你的观众和推动可操作的见解,从而实现有效的决策。

叙述

统计数据可能很难理解,尤其是如果你没有排除不必要的信息或给数据添加叙述的话。**你希望以一种能引起目标受众共鸣并对其产生影响的方式展示和传达你的见解。**下面是该如何做:

1.将你的数据联系起来

如果你看到一个没有任何上下文层次的数字“25”,你不会知道它的真正含义。是某人的年龄吗?是客户转化率的百分比变化吗?是网站访问量吗?

虽然在真空中展示数据无助于我们对其意义的理解,但将数据置于更大的环境或背景中可以使其获得真实和完整的意义。

你必须问自己,为了更好地理解你的发现,什么样的背景信息是相关的或必要的。通过这种方式,您可以将无意义的数据转换为真实的信息,这些信息可以用作可操作的见解。您还必须:

a .了解你的听众— 考虑一下你要向谁展示你的发现和见解。是对整体业务表现感兴趣的高管吗?是营销经理想要确定特定的社交媒体活动是否有效吗?销售团队是否需要知道本季度是否能达到配额?你的演示和数据可视化需要围绕你的听众已经拥有的信息水平和他们想要的信息来构建。

b .与你的听众相关哈佛商业评论进行了一项关于讲故事的神经生物学研究,发现“带有情感内容的人物驱动的故事可以更好地理解演讲者想要表达的要点。”这意味着决策通常是基于情感而非逻辑。通过与你的观众建立概念驱动的联系,你可以增加观众的参与度。

人们听到的是统计数据,但他们感受到的是故事——布伦特·戴克斯

2.创造一个引人注目的故事

你展示信息的方式可以塑造你的观众的看法和行为。强大的故事都是在更大的画面内诬陷****——它们有一个勾,气势销魂目的 。思考如何组织故事可以帮助你找到吸引人的故事,让人们了解复杂的问题,并激发关于提议的解决方案的对话。

那么,你如何构建你的故事,并形成一个强有力的叙述呢?考虑以下问题:

  • 你数据分析的目的是什么?为什么你首先要解读这些数据?
  • 你的信息是什么?
  • 你打算用你的洞察力解决什么问题?
  • 你的发现给你的组织增加了什么价值?

数据故事化(通过叙述)的目标是激发商业决策的批判性思考和讨论——你应该能够通过行动号召来引发听众的回应。

3.总结你的见解

想象一下,你只有有限的时间或一句话来向你的听众传达信息。你会怎么说?你只需要告诉他们需要知道的。以这种方式思考你的陈述,将使你能够简洁、清晰、简明地讲述你想要讲述的故事。

请记住,好的数据故事只包含与分析目标直接相关的信息,超过这个数量,你的听众将很难理解你想要表达的观点。

画面

数据可视化——图形、图表、图解——是赋予数据生命的绝佳方式。强大的可视化通过统计信息的图形描述讲述一个故事。通过创造性地使用数据和统计数据来展示模式并得出关于假设的结论,你可以抓住并保持你的听众的注意力。

Deliveroo 是一个受欢迎的英国食品交付应用程序,已经筹集了数百万美元的投资者资金,它使用大数据和机器学习来推动食品交付。工程副总裁这样评价数据可视化:

图表帮助我们的运营团队了解趋势并做出反应,整个企业的代理每天 24 小时都在对我们的数据集进行查询——Dan Webb

理解什么时候最适合使用某些数据可视化也很重要。疯狂的蛋用一个超级酷的信息图来演示这一点:

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

疯狂鸡蛋信息-图片

用适当的数据可视化来说明你的结论是一种动态的说服形式。它让你的观众发现模式,看到趋势,并以更快的速度消化大量的数据。

总之,**当数据适合一个故事时,它的价值就增加了。**那些处理数据的人必须能够传达出数据为什么吸引人或有用,否则数据的价值就会丧失。你的目标受众必须能够对你的分析解决方案产生共鸣或反应。通过在叙述中呈现数据(并辅以视觉效果),你可以从人的角度看待事实数据,以增加观众对你的发现的理解,并获得有价值的见解。

使用 Python 中的 Pytrends 讲述 Google Trends 的故事

原文:https://towardsdatascience.com/telling-stories-with-google-trends-using-pytrends-in-python-a11e5b8a177?source=collection_archive---------11-----------------------

如何使用谷歌趋势 python 库 Pytrends 追踪多个关键词的相对受欢迎程度并发现它们的故事。 + 数据可视化使用 Tableau

Google Trends 从 2006 年开始向公众开放,让他们搜索可以追溯到 2004 年的某些关键词的相对受欢迎程度。从谷歌的数据中,我们可以了解不同国家或地区之间的相对受欢迎程度。

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

米切尔·罗Unsplash 上的照片

在本教程中,我将分享如何跟踪多个关键词的相对受欢迎程度(我说的是一次几十个,甚至几百个关键词)。

我使用 Python 连接到 Google Trends API 使用 Pytrends ,迭代关键字列表上的数据收集,并使用一个关键字作为参考来整合它们。我们需要这样做,因为谷歌趋势一次只允许最多 5 个关键词比较。

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

直接在谷歌趋势上比较关键词

现在让我们搜索关于食物的关键词。这将是有趣的,因为不同类型的食物可能有不同的季节性和受欢迎程度,这可能是一个很好的研究餐饮业。还有,我饿了。所以让我们开始吧!

准备

首先,我们需要准备关键字列表,并选择一个参考关键字来实现比较的集成。注意谷歌趋势给出的是相对受欢迎程度的数据,而不是实际的搜索量。来自谷歌趋势页面:

“数字代表在给定地区和时间内相对于图表最高点的搜索兴趣。值 100 是该术语的最高流行度。值为 50 表示该术语的流行程度减半。得分为 0 意味着没有足够的数据用于这个术语。

再者,从我的经验来看,选择一个不太热门的参考关键词是一件好事,因为我们会得到更有特色的对比。但是,引用关键字也应该足够受欢迎,不会获得 0 相对受欢迎度。

所以让我们制作一个关键词列表,可以直接在 Python 或者任何电子表格中制作。为了这个教程,我列出了世界上几个受欢迎的菜系的 100 种食物。

连接谷歌 API &收集数据

现在让我们跳进 Python 吧。首先要做的是导入库并连接到 Google API :

# pip install pytrends
import pandas as pd
from pytrends.request import TrendReqpytrends = TrendReq(hl=’en-US’, tz=360)

接下来,读取列表并创建迭代以获得列表中所有关键词的 Google Trends 数据。为此,我创建了一个函数来收集一段时间内的 Google Trends 数据(时态数据):

我还创建了一个函数来按地区或国家收集 Google Trends 数据(空间数据):

几个重要参数(详情此处):

  • kw_list 是要搜索的关键字列表,
  • geo 可以设置为特定的国家代码,例如“美国”或“全球”,
  • 可以设置到某个类别,例如所有类别:0,食物&饮料:71,
  • 时间范围可以设置为过去 5 年'today 5-y',2004 年到现在'all'等。

每个函数产生 25 个文件(100 个关键字除以 4),每个文件包含 4 个关键字+参考关键字的比较。接下来,我们将整合这些文件,并相应地归一化相对流行度。

数据整合

通过将所有文件的列连接在一起,我们得到了完整的数据集,每行代表时间或空间维度。然而,我们可以观察到,在不同的比较之间,参考关键词的相对流行度的值可能是不同的。

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

下一步是将这些值标准化,这样我们就可以得到所有 100 种食物的完整的相对比较。我们使用以下公式来计算每个关键字的归一化值:

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

归一化关键字相对流行度的公式

为了实现上面的公式,让我们运行我创建的下面的函数。注意,为了避免无限值,如果参考关键词的相对流行度太小,以至于 Google 报告为 0,我假设相对流行度为 0.01(来自 Google Trends 的最小值)。

我们在 Python 中做的最后一步是整理和融化数据帧

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

我们的数据已经可以可视化了!

数据可视化使用Tableau

几个好吃的发现:

  1. **披萨主宰一切。**他们到处都有极高的人气。但是很明显,T42 的 Soto 在印尼打败了他们,喀麦隆的 Crepes 打败了他们。汉堡和寿司在一些国家也是最受欢迎的。

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

披萨统治

2.甜点的季节性(其他也是)。夏天吃冰淇淋,冬天吃蛋糕,经典。

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

随着时间的推移而流行

3.**欢宴&节日模式。**例如,人当每年有两次高峰,分别发生在伊斯兰节日开斋节和宰牲节。

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

印度尼西亚食物

4.更多花样:每年二月的薄饼

此外,几乎所有的食品都在 2020 年 4 月至 5 月突然涨价,这可能是由于新冠肺炎封锁和检疫的影响。

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

绉效应日

请随意浏览此处提供的完整表格仪表盘

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

完整仪表板

我希望这篇教程对你有所帮助,并可能激发更多的分析来!

完整的 Jupyter 笔记本是 这里有

可以通过 LinkedIn 联系我。之前我还用 Google Trends 做了一个 Tableau 仪表盘,关于家庭娱乐设备这里有

到 Google BigQuery 的 SQL 查询模板将把您的报告带到另一个层次

原文:https://towardsdatascience.com/templates-of-sql-queries-to-google-bigquery-that-will-take-your-reports-to-another-level-d0ebc1b8957d?source=collection_archive---------30-----------------------

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

来源:沉积照片

了解创建报告的常见挑战 Google Analytics,以及如何使用 Google BigQuery 克服这些挑战

在这篇文章中,我们分享了一些报告模板,你可以用 SQL 查询来构建 Google BigQuery 数据。

首先,您将了解从 GA360 到 GBQ 的标准导出可以计算什么。

接下来,在 OWOX BI Pipeline 的帮助下,您将发现哪些独特的指标可以添加到标准的谷歌分析指标中。

基于从 Google Analytics 360 到 BigQuery 的标准导出的报告

谷歌分析报告是用户友好和方便的,尽管你可能会面临采样,数据聚合和其他限制。抬头!有一个解决办法:使用标准的数据导出到 Google BigQuery 来规避限制,并通过 SQL 请求构建更全面的报告。

1.跨任何维度的用户行为

假设您已经在网站上实施了新的指标或更新了现有指标,以衡量对您的业务至关重要的 KPI。您可以使用网站上的点击量变化报告来查看数据是否发送正确,并及时对任何分析错误做出反应。对于此报告类型,您需要以下维度:

  • 设备类别。
  • 设备浏览器。
  • 点击类型。
  • 事件类别。
  • 事件操作。
  • 内容分组。

常规的谷歌分析报告不会为你提供所有上述信息,因为它只允许同时选择 2 个维度,而定制报告则建议更多——5 个维度。SQL 查询没有这样的限制,让您可以在报告中提取您想要的所有指标和维度。

我们在 PDF 文件中提供的 SQL 查询模板将帮助您了解会话、用户和点击是如何在浏览器、设备和点击类型之间分布的。如果需要,您可以向查询中添加更多的维度。例如:

  • 设备.操作系统。
  • device.mobileDeviceInfo。
  • 设备.语言。
  • 地理网络.区域

通过添加这些维度,您将得到下表:

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

图片由作者提供

你也可以将 CRM 或 ERP 系统中的信息导入 Google BigQuery。因此,您将能够跨任何所需的指标分析用户行为:产品目录、利润、产品类别、用户描述、订单完成等。例如,您发送一个查询来获取交易数据,然后将它们与来自 CRM 的已付款订单相结合,并计算在线完成订单的百分比。这将帮助您了解从下订单到付款或交货的过程中是否存在任何问题。

2.关键用户操作的统计数据

如果你想建立用户群并建立个性化的时事通讯,你需要关于在线用户行为的信息。细节越多,分割的选择就越多。Google Analytics 不会为您提供所有点击类型的用户行为报告,如浏览量、事件、社交、计时以及增强型电子商务事件(点击、详细信息、添加、删除、结账、购买、退款)。您也不能查看某个用户点击类型的平均值、最大值或最小值。然而,所有这些信息都可以通过一个 SQL 查询获得,这个查询可以在这篇文章的 PDF 文件中找到。

上述查询还将帮助您计算每个用户的以下平均值、最大值和最小值:

  • 根据特定搜索查询的页面视图。
  • 每次访问的页面访问量。
  • 将产品添加到购物车的次数。
  • 从购物车中取出产品的次数。
  • 添加到购物车的产品数量。
  • 从购物车中移除的产品数量。
  • 添加到购物车的产品的总价格。
  • 从购物车中移除的产品的总价格。

使用完全相同的 SQL 查询,您还可以为每个会话计算这些值:

  • 根据特定搜索查询的页面视图。
  • 每个会话的页面访问量。
  • 在购物车中添加/移除产品的次数。
  • 添加到购物车或从购物车中移除的产品数量。
  • 添加到购物车或从购物车中移除的产品的总价格。

手头有了这样的信息,就可以预测重复购买和微转化。

3.选择访问过某些产品页面的用户

为了完善你的销售漏斗,你需要在购买之前对用户在你的网站上所做的给予适当的信任。GA 中的用户浏览器报告将为您提供所有类型的用户操作信息(浏览量、事件、社交、计时)。然而,这可能是复杂和耗时的,因为您将只能看到单个用户的这种统计数据,为此应用了高级细分和产品 ID 过滤器。

然而,基于从 GA360 到 Google BigQuery 的标准导出,构建一个报告将为您提供关于您网站上所有用户操作的数据,通过 GA 代码进行跟踪。例如,我们前面谈到的 SQL 查询将帮助您对查看过一些产品页面的用户进行分组。因此,您可以提醒那些没有付款就把商品放在购物车里的用户他们感兴趣的产品,并推荐其他产品,甚至建立客户档案。

4.购买了某种产品的用户的行为

上一段提到的所有情况也适用于本报告。使用我们的 PDF 文件中的 SQL 查询,您将构建一个报告,其中包含购买了某个特定商品的用户的姓名。这些名称将允许您向用户提供与已经购买的产品相似的产品或配件。

5.用更适合您业务的步骤建立漏斗

比方说,你在博客上发表了一篇文章,鼓励你的客户订阅时事通讯。要跟踪这样的转换,您需要两个事件:阅读文章和订阅。问题是你不能在谷歌分析中将这两者结合起来,因为它们是两种不同的目标类型——浏览量和事件。

此外,在 GA 中设置目标还有其他限制:

  • 每个 GA 视图最多可以配置 20 个目标。这些目标不能删除,你只能停止为它们收集数据。
  • 在报告中,您将看到创建目标后收集的数据。这意味着您不能将目标应用于前一时期的数据。

将数据导出到 Google BigQuery 和一个简单的 SQL 查询将帮助您规避上述限制。你可以建立一个包含任何必要步骤的漏斗,找到网站上任何狭窄的范围,并了解用户在哪个阶段掉得最多。

您还可以发现用户查看产品描述的频率,以及这种查看如何影响转化率。在我们的例子中,漏斗是这样的:

1.产品页面视图→ 2。产品描述视图→ 3。将产品添加到购物车。不过,你可以将任何用户操作设置为漏斗步骤,以便在网站上进行跟踪。结果,你会得到一个类似的图表:

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

图片由作者提供

6.网站内部搜索的效率

你可以通过改善网站的内部搜索来提高转化率。例如,分析零搜索结果的百分比并更新网站内容,添加类似产品、特价商品等等。另一种选择是使用搜索查询报告,将查询最多的产品类别切换到更高的位置。

GA 报告中的维度和指标需要处于同一级别:点击级别、会话级别、用户级别或产品级别范围。这意味着,在包含维度的单个报表中,您无法查看产品 SKU 或跨会话 ID 的搜索查询排名。

该模板将有助于评估搜索查询会话的性能,并检查网站可用性的假设。

SQL 查询也将为您提供这些数据:

  • 具有特定查询的会话数。
  • 根据搜索查询的平均搜索结果数。
  • 使用明确的搜索查询跨会话的总收入。
  • 会话间搜索查询的等级。
  • 搜索查询在搜索结果中的排名。

基于从 OWOX BI Google Analytics 到 Google BigQuery 的管道数据的报告

如果您还没有 GA 360 订阅,但真的愿意用您的业务所需的附加信息来丰富您的 GA 数据,OWOX BI Pipeline 将帮助您并为您提供必要的原始数据。事情是这样的,谷歌分析只允许导入跨广告活动的总成本数据,而标准导出模式根本不提供这样的信息。

使用 OWOX BI Pipeline,您可以组合来自所有广告平台的数据,并将其发送到 Google BigQuery,甚至可以查看所有会话的成本。这将允许您将您的支出和收入分组到用户级别、细分或群组级别,甚至是登录页面级别。

下面,我们提供了无法通过标准导出来计算的指标,但是可以通过 OWOX BI 来计算。以下所有报告都可以通过 SQL 查询或简单提问 OWOX BI 智能数据获得。

1.归因广告成本如何随来源、媒介和天数而变化?

该报告将为您提供特定时期的成本信息,以及设定时间内的指标变化信息。你可以将获得的信息与之前的信息进行比较,评估不同来源的广告效果。

下面是 OWOX BI 智能数据的一个报告示例:

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

图片由作者提供

从上面的图表中,你可以看到 facebook/cpc 的成本在 6 月 7 日急剧下降。这可能是一个信号,让营销专家检查哪些活动、广告组和特定来源的关键词开始减少点击。很可能,由于竞争对手的广告,广告浏览量减少了。为了解决这个问题,营销专家可以调整出价、更新广告内容等等。

2.每个城市获得访客的平均成本是多少?

如前所述,Google Analytics 和 BigQuery 的标准导出不允许您计算每个会话、用户和群组的成本。但是,OWOX BI 肯定会让你这么做。

借助下面的报告,您可以了解不同城市和时间段的平均客户获取成本。查看它在 OWOX BI 智能数据界面中的外观:

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

图片由作者提供

通常,每个地区的广告活动都有不同的设置。前面提到的报告会让你知道该关注哪个地区。例如,从上图可以看出,达拉斯的客户获取成本(CAC)最高。这意味着你应该更仔细地观察这个地区的广告活动,计算每个用户的平均收入,广告活动的 CAC,将其与客户终身价值(LTV)进行比较。如果广告活动没有回报,你可以调整出价或干脆取消一些广告。

3.按活动划分的毛利润的 ROAS 是多少?

这样的报告可以帮助您评估广告的表现,并通过 CRM 中的订单完成率和产品主要成本来查看活动的贡献。要获得这个报告,您需要首先将订单数据从 CRM 或 ERP 系统导入到 Google BigQuery。下面您可以看到报告在 OWOX BI 智能数据界面中的外观:

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

图片由作者提供

从图表中你可以看到活动的表现,从最好的到最差的。营销人员将能够对每一次营销活动给予适当的肯定,了解其中一些活动成功或失败的原因,并为未来的营销努力选择最有效的渠道。

4.根据交易支付类型和交易交付类型,CRM 中的交易数量是多少?

有了这份报告,你就可以找到任何与下订单或支付选项有关的问题。为了构建报告,您必须将关于已完成订单的 CRM 数据上传到 Google BigQuery。接下来,您将能够使用我们的 SQL 模板,根据您需要的指标提出智能数据问题,并最终获得以下报告:

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

图片由作者提供

这个气泡图显示了用户通过信用卡(onlineCard)支付四次的三次或两次:当选择客户上门取件或邮局上门取件递送选项时。但是,客户也可以通过信用卡支付快递服务。如果没有使用这种方法,你的网站可能会有一些问题。

5.每个城市的平均送货时间是多少?

对于这个报告,您还需要来自 CRM 系统的已完成订单的数据。该报告将允许您检查在某些城市是否有任何递送问题。

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

图片由作者提供

例如,您可以看到伦敦的交付时间最长。如果平均送货时间比你网站上说的要长,你可能需要查一下那个地区是否有当地的线下商店或仓库。如果还没有的话,去找一个可能是个好主意,因为这会减少送货时间。另一个好主意是检查你的客户在这个地区的满意度。

结论

标准的数据导出到 Google BigQuery 和 SQL 查询以及 OWOX BI 工具在克服默认的 Google Analytics 限制和创建深入分析报告时非常方便。例如,您可以:

  • 跨任意数量的参数分析用户行为。
  • 获取关键用户操作的统计数据,以及每个用户点击类型的平均值、最大值和最小值。
  • 根据用户访问的特定页面对用户进行分组,或者查看购买了特定产品的人的用户行为。
  • 建立一个包含所有必要步骤的漏斗。
  • 评估内部网站搜索的性能。

OWOX BI Pipeline 将丰富您的 Google BigQuery 数据,并帮助您了解:

  • 不同来源和媒介的归属成本每天有什么变化。
  • 平均获客成本如何取决于城市。
  • 毛利率如何取决于活动来源和媒体。
  • CRM 系统中的订单编号如何取决于付款和交货选项。
  • 平均配送时间如何取决于城市。

视频中的时间概念定位

原文:https://towardsdatascience.com/temporal-concept-localization-on-videos-91b540d95dbf?source=collection_archive---------46-----------------------

活动讲座

萨蒂亚·克里希纳·戈尔蒂| TMLS2019

在多伦多机器学习峰会上的演讲

关于演讲者

我是理科硕士毕业的。多伦多大学应用计算专业。我的主要兴趣在于计算机视觉领域。我目前是 Layer6 AI 的机器学习科学家,在那里我从事大规模图像检索和视频上的动作识别。

关于谈话

视频中的概念是给予视频中的片段的高级标签。它们可以是“滑板”、“跳舞”等动作,也可以是“木吉他”、“婚礼”等更一般的实体。本演示将概述关于 YouTube-8M 数据集的概念识别和本地化任务。它将涵盖最近文献中的方法和我们在数据集上达到最先进结果的方法。

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

视频上的时间概念定位

时间卷积网络,时间序列的下一次革命?

原文:https://towardsdatascience.com/temporal-convolutional-networks-the-next-revolution-for-time-series-8990af826567?source=collection_archive---------0-----------------------

这篇文章回顾了 TCN 解决方案的最新创新。我们首先介绍了一个运动检测的案例研究,并简要回顾了 TCN 架构及其相对于卷积神经网络(CNN)和递归神经网络(RNN)等传统方法的优势。然后,我们介绍了几部使用 TCN 的小说,包括《改进交通预测》、《声音事件定位与检测》和《概率预测》。

TCN 简评

Lea 等人(2016)的开创性工作首先提出了用于基于视频的动作分割的时间卷积网络(TCNs)。该传统过程的两个步骤包括:首先,使用(通常)编码时空信息的 CNN 计算低级特征,其次,将这些低级特征输入到使用(通常)RNN 捕获高级时间信息的分类器中。这种方法的主要缺点是它需要两个独立的模型。TCN 提供了一个统一的方法来捕获所有两个层次的信息。

编码器-解码器框架如图 1 所示,关于该架构的更多信息可在前两篇参考文献中找到(见本文末尾)。最关键的问题提供如下:TCN 可以采取一系列的任何长度,并输出同样的长度。在使用 1D 完全卷积网络架构的情况下,使用因果卷积。一个关键特征是在时间 t 的输出仅与在 t 之前出现的元素进行卷积。

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

Lea 等人(2016 年)

《自然》杂志最近发表了严等人(2020)在进行天气预报任务的研究成果,这甚至引起了周围的议论。在他们的工作中,对 TCN 和 LSTM 进行了对比实验。他们的结果之一是,在其他方法中,TCN 在时间序列数据的预测任务中表现良好。

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

颜等(2020)

接下来的部分提供了这个经典 TCN 的实现和扩展。

改善交通预测

拼车和在线导航服务可以改善交通预测,改变路上的生活方式。更少的交通堵塞、更少的污染、安全和快速的驾驶只是通过更好的交通预测可以实现的基本问题的几个例子。由于这是一个实时数据驱动的问题,因此有必要利用即将到来的流量的累积数据。为此,戴等(2020)最近提出了一种混合时空图卷积网络(H-STGCN)。总体思路是利用分段线性流量密度关系的优势,将即将到来的交通量转换为其行程时间当量。他们在这项工作中使用的最有趣的方法之一是图形卷积来捕捉空间依赖性。复合邻接矩阵捕捉了流量近似值的固有特性(更多信息,请参考李瑟娥,2017)。在下面的体系结构中,给出了四个模块来描述整个预测过程。

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

戴等(2020)

声音事件定位&检测

声音事件定位和检测(SELD)领域继续发展。理解环境在自主导航中起着至关重要的作用。Guirguis 等人(2020)最近为声音事件 SELD-TCN 提出了一种新的架构。他们声称他们的框架优于该领域的最新技术,训练时间更快。在他们的 SELDnet(架构如下)中,以 44.1 kHz 采样的多声道音频录音通过应用短时傅立叶变换提取频谱的相位和幅度,并将其作为单独的输入特征进行叠加。然后,卷积块和递归块(双向 gru)被连接,随后是全连接块。SELDnet 的输出是声音事件检测(SED)和到达方向(DOA)。

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

Guirguis 等人(2020 年)

为了超越它,他们提出了 SELD-TCN:

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

Guirguis 等人(2020 年)

由于扩展的卷积使网络能够处理各种输入,因此可能需要更深入的网络(这将受到反向传播期间不稳定梯度的影响)。他们通过调整 WaveNet (Dario 等人,2017 年)架构克服了这一挑战。他们表明,SELD 任务不需要循环层,并成功地检测到活跃声音事件的开始和结束时间。

概率预测

陈等人(2020)设计的新框架可用于估计概率密度。时间序列预测改进了许多业务决策方案(例如,资源管理)。概率预测可以从历史数据中提取信息,将未来事件的不确定性降到最低。当预测任务是预测数以百万计的相关数据序列时(如在零售业中),它需要令人望而却步的劳动力和计算资源来进行参数估计。为了解决这些困难,他们提出了一个基于 CNN 的密度估计和预测框架。他们的框架可以学习序列之间潜在的相关性。他们作品的新颖之处在于他们提出的深层 TCN,正如他们的建筑所展示的那样:

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

陈等(2020)

编码器-解码器模块解决方案可能有助于实际大规模应用的设计。

摘要

在这篇文章中,我们介绍了最近的工作,涉及时间卷积网络,并优于经典的 CNN 和 RNN 方法的时间序列任务。如需更多信息,请随时给我发电子邮件。

— — — — — — — — — — — — — — — — — — — — — — — — —

关于作者

Barak 获得了以色列理工学院的航空工程学士学位(2016 年)、硕士学位(2018 年)以及经济和管理学士学位(2016 年,成绩优异)。他曾在高通工作(2019-2020),在那里他主要研究机器学习和信号处理算法。巴拉克目前正在海法大学攻读博士学位。他的研究兴趣包括传感器融合、导航、深度学习和估计理论。www.Barakor.com

https://www.linkedin.com/in/barakor/领英

推特:巴拉克 2

— — — — — — — — — — — — — — — — — — — — — — — — —

参考

时间卷积网络:动作分段的统一方法。欧洲计算机视觉会议。施普林格,查姆,2016。

行动分割与侦测的时间回旋网络。IEEE 计算机视觉和模式识别会议论文集。2017.

闫,吉宁,等。enSo 预报的时间卷积网络。科学报告10.1(2020):1–15。

李,亚光,等。扩散卷积递归神经网络:数据驱动的交通预测。 arXiv 预印本 arXiv:1707.01926 (2017)。

雷萨格、达里奥、乔迪·庞斯和泽维尔·塞拉。“用于语音去噪的波网.” 2018 IEEE 声学、语音和信号处理国际会议(ICASSP) 。IEEE,2018。

陈,易天,等。“时间卷积神经网络的概率预测”神经计算 (2020)。

SELD-TCN:通过时间卷积网络的声音事件定位和检测 arXiv 预印本 arXiv:2003.01609 (2020)。

时间时尚推荐器

原文:https://towardsdatascience.com/temporal-fashion-recommender-59c26313fa25?source=collection_archive---------46-----------------------

现代 RecSys

建立一个随季节变化的推荐器

设计任何推荐系统(RecSys)的最大挑战之一是处理时间变化。由于时尚界随着时间而发展,我们设计的推荐人也必须适应变化的潮流。

在本文中,我们将考虑如何使用时间权重将季节性服装的微妙之处纳入我们的卷积神经网络(CNN)模型。

商业问题

我们想象中的电子商务公司happy panda co .正在全球扩张,并将推出季节性系列。产品要求是:

  • 给定服装系列,我们如何调整它们以适应不同国家的不同季节?注意,每个国家在不同的季节会有不同的时尚感和天气状况。

数据

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

DeepFashion、开源从 刘 z 等 挑选春夏秋冬服装

从深层的时尚数据中,我选择适合四季的服装。例如,在冬天,大多数人会穿上更厚的夹克来保暖。另一方面,春天和夏天是穿着轻便的衣服在阳光下享受时光的时候。因此,温度在影响人们穿着方面起着重要作用。例如,如果我们考虑一个特定城市全年的平均温度,马德里(西班牙),我们可以将我们选择的服装放置在不同的时间,以观察服装和温度之间的关系。****

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

马德里(西班牙)温度来自 Kaggle —气候变化:地球表面温度 ( CC BY-NC-SA 4.0 )由伯克利地球

更重要的是,季节之间的过渡需要几周时间,我们的模型应该能够随着时间的推移调整推荐,帮助我们的用户逐渐过渡到下一个季节。****

当然,在现实世界中,我们将有机会获得更丰富的时间序列数据。例如,随着时间的推移,客户的查看/购买趋势,热卖品,或像韩国 Kpop 时尚这样的时尚。这里的天气数据说明了纳入时间序列数据的潜力,而不是问题的最终或唯一的数据解决方案。

查看季节性系列的结果

在深入研究代码之前,让我们看一下模型的输入/输出,以获得对问题和建议的解决方案的直觉。

输入:

  • 我为每一季选择了 24 套服装。它们将作为季节性系列的种子图片。
  • 我将只把图像传递到模型中;模型不吸收额外的属性/描述/产品细节;这是因为我们希望模型能够自动学习和检测传递给它的时尚图像的风格,而无需进一步的人/机器标记。

输出:

  • 我们的目标是让季节性系列融入每个季节的影响,并根据季节的深度进行加权。

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

季节性系列为马德里(西班牙)选择的服装。左:100%冬天。右:100%弹簧。中间:冬春各占一半。服装来自 DeepFashion,开源来自 刘等

从冬天到春天,从一月到五月,马德里的天气逐渐变化。季节性系列可以通过将冬季**(外套、长袖、长筒装)的特点与春季(更轻的材质、多彩的穿着、更少的层次感)的特点融合成一个新的“春天来了系列”,从而为过渡期打造一个新系列。我们在这里使用的比例是 50–50,所以冬天和春天在最终的混合中具有相同的权重(我们将在代码部分探讨这个概念)。**

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

季节性系列为墨尔本(澳大利亚)选择的服装。左:100%夏天。右:100%秋天。中间:25–75 度夏秋季混合。服装来自 DeepFashion,开源来自 刘等

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

与马德里形成鲜明对比的是,墨尔本的夏天迅速过渡到秋天,气温每周都会下降几摄氏度。因此,我们需要积极引入秋季系列的元素,以满足顾客对保暖的需求。使用 25–75 的混合比例,我们为秋季系列赋予了更高的权重,让我们的模特展现出必要的属性,如层次感、长袖和更厚的材料,为顾客保暖。

可见国产化的重要性;针对不同城市不同时期调整模型。对于 RecSys 来说,没有放之四海而皆准的解决方案,尤其是当我们想要跨时态数据进行推荐时。

代码

链接到 Colab 上的代码 (你只需要一个免费的 Google 账号就可以在云端运行 GPU 上的代码)。

季节性收集建立在卷积神经网络上,从 ResNet 和近似最近邻进行转移学习。我将不深究个别的理论,因为它们已经在许多文章中被很好地涵盖了:

整体设置说明:

卷积神经网络:

ResNet 与迁移学习:

近似最近邻居:

相反,我将专注于季节性系列的核心逻辑:

获取上面墨尔本示例的服装列表的命令是这行代码:

get_similar_image(generate_image_mix(summer_ids, autumn_ids, number_of_items=24, ratio=0.25))
  • 实质上,我们将两个系列( summer_idsautumn_ids )根据比率(0.25) 进行混合,并从混合中选择 24 项。
  • 这意味着 6 套夏季服装和 18 套秋季服装将作为新系列的种子。
  • **比率因此是可以基于时间序列模式调整的临界超参数。如果我们想增加一个系列的影响力,我们会调整比例,以便在组合中包含更多该系列的服装。
  • 质心嵌入然后将通过平均所有维度上的值将所有种子图像合并成一个表示**。最后,近似最近邻被应用于返回与表示最接近的服装。**
  • 我们可以将上面的 get_similar_image()代码片段放在一个循环中,并基于不同的比率生成集合的混合:

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

冬季与春季的比率为 1.00。来自 DeepFashion、开源由 刘 z 等人

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

冬季与春季的比率为 0.75。服装来自 DeepFashion,开源由 刘 z 等人

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

冬季与春季的比率为 0.50。各路人马出自 DeepFashion,开源出自 刘 z 等人

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

冬季与春季的比率为 0.25。来自 DeepFashion、开源由 刘 z 等人

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

冬季与春季的比率为 0.00。服装来自 DeepFashion,开源来自 刘等

我们学到了什么

我们可以通过调整比率来混合不同的集合,从而直观地将季节性和时间序列数据纳入 RecSys。然而,在现实世界中确定这个比例并不容易。我们将需要进行大量的 AB 测试,并收集来自用户、领域专家、产品团队的反馈。此外,我们将不得不在不同的地区和市场本地化解决方案,以迎合时尚趋势甚至天气的差异。

时态图网络

原文:https://towardsdatascience.com/temporal-graph-networks-ab8f327f2efe?source=collection_archive---------4-----------------------

动态图上的深度学习

许多现实世界的问题涉及各种性质的交易网络以及社会互动和参与,这些问题是动态的,并且可以被建模为图,其中节点和边随着时间的推移而出现。在这篇文章中,我们描述了时态图网络,这是 Twitter 开发的一个通用框架,用于在动态图上进行深度学习。

本帖与 伊曼纽罗西 合著。

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

一个动态的 Twitter 用户网络,用户可以与 tweets 互动并互相关注。所有的边都有时间戳。给定这样一个动态图表,我们希望预测未来的互动,例如,用户会喜欢哪条推文,或者他们会关注谁。

今年,图形神经网络(GNNs)的研究已经成为机器学习领域最热门的话题之一。GNNs 已经在生物学、化学、社会科学、物理学和许多其他领域的问题上取得了一系列的成功。到目前为止,GNN 模型主要是为不随时间变化的静态图开发的。然而,许多有趣的现实世界的图表是动态的,随着时间的推移而演变,突出的例子包括社交网络、金融交易和推荐系统。在许多情况下,正是这种系统的动态行为传达了重要的见解,否则如果只考虑静态图,就会失去这些见解。

一个动态图可以被表示为一个有序的列表或者一个异步的定时事件“流”,比如节点和边的增加或删除[1]。像 Twitter 这样的社交网络是一个很好的例子:当一个人加入这个平台时,一个新的节点就产生了。当他们跟随另一个用户时,会创建一个跟随边。当他们改变他们的配置文件时,节点被更新。

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

该事件流被编码器神经网络接收,该编码器神经网络为图的每个节点产生依赖于时间的嵌入。然后,该嵌入可以被馈送到为特定任务设计的解码器中。一个示例任务是通过尝试回答以下问题来预测未来的交互:在时间 t 节点 ij 之间有边的概率是多少?回答这个问题的能力对于推荐系统至关重要,例如,推荐系统建议社交网络用户关注谁或决定显示哪些内容。下图说明了这种情况:

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

tgn 编码器摄取具有七条可见边(时间戳为 t₁到 t₇)的动态图的示例,目标是预测节点 2 和 4 在 t₈时间(灰色边)的未来交互。为此,TGN 在 t₈.时间计算节点 2 和 4 的嵌入然后,这些嵌入被连接并被馈送到解码器(例如,MLP),该解码器输出交互发生的概率。

上述设置中的关键部分是可以用任何解码器训练的编码器。在前面提到的未来交互预测的任务中,训练可以以自我监督的方式进行:在每个时期,编码器按照时间顺序处理事件,并根据先前的事件预测下一个交互[2]。

Temporal Graph Network(TGN)是一个通用编码器架构,我们在 Twitter 上与同事法布里齐奥·弗拉斯卡、大卫·艾纳德、本·张伯伦和费德里科·蒙蒂共同开发。该模型可以应用于在表示为事件流的动态图上学习的各种问题。简而言之,TGN 编码器通过基于节点的交互来创建节点的压缩表示,并在每个事件发生时更新它们。为了实现这一点,TGN 具有以下主要组件:

*记忆。存储器存储所有节点的状态,充当节点过去交互的压缩表示。它类似于 RNN 的隐藏状态;但是,这里我们为每个节点 i 都有一个单独的状态向量s***(t)。当一个新的节点出现时,我们添加一个相应的初始化为零向量的状态。此外,由于每个节点的内存只是一个状态向量(而不是一个参数),当模型接受新的交互时,它也可以在测试时更新。

消息功能是更新存储器的主要机制。给定在时间 t 节点 ij 之间的交互,消息函数计算两个消息(一个给 i 一个给 j ),用于更新存储器。这类似于在消息传递图神经网络中计算的消息[4]。该消息是在交互之前的时间 t⁻ 的情况下节点 ij 的存储器、交互时间 t 和边缘特征[5]的函数:

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

存储器更新器用于用新消息更新存储器。这个模块通常被实现为一个 RNN。

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

假设一个节点的记忆是一个随时间更新的向量,最直接的方法是直接用它作为节点嵌入。然而,实际上,由于陈旧性问题,这是一个坏主意:假设只有当节点参与交互时,内存才会更新,节点长时间的不活动会导致其内存过期。举个例子,想象一个用户离开 Twitter 几个月。当用户回来的时候,他们可能已经发展了新的兴趣,所以他们过去活动的记忆不再相关。因此,我们需要一种更好的方法来计算嵌入。

**嵌入。**一种解决方案是查看节点邻居。为了解决陈旧问题,嵌入模块通过在节点的时空邻居上执行图形聚合来计算节点的时间嵌入。即使一个节点已经不活动了一段时间,它的一些邻居也可能是活动的,并且通过聚集它们的记忆,TGN 可以为该节点计算最新的嵌入。在我们的例子中,即使当用户离开 Twitter 时,他们的朋友仍然是活跃的,所以当他们回来时,朋友最近的活动很可能比用户自己的历史更相关。

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

图嵌入模块通过对目标节点的时间邻域执行聚合来计算目标节点的嵌入。在上图中,当在大于 t、t和 t但小于 t的某个时间 t 计算节点 1 的嵌入时,时间邻域将仅包括在时间 t 之前出现的边。因此,具有节点 5 的边不包括在计算中,因为它在未来发生。相反,嵌入模块聚集来自邻居 2、3 和 4 的特征(v)和存储器(s)以及边上的特征,以计算节点 1 的表示。在我们的实验中,表现最好的图形嵌入模块是图形注意力,它能够根据邻居的记忆、特征和交互时间来学习哪些邻居是最重要的。

下图总结了 TGN 对一批训练数据进行的整体计算:

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

TGN 对一批训练数据进行的计算。一方面,嵌入模块使用时态图和节点的存储器产生嵌入(1)。然后,嵌入用于预测批次相互作用并计算损失(2,3)。另一方面,这些相同的交互用于更新存储器(4,5)。

通过查看上图,您可能会想知道与内存相关的模块(消息功能消息聚合器、内存更新器)是如何训练的,因为它们似乎不会直接影响损耗,因此不会接收到梯度。为了让这些模块影响损失,我们需要在预测批次相互作用之前更新内存。然而,这将导致泄漏,因为内存中已经包含了我们试图预测的信息。我们提出的解决这个问题的策略是用来自之前批次的消息更新内存,然后预测交互。下图显示了训练存储器相关模块所需的 TGN 的操作流程:

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

训练记忆相关模块所需的 TGN 的操作流程。引入了一个新的组件,原始消息存储,它存储了计算消息所必需的信息,我们称之为原始消息,用于模型过去已经处理过的交互。这使得模型可以将交互带来的内存更新延迟到后面的批次。首先,使用从先前批次(1 和 2)中存储的原始消息计算的消息来更新存储器。然后可以使用刚刚更新的存储器(灰色链接)(3)来计算嵌入。通过这样做,存储器相关模块的计算直接影响损耗(4,5),并且它们接收梯度。最后,这个批处理交互的原始消息被存储在原始消息存储库(6)中,以便在将来的批处理中使用。

在对各种动态图进行的大量实验验证中,TGN 在未来边缘预测和动态节点分类任务中,无论是在准确性还是速度方面,都明显优于竞争方法[6]。一个这样的动态图是 Wikipedia,其中用户和页面是节点,交互表示用户编辑页面。编辑文本的编码被用作交互特征。这种情况下的任务是预测用户在给定时间将编辑哪个页面。我们将 TGN 的不同变体与基线方法进行了比较:

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

根据预测准确性和时间,比较 TGN 和旧方法(戴雷普、TGAT 和乔迪)在维基百科数据集上的未来链接预测的各种配置。

这项消融研究阐明了不同 TGN 模块的重要性,并让我们得出一些一般性结论。首先,记忆很重要:它的缺失会导致性能的大幅下降[7]。其次,嵌入模块的使用(与直接输出内存状态相反)很重要。基于图注意力的嵌入表现得最好。第三,具有存储器使得仅使用一个图关注层就足够了(这极大地减少了计算时间),因为 1 跳邻居的存储器给予模型对 2 跳邻居信息的间接访问。

作为结束语,我们认为对动态图的学习几乎是一个未开发的研究领域,有许多重要和令人兴奋的应用以及重大的潜在影响。我们相信,我们的 TGN 模型是向提高在动态图上学习的能力迈出的重要一步,巩固并扩展了以前的结果。随着这一研究领域的发展,更好、更大的基准将变得至关重要。我们现在正致力于创建新的动态图形数据集和任务,作为开放图形基准的一部分。

[1]这种场景通常被称为“连续时间动态图”。为简单起见,这里我们只考虑节点对之间的交互事件,用图中的边来表示。当一个端点不在图中时,节点插入被认为是新边的特殊情况。我们不考虑节点或边的删除,这意味着该图只能随着时间的推移而增长。由于一对节点之间可能有多条边,从技术上讲,我们拥有的对象是一个多图

[2]多个交互可以具有相同的时间戳,并且模型独立地预测它们中的每一个。此外,通过将有序的事件列表分割成固定大小的连续块来创建小批量。

[3] E. Rossi 等动态图上深度学习的时态图网络 (2020)。arXiv:2006.10637。

[4]为了简单起见,我们假设该图是无向的。在有向图的情况下,将需要两个不同的消息函数,一个用于源,一个用于目的地。

[5] J. Gilmer 等人量子化学的神经信息传递 (2017)。arXiv:1704.01212。

[6]我们并不是第一个研究动态图的人。然而,大多数先前的方法集中于离散时间动态图的更有限的情况,例如 A. Sankar 等人通过自我注意网络的动态图表示学习,Proc .WSDM 2020,或者时态知识图的具体场景,比如 A. García-Durán et al. 学习序列编码器用于时态知识图完成 (2018)。继续。EMNLP 或 Z. Han 等. Graph Hawkes 神经网络用于时态知识图的预测2020。参见 s .卡泽米等人的动态图的表示学习:一个调查以获得这种方法的更广泛的概述。另一方面,在动态图上进行深度学习的方法屈指可数,如 R. Trivedi 等人的 dy rep在动态图上进行表示学习 (2018),arXiv:1803.04051,D. Xu 等人的在时态图上进行归纳表示学习 (2020),arXiv:2002.07962 和 S. Kumar 等人的 Jodie在时态上预测动态嵌入轨迹我们证明了这些方法可以作为 TGN 的特殊构型得到。出于这个原因,TGN 似乎是迄今为止在动态图上学习的最通用的模型。

[7]虽然存储器包含关于节点过去所有交互的信息,但是图嵌入模块只能访问时间邻域的样本(出于计算原因),因此可能无法访问手头任务的关键信息。

作者感谢 Giorgos Bouritsas、Ben Chamberlain 和 Federico Monti 对本文的校对,并感谢 Stephan Günnemann 参考了动态知识图的早期作品。本帖的 中文翻译 刘止庸 提供。参见 Twitter Research GitHub 资源库中的 TGN 代码 。对图形 ML 和几何深度学习感兴趣?参见我的 其他文章 在走向数据科学, 订阅 到我的帖子,获取 中等会员 ,或者关注我的 推特

改变我进行深度学习方式的 10 个艾森特性

原文:https://towardsdatascience.com/ten-eisen-features-that-changed-the-way-i-do-deep-learning-f0358f664dec?source=collection_archive---------59-----------------------

一个简单的“pip 安装艾森”将如何节省几天的工作,并解决(几乎)你所有的问题。

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

克里斯娅·克鲁兹在 Unsplash 上的照片

Eisen 是一个 python 包,可以促进和加速深度学习模型的训练和开发。我已经在之前的一篇博文中谈到了这个项目。总之,Eisen 构建于 PyTorch 之上,提供加载、转换数据、训练模型、实现模型和数据并行、利用混合精度训练等功能。这些功能是为医学图像分析量身定制的,但可以轻松扩展到其他方面。

作为一名专业的深度学习开发者和研究人员,我很好地利用了艾森的特性。我想在这篇博文中分享十个最好的特点。

1.自动模型并行

有时模型太大,我们无法在单个 GPU 的内存中容纳它们。这种情况经常发生在高分辨率断层扫描数据(如 CT、MRI)、视频数据和通过数字病理学获得的图像中。

在这种情况下,唯一的解决方案是在不同的 GPU 之间划分模型,这将在多个处理器上分布层,并利用增加的可用内存和计算能力。这种技术被称为模型并行。众所周知,模型并行性很难实现,团队可能会花费数周甚至数月的时间来实现它。

Eisen 仅用一行代码就在多 GPU 机器中实现了自动模型并行。

model = eisen.utils.ModelParallel(model, split_size=2)

这个特性是 Eisen 独有的,坦率地说非常有用。我已经在另一篇博文中写了关于 Eisen 中的模型并行性,并进行了一次基准测试,所以请随意关注这个链接以了解更多信息。

数据并行也可以通过 PyTorch 实现,作为一个具有几乎相同接口的单行程序。

model = torch.nn.DataParallel(model)

2.张量板摘要

观察培训进展的指标和指示对于了解什么有效,什么可以改进是至关重要的。我在自己的工作中每天使用的功能之一是 Eisen 中包含的 Tensorboard 摘要生成功能。

这个功能最好的方面是它是全自动的!需要定义一个 TensorboardSummaryHook 并将其与工作流关联起来,以获得工作流进度的详细报告。

training_tb_hook = TensorboardSummaryHook(
    training_workflow.id,
    'Training',
    './results,
    comparison_pairs=[['label', 'predictions']]
)

这简单的一行将生成捕获工作流每个方面的摘要。

  • 所有损失和指标的平均值和标准偏差
  • 所有损失和指标的分布
  • 所有损失和指标的直方图
  • 图像摘要:图像的静止帧,体积和视频的 gif
  • 投入和产出的分配
  • 输入和输出直方图
  • 分类任务的混淆矩阵/ PR 曲线

我在这里提供了几个截图,展示了上面写的一行代码可以实现的信息粒度。

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

每个输入、输出、损失和指标的标量摘要。令人惊讶的是,有时查看输入和输出的平均值和标准差是多么有用。

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

影像摘要直观地展示了网络的输入内容。一整批被整理在一起,以便给出一个更完整的代表。可选地,也可以绘制有用的表示,例如混淆矩阵和 PR 曲线。

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

分布(和直方图)为我们提供了输入、度量、输出和损失的范围和分布的直观表示。

3.自动混合精确训练

自动混合精度(AMP)可以加快训练速度,降低深度学习模型的内存占用。NVIDIA 在开发和展示减少精确训练的优势方面投入了大量精力。例如,张量核通过使用专门的硬件来执行一些运算,如矩阵乘法,以降低的精度提供非常快速的计算。AMP 旨在自动和动态地选择是否在每一层中使用降低的精度。

如果你已经安装了 NVIDIA Apex ,艾森提供专门的混合精度训练工作流程。一旦 Torch 1.6.0 变得稳定,这一功能将作为原生 pytorch 功能和通过 APEX 提供给

声明 AMP 工作流很简单

**from eisen.utils.workflows import TrainingApexAMPTrainingApexAMP(
    *model*, 
    *data_loader*, 
    *losses*, 
    *optimizer*, 
    *metrics=None* )**

一旦 AMP 的本地 PyTorch 实现发布后,将会非常相似。

4.公共数据集支持

你想参加公开挑战吗?你有兴趣在来自Grand-Challenge.org或 Kaggle 的数据集上尝试你的想法吗?你想为即将到来的 MICCAI 比赛做好准备吗?

艾森能够从 11 个不同的公共数据集加载数据,随着项目的进展,对其他数据源的支持只会进一步扩展。这是迄今为止任何旨在促进医学成像深度学习的包所支持的最高数量的数据集。

唯一需要做的事情是下载数据,解压 zip 文件,并使用 eisen 中实现的一个数据集来加载它。这通常是一行程序,指定数据被解包的目录。其余的都是自动处理的。截至目前,艾森支持:

5.虚拟实验大楼

谁没梦想过不用写一行代码就能建立深度学习模型呢?艾森实际上实现了可视化实验大楼,它允许控制实验的每个方面,从随机种子选择、数据集、优化器并行策略等。通过在直观的 web 界面中拖拽&来执行培训/验证。

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

拖放 Eisen 模块来构建实验和模型,无需编写任何代码。

本练习的结果将是一个 JSON 格式的配置文件,可以通过 CLI 使用。

**$ eisen train configuration.json N_EPOCHS ...**

6.ONNX 模型保存

Eisen 可以以多种不同格式保存模型,甚至支持用户扩展可能需要的自定义保存/打包功能。ONNX 允许模型部署在各种生产场景中,从嵌入式设备、专业加速器(如 NVIDIA Jetson)、手机,甚至通过 ONNX.js 部署在网页中。

虽然艾森目前正在进行 TensorRT 车型包装, ONNX 车型保存已经成为现实。这个功能可以作为钩子使用,这样一旦训练或验证损失/度量表明模型实际上运行良好,它就可以在训练期间自动完成,或者它可以作为一个独立的功能来完成。

当用作挂钩时,该功能可通过编写以下内容来使用:

**eisen.utils.artifacts.SaveONNXModelHook(
    *training_workflow.id, 
    phase*, 
    *artifacts_dir*, 
    *input_size*, 
    *select_best_loss=True*, 
    *save_history=False* )**

否则,可以通过编写以下内容来使用独立版本:

**eisen.utils.artifacts.SaveONNXModel(*artifacts_dir*, *input_size*)**

7.大型模型动物园

艾森与 PyTorch 生态系统的整体是相容的。也就是说,如果您有一个用 PyTorch 编写的模型,它将直接与 Eisen 兼容,您将能够直接使用它,而无需在 Eisen 工作流中进行更改。艾森适应任何自定义模型,无论输入输出的类型和数量以及它可能拥有的层。

除了这一功能之外,Eisen packs 还包含了一些常见的网络架构:

  • U-Net,3D U-Net
  • 虚拟网络
  • 高二维和高三维网
  • 方尖碑

尽管这些没有预先训练好的权重,但是如果您想要实现一些健壮的基准测试并与这些架构进行比较,它们是非常有用的。

教程还展示了如何在 Eisen 中使用 Torchvision 模型。

8.ITK、Nifti 和 DICOM 支持

我每天都会用到的另一个特性是加载各种数据类型的能力。Eisen 的 I/O 功能基本上支持每一种可能的医学成像文件格式,甚至更多。

支持医学特定格式包括 ITK 格式,例如。mha,。mhd 等,Nifti 格式。nii 和. nii.gz 和 DICOM .dcm 当然。png,。PIL 仍然支持 jpeg 和所有其他图像格式。

文档阐明了这些能力。

9.数据转换和操作

为了使数据适合于训练,我们要花费多少时间来编写代码来转换数据?在我们的项目中使用可靠的数据转换和增强链之前,我们通常需要找出多少错误?如果 Eisen 生成的 Tensorboard 摘要通常足以发现数据处理代码的错误和问题,那么使用 Eisen 为大量场景提供的开箱即用、经过测试且可靠的转换可能是个好主意。

Eisen 中的数据集总是以字典的形式返回数据点。每个训练示例被表示为具有多个字段的字典。

艾森转换对这些字典进行操作,可以添加、删除或修改字段。例如,数据集可能返回图像的路径,而不是图像本身。然后,转换链将包括将图像替换为数据字典中的路径的数据加载。标签可以作为数据集的一些高级处理的结果来计算,例如使用与患者相关的原始元数据。转换可能会包括完全成熟的人工智能模型,这些模型处理来自不同字典领域的信息,并因此创建新数据。

Eisen 目前包含 18 种变换,用于执行图像重采样、调整大小、填充、裁剪等任务。文档提供了关于如何为定制用途开发新转换的见解。

此外,Eisen 与 PyTorch 中使用的任何数据转换都兼容,几乎无限扩展了它的数据处理能力。

10.灵活的工作流程

艾森实施工作流程进行培训、验证和测试。这意味着没有必要再次编写训练代码。每个工作流透明地执行完成其目的所需的所有操作。无论模型是数据并行还是模型并行,无论您有一个还是多个丢失,无论使用什么类型的优化器:一旦任务的所有部分,例如模型、丢失、数据加载器等。只需要一条语句就可以得到一个可以运行的工作流

**training_workflow = Training(
      model=model,
      losses=[loss_one, loss_two, loss_three],
      data_loader=loader_training,
      optimizer=optimizer,
      metrics=[metric_one, metric_two, metric_three],
      gpu=True
)**

10 之二。与 PyTorch 生态系统的兼容性

我已经多次声明 Eisen 完全兼容大多数 PyTorch 生态系统包。火炬视觉可能是最好的例子。torchvision 中的模型、转换、数据集和几乎所有其他东西都可以直接使用或通过使用包装器来使用。

为此,艾森实现了模型/层,转换和数据集包装器,在这里解释。

例如,人们可以通过简单的书写来使用火炬视觉的 MNIST 数据

**from torchvision.datasets import MNISTmnist_training_dataset = EisenDatasetWrapper(
    MNIST('./', train=True, download=True), 
    ['image', 'label'], 
    tform
)**

并通过以下方式使用火炬视觉(预训练或裸)模型

**from torchvision.models import resnet18model = EisenModuleWrapper(
    resnet18(num_classes=10), 
    ['image'], 
    ['logits']
)**

我希望你喜欢这篇文章,并且我希望你能继续键入唯一必要的命令来改善你作为一个 AI 开发者的生活:

**pip install eisen**

数据科学面试中你应该知道的十个机器学习概念

原文:https://towardsdatascience.com/ten-machine-learning-concepts-you-should-know-for-data-science-interviews-70107ca84754?source=collection_archive---------1-----------------------

最基本的机器学习概念的总结

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

马克斯·兰格洛特在 Unsplash 上的照片

如你所知,数据科学和机器学习可以提供无穷无尽的信息和知识。也就是说,大多数公司测试的核心理念屈指可数。这是因为这十个概念是更复杂的想法和概念的基础。

在这篇文章中,我将涵盖我认为你应该学习和理解的十个最基本的机器学习概念。

说到这里,我们开始吧!

1.监督与非监督学习

你可能想知道为什么我要费心把这个放进去,因为它太基本了。然而,我认为重要的是,你要真正理解两者之间的区别,并能够交流这些区别:

监督学习包括在标记为的数据集上学习,其中目标变量是已知的**。**

无监督学习用于从输入数据中得出推论和发现模式,而不需要参考标记的结果——没有目标变量

现在你知道了两者的区别,你应该知道一个机器学习模型是有监督的还是无监督的,你也应该知道一个给定的场景是需要有监督的学习算法还是无监督的学习算法。

例如,如果我想预测一位客户是否会购买牛奶,因为他们已经购买了谷类食品,这需要有监督或无监督的学习算法吗?

2.偏差-方差权衡

为了理解偏差-方差权衡,你需要知道什么是偏差和方差。

偏差是由于简化模型的假设而产生的误差。例如,使用简单的线性回归来模拟病毒的指数增长会导致较高的偏差。

方差是指如果使用不同的训练数据,预测值的变化量。换句话说,更重视训练数据的模型将具有更高的方差。

现在,偏差-方差权衡本质上表明,在给定的机器学习模型中,偏差和方差之间存在反比关系。这意味着当你减少模型的偏差时,方差增加,反之亦然。然而,存在一个最佳点,在该点上,特定量的偏差和方差导致最小量的总误差(见下文)。

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

偏倚方差权衡的可视化(由作者创建)

3.正规化

最常见的正则化方法称为 L1 和 L2。L1 和 L2 正则化都是用于减少训练数据过拟合的方法。

L2 正则化,也称为岭回归,最小化残差平方和加上λ乘以斜率平方。这个附加项被称为岭回归惩罚。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。

如果采用岭回归罚分并用斜率的绝对值替换它,则得到套索回归或 L1 正则化。

L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。

4.交叉验证

交叉验证本质上是一种用于评估模型在新的独立数据集上表现如何的技术。

交叉验证最简单的例子是将数据分为三组:训练数据、验证数据和测试数据,其中训练数据用于构建模型,验证数据用于调整超参数,测试数据用于评估最终模型。

这就引出了下一点——机器学习模型的评估指标。

5.评估指标

有几个指标可供选择来评估您的机器学习模型,最终选择哪一个取决于问题的类型和模型的目标。

如果您正在评估回归模型,重要的度量标准包括以下内容:

  • **R 平方:**一个度量,告诉你因变量的方差比例在多大程度上是由自变量的方差解释的。更简单地说,当系数估计趋势时,R 平方表示最佳拟合线周围的散布。
  • **调整后的 R 平方:**模型中每增加一个独立变量都会增加 R 值——因此,一个有几个独立变量的模型可能看起来更适合,即使它不是。因此,调整后的 R 补偿了每个额外的独立变量,并且仅在每个给定变量将模型改进到超出概率可能的程度时才增加。
  • 平均绝对误差(MAE): 绝对误差是预测值与实际值之差。因此,平均绝对误差是绝对误差的平均值。
  • 均方误差(MSE): 均方误差或 MSE 类似于 MAE,除了你取预测值和实际值之间的平方差的平均值。

分类模型的指标包括:

  • 真阳性:模型正确预测阳性类别的结果。
  • 真阴性:模型正确预测阴性类别的结果。
  • 假阳性(1 型错误):模型错误预测阳性类别的结果。
  • 假阴性(2 型错误):模型错误预测阴性类别的结果。
  • **准确性:**等于模型预测正确的比例。
  • **回忆:**尝试回答“正确识别实际阳性的比例是多少?”
  • Precision: 试图回答“多大比例的肯定识别实际上是正确的?”
  • **F1 分数:**测试准确度的一种度量——它是准确度和召回率的调和平均值。它的最高分是 1(完美的精确度和召回率),最低分是 0。总的来说,这是对你的模型的精确性和健壮性的一个度量。
  • AUC-ROC 曲线是对分类问题的一种性能测量,它告诉我们一个模型在多大程度上能够区分类别。更高的 AUC 意味着模型更准确。

6.降维

降维是减少数据集中特征数量的过程。这主要在您想要减少模型中的方差(过度拟合)的情况下很重要。

最流行的降维技术之一叫做主成分分析或 PCA。从最简单的意义上来说,PCA 涉及将高维数据(例如 3 维)投影到更小的空间(例如 2 维)。这导致数据的维度降低(2 维而不是 3 维),同时保持模型中的所有原始变量。

PCA 通常用于压缩目的,以减少所需的内存并加速算法,以及用于可视化目的,使汇总数据更容易。

7.数据争论

数据角力是将原始数据清理并转化为更可用状态的过程。在采访中,你可能会被要求列出一些你在争论数据集时采取的步骤。

数据争论中一些最常见的步骤包括:

  • 检查异常值并尽可能删除它们
  • 缺失数据的插补
  • 编码分类数据
  • 规范化或标准化您的数据
  • 特征工程
  • 通过对数据进行欠采样或过采样来处理数据中的不平衡

8.自助抽样

Bootstrap 采样方法是一个非常简单的概念,是 AdaBoost 和 XGBoost 等一些更高级的机器学习算法的构建模块。

从技术上讲, bootstrap 抽样法是一种使用带替换的随机抽样的重抽样方法。

如果这听起来令人困惑,请不要担心,让我用图表来解释一下:

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

假设你有一个有 3 个观察值的初始样本。使用 bootstrap 抽样方法,您也将创建一个包含 3 个观察值的新样本。每个观察都有均等的机会被选中(1/3)。在这种情况下,第二个观察值是随机选择的,将是我们新样本中的第一个观察值。

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

在随机选择了另一个观察点后,你选择了绿色的观察点。

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

最后,再次随机选择黄色观察值。记住,自举抽样使用随机抽样的与替换。这意味着已经选择的观察结果很有可能再次被选择。

而这就是 bootstrap 抽样的精髓!

9.神经网络

虽然深度学习不是每个数据科学工作都需要的,但它的需求肯定在增加。因此,对什么是神经网络以及它们如何工作有一个基本的了解可能是一个好主意。

从根本上来说,神经网络本质上是一个数学方程网络。它接受一个或多个输入变量,并通过一个方程式网络,产生一个或多个输出变量。

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

在神经网络中,有一个输入层,一个或多个隐藏层,以及一个输出层。输入层由一个或多个特征变量(或输入变量或独立变量)组成,表示为 x1,x2,…,xn。隐藏层由一个或多个隐藏节点或隐藏单元组成。节点就是上图中的一个圆圈。类似地,输出变量由一个或多个输出单元组成。

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

就像我一开始说的,神经网络只不过是一个方程网络。神经网络中的每个节点由两个函数组成,一个线性函数和一个激活函数。这是事情变得有点混乱的地方,但是现在,把线性函数想成一些最佳拟合线。另外,把激活功能想象成一个电灯开关,它会产生一个介于 1 或 0 之间的数字。

10.集成学习、打包、提升

一些最好的机器学习算法结合了这些术语,因此,理解什么是集成学习、bagging 和 boosting 是非常重要的。

集成学习是一种多种学习算法联合使用的方法。这样做的目的是让您获得比单独使用单个算法更高的预测性能。

Bagging 又称 bootstrap aggregating ,是用原始数据集的自举样本对同一学习算法的多个模型进行训练的过程。然后,像上面的随机森林示例一样,对所有模型的输出进行投票。

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

装袋过程(由作者创建)

Boosting 是 bagging 的一种变体,其中每个单独的模型都是按顺序构建的,并重复上一个模型。具体来说,任何被前一个模型错误分类的数据点都会在后一个模型中得到强调。这样做是为了提高模型的整体准确性。这里有一个图表,可以更好地理解这个过程:

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

推进过程(由作者创建)

一旦建立了第一模型,除了第二自举样本之外,还采用错误分类/预测的点来训练第二模型。然后,针对测试数据集使用集合模型(模型 1 和 2 ),并且该过程继续。

感谢阅读!

仅此而已!我希望这对你的面试准备有所帮助,并祝你在未来的努力中好运。希望这能为你在数据科学面试中应该了解的机器学习概念提供一个很好的指导。

不确定接下来要读什么?我为你挑选了另一篇文章:

[## 数据科学面试中你应该知道的十个 SQL 概念

学习聪明,不努力。

towardsdatascience.com](/ten-sql-concepts-you-should-know-for-data-science-interviews-7acf3e428185)

特伦斯·申

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值