TowardsDataScience 博客中文翻译 2020(六百零六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

通过 eli5 的机器学习可解释性介绍

原文:https://towardsdatascience.com/machine-learning-explainability-introduction-via-eli5-99c767f017e2?source=collection_archive---------38-----------------------

从您的机器学习模型中提取洞察力

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

照片由 Unsplash 上的 h heyerlein 拍摄

介绍

根据我作为数据科学家的工作经验,大多数时候,你需要解释为什么你的模型有效,以及你的模型给出了什么样的洞察力。就洞察力而言,我指的不是模型准确性或任何指标,而是机器学习模型本身。这就是我们所说的机器学习的可解释性。

机器学习可解释性最直接的例子是带有普通最小二乘估计方法的线性回归模型。让我用一个数据集给你举个例子。请注意,我违反了一些普通的最小二乘假设,但我的观点不是创建最佳模型;我只是想有一个模型,可以提供一个洞察力。

#Importing the necessary package
import pandas as pd
import seaborn as sns
import statsmodels.api as sm
from statsmodels.api import OLS#Load the dataset and preparing the data
mpg = sns.load_dataset('mpg')
mpg.drop(['origin', 'name'], axis =1, inplace = True)
mpg.dropna(inplace = True)#Ordinary Least Square Linear Regression model Training
sm_lm = OLS(mpg['mpg'], sm.add_constant(mpg.drop('mpg', axis = 1)))
result = sm_lm.fit()result.summary()

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

我不会详细解释该模型,但线性模型假设在自变量(要预测的特征)和因变量(要预测的内容)之间存在线性。等式如下所示。

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

这里重要的是,每个自变量(x)都要乘以系数(m)。这意味着系数说明了自变量和因变量之间的关系。从上面的结果中,我们可以看到“model_year”变量的系数(coef)为 0.7534。这意味着‘model _ year’每增加 1,因变量‘mpg’值就会增加 0.7534。

线性回归模型及其系数是机器学习可解释性的一个例子。模型本身用于解释我们的数据发生了什么,并且洞察的提取是可能的。然而,并不是所有模型都能做到这一点。

黑盒模型的机器学习可解释性

基于树的特征重要性

随机森林等机器学习模型通常被视为黑盒。为什么?一个森林由大量的深层树组成,其中每棵树都使用随机选择的特征对袋装数据进行训练。通过检查每一棵树来获得全面的理解几乎是不可能的。

例如,xgboost 包中著名的 XGBoost 分类器几乎是一个利用随机森林过程的黑盒模型。这个模型被认为是一个黑盒模型,因为我们不知道在模型学习过程中发生了什么。让我们以同一个数据集为例来尝试一下。

#Preparing the model and the datasetfrom xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
mpg = sns.load_dataset('mpg')
mpg.drop('name', axis =1 , inplace = True)#Data splitting for xgboost
X_train, X_test, y_train, y_test = train_test_split(mpg.drop('origin', axis = 1), mpg['origin'], test_size = 0.2, random_state = 121)#Model Training
xgb_clf = XGBClassifier()
xgb_clf.fit(X_train, y_train)

就这样,我们有了模型,但是我们从数据中得到了什么启示吗?或者我们能知道依赖者和独立者之间的关系吗?。

你可能会说分类器拥有一个特征重要性方法,这是一个树模型,专门用来衡量特征的重要性。准确地说,它测量特征对模型的平均杂质减少的贡献。

tree_feature =  pd.Series(xgb_clf.feature_importances_, X_train.columns).sort_values(ascending = True)plt.barh(X_train.columns, tree_feature)
plt.xlabel('Mean Impurity Reduction', fontsize = 12)
plt.ylabel('Features', fontsize = 12)
plt.yticks(fontsize = 12)
plt.title('Feature Importances', fontsize = 20)

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

在一定程度上,这是一个机器学习可解释的例子。但是,您需要记住 xgboost 依赖于引导过程来创建模型。也就是说,这个特征的重要性可能会因为随机过程而发生。此外,该贡献仅表明该特征可以减少多高的总杂质(总的来说是所有产生的树的平均值)。

通过 eli5 的排列重要性

还有另一种方法可以从基于树的模型中获得洞察力,方法是逐个置换(改变位置)每个特征的值,并检查它如何改变模型性能。这就是我们所说的排列重要性方法。我们可以尝试使用 eli5 包将这种方法应用到我们的 xgboost 分类器中。首先,我们需要使用下面的代码来安装这个包。

#installing eli5pip install eli5
#or
conda install -c conda-forge eli5

安装后,我们将从现在开始使用 eli5 包进行机器学习解释。让我们从排列重要性开始。

#Importing the module
from eli5 import show_weights
from eli5.sklearn import PermutationImportance#Permutation Importance
perm = PermutationImportance(xgb_clf, scoring = 'accuracy' ,random_state=101).fit(X_test, y_test)
show_weights(perm, feature_names = list(X_test.columns))

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

排列重要性背后的思想是如何评分(准确度、精确度、召回率等。)shift 随特征存在与否,在上面的结果中我们可以看到,displacement 得分最高,为 0.3797。这意味着,当我们置换位移特征时,它将改变模型的精度高达 0.3797。正负符号后的值是不确定度值。排列重要性方法本质上是一个随机过程;这就是为什么我们有不确定值。

位置越高,这些特征对得分的影响越大。底部的一些特征显示了一个负值,这很有趣,因为这意味着当我们改变特征时,这个特征增加了得分。发生这种情况是因为偶然的特征排列实际上提高了分数。

通过测量杂质减少和排列重要性,我们已经知道了这两种方法。它们是有用的,但在某种意义上说,它们是粗糙的和静态的,很难理解个人对实际数据的决策。这就是为什么我们会使用基于树决策路径的 eli5 权重特征重要性计算。

通过 eli5 确定树特征的重要性

让我们使用 eli5 来检查 XGBoost 分类器特性的重要性。

show_weights(xgb_clf, importance_type = 'gain')

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

我们可以看到“位移”特征是最重要的特征,但我们还不明白我们是如何得到重量的。因此,让我们看看分类器如何尝试预测单个数据。

#Taking an example of test datafrom eli5 import show_prediction
show_prediction(xgb_clf, X_test.iloc[1], show_feature_values=True)

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

上表显示了我们的分类器如何根据给定的数据预测我们的数据。每个类别都有自己的概率,以及每个特征对概率和分数的贡献(分数计算基于决策路径)。分类器还引入了<BIAS>特征,它是模型基于训练集的分布输出的期望平均得分。如果你想了解更多,你可以查看这里的。

上表中最重要的是每个特征都对预测结果有贡献,因此特征贡献影响权重结果。权重是所有树中对最终预测有贡献的每个特征的百分比(如果将权重相加,它将接近 1)。

有了这个软件包,我们不仅可以根据功能性能得分,还可以根据每个功能本身对决策过程的贡献来衡量功能的重要性。

结论

有了 eli5,我们能够将黑盒分类器转变为更易解释的模型。我们仍然有很多方法可以用于机器学习的解释目的,你可以在 eli5 主页上查看。

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

机器学习在嵌入式系统上是失败的。原因如下

原文:https://towardsdatascience.com/machine-learning-fails-when-it-comes-to-embedded-system-9ce6def9ba75?source=collection_archive---------6-----------------------

思考不同

深入了解嵌入式世界以及 ML 行业目前还不能解决的问题

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

丹尼尔·威德罗在 Unsplash 上的照片

今天,中文学习达到了顶峰,最终被广泛使用。你可以在机场看到人脸识别系统,在脸书看到个性化的广告。

虽然,当我们谈到将 ML 与嵌入式设备相结合时,仍然有相当大的差距

1.我们不明白嵌入式世界是什么

使用 ML,我们曾经拥有巨大的计算能力。

AlexNet 需要 727 MegaFlops 和 235Mb 内存来处理一个 227x227px 的小图像。例如,谷歌 Nexus S 上的 ARM Cortex-A8 每秒可以产生 66 兆次浮点运算。所以,你要等~11 秒才能推断。太多了!

*FLOP —浮点运算

查看更多信息 : 对各种 CNNARM 内核浮点性能及其效率的内存消耗和 FLOP 计数的估计。

我在大学里学过几门与 ML 相关的课程。我们做了很多很酷的作业。但即使在那里,我的 4GB GTX1050 也不足以训练所有的模型。

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

理解问题是制造正确产品的关键

一般 ML 工程师很少考虑计算资源。而且,他/她很少关心内存使用。为什么?因为它很便宜,甚至你的手机有很好的 CPU 和很大的内存。

提到上次聚会的照片,你还会觉得手机内存不足吗?假设您使用具有 256KB 闪存的 TrueTouch 感应控制器。是的,256KB。由于现有的固件,你不能使用所有这些。大约 100KB。看看你最后的型号。可能要大得多。

变得有趣了吗?我们继续:)

听到“嵌入式设备”你会怎么想?想象这幅画,并把它记在心里。

1.它是任何电动机械。甚至我的微波炉和洗衣机

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

马科斯·拉米雷斯在 Unsplash 上的照片

是的,你是对的!

如今,几乎所有的电子设备都是嵌入式设备。它内部可能有一个或几个控制器,负责每个确切的功能:触摸感应、发动机状态监控等。

2.Arduino 或/和树莓派

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

哈里森·布罗德本特在 Unsplash 上拍摄的照片

恭喜你,你又答对了!

它们是 DIY 项目中最受欢迎和广泛使用的工具包之一。是的,它们是嵌入式设备。

3.杰特森纳米和类似产品

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

英伟达照片

又对了。

这是一个特殊的开发工具包“又名迷你电脑”,专为在其上运行 ML 模型而开发。它非常强大,说实话,超级性感。

但是这里遗漏了一些东西

我有许多朋友正在做令人难以置信的硬件宠物项目。他们那里一般用 Arduino 或者 STM32(又名硬核 Arduino)。

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

智能头盔、机器人汽车和 ALU

我认识几个人工智能工程师,他们对 Jetson Nano 和类似的设备感到兴奋。他们认为这是嵌入式人工智能的未来。

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

英伟达照片

而现在。请想一想“这样的设备有多少是用在生产层面的?”

答案是——微小

想想你家里有多少电器设备。然后在你的车里增加大量的控制器。你工作中的安全系统。我可以列出一个很长的清单。

且每个设备都有一些控制器。通常,它是微型的,而且超级便宜。不能和杰特森或者树莓的资源和能力相比。

想象你有一个微控制器。它的主要任务是处理你在屏幕上的手指触摸。它有 ARM Cortex-M0 处理器,256KB 内存(其中只有 80–120 可供您使用)。这是一个实时系统,所以你有很少的时间来为你的模型做出推断,比如说 100 微秒。你的目标是改进或替换那里的一些算法。

祝你好运,欢迎来到“嵌入式人工智能”的世界。

嵌入式世界”由 1-2 美元的芯片组成,资源有限。这是在生产层面上使用的

2.纯基础设施

我一直在做我上面描述的项目。一切都很好。我开发了一个小型网络,它有可能适合那个微控制器。

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

马蒂·林恩·巴恩斯在 Unsplash 上拍摄的照片

将模型从我的电脑转移到设备的时间已经开始了!

  1. 量化。

那个处理器不能处理浮点数。即使可以,我们也不会使用它,因为这是一个相当复杂的操作,需要很多时间。

所以,我做了模型权重量化——将连续范围的值转换成有限范围的离散值。

你猜怎么着?PyTorch 和 TensorflowLite 都不完全支持。它们不支持所有激活功能(虽然我使用了非常简单的 HardTanh)。PyTorch 甚至无法将量化模型保存到文件中。

所以,我只能用手来做。

2。推理代码生成

您希望在该控制器上运行您的模型。对吗?所以,你需要 C 代码进行模型推断。

很悲哀,但你必须用手去做。为什么?PyTorch 没有推理代码生成的功能。相比之下,TFLite 有,但是它非常有限,也不支持常见的激活功能。

所以,我又用手做了一次。

我在工作中遇到过很多这样的情况。不是往 PyTorch 或者 TF 这边一拳,而是“呼救”。

* * 社区还有另外一面,那就是在找“嵌入式 AI”的专业工具,却找不到。

有什么好消息吗?

我看到大型半导体公司对人工智能有巨大的兴趣,他们正在做非常有价值和重要的事情。它们值得再写一篇文章,所以我列出了几个,以免这篇文章太长。

  • CMS is-NN——面向 Arm Cortex-M 处理器的高效神经网络内核
  • 编译器可以产生高效的推理代码,并根据您所拥有的硬件进行优化
  • 还有很多其他很酷的东西

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

照片由艾哈迈德·哈桑Unsplash 上拍摄

觉得这篇文章有用?看看下面另一篇有趣的文章

[## 我们需要数学吗?想象一下我们没有它的生活

没有数学的世界之旅,以及为什么抽象是一切的关键

medium.com](https://medium.com/swlh/do-we-need-math-imagine-our-life-without-it-c458fda152b3)

机器学习领域指南

原文:https://towardsdatascience.com/machine-learning-field-guide-726989c928a1?source=collection_archive---------66-----------------------

没有 BS 指南和概述机器学习(真相),从开始到结束,垃圾到黄金

我们都必须处理数据,我们试图了解机器学习并将其应用到我们的项目中。但是大家好像都忘了一件事…远非完美,还有那么多要经历!别担心,我们会从头到尾讨论每一个小步骤👀。

你所需要的就是这些基础知识

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

照片由 国立癌症研究所 上传于 Unsplash

这一切背后的故事

我们都是从一个数据集或一个目标开始的。一旦我们发现、收集或搜集了我们的数据,我们就把它拉起来,目睹无情的数字细胞、更多的数字、类别,也许还有一些单词的压倒性景象😨!一个天真的想法闪过我们的脑海,用我们的机器学习能力来处理这一团乱麻…但是快速搜索揭示了我们在训练模型之前需要考虑的大量任务😱!

一旦我们克服了难以控制的数据带来的冲击,我们就会想方设法与强大的对手作战🤔。我们从尝试将数据导入 Python 开始。理论上是比较简单的,但是过程可以稍微……涉及。然而,只需要一点点努力(幸运的我们)。

没有浪费任何时间,我们开始数据清理去伪存真。我们的方法从简单开始——观察并移除。它工作了几次,但后来我们意识到…它真的对我们不公平!为了处理这些混乱,我们找到了一个强大的工具来补充我们的武器库:图表!通过我们的图表,我们可以对我们的数据、数据中的模式以及缺失的地方有所了解。我们可以内插(填充)或删除缺失的数据。

最后,我们接近我们高度期待的😎挑战,数据建模!稍加研究,我们就能发现哪些战术和模型是常用的。这是一个有点困难的破译,我们应该使用哪个,但我们仍然设法通过它,并把它都搞清楚了!

但是,如果不做一些令人印象深刻的事情,我们就无法完成一个项目。所以,一个最终的产品,一个网站,一个 app,甚至一个报告,都会带我们走很远!我们知道第一印象很重要,所以我们修复了 GitHub 库,并确保一切都有很好的记录和解释。现在,我们终于能够向世界展示我们的辛勤工作了😎!

时代

第 1 章—导入数据

数据有各种各样的形状和大小,所以我们用来把所有东西编码的过程经常是不同的。

说实在的,导入数据看起来很容易,但是有时候……有点讨厌。

数据清理最难的部分不是编码或理论,而是我们的准备工作!当我们第一次开始一个新项目并下载我们的数据集时,打开一个代码编辑器并开始输入是很诱人的…但是这不会给我们带来任何好处。如果我们想领先一步,我们需要为数据中最好和最差的部分做好准备。要做到这一点,我们需要从 basic 开始,通过手动检查我们的电子表格。一旦我们理解了数据的基本格式(文件类型以及任何细节),我们就可以将它们全部导入 Python。

如果我们运气好,只有一个电子表格,我们可以使用 Pandas [read_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)函数(让它知道我们的数据在哪里):

pd.read_csv("file_path.csv")

事实上,我们会遇到更复杂的情况,所以请注意:

  • 包含不需要的信息的文件(我们需要跳过)
  • 我们只想导入几列
  • 我们想重命名我们的列
  • 数据包括日期
  • 我们希望将来自多个来源的数据合并到一个地方
  • 数据可以分组在一起

尽管我们在讨论一系列场景,但我们通常一次只处理几个。

我们的前几个问题(导入数据的特定部分/重命名列)很容易处理,只需使用几个参数,如要跳过的行数、要导入的特定列以及我们的列名:

pd.read_csv("file_path.csv", skiprows=5, usecols=[0, 1], names=["Column1", "Column2"])

每当我们的数据分布在多个文件中时,我们可以使用 Pandas [concat](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html)函数将它们组合起来。[concat](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html)函数将一系列[DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html)组合在一起:

my_spreadsheets = [pd.read_csv("first_spreadsheet.csv"), pd.read_csv("second_spreadsheet.csv")]
pd.concat(my_spreadsheets, ignore_index=True)

我们解析到[concat](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html)一个电子表格列表(就像之前一样导入)。当然,列表可以通过任何方式获得(所以一个奇特的列表理解或者每个文件的随意列表都可以),但是请记住我们需要的是数据帧,而不是文件名/路径

如果我们没有 CSV 文件,熊猫仍然工作!我们可以用 [read_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)换成[read_excel](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html)[read_sql](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql.html)或者另一个选项

在所有数据都在 Pandas 数据框架中之后,我们需要再次检查数据的格式是否正确。实际上,这意味着检查每个 series 数据类型,并确保它们不是通用对象。我们这样做是为了确保我们可以利用 Pandas 内置的数字、分类和日期/时间值功能。来看看这刚刚运行的DataFrame.dtypes。如果输出看起来合理(例如,数字是数字,类别是分类的,等等),那么我们应该可以继续。然而,通常情况并非如此,因为我们需要改变我们的数据类型!熊猫[DataFrame.astype](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html)可以做到这一点。如果这不起作用,应该有另一个熊猫函数用于特定的转换:

data["Rating"] = data["Rating"].as_type("category")
data["Number"] = pd.to_numeric(data["Number"])
data["Date"] = pd.to_datetime(data["Date"])
data["Date"] = pd.to_datetime(data[["Year", "Month", "Day", "Hour", "Minute"]])

如果我们需要分析不同的数据组(例如,我们的数据可能是按国家划分的),我们可以使用 Pandas groupby。我们可以使用groupby来选择特定的数据,并分别对每个组运行函数:

data.groupby("Country").get_group("Australia")
data.groupby("Country").mean()

其他更适合的技巧,如多重/分层索引,在特定场景中也有帮助,但是理解和使用起来更棘手。

第 2 章—数据清理

数据是有用的,数据是必要的,但是,它需要干净并且切中要害!如果我们的数据无处不在,那么它对我们的机器学习模型根本没有任何用处。

每个人都会被丢失的数据逼疯,但隧道的尽头总会有一线光明。

完成数据清理最简单快捷的方法是问我们自己:

我们数据中的哪些特征会影响我们的最终目标?

所谓最终目标,我们指的是我们正在努力预测、分类或分析的任何变量。这一点是为了缩小我们的范围,而不是陷入无用的信息。

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

照片由 亚当·诺瓦克斯基 在 Unsplash 上拍摄

一旦我们知道我们的主要目标特征是什么,我们就可以尝试找到模式、关系、缺失数据等等。一个简单而直观的方法就是绘图!快速使用 Pandas 勾画出数据集中的每个变量,并尝试查看每个变量的位置。

一旦我们发现了潜在的问题,或者数据中的趋势,我们就可以尝试解决它们。一般来说,我们有以下选择:

  • 删除丢失的条目
  • 删除整列数据
  • 填写缺失的数据条目
  • 对数据进行重新采样(即改变分辨率)
  • 收集更多信息

从识别丢失的数据到选择如何处理它,我们需要考虑它如何影响我们的最终目标。对于缺失的数据,我们删除任何似乎对最终结果没有重大影响的数据(即,我们找不到有意义的模式),或者似乎缺失太多而无法得出值。有时,我们还决定删除非常少量的缺失数据(因为这比填充数据更容易)。

如果我们决定摆脱信息,熊猫[DataFrame.drop](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html)可以被使用。它从数据帧中删除列或行。这很容易使用,但是记住默认情况下 Pandas 不会修改/删除源数据帧中的数据,所以必须指定inplace=True。注意到axis参数指定是否移除行或列可能是有用的。

当不删除一整列时,或者特别针对丢失的数据时,依靠一些漂亮的 Pandas 函数通常是有用的。为了删除空值,可以使用DataFrame.dropna。请记住,默认情况下,dropna会完全删除所有丢失的值。然而,将参数how设置为all或者设置阈值(thresh,表示需要删除多少空值)可以对此进行补偿。

如果我们有少量的不规则缺失值,我们可以用几种方法来填充它们。最简单的是DataFrame.fillna,它将缺失值设置为某个预设值。更复杂但灵活的选择是使用DataFrame.interpolate进行插值。插值本质上允许任何人简单地设置他们想要用来替换每个空值的方法。这些包括上一个/下一个值、线性值和时间值(后两个值根据数据进行推断)。无论何时与时间打交道,时间都是一个自然的选择,否则就要根据插值的数据量及其复杂程度做出合理的选择。

data["Column"].fillna(0, inplace=True)
data[["Column"]] = data[["Column"]].interpolate(method="linear")

如上所述,需要在一个只包含丢失数据的列的数据帧中传递插值(否则将抛出错误)。

每当我们看到定期丢失的数据或使用不同时标的多个数据源时(如确保可以合并以分钟和小时为单位的测量值),重采样就非常有用。直观地理解重采样可能有点困难,但当您对特定时间范围内的测量值进行平均时,这是非常重要的。例如,我们可以通过指定要获取每月值的平均值来获取每月值:

data.resample("M").mean()

"M"代表月份,可以替换为"Y"代表年份和其他选项。

尽管数据清理过程可能相当具有挑战性,但是如果我们记住我们最初的意图,它将成为一个更加合理和直接的任务!如果我们仍然没有所需的数据,我们可能需要回到第一阶段,收集更多的数据。请注意,丢失数据表明数据收集存在问题,因此仔细考虑并记下出现问题的位置非常有用。

为了完成,熊猫 [*unique*](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.unique.html) [*value_counts*](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html) 函数有助于决定直接移除哪些特征以及绘制/研究哪些特征。

第 3 章——视觉化

观想听起来很简单,事实也确实如此,但是很难做到……不过分复杂。对我们来说,把情节看作是创造的苦差事实在是太容易了。然而,这些坏男孩做了一件非常非常好的事情——直观地展示了我们数据的内部工作原理!请记住:

我们用图表数据来发现和解释一切是如何工作的。

因此,当陷入想法,或不太确定该做什么时,我们基本可以总是依靠识别有用的模式和有意义的关系。这可能看起来玄乎🥶,但它确实是有用的。

我们的目标不是绘制花哨的六边形图,而是描绘正在发生的事情,所以绝对任何人都可以简单地解读一个复杂的系统!

一些技巧无疑是有用的:

  • 当我们有太多数据时进行重采样
  • 绘图具有不同比例时的次坐标轴
  • 当我们的数据可以分类拆分时进行分组

要开始绘图,只需在任何系列或数据帧上使用熊猫.plot()!当我们需要更多时,我们可以深入研究 MatPlotLib、Seaborn 或一个交互式绘图库。

data.plot(x="column 1 name", y="column 2 name", kind="bar", figsize=(10, 10))
data.plot(x="column 1 name", y="column 3 name", secondary_y=True)
data.hist()
data.groupby("group").boxplot()

90%的情况下,这个基本功能就足够了(更多信息,请点击),如果没有,搜索应该会显示如何绘制特别奇特的图形😏。

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

Luke Chesser 在 Unsplash 上拍摄的照片

第 4 章——建模

简要概述

现在终于到了有趣的事情——得出结果。训练一个 scikit 学习模型看起来很简单,但是没有人去研究细节!所以,让我们诚实地说,不是每个数据集和模型都是平等的。

基于我们的数据,我们的建模方法会有很大的不同。有三个特别重要的因素:

  • 问题类型
  • 数据量
  • 数据的复杂性

我们的问题归结为我们是否试图预测一个类/标签(称为分类)、一个值(称为回归)或者一组数据(称为聚类)。如果我们试图在数据集上训练一个模型,其中我们已经有了我们试图预测的例子,我们称我们的模型有监督,如果没有,称无监督。可用数据的数量及其复杂程度预示着一个模型有多简单就足够了。具有更多特征(即列)的数据往往更复杂

解释复杂性的要点是理解哪些模型对我们的数据来说太好或太差

模型拟合优度告诉我们这一点!如果一个模型难以解释我们的数据(太简单),我们可以说它欠拟合,如果它完全矫枉过正(太复杂),我们说它过拟合。我们可以把它想象成一个从什么都没学到到什么都记住的光谱。我们需要取得平衡,以确保我们的模型能够我们的结论推广到新的信息。这通常被称为偏差-方差权衡。请注意,复杂性也会影响模型的可解释性。

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

修改了来自文档的 Scikit 学习图

复杂的模型需要更多的时间来训练,尤其是大型数据集。所以,升级电脑,运行一夜模型,冷静一段时间😁!

准备工作

分割数据

在训练一个模型之前,需要注意的是我们需要一些数据集来测试它(这样我们就知道它的表现如何)。因此,我们经常将数据集分成个独立的训练和测试集。这让我们可以测试我们的模型对新的未知数据的概括能力有多强。这通常是可行的,因为我们知道我们的数据很好地代表了现实世界。

实际的测试数据量并没有太大关系,但是经常使用 80%训练,20%测试。

在 Python 中用 Scikit 学习[train_test_split](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)函数是这样做的:

train_data, test_data = train_test_split(data)

交叉验证是将数据集分成几个部分(即原始数据集的子集或部分)。这往往比使用单一测试/验证集更加健壮,并且能够抵抗过度拟合!几个 Sklearn 函数有助于交叉验证,然而,它通常直接通过网格或随机搜索来完成(下面讨论)。

cross_val_score(model, input_data, output_data, cv=5)

超参数调谐

有些因素我们的模型无法解释,因此我们设置了某些超参数。这些因型号而异,但我们可以通过人工试错法或网格或随机搜索等简单算法找到最佳值。使用网格搜索,我们尝试所有可能的值(蛮力😇)并从一些分布/选择中随机搜索随机值。这两种方法通常都使用交叉验证。

Sklearn 中的网格搜索通过一个parameters字典来工作。每个条目键表示要优化的超参数,值(一个列表或元组)是可供选择的值:

parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
model = = SVC()
grid = GridSearchCV(model, param_grid=parameters)

创建网格后,我们可以用它来训练模型,并提取分数:

grid.fit(train_input, train_output)
best_score, best_depth = grid.best_score_, grid.best_params_

这里重要的是要记住我们需要在训练上训练,而不是测试数据。尽管交叉验证用于测试模型,但我们最终会尝试获得训练数据的最佳拟合,并随后在测试集上测试每个模型:

test_predictions = grid.predict(test_input)

Sklearn 中的随机搜索工作方式类似,但稍微复杂一些,因为我们需要知道每个超参数采用什么类型的分布。虽然从理论上来说,T7 可以更快地产生相同或更好的结果,但它会随着情况的变化而变化。为了简单起见,最好坚持网格搜索。

型号选择

使用模型

有了 Sklearn,就像找到我们想要的模型名,然后为它创建一个变量一样简单。查看文档链接,了解更多细节!例如

support_vector_regressor = SVR()

基本选择

线性/逻辑回归

线性回归试图将直线拟合到我们的数据。它是最基本和最基本的模型。线性回归有几种变体,如 lasso 和 ridge 回归(这是防止过度拟合的正则化方法)。多项式回归可用于拟合更高次的曲线(如抛物线和其他曲线)。逻辑回归是另一种可用于分类的变体。

支持向量机

就像线性/逻辑回归一样,支持向量机(SVM 的)尝试用直线或曲线来拟合数据点。然而,SVM 的目标是最大化边界和每个点之间的距离(而不是让直线/曲线穿过每个点)。

支持向量机的主要优势是它们能够使用不同的内核。核是计算相似性的函数。这些内核允许线性和非线性数据,同时保持相当高的效率。内核将输入映射到一个更高维度的空间,因此出现了一个边界。这个过程对于大量的特征来说通常是不可行的。神经网络或其他模型可能是更好的选择!

神经网络

所有的嗡嗡声总是关于深度学习和神经网络。它们是复杂、缓慢且资源密集型的模型,可用于复杂的数据。然而,当遇到大型非结构化数据集时,它们非常有用。

使用神经网络时,一定要小心过度拟合。一种简单的方法是跟踪误差随时间的变化(称为学习曲线)。

深度学习是一个极其丰富的领域,因此这里有太多的内容需要讨论。其实 Scikit learn 是一个机器学习库,深度学习能力很少(相比 PyTorch 或者 TensorFlow )。

决策树

决策树是建模关系的简单快捷的方法。它们基本上是一个决策树,帮助决定一个数据点属于哪个类或标签。决策树也可以用于回归问题。虽然简单,但为了避免过度拟合,必须选择几个超参数。总的来说,这些都与树有多深以及要做多少决策有关。

K-表示

我们可以使用 k-means 将未标记的数据分成几个。通常,存在的簇的数量是选定的超参数。

K-means 的工作原理是试图优化(减少)一些称为惯性的标准(即函数)。可以认为这就像试图最小化从一组质心到每个数据点的距离。

合奏

随机森林

随机森林是根据数据的随机子集训练的多个决策树的组合(引导)。这个过程称为 bagging,它允许随机森林获得与复杂数据的良好拟合(低偏差和低方差)。

这背后的基本原理可以比作民主。

一个选民可能会投票给一个糟糕的候选人,但我们希望大多数选民做出明智、积极的决定

对于回归问题,我们平均每个决策树的输出,对于分类,我们选择最流行的一个。这个可能并不总是有效,但是我们假设它通常会有效(特别是对于包含多个列的大型数据集)。

随机森林的另一个优点是,由于 democratic-esc 引导过程,无关紧要的特性不会对性能产生负面影响!

超参数的选择与决策树的选择相同,但决策树的数量也不同。由于上述原因,更多的树等于更少的过度适应!

注意,随机森林使用随机子集,替换行和列!

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

照片由古伊列梅·卡埃塔诺在 Unsplash 上拍摄

梯度增强

像 AdaBoost 或 XGBoost 这样的集合模型通过将一个模型堆叠在另一个模型上来工作。这里的假设是,每个连续的弱学习者将纠正前一个学习者的缺陷(因此称为提升)。因此,模型的组合应该提供每个模型的优点,而没有其潜在的缺陷。

迭代方法意味着先前的模型性能影响当前的模型,并且更好的模型被给予更高的优先级。增强模型的表现略好于套袋模型(也称为随机森林),但也更有可能过度拟合。Sklearn 为分类回归提供 AdaBoost。

第 5 章—生产

这是整个过程的最后一步,但也是最重要的一步,🧐.我们已经投入了所有这些工作,所以我们需要坚持到底,创造一些令人印象深刻的东西!

有多种选择。对于面向数据的网站来说,Streamlit 是一个令人兴奋的选择,像 Kotlin、Swift 和 Dart 这样的工具可以用于 Android/IOS 开发。带有 VueJS 这样的框架的 JavaScript 也可以用来提供额外的灵活性。

在尝试了其中的大部分之后,我真诚地推荐坚持使用,因为它比其他的要容易得多!

在这里,重要的是从一个愿景开始(越简单越好),并试图找出哪些部分是最重要的。然后试着在这些方面下功夫。继续直到完成!对于网站来说,需要像 Heroku 这样的托管服务,这样世界上的其他人就可以看到我们所有努力的惊人的最终产品🤯😱。

即使上面的选项都不适合这个场景,一份报告或一篇文章涵盖我们做了什么,我们学到了什么,以及任何建议/经验教训,以及一个记录良好的 GitHub 库是必不可少的!确保自述文件是最新的。

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

照片由 Unsplash 上的this engineering RAEng拍摄

感谢阅读!

真的希望这篇文章对你有所帮助!如需更新,请在 Twitter 上关注我

如果你喜欢这本书,你可能也会喜欢完整的编码实践者手册,里面介绍了你需要知道的每一个实用的编码工具。如果你不知道该做什么项目,可以考虑看看我的《从零到英雄》指南,关于选择项目和通过网络搜集收集自己的数据集的指南(T21)。

用于异常检测的机器学习:椭圆包络

原文:https://towardsdatascience.com/machine-learning-for-anomaly-detection-elliptic-envelope-2c90528df0a6?source=collection_archive---------21-----------------------

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

马可·蒙斯Unsplash 上拍摄的照片

小型数据科学

欢迎回到异常检测;这是一系列关注异常值检测的“小数据”科学中的第 6 篇。今天我写的是一个叫做EllipticEnvelope的机器学习算法,它是数据科学家工具箱中的又一个工具,用于欺诈/异常/异常值检测。

如果您错过了我以前的文章,或者您有兴趣了解关于这个主题的更多信息,请找到下面的链接:

椭圆形信封

那么什么是椭圆包络,算法背后的直觉是什么?

如果你上过几何课,你可能对椭圆很熟悉——一种在二维平面上呈椭圆形的几何形状。

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

椭圆形外壳的概念图

上图中的绿色区域是一个椭圆。因此,算法——椭圆包络——在给定数据集周围创建一个假想的椭圆区域。落在包络线内的值被视为正常数据,任何超出包络线的值都作为异常值返回。因此,自然地,上图中的红色数据点应该被该算法识别为异常值。从该图可以明显看出,如果数据具有高斯分布,则该算法工作得最好。

履行

sklearn是机器学习算法的瑞士军刀。因此毫不奇怪,它也有一个使用椭圆包络进行异常检测的模块。下面我用 5 个简单的步骤演示了一个使用虚拟数据点的实现。

步骤 1:导入库

# import libraries
import pandas as pd
import numpy as np
from sklearn.covariance import EllipticEnvelope
import matplotlib.pyplot as plt

第二步:获取训练数据

# create a dataframe
df = pd.DataFrame(np.array([[0,1], [1,1], [1,2], [2,2], [5,6]]), columns = ["x", "y"], index = [0,1,2,3,4])# show data in a scatterplot
plt.scatter(df["x"], df["y"], color = "r")
plt.grid()

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

步骤 3:准备输入

# convert dataframe to arrays
data = df[['x', 'y']].values

第四步:建模

定义模型时最重要的参数是设置“污染”参数,它基本上定义了将被识别为异常值的值的比例。参数值的范围在 0 到 0.5 之间

# instantiate model
model1 = EllipticEnvelope(contamination = 0.1) # fit model
model1.fit(data)

第五步:预测

# new data for prediction (data needs to be in arrays)
new_data = np.array([[10,10], [1,1], [1,1], [1,1]])# predict on new data 
pred1 = model1.predict(new_data)
print(pred1)

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

负值是异常值

总结和后续步骤

本文的目的是介绍椭圆包络——一种用于异常检测的机器学习算法——并使用 Scikit-Learn 库实现该算法。如果您现在已经清楚了关键概念,那么继续尝试在真实数据集上实现它,例如,在线可用的 Iris 数据集。您应该能够对这个数据集使用上面的 5 个步骤,只需要确保您选择了正确的列以使算法工作。

生物学的机器学习:新冠肺炎下一步将如何变异?

原文:https://towardsdatascience.com/machine-learning-for-biology-how-will-covid-19-mutate-next-4df93cfaf544?source=collection_archive---------1-----------------------

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

来源: Pixabay

基于 K-Means 和 PCA 的基因组序列分析

许多人不太了解病毒的一点是,就像地球上所有其他为生存而挣扎的生物一样,它们会进化或变异。

只要看看人类病毒来源于蝙蝠病毒 RNA 核苷酸序列的一个片段…

aaaatcaagcttgtgttgaagaagttacaacaatctggaaaaactaagtt

…以及人类新冠肺炎 RNA 核苷酸序列的一个片段…

aaaattaaggcttcattgattaggttaccacaacacactggaagaaactaagtt

……显然,冠状病毒已经改变了其内部结构,以适应其宿主的新物种(更准确地说,冠状病毒的内部结构约有 20%发生了突变),但仍保持足够的数量,以至于它仍然忠于其原始物种。

事实上,研究表明,新冠肺炎已经多次变异,以提高其生存能力。在我们战胜冠状病毒的斗争中,我们不仅需要找到如何摧毁病毒,还需要找到病毒如何变异以及如何应对这些变异。

在这篇文章中,我将…

  • 提供什么是 RNA 核苷酸序列的表层解释
  • 使用 K-Means 创建基因组信息聚类
  • 使用主成分分析可视化聚类

…并从我们执行的每个分析程序中获得洞察力。

什么是基因组序列?

如果你对 RNA 核苷酸序列有基本的了解,可以跳过这一部分。

基因组测序,通常比作“解码”,是分析从样本中提取的脱氧核糖核酸(DNA)的过程。每个正常细胞内有 23 对染色体,这是存放 DNA 的结构。

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

来源。图像免费共享和商业使用。

DNA 卷曲的双螺旋结构允许它展开成梯形。这个梯子是由成对的被称为碱基的化学字母组成的。DNA 中只有四种:腺嘌呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。腺嘌呤只与胸腺嘧啶结合,鸟嘌呤只与胞嘧啶结合。这些碱基分别用 A、T、G 和 C 表示。

这些碱基形成了各种各样的代码,指导生物体如何构建蛋白质——正是 DNA 从本质上控制着病毒的行为。

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

DNA 转化为 RNA 再转化为蛋白质的过程。来源。图像免费共享和商业使用。

使用专门的设备,包括测序仪器和专门的标签,显示特定片段的 DNA 序列。由此获得的信息经过进一步的分析和比较,使研究人员能够识别基因的变化、与疾病和表型的关联,并识别潜在的药物靶点。

基因组序列是一长串的‘A’、‘T’、‘G’和‘C’,代表生物体对环境的反应。生物体的突变是通过改变 DNA 产生的。查看基因组序列是分析冠状病毒突变的一种强有力的方法。

了解数据。

数据可以在 Kaggle 这里找到,看起来是这样的:

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

每行代表蝙蝠病毒的一种变异。首先,花一分钟时间来欣赏大自然是多么不可思议——在几周内,冠状病毒已经创造了 262 种变异(还在增加)来提高存活率。

一些重要的列:

  • query acc.ver代表原病毒标识符。
  • subject acc.ver 是病毒突变的标识符。
  • % identity代表百分之多少的序列与原始病毒相同。
  • alignment length表示序列中有多少项相同或对齐。
  • mismatches代表变异和原始不同的项目数。
  • bit score代表一种度量,用于表示对准有多好;分数越高,排列越好。

每个列的一些统计度量(这可以在 Python 中用data.describe()方便地调用):

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

查看% identity栏,有趣的是看到一个突变与原始病毒的最小比对百分比——大约 77.6%。对于% identity来说,7%的相当大的标准偏差意味着有很大范围的变异。这是由bit score中的巨大的标准差支持的——标准差大于平均值!

可视化数据的一个好方法是通过关联热图。每个单元格表示一个要素与另一个要素的相关程度。

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

许多数据彼此高度相关。这是有意义的,因为大多数度量是彼此不同的。如果alignment lengthbit score高度相关,有一点需要注意。

使用 K-Means 创建变异聚类

K-Means 是一种用于聚类的算法,是机器学习中在特征空间中寻找数据点组的方法。我们的 K-Means 的目标是找到突变的簇,因此我们可以获得关于突变的性质以及如何解决它们的见解。

但是,我们仍然需要选择簇的数量 k 。虽然这就像在二维空间中画出点一样简单,但在更高维空间中这是无法实现的(如果我们想保留最多的信息)。像手肘法选择 k 这样的方法是主观的,不准确的,所以我们会改用剪影法。

剪影法是根据聚类与数据的吻合程度对 k 聚类进行评分。Python 中的sklearn库使得实现 K-Means 和 silouhette 方法变得非常简单。

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

看起来 5 个聚类似乎是数据的最佳聚类。现在,我们可以确定聚类中心。这些是每个聚类围绕的点,并代表 5 种主要突变类型的数值评估(在这种情况下)。

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

注意:这些特征已被标准化,以便将它们放在相同的比例上。否则,列将无法进行比较。

该热图按列显示了每个集群的属性。因为点是按比例缩放的,所以实际的注释值在数量上没有任何意义。但是,可以比较每列中的换算值。你可以直观地感受到每一个变异群的相对属性。如果科学家要开发一种疫苗,它应该针对这些主要的病毒群。

在下一节中,我们将使用 PCA 来可视化聚类。

聚类可视化的主成分分析

PCA,即主成分分析,是一种降维方法。它选择多维空间中的正交向量来表示轴,从而保留了最多的信息(方差)。

使用流行的 Python 库sklearn,可以通过两行代码实现 PCA。首先,我们可以检查解释的方差比。这是从原始数据集中保留的统计信息的百分比。在这种情况下,解释的方差比是0.9838548580740327,这是天文数字!我们可以确信,无论我们从主成分分析中得到什么样的分析,数据都是真实的。

每个新特征(主成分)是几个其他列的线性组合。我们可以用热图来想象一个列对于两个主要组件中的一个有多重要。

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

重要的是要理解第一个组分中具有高值意味着什么——在这种情况下,它的特征是具有更高的比对长度(更接近原始病毒),而组分 2 的主要特征是具有更短的比对长度(突变得离原始值更远)。这也体现在bit score的差异较大。

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

很明显,这种病毒有 5 条主要的变异链。我们可以带走很多洞察力。

四个病毒突变在第一个主成分的左侧,一个在右侧。第一主成分的签名是高alignment length。这意味着第一主成分的值越高,意味着alignment length越高(更接近原始病毒)。因此,组分 1 的较低值在遗传上与原始病毒更远。大多数病毒群与原始病毒有很大不同。因此,试图制造疫苗的科学家应该意识到病毒会发生变异**批次*。*

结论

使用 K-Means 和 PCA,能够识别冠状病毒中的五个主要突变簇。开发冠状病毒疫苗的科学家可以使用聚类中心来获得关于每个聚类特征的知识。我们能够使用主成分分析在二维空间中可视化集群,并发现冠状病毒具有非常高的突变率。这可能是它如此致命的原因。

感谢阅读!

如果你喜欢,请随意查看我在冠状病毒方面的其他工作:

编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

用 Python 构建推荐系统的机器学习

原文:https://towardsdatascience.com/machine-learning-for-building-recommender-system-in-python-9e4922dd7e97?source=collection_archive---------4-----------------------

利用 Python 中基于模型的协同过滤构建推荐系统

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

作者照片

推荐系统广泛应用于产品推荐,如音乐、电影、书籍、新闻、研究文章、餐厅等的推荐。[1][5][9][10].

构建推荐系统有两种流行的方法:

协作过滤方法[5][10]通过从许多其他用户(协作)收集偏好信息来预测(过滤)用户对产品的兴趣。协同过滤方法背后的假设是,如果一个人 P1 和另一个人 P2 在一个问题上有相同的观点,P1 比随机选择的人更有可能在不同的问题上分享 P2 的观点[5]。

基于内容的过滤方法[6][9]利用产品特征/属性,根据其他用户以前的行为或明确的反馈(如对产品的评级),推荐与用户喜欢的产品相似的其他产品。

推荐系统可以使用这两种方法中的一种或两种。

在本文中,我使用 Kaggle 网飞奖数据[2]来演示如何使用基于模型的协同过滤方法在 Python 中构建一个推荐系统。

文章的其余部分安排如下:

  • 协同过滤概述
  • 用 Python 构建推荐系统
  • 摘要

1.协同过滤概述

正如[5]中所描述的,协同过滤背后的主要思想是一个人经常从另一个有相似兴趣的人那里得到最好的推荐。协同过滤使用各种技术来匹配具有相似兴趣的人,并基于共同兴趣进行推荐。

协同过滤系统的高级工作流程可以描述如下:

  • 用户对项目(例如,电影、书籍)进行评级以表达他或她对项目的偏好
  • 系统将评级视为用户对项目兴趣的近似表示
  • 系统将该用户的评分与其他用户的评分进行匹配,并找到评分最相似的人
  • 系统推荐相似用户已经评级很高但是还没有被该用户评级的项目

典型地,协同过滤系统分两步向给定用户推荐产品[5]:

  • 步骤 1:寻找与给定用户具有相同评级模式的人
  • 步骤 2:使用在步骤 1 中找到的人的评分来计算给定用户对产品的评分预测

这被称为基于用户的协同过滤。该方法的一个具体实现是基于用户的最近邻算法

作为替代,基于项目的协作过滤(例如,对 x 感兴趣的用户也对 y 感兴趣)以项目为中心的方式工作:

  • 步骤 1:建立项目对之间评级关系的项目-项目矩阵
  • 步骤 2:通过检查矩阵和匹配用户的评级数据来预测当前用户对产品的评级

有两种类型的协同过滤系统:

  • 基于模型的
  • 基于记忆的

在基于模型的系统中,我们使用不同的机器学习算法来开发模型,以预测用户对未评级项目的评级【5】。基于模型的协同过滤算法有很多,如矩阵分解算法(如奇异值分解 (SVD)、交替最小二乘(ALS)算法【8】)、贝叶斯网络聚类模型等。【5】

基于记忆的系统使用用户的评级数据来计算用户或项目之间的相似性。这类系统的典型例子是基于邻域的方法和基于项目/基于用户的 top-N 推荐[5]。

本文描述了如何使用 SVD 模型构建基于模型的协同过滤系统。

2.用 Python 构建推荐系统

本节描述如何用 Python 构建推荐系统。

2.1 安装库

有多个 Python 库可用于构建推荐系统(例如,Python scikitSurprise【7】, Spark 基于 RDD 的协同过滤 API【8】)。我在本文中使用 Python scikit Surprise 库进行演示。

惊喜库可以按如下方式安装:

pip install scikit-surprise

2.2 加载数据

如前所述,我在本文中使用了 Kaggle 网飞奖数据[2]。有多个数据文件用于不同的目的。本文中使用了以下数据文件:

训练数据:

  • 组合 _ 数据 _1.txt
  • 组合 _ 数据 _2.txt
  • 组合 _ 数据 _3.txt
  • 组合 _ 数据 _4.txt

电影片头数据文件:

  • 电影 _ 标题. csv

训练数据集太大,无法在笔记本电脑上处理。因此,出于演示目的,我只从每个训练数据文件中加载前 100,000 条记录。

一旦将训练数据文件下载到本地机器上,来自每个训练数据文件的前 100,000 条记录可以作为熊猫数据帧加载到内存中,如下所示:

def readFile(file_path, rows=100000):
    data_dict = {'Cust_Id' : [], 'Movie_Id' : [], 'Rating' : [], 'Date' : []}
    f = open(file_path, "r")
    count = 0
    for line in f:
        count += 1
        if count > rows:
            break

        if ':' in line:
            movidId = line[:-2] # remove the last character ':'
            movieId = int(movidId)
        else:
            customerID, rating, date = line.split(',')
            data_dict['Cust_Id'].append(customerID)
            data_dict['Movie_Id'].append(movieId)
            data_dict['Rating'].append(rating)
            data_dict['Date'].append(date.rstrip("\n"))
    f.close()

    return pd.DataFrame(data_dict)df1 = readFile('./data/netflix/combined_data_1.txt', rows=100000)
df2 = readFile('./data/netflix/combined_data_2.txt', rows=100000)
df3 = readFile('./data/netflix/combined_data_3.txt', rows=100000)
df4 = readFile('./data/netflix/combined_data_4.txt', rows=100000)df1['Rating'] = df1['Rating'].astype(float)
df2['Rating'] = df2['Rating'].astype(float)
df3['Rating'] = df3['Rating'].astype(float)
df4['Rating'] = df4['Rating'].astype(float)

训练数据的不同部分的不同数据帧被组合成如下一个:

df = df1.copy()
df = df.append(df2)
df = df.append(df3)
df = df.append(df4)df.index = np.arange(0,len(df))
df.head(10)

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

电影标题文件可以作为熊猫数据帧载入存储器:

df_title = pd.read_csv('./data/netflix/movie_titles.csv', encoding = "ISO-8859-1", header = None, names = ['Movie_Id', 'Year', 'Name'])
df_title.head(10)

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

2.3 培训和评估模式

Surprise 中的数据集模块提供了从文件、Pandas 数据帧或内置数据集(如 ml-100k(movie lens 100k)【4】加载数据的不同方法:

  • Dataset.load_builtin()
  • Dataset.load_from_file()
  • Dataset.load_from_df()

在本文中,我使用 load_from_df ()方法从 Pandas DataFrame 加载数据。

Surprise 中的 Reader 类用于解析包含用户、项目和用户对项目的评分的文件。默认的格式是每个评分按空格分隔的顺序存储在单独的行中:用户 项目 评分

该顺序和分隔符可使用以下参数进行配置:

  • line_format 是一个类似于“itemuserrating 的字符串,表示数据的顺序,字段名之间用空格隔开
  • sep 用于指定字段之间的分隔符,如空格、'、'等。
  • rating_scale 是指定评级尺度。默认值为(1,5)
  • skip_lines 表示文件开头要跳过的行数,默认为 0

我在本文中使用默认设置。用户评分分别对应数据帧的客户标识电影标识评分栏。

惊喜库[7]包含用于构建推荐系统的多种模型/算法的实现,例如奇异值分解、概率矩阵分解(PMF)、非负矩阵分解(NMF)等。本文使用了 SVD 模型。

下面的代码从 Pandas DataFrame 加载数据并创建一个 SVD 模型实例:

from surprise import Reader, Dataset, SVD
from surprise.model_selection.validation import cross_validatereader = Reader()data = Dataset.load_from_df(df[['Cust_Id', 'Movie_Id', 'Rating']], reader)svd = SVD()

一旦用于产品推荐的数据和模型准备就绪,就可以使用交叉验证来评估模型,如下所示:

# Run 5-fold cross-validation and print results
cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

以下是 SVD 模型的交叉验证结果:

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

一旦模型评估达到我们的满意程度,我们就可以使用整个训练数据集来重新训练模型:

trainset = data.build_full_trainset()
svd.fit(trainset)

2.4 推荐产品

在推荐模型被适当地训练之后,它可以被用于预测。

例如,给定用户(例如,客户 Id 785314),我们可以使用经训练的模型来预测用户对不同产品(即,电影名称)给出的评级:

titles = df_title.copy()titles['Estimate_Score'] = titles['Movie_Id'].apply(lambda x: svd.predict(785314, x).est)

为了向给定用户推荐产品(即电影),我们可以按照预测评级的降序对电影列表进行排序,并将前 N 部电影作为推荐:

titles = titles.sort_values(by=['Estimate_Score'], ascending=False)
titles.head(10)

以下是向客户 Id 为 785314 的用户推荐的前 10 部电影:

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

3.摘要

在本文中,我使用 scikit 惊喜库[7]和 Kaggle 网飞奖数据[2]来演示如何使用基于模型的协同过滤方法在 Python 中构建推荐系统。

如本文开头所述,数据集太大,无法在笔记本电脑或任何典型的个人电脑上处理。因此,出于演示目的,我只从每个训练数据集文件中加载了前 100,000 条记录。

在真实应用的设置中,我会推荐用 Surprise 搭配考拉或者用 Spark MLLib 中的 ALS 算法实现协同过滤系统,在 Spark cluster 上运行[8]。

Github [11]中提供了 Jupyter 笔记本以及本文中使用的所有源代码。

参考

  1. DLao,网飞——电影推荐
  2. Netflix 获奖数据,来自网飞竞赛的数据集,用于改进他们的推荐算法
  3. 推荐系统
  4. A.Ajitsaria,用协同过滤建立推荐引擎
  5. 协同过滤
  6. 基于内容的过滤
  7. 惊喜
  8. 南 Ryza,U. Laserson 等。艾尔。,Spark 高级分析,奥赖利,2015 年 4 月
  9. N.S. Chauhan,如何构建餐厅推荐引擎(第一部分)
  10. N.S. Chauhan,如何构建餐厅推荐引擎(第二部分)
  11. Y. Github 中的张、Jupyter 笔记本

用于能量分配的机器学习

原文:https://towardsdatascience.com/machine-learning-for-energy-distribution-2150d095520f?source=collection_archive---------54-----------------------

能源领域的机器学习——第三部分

能源分销公司的 9 个用例

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

来源:作者

分布式生产、可再生能源的兴起、向更智能电网的转变以及竞争性营销正在改变能源分配市场,并给公用事业的利润率带来压力。

越来越需要在一定范围内做出更明智的决策。为了保持竞争力,需要快速做出这些决定。机器学习正在成为最重要的工具,帮助你做出更好的定价决策,并与客户建立更好的关系。借助机器学习,您可以:

  • 预测价格和需求,
  • 优化零售价格,
  • 提供更好的报价,赢得更多客户,减少客户流失,预测客户终身价值,
  • 预测价值顺序,优化消费

准确预测能源价格

随着个人发电(使用太阳能或风能)变得越来越容易和便宜,消费者和企业越来越多地生产自己的电力。

个人发电允许人们制造、消耗和储存自己的能量。根据他们居住的地方,他们甚至可以将多余的电力卖给当地的电力公司。

机器学习可以帮助找到生产、储存或出售这种能源的最佳时间。理想情况下,能源应该在价格低的时候消耗或储存,价格高的时候卖回给电网。

当我们使用机器学习模型来查看历史数据、使用趋势和天气预报时,我们可以每小时做出更准确的预测。这有助于拥有个人和商业能源生成系统的人做出关于如何使用他们的能源的战略决策。

例如,自适应神经模糊推理系统(ANFIS)已被用于预测发电的短期风模式。这使得生产商能够最大限度地提高能源产量,并在价格达到峰值时将能源返销给电网。

准确预测能源需求

准确预测客户的能源需求对于任何公用事业提供商来说都至关重要。到目前为止,还没有足够的解决方案来储存大量的能量,这意味着能量需要在产生的同时就被传输和消耗。

我们正在使用机器学习来提高这些预测的准确性。历史能源使用数据、天气预报以及某一天运营的企业或建筑类型都在决定能源使用量方面发挥着作用。

例如,一周中炎热的夏天意味着更多的能源使用,因为办公楼空调的运行能力很高。天气预报和历史数据可以帮助及时识别这些模式,以防止夏季空调导致的轮流停电。

机器学习在各种影响因素(如星期几、时间、预测的风和太阳辐射、重大体育赛事、过去的需求、平均需求、气温、湿度和压力以及风向)中找到复杂的模式,以解释需求的发展。因为机器学习比人类能发现更多错综复杂的模式,所以它的预测更准确。这意味着您可以在购买能源时提高效率并降低成本,而不必进行昂贵的调整。

通过更好的交易优化价格

为电力等商品提供最优惠的价格是在开放的能源市场中生存的关键。当消费者可以选择谁提供他们的电力时,价格比较是不可避免的。

为了保持竞争力,公用事业提供商使用机器学习来根据价格最低的时间确定购买能源的最佳时间。

谈到商品追踪,有成千上万的因素影响着能源价格——从一天中的时间到天气的一切。我们可以使用机器学习来分析这些因素的微小变化,这有助于公用事业提供商在何时购买和出售能源方面做出更明智的决定。

但我们可以更进一步,对于我们的一个客户,我们结合了梯度推进、通用加法和深度学习模型,以更准确地预测未来一天的价格。我们还使用机器学习来帮助一家 B2B 能源分销商选择交易策略,以更便宜的价格购买期货。

在一些市场,这种分析导致消费者在一年内多次降价。

减少客户流失

在开放的能源市场中,客户可以选择公用事业供应商,了解哪些客户将会流失至关重要。在能源行业,流失率——在特定年份停止使用某项服务的客户的百分比——可能高达 25%。准确预测和防止客户流失对生存至关重要。

我们可以使用机器学习来帮助公用事业所有者预测客户何时准备大量生产。

通过使用跨行业数据挖掘标准流程(CRISP-DM)、AdaBoost 和支持向量机等技术,以及历史使用数据,公用事业提供商可以确定预测客户是否会流失的关键指标。

这些包括客户满意度、就业状况、能源消耗、房屋所有权或租赁状况等。这些因素中的任何一个变化都可能指向准备终止服务的客户。

当我们提前足够长的时间确定这些指标时,您可以通过与客户合作解决他们遇到的任何问题来防止流失。

预测客户终身价值

在开放的公用事业市场中,公用事业所有者和提供商必须更加关注客户终身价值(CLV)等指标。这有助于他们了解任何给定客户在合同期限内将花费多少。

机器学习能做的不仅仅是给你一个更准确的 CLV 预测。通过输入客户信息、消费习惯、位置、购买历史和支付行为等数据,我们可以使用深度神经网络等机器学习模型来预测单个客户的整体价值。

有了机器学习,我们甚至可以通过建议增加客户价值的方法来更进一步。这可能意味着向类似的客户提供高针对性的服务,或者利用自然语言处理(NLP)来帮助改善对可能准备流失的沮丧客户的服务。

预测赢得客户的概率

对于开放市场中的公用事业提供商来说,全面了解潜在客户对于保持竞争优势至关重要。

但是机器学习能做的不仅仅是给你提供这个完整的画面。它还可以提供您做出数据驱动的营销决策所需的信息…这意味着当一个人登陆你的网站时,你就能判断出这个人是否会成为你的顾客。

我们可以使用机器学习来收集人们随身携带的信息——比如他们住在哪里,他们使用哪种电脑,他们的浏览历史,搜索历史,以及他们访问你的网站的次数——并得出这个人作为消费者的准确图片。

由此,机器学习不仅可以确定那个人成为客户的可能性(这就是所谓的评分),还可以确定将他们变成客户的最佳策略。这包括使用高度有针对性的广告和提供非常个性化的体验——例如,当一个四口之家的人访问网站时,在主页上使用一个四口之家的照片。

向客户提供极具针对性的优惠

在开放的能源市场中,消费者可以选择公用事业供应商。个性化的优惠对于吸引新客户和留住现有客户至关重要,尤其是因为品牌忠诚度已经不像以前那么高了。

我们可以使用机器学习来帮助您获得所需的洞察力,以提供直接针对特定客户需求的不可抗拒的优惠。

通过分析消费习惯和客户数据,机器学习可以帮助你确定在任何给定时间向特定客户提供的最佳优惠。

例如,如果数据表明客户正准备搬家,您可以在他们的新位置发出免除连接费的提议。这种个性化的优惠让你在竞争中领先,减少客户流失的可能性。

优化能源消耗

人们很早就意识到了能源消耗,无论是在家里还是在工作中。但是,如果不进行大量的手工计算,我们只能获得能源使用的总体感觉,而不知道哪些电器或设备使用最多。

智能电表和物联网设备的兴起改变了这一切。非侵入式设备负载监控(NIALM),也称为分解,是一种使用机器学习在设备特定级别分析能耗的算法。

我们可以帮助您找出哪些设备的运行成本最高。这将有助于家庭和企业客户调整他们的消费习惯,以节省资金和减少能源使用。他们可以少用高价电器,或者换成更节能的型号。

预测能源价格的价值顺序

公用事业供应商在能源来源方面有很多选择——从风能、太阳能等可再生能源到化石燃料和核能。到了销售电力的时候,这些不同的来源被组织成一个基于价格的价值顺序。这决定了这些不同来源的电力出售的顺序。

因为我们可以访问来自各种来源的数据,所以我们可以使用机器学习来分析实时数据和历史数据。机器学习算法也更善于考虑影响价格的所有不同因素——如天气、需求、各种来源的可用能源量、历史使用情况等。–预测优化的奖励等级。

这有助于你做出更明智的决定,从哪里获得力量。这在有大量可再生能源的市场上尤其有用,例如,因为很难保证这些来源的能源可用性。

T 他的文章是机器学习在能源行业应用的 3 部分系列文章之一:

  1. 第一部分— 用于能源生成的机器学习
  2. 第二部分— 用于能量传输的机器学习
  3. 第二部分(本文)——针对能量分布的机器学习

用于能源生产的机器学习

原文:https://towardsdatascience.com/machine-learning-for-energy-generation-302069a942f?source=collection_archive---------43-----------------------

能源领域的机器学习——第一部分

发电厂 ML 的 4 个用例

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

来源:作者

如果你正在管理风力发电场或任何其他发电厂,那么你很清楚:维护、人为错误、停机和规划效率低下每年会造成数百万美元的损失

在更简单的统计学进展甚微的情况下,机器学习被证明是一种非常有效的工具,可以:

  • 更快更准确地预测故障
  • 检测人为错误,在它们变成大问题之前
  • 优化电厂计划,提高您的盈利能力
  • 预测优序,优化不同电源的调度

预测涡轮机故障

风是一种很好的可再生能源,但是风力涡轮机的维护费用是出了名的昂贵。它占每千瓦时成本的 25%。并且在问题发生后解决问题可能会更加昂贵。

机器学习可以帮助您提前解决这个问题,通过在涡轮机出现故障之前发现问题来降低维护成本。当风力发电场位于难以到达的地方时,例如海洋中部,这一点尤为重要,因为这使得维修成本更高。

监控和数据采集(SCADA)收集的实时数据有助于提前识别系统中可能出现的故障,从而防止故障发生。

例如,我们可以使用来自涡轮机内传感器的数据,如油、油脂和振动传感器,来训练机器学习模型,以识别故障的前兆,如低水平的润滑剂。这种方法可以提前 60 天预测故障。

减少潜在的人为错误

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

来源:作者

每年,人为错误占发电厂故障的 25%。除了每年损失高达 3000 万兆瓦时的发电量,这还会导致客户服务中断,甚至更糟——想想切尔诺贝利和三里岛就知道了。这也意味着与修复错误和让系统重新上线相关的不必要成本。

为了解决这个问题,我们可以使用机器学习来支持控制室操作员做出的决定。

机器学习提供持续的系统监控,帮助您检测异常。我们还会自动建议一个行动计划来防止情况变得更糟。它甚至可以在需要人工干预之前处理问题。

这降低了由于注意力分散、缺乏知识或反应速度而导致的人为错误的风险——有时控制室操作员根本无法快速阻止问题。

通过优化调度和定价提高电厂的盈利能力

如今,我们拥有的海量数据正在帮助人们就如何经营企业做出更好的决策。公用事业也不例外。能源价格的波动性意味着,运营一家发电厂可能或多或少有利可图,这取决于一天中简单的时间。

但是,由于公用事业市场节奏如此之快,很难手动跟踪做出这些决策所需的所有数据。

我们可以使用机器学习来帮助。通过将价格和使用的历史数据输入机器学习算法,你可以预测运营他们工厂的最佳时间,从而赚更多的钱。机器学习可以找到使用率高但用于生产能源的原材料价格低的时候。这些极其准确的预测创建了一个优化的发电计划,使盈利能力最大化。

预测能源价格的价值顺序

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

来源:作者

公用事业供应商在能源来源方面有很多选择——从风能、太阳能等可再生能源到化石燃料和核能。到了销售电力的时候,这些不同的来源被组织成一个基于价格的价值顺序。这决定了这些不同来源的电力出售的顺序。

因为我们可以访问来自各种来源的数据,所以我们可以使用机器学习来分析实时数据和历史数据。机器学习算法也更善于考虑影响价格的所有不同因素,如天气、需求、各种来源的可用能源量、历史使用情况等。-创建优化的奖励等级。

这有助于你做出更明智的决定,从哪里获得力量。这在有大量可再生能源的市场上尤其有用,比如风能,因为很难保证这些能源的可用性。

T 他的文章是机器学习在能源行业应用的 3 部分系列文章之一:

  1. 第一部分(本文)–用于能源生产的机器学习
  2. 第二部分-用于能量传输的机器学习
  3. 第二部分-针对能量分配 的机器学习

原载于https://www.datarevenue.com

用于能量传输的机器学习

原文:https://towardsdatascience.com/machine-learning-for-energy-transmission-750f518ae282?source=collection_archive---------54-----------------------

能源领域的机器学习——第二部分

传输系统运营商的 6 ML 应用。

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

来源:作者

在电网中输送电力会带来一系列独特的问题。从能源盗窃到电网故障,一切都可能干扰这一过程。而且,每次出了问题,都要花费时间和金钱去纠正。

机器学习已经成为一种越来越强大的工具,有助于降低与能源传输相关的风险。它可以帮助您:

  • 预测和预防电网故障
  • 通过实时监控和人工智能预测防止限电
  • 检测电网故障
  • 平衡网格
  • 区分电力系统干扰和网络攻击
  • 检测能源盗窃

1.预测和预防电网故障

大规模停电给公众带来了混乱,并且每年给公用事业提供商造成大约 490 亿美元的损失。

如果大规模停电很少发生,这不会是什么大问题,但影响超过 50,000 人的停电近年来急剧增加。这意味着公用事业公司需要找到预测和管理这些中断的新方法。

如今,智能电网正在产生大量数据,这意味着预测和管理停电比以往任何时候都更容易。传统电网是单向的(意味着它们只向一个方向传输电力),而智能电网则是双向的。他们可以在提供电力的同时从电网中的每一个可能的来源获取数据。他们从智能电表、物联网设备和发电站等来源收集和监控数据,提供清晰、实时的电力使用情况。

机器学习可以使用这些数据来预测和防止电网中的大规模停电。它有助于识别数据中不明显的模式,这些模式可能是电网故障的前兆,这有助于维护团队预防故障。

2.通过实时监控和人工智能预测防止电力不足

电网在向客户提供持续能源方面有许多障碍需要克服。天气模式、使用、内部故障,甚至像雷击和野生动物干扰这样的意外事件都会影响电力输送。

机器学习越来越多地用于帮助预测潜在的限电情况。通过将历史数据输入人工智能并运行蒙特卡罗模拟来预测潜在的结果,电网运营商可以使用机器学习来识别可能导致电网故障的条件。他们可以据此采取行动。

相位测量单元(PMU)和智能电表等传感器可以实时提供使用信息。当我们将这些工具与历史和模拟数据结合起来时,人工智能可以使用网格平衡和需求响应优化等技术来帮助减轻潜在的网格故障。否则会影响数百万人的事件可以被控制在更小的范围内,并以更少的资金更快地得到解决。

3.检测电网故障

大多数公用事业提供商目前用于检测电网故障的方法消耗了大量不必要的时间和资源。这就造成了这样一种情况,即电力传输中断,用户没有电,而故障是先定位,然后修复的。

机器学习可以更快更准确地找到故障,帮助您最大限度地减少对客户的服务中断。例如,我们可以将支持向量机(SVM)与离散小波变换(DWT)相结合来定位线路中的故障。

当我们将 DWT(一种捕捉频率和位置信息的数值和函数分析形式)应用于传输线上记录的瞬态电压时,我们可以通过计算天线模式电压小波(对于地上传输导线)和接地模式电压小波(对于地下传输导线)来确定故障的位置。到目前为止,这种方法已经成功地检测了架空和地下输电线路的故障起始角、故障位置、负载水平和非线性高阻抗故障。

4.平衡网格

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

脸书预言家算法预测风力

平衡电网——确保能源供应与能源需求相匹配——是输电运营商最重要的工作之一。但是可再生能源严重依赖天气,这使得它们更难预测。

输电运营商每年花费数百万美元来修复导致发电量过多或过少的规划错误。在依靠可再生能源和化石燃料发电的混合系统中,这些错误必须在最后一刻通过购买更多的能源或补偿电厂的过剩来纠正。

准确了解需求水平何时达到峰值,可让公用事业提供商连接到二次电源(如传统发电)以支持可用资源并确保持续的服务供应。

机器学习是预测可再生能源产量的最准确的方法。当我们应用像长短期神经网络(LSTMs)这样的高级方法时,AI 可以权衡所涉及的许多因素——风、温度、阳光和湿度预测——并做出最佳预测。这为运营商节省了资金,也为电厂保留了资源。

我们还可以将历史数据输入机器学习算法,如支持向量机(SVM),以准确预测能源使用量,并确保足够的水平和持续的供应。

5.区分电力系统干扰和网络攻击

网络攻击越来越多地被用来攻击重要的基础设施,比如劫持公用设施和索要现金。这可能需要很长时间和大量的资金来解决。例如,在科罗拉多州,在一次网络攻击后,他们花了三个星期才解开数据。他们不得不引入额外的人员来梳理记录,以确保他们客户的个人信息不被泄露,这是同一家公用事业公司在两年内第二次发生这种情况。

检测这些攻击至关重要。

开发人员正在使用机器学习来区分故障(例如短路)或电网干扰(例如线路维护)和智能网络攻击(例如数据注入)。

由于欺骗是这些攻击的一个重要组成部分,因此需要训练该模型来寻找可疑活动,如欺骗发生后留下的恶意代码或机器人。一旦模型经过训练,它就可以监控系统并更快地捕捉可疑活动。

我们可以应用的一种方法是使用符号动态过滤(一种基于信息论的模式识别工具)的特征提取来发现子系统之间的因果关系,而不会使计算机系统负担过重。在测试中,它准确地检测到 99%的网络攻击,真阳性率为 98%,假阳性率不到 2%。如此低的误报率意义重大,因为误报是检测网络攻击的最大问题之一。

6.检测能源盗窃

在能源领域,“非技术性损失”意味着能源盗窃或欺诈。

有两种常见的非技术性损失。第一种情况是,客户使用的能源比电表报告的多。第二个是流氓连接从付费用户那里窃取能源。为了实现这一点,坏人可以完全绕过智能电表,或者在系统中插入芯片,改变电表跟踪能源使用的方式。抄表员也可以被贿赂报告更低的数字(尽管由于智能电表,这越来越难做到)。

因为这些非技术性损失每年花费960 亿美元,公用事业提供商正在转向机器学习来解决这个问题。

我们可以帮助您挖掘历史客户数据,以发现表明盗窃或欺诈的违规行为。这些可能是不寻常的使用高峰,报告和实际使用之间的差异,甚至是设备篡改的证据。

本文是机器学习在能源行业应用的 3 部分系列文章之一:

  1. 第一部分— 发电的机器学习
  2. 第二部分——能量传输 机器学习
  3. 第二部分— 用于能量分配的机器学习

基因组学的机器学习

原文:https://towardsdatascience.com/machine-learning-for-genomics-c02270a51795?source=collection_archive---------14-----------------------

如何转换您的基因组数据以适应机器学习模型

机器学习已经普及。然而,它不是生物信息学和计算生物学领域的常见用例。使用机器学习技术的工具非常少。大多数工具都是在确定性方法和算法的基础上开发的。在这篇文章中,我将介绍我们如何安排我们的数据,以便在机器学习模型中有效地使用它们。

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

图片来自 PixabayClker-Free-Vector-Images

应用领域

在基因组学中有很多场景我们可能会用到机器学习。聚类和分类的主要领域可用于基因组学的各种任务。其中一些如下:

聚类(无监督学习)

  1. 宏基因组重叠群的宁滨
  2. 质粒和染色体的鉴定
  3. 聚类读入染色体,以便更好地组装
  4. 作为读取集合的预处理器的读取聚类

分类(监督学习)

  1. 将较短的序列分类(门、属、种等)
  2. 序列的系统发育推断
  3. 质粒和染色体的检测
  4. 寻找编码区域
  5. 人类基因组学中的染色体预测

虽然我已经列出了几个我有经验的领域,但是这个清单可能还会更长。

数据转换和模型选择

在转换和模型选择这两个步骤中,我认为前者更重要。这是因为如果没有数据表示的坚实基础,我们可能无法从模型中获得最大收益。然而,即使我们的模型看起来很差,拥有干净和信息丰富的数据也可以表现得更好。我们可以考虑两类数据。

顺序数据

顺序数据是指输入模型的数据顺序与数据集中数据的实际顺序相对应的数据。让我们看看下面的例子。

  1. 蛋白质编码区的预测
    在这个场景中,我们将会看到连续的核苷酸碱基和它们的顺序。否则就没有意义了。在这种情况下,我们可以将数据转换为包含连续的三聚体单词的句子。
  2. 分类标签预测
    在这种情况下,我们需要更高的精确度,因为寡核苷酸频率在物种之间可能非常相似,而在某些物种之间具有非常低的唯一性。因此,我们将着眼于创建大于 5 或 7 的 k 值的 k-mer 句子。

让我们考虑下面的例子。我将使用两个物种铜绿假单胞菌( CP007224.1) 和发酵乳杆菌 (AP008937.1) 来演示转化为 k-mer 单词句子(显示了前 50 个碱基)。

**Pseudomonas aeruginosa** TTTAAAGAGACCGGCGATTCTAGTGAAATCGAACGGGCAGGTCAATTTCC**Lactobacillus fermentum** TTGACTGAGCTCGATTCTCTTTGGGAAGCGATCCAAAATTCATTCCGTAA

现在,我们可以将其转换为三聚体单词,如下所示。

**Pseudomonas aeruginosa** TTT TTA TAA AAA AAG AGA GAG AGA GAC ACC CCG CGG GGC GCG CGA GAT ATT TTC TCT CTA TAG AGT GTG TGA GAA AAA AAT ATC TCG CGA GAA AAC ACG CGG GGG GGC GCA CAG AGG GGT GTC TCA CAA AAT ATT TTT TTC TCC**Lactobacillus fermentum** TTG TGA GAC ACT CTG TGA GAG AGC GCT CTC TCG CGA GAT ATT TTC TCT CTC TCT CTT TTT TTG TGG GGG GGA GAA AAG AGC GCG CGA GAT ATC TCC CCA CAA AAA AAA AAT ATT TTC TCA CAT ATT TTC TCC CCG CGT GTA TAA

现在我们有了单词的句子,处理过程变得类似于情感分析。关键的想法是保持句子的长度,你可以根据序列的平均长度来决定。

适用于顺序数据的模型

由于上述场景中 k-mers 的顺序很重要,我们可以很容易地使用递归神经网络(RNN)长短期记忆模型(LSTM) 。这是因为它们能够将项目的顺序保持为一种时间关系。

然而,在上面的场景中,您必须使用标记化,然后是单词嵌入层。确保将编码器和记号赋予器保存到一个文件中(序列化),这样您就有了用于以后预测的编码器。这里 kmer_strings 是我创建的句子,是指定的标签。

tokenizer = Tokenizer()
tokenizer.fit_on_texts(**kmer_strings**)
vocab_size = len(tokenizer.word_index) + 1
encoded_docs = tokenizer.texts_to_sequences(**kmer_strings**)binarizer = preprocessing.LabelBinarizer()
labels_encoded = binarizer.fit_transform(**classes**)

以下是我几天前使用 Keras Sequential API 进行序列分类时使用的一个模型。我将单词从最初的 32 个维度嵌入到 5 个维度中(有 32 个独特的三聚体合并了下游链的反向互补)。

model = Sequential()
model.add(Embedding(vocab_size, 5))
model.add(Bidirectional(LSTM(5)))
model.add(Dense(30, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(20, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(2, activation = 'softmax'))

如果您的分类是多标签,您需要使用 sigmoid 激活功能代替 softmax 功能。

无序数据

对于相似序列之间的相关性比序列的唯一可识别性更重要的情况,我们倾向于使用无序数据。这些通常以寡核苷酸频率向量的形式表示。例如,铜绿假单胞菌( CP007224.1) 和发酵乳杆菌 (AP008937.1)的标准化频率如下所示。

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

两个物种的三聚体频率模式

我们可以看到它们遵循完全不同的模式。请注意,我们已经失去了三聚体的实际顺序,但留下了一个代表来唯一地识别这两个物种。然而,在 k=3 的时候,你很可能会遇到近亲物种之间的碰撞。这是一篇关于如何基于这些模式进行集群的有趣文章;

[## 基于组成的宏基因组序列聚类

基于寡核苷酸组成的宏基因组序列聚类

towardsdatascience.com](/composition-based-clustering-of-metagenomic-sequences-4e0b7e01c463)

下面的文章可能会对如何非常有效地使用 DBSCAN 有所帮助。

[## 如何有效地使用 DBSCAN

有效使用最常引用的聚类算法的完整指南

towardsdatascience.com](/how-to-use-dbscan-effectively-ed212c02e62)

现在您已经看到了数据,您可以使用类似于下面的模型来进行分类。

model = Sequential()
model.add(Dense(30, activation = 'relu', input_shape=(32,)))
model.add(Dropout(0.2))
model.add(Dense(20, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(2, activation = 'softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam')

请注意,当您为此决定更长的 k-mers 时,您的输入维度将增加 4 的幂次。此外,计算如此长的向量也需要很长时间。您可能希望阅读下面的文章,这篇文章解释了如何使用一个简单易用的小脚本来实现这一点。

[## DNA 序列的矢量化

ACGT 序列到 k-mer 频率向量的有效转换

medium.com](https://medium.com/computational-biology/vectorization-of-dna-sequences-2acac972b2ee)

现有工具很少

现在,您已经看到了如何在机器学习模型中使用可变长度的基因组序列,让我展示几个实际做到这一点的工具。

  1. plas class(2020 出版,PLOS )
    对 k-mer 频率向量使用逻辑回归来检测它们是否来源于质粒序列或染色体片段。这是一个基于二元分类的工具。
  2. plas flow(2018 出版,核酸研究 )
    该工具预测门级分类,预测给定的重叠群是质粒还是染色体。在 k-mer 频率向量上使用神经网络。
  3. MetaBCC-LR ( 出版,2020,生物信息学 )
    使用 t-分布式随机邻居嵌入(t-SNE)对基因组长阅读进行降维,以执行宏基因组阅读的三聚体向量的宁滨。

除了这几个工具(我用过的和我写的第三个),在不同的研究领域有更多的工具。LSTMs 用于基因预测和编码区检测。

然而,机器学习技术在该领域有巨大的潜力可以展示。

我希望你读过一些有用的书。干杯!

用于销售线索管理的机器学习

原文:https://towardsdatascience.com/machine-learning-for-lead-management-4f15e52e732a?source=collection_archive---------12-----------------------

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

斯科特·格雷厄姆Unsplash 上拍照

线索是许多企业的生命线。销售线索是接触潜在客户的起点。简而言之,“线索”代表关于潜在客户的记录,通常包括一些联系信息,如电子邮件地址和电话号码,还可能包括关于客户的其他属性(例如,产品偏好和人口统计数据)。营销和销售部门在销售线索管理上花费了大量的时间、金钱和精力,我们将采用这一概念来涵盖销售线索生成、资格认定和货币化这三个关键阶段。

在本文中,我们将探讨机器学习如何通过为智能、动态和高度可扩展的领导管理方法提供基础来为企业创造切实的价值。我们将使用一个案例研究来使讨论不那么抽象,更容易理解。

销售线索管理的三个关键阶段

在深入案例研究之前,至少有必要对我们将要考虑的销售线索管理的三个关键阶段有一个高度的了解:

  • 产生潜在客户通常通过开展营销活动,让潜在客户了解企业正在销售的产品,并表明他们对这些产品的兴趣,从而产生一份长长的潜在客户名单。例如,在在线环境中,网站可能会询问您的电子邮件地址,以便您注册他们的邮件列表和时事通讯,并不时向您发送特殊产品报价和折扣。网站还可以收集行为跟踪数据(例如,您访问了哪些内容,访问的频率和时间),并进行定期调查,以开发更丰富的线索档案。
  • 销售线索资格是指根据各种标准对销售线索进行评估和优先排序。可能的标准包括容易获得或转换(客户对产品说“是”的可能性)、容易交付(企业是否有必要的资源和能力按要求向客户交付产品)、利润潜力(由于高度差异化的产品和客户的高支付意愿,企业可以实现的利润率的大小)和战略适合度(向这一特定客户群销售是否符合公司的战略)。
  • 销售线索货币化着眼于从合格的销售线索中获取收入的可能方式。货币化的机会通常由业务范围(尤其是其在供应链中的位置和垂直整合的水平)和潜在的可扩展性决定。高度垂直整合的企业可以通过直接向潜在客户销售来实现销售线索的货币化;如果产品的利润率很高,这可能特别有利可图。处于供应链上游的纵向一体化程度较低的企业可以通过将合格的销售线索出售给拥有交付产品手段的下游企业来实现货币化。潜在的可扩展性将受到供应方因素(如生产能力和销售队伍的规模)和需求方因素(如市场规模、增长率、补充和替代产品的可用性)的制约。

个案研究

现在,我们将通过一个案例研究来了解机器学习如何在实践中应用于销售线索管理。我们的案例围绕着一个虚构的招聘机构 Valiant Recruiters Ltd. ,它帮助客户公司找到技术职位空缺的完美候选人。

Valiant 本质上是一家在线企业;它维护着一个全面的在线门户网站,提供当前的空缺职位,并通过在几个在线渠道,包括专业社交网站和其他求职网站上开展广告活动来吸引潜在的候选人。潜在候选人可以通过上传简历或直接联系 Valiant 招聘人员在 Valiant 的门户网站上注册;在每种情况下,都会在 Valiant 的候选人数据库中创建一个相应的销售线索档案。Valiant 专注于数据科学职位,通常会通过成功地将候选人安置在客户公司来获得可观的佣金。如果候选人由于任何原因(例如,没有合适的空缺,候选人的偏好超出了 Valiant 的专业领域,招聘人员满负荷工作)而无法转换,Valiant 保留将销售线索档案出售给选定的合作招聘机构(多面手和利基参与者)的选项,这些机构可能更适合转换销售线索。

因此,线索管理是 Valiant 商业模式的核心。作为数据科学业务的专家,Valiant 的首席执行官敏锐地意识到了使用机器学习来改善和扩展公司领导管理方法并最终提高底线的潜力。在过去的六个月里,首席执行官领导了一项计划,旨在确定和实施贯穿线索管理所有三个阶段(生成、资格认定和货币化)的高效机器学习用例。

创造更好的销售线索

Valiant 在围绕数据科学的宣传达到空前高潮之际推出了领先管理计划。数据科学家的工作仍然是一个相当新的现象,但行业专家已经将其誉为“21 世纪最性感的工作”(例如,见这篇 HBR 文章)。各公司都在争相招聘数据科学家,对 Valiant 招聘服务的需求非常火爆。与此同时,许多数据科学角色的定义松散但利润丰厚的性质是这样的,对于 Valiant 来说,仅仅产生线索不是问题——产生好的线索才是问题。Valiant 开展的任何营销活动似乎都会收到来自拥有广泛技能和经验的候选人的大量申请。然而,Valiant 汇编的统计数据显示,跨活动的销售线索转化率往往很低。大量的营销预算和招聘资源似乎被浪费在了不良线索上。

在这种背景下,Valiant 的首席执行官已经将营销活动的优化确定为机器学习的一个高影响力用例。特别是,该公司的一名常驻数据科学家承担了构建智能优化器的任务,以提高营销活动的绩效。图 1 显示了优化器在线索生成中的作用的简化概念视图。

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

图 1:优化营销活动的逻辑(来源:自有插图)

为了理解图 1 背后的逻辑,假设 Valiant 要进行一场营销活动,产生大量的销售线索。这些销售线索将由营销活动优化器根据其预期投资回报(ROI)是否高于某个阈值进行实时评估;在实践中,也可以使用 ROI 以外的性能指标。现在,如果新产生的潜在客户的预期投资回报率高于所需的阈值,优化器将向营销活动管理工具提供正面反馈,否则将提供负面反馈。正反馈告诉该工具加强当前的营销活动策略,而负反馈则是纠正营销活动策略,以便将来获得的销售线索能够根据需要清除预期的 ROI 阈值。

简单地说,这种情况下的投资回报率可能是成功安置候选人的佣金除以这样做的成本(包括招聘顾问花费的时间、起草合同的法律费用和其他管理费用)。但是,我们无法在销售线索产生时计算出销售线索的实际投资回报,因为我们不知道销售线索最终是否会转化。因此,预期的投资回报率根据潜在客户实际转化的概率来贴现投资回报率——这就是机器学习可以产生巨大影响的地方。通过使用已关闭销售线索及其结果的历史数据,Valiant 的数据科学家可以构建一个模型来预测新销售线索的转化概率。预期 ROI 需要清除的阈值可能与 Valiant 的首席执行官定期为公司设定的战略目标和关键成果(okr)相关。

此外,机器学习也是通过确定如何以及在何种程度上纠正或加强营销活动来操作反馈循环的关键;这需要将学习逻辑嵌入活动管理工具中,以便它能够对优化器的反馈做出有意义的反应,并随着时间的推移改进营销活动(例如,通过更好地跨渠道分配广告支出,并优化广告消息传递,以便对目标受众更有说服力)。

准确确认销售线索

一旦新产生的潜在客户进入 Valiant 的候选人数据库,他们需要尽快获得资格,以便招聘顾问知道如何进行。以下是 Valiant 的销售线索资格认定流程可能会考虑的一些基本问题:

  • **转换的容易程度:**该销售线索转换的可能性有多大,例如,我们能否将该候选人推荐给我们的某个客户,或者将该销售线索出售给合作招聘机构?这种销售线索转化的速度有多快?候选人是立即寻找新的角色,还是在六个月后?
  • 交付便利:【Valiant 转化该销售线索的难度(或工作量)有多大?公司有合适的顾问来指导候选人吗?候选人会不会太挑剔?
  • **潜在利润:**这条线索能给 Valiant 带来多少利润?一旦有了线索,公司通常会收到相当于候选人在客户公司起薪 20%的佣金。因此,在其他条件相同的情况下,求职者在市场上的起薪越高越好。或者,将线索出售给合作机构会有多有利可图?
  • **战略契合度:**这种领导特征适合数据科学角色吗?还是更适合另一个角色(比如软件工程、业务分析、产品管理)?

虽然手动确认每个潜在客户有其优势(当潜在客户数量较低时,它可能更便宜、更有效),但对于像 Valiant 这样快速增长、高数量的企业来说,它也有一些主要限制(不可能正确地手动审查每个潜在客户档案,并且依赖于人工参与使得难以快速高效地扩展)。此外,上述问题围绕易获取性、交付等。,往往一开始就不能高度肯定地回答。考虑到 lead qualification 问题固有的不确定性因素,该问题的自动化解决方案也应该理想地考虑这种不确定性。Valiant 的 CEO 强烈预感到,一个基于机器学习的解决方案可能正好符合要求。

首席执行官心目中的解决方案实际上相当于预测性销售线索资格。机器学习模型的合适的目标变量可以是转换的概率和转换的时间(作为转换容易程度的代表)、候选人和招聘顾问之间的交互的数量和长度以及所讨论的问题的复杂性(作为交付容易程度的代表)、通过将候选人安排在过去所实现的利润(作为潜在利润的代表)、以及从客户端招聘经理接收的关于过去的候选人对广告角色的适合性的反馈的性质(作为战略适合的代表)。这些结果的可能预测值可以从领导档案数据和 Valiant 可以访问的任何其他行为跟踪数据中得出。显然,一些结果和预测变量可能比其他变量更容易获得,因此数据收集和准备将是成功实现机器学习模型的关键。

现在,假设 Valiant 的数据科学家建立了一个模型来预测潜在客户的转化结果(即,公司是否能够成功安置候选人)。图 2 给出了这种模型可能实现的预测性能的简化视觉表示。从图中的快照可以看出,该模型总共对 25 个销售线索进行了分类(显示为点)。虚线右侧的引线被分类为潜在命中,而虚线左侧的引线被分类为潜在未命中;本质上,该模型已经预测了每个销售线索转化的概率,并且转化概率大于 50%的销售线索已经被分类为命中。此外,到目前为止,所有 25 条线索都已关闭,那些实际转换的线索(真实命中)显示为绿色,而那些没有转换的线索(真实未命中)显示为灰色。

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

图 2:销售线索资格模型的预测性能(来源:自有插图)

为了更好地感受图 2 所示模型的预测性能,Valiant 的数据科学家可以计算一些常用指标:

  • **准确性:**这反映了被正确分类为命中或未命中的线索数量,即(6 + 14) / 25 = 20 / 25 = 80%。
  • **精度:**这显示了有多少预测的命中结果后来变成了实际的命中结果,即 6 / (6 + 2) = 6 / 8 = 75%
  • **回忆:**这度量了模型正确预测为可能命中的实际命中数,即 6 / (6 + 3) = 6 / 9 = 67%

因此,我们看到该模型总体上具有较高的预测准确性,尽管其预测有点保守(比召回更精确)。通常需要考虑模型的精确度和召回率之间的权衡-更严格的模型往往会实现更高的精确度但更低的召回率,而更宽松的模型则相反。在 Valiant 的销售线索资格中,精确度和召回率都很重要。一旦推广了销售线索资格模型,招聘顾问就会被告知,首先要处理那些被预测为热门的销售线索(甚至可以按照潜在转换概率的降序排列),然后再处理其余的线索。因此,高模型精度可确保顾问通过优先处理最终转化频率更高的潜在客户来充分利用他们的时间。然而,高召回率也很重要,因为忽略被模型错误地分类为错过的好线索会导致错过机会;这对于 Valiant 在一年中业务不景气的时候的财务表现尤其不利,因为招聘顾问很少有合格的销售线索。

最后,值得注意的是,根据上述任何资格标准(转换的可能性、交付的容易程度等),销售线索的吸引力。)会随着时间而改变。通过每一次电话和会面,招聘顾问都有希望更好地了解候选人的偏好、技能和工作前景。在动态的业务环境中,客户端的需求也可能发生变化。即使是 Valiant 自己的战略重点也可能从仅仅安置数据科学家和数据工程师发展到还安置商业智能工程师和其他邻近角色。销售线索资格认定流程今天对某个销售线索的评分可能与一个月后不同。这一点的一个关键含义是,所有活动的销售线索都应经常重新存储,以反映销售线索档案和评估环境的变化。重新评分可以简单地在预定的、定期的基础上(例如,每周)发生,或者由特定事件的发生而触发(例如,与候选人的电话、新客户的获得、对 Valiant 的 OKRs 的改变)。

有效地将销售线索货币化

在确认销售线索后,Valiant 可以通过转换销售线索(成功安置候选人)或将销售线索出售给合作伙伴机构来实现盈利。机器学习至少可以通过五种关键方式推动货币化:计划行动、定价销售线索、包装销售线索、向客户推销销售线索以及向合作伙伴机构传递销售线索——我们可以称之为“销售线索货币化的 5p”。让我们依次看看这些 Ps。

计划行动:

为确认销售线索而构建的预测模型对于计划如何处理给定的销售线索非常有用。例如,如果某个销售线索在所有资格标准中排名都很高,那么给予它高优先级可能是有意义的;这可能意味着在其他线索之前处理它,并将其分配给 Valiant 的一位更有经验的招聘顾问,以增加成功关闭线索的机会。相比之下,如果求职者不适合数据科学职位和/或近期内不打算找新工作,那么在转换容易度、交付容易度和战略契合度等资格标准上,销售线索可能排名较低;在这种情况下,如果可能的话,Valiant 最好将销售线索出售给合作伙伴机构。

定价线索:

如果 Valiant 希望销售销售线索,能够为其分配货币价值就变得尤为重要。理论上,Valiant 可以从给定的销售线索中获取的最高销售价格是最高出价者愿意支付的价格。如果销售价格高于产生销售线索的成本,那么 Valiant 就能获利。然而,在一开始,Valiant 可能需要报出一个合适的价格,而不一定知道潜在潜在潜在潜在买家的支付意愿,这就是来自潜在买家资格认定阶段的预测模型可以再次派上用场的地方。特别地,引导价格可以通过跨资格标准的预测概率(或分数)来加权,以平均产生一定水平的利润。

为了了解这是如何工作的,为了简单起见,假设我们只关心潜在客户的转换是否容易。如果销售线索很容易转化(转化率超过某个阈值),我们称之为“高质量”,否则称为“低质量”。实际上,我们可能期望高质量销售线索的销售线索生成成本和销售价格高于低质量销售线索。用数学术语来说,让 *C(高)*和 *C(低)*分别是高质量和低质量线索的线索生成成本,让 *R(高)*和 *R(低)*分别是 Valiant 可以从高质量和低质量线索中获得的现实销售价格或收入。如果预测生成的销售线索的一小部分 p 是高质量的,那么总预期利润将是 p(R(高)-C(高))+ (1-p)(R(低)-C(低))。至关重要的是,Valiant 可以切换公式中的杠杆( pRC ),以确定实现预期盈利水平的必要条件,并相应地为销售线索定价。

封装引线:

除了单独销售线索之外,Valiant 还可以将多个线索打包销售给有意愿的合作伙伴机构。在这种情况下,购买机构的支付意愿可能是铅包整体质量的函数。据推测,主要由高质量销售线索组成的包装可能会获得较高的价格,而销售线索购买者在不同的资格标准方面可能会有更具体的要求。拥有机器学习模型来预测多个资格标准的线索质量,将使 Valiant 能够很好地包装线索,以满足特定买家的定制要求。例如,Valiant 可以将具有某种预期的转换和交付简易性、盈利潜力等的销售线索打包在一起。

值得注意的是,虽然在人才招聘的背景下,以这种方式包装销售线索可能看起来很新颖,但这种做法在金融和保险等其他行业中实际上相当成熟,在这些行业中,销售线索包是使用复杂的数学模型构建的,以符合某些“风险概况”(例如,“AAA”,“BB”)—Valiant 可能会从这些行业借用一些概念来构建自己的销售线索包。

向客户推销销售线索,向合作机构传递销售线索:

机器学习可以用来帮助 Valiant 向客户推销线索,并以类似的方式将其传递给合作伙伴机构。在这两种情况下,Valiant 都面临着企业对企业(B2B)的交易场景。客户通常会将特定数据科学角色的人员配备外包给 Valiant,并附带特定条件(例如,员工的技能和经验水平、薪资范围、开始日期)。如果 Valiant 推荐了一位最终被录用的候选人,它就能获得佣金,不管 Valiant 在招聘过程中为寻找、审查和指导候选人付出了多少努力。因此,能够预测特定地区和时间范围内人才库的质量可以明确帮助 Valiant 决定是否值得与客户签订合同。与此同时,向合作伙伴机构销售线索意味着将 Valiant 的一些有限资源(招聘人员、预算、时间)从客户工作重新分配给销售线索——只有在特定背景下销售线索的预期价值高于从事客户工作时,这才有战略意义。同样,了解人才库可以帮助 Valiant 决定如何以最佳方式分配资源。

图 3 显示了预测模型如何指导战略性 B2B 交易。横轴根据具有高预测质量的线索的比例( p )来描述所生成的线索的质量(例如,在特定城市和一年中的特定时间)。纵轴显示了给定交易在不同的 p 值下的预期利润。图 3 示出了 Valiant 可能必须在两个示例交易之间进行选择的比较。请注意,尽管在 p 值较低的情况下,交易 1 不如交易 2 有吸引力,但一旦高质量销售线索的比例超过值 p* ,交易 1 就会变得更有吸引力。在其他条件都相同的情况下,如果 Valiant 能够得出 p* 和 p 的值,那么它就有可能做出合理的战略决策,这正是预测性销售线索资格模型的用途。

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

图 3:战略性 B2B 交易(来源:自有插图)

包裹

机器学习可以帮助企业产生更好的线索,以更高的准确性证明它们,并最终更有效地将其货币化。鉴于每个阶段的目标不同,机器学习帮助解决的问题以及解决方案的性能和局限性在三个阶段都有所不同。

值得注意的是,尽管 Valiant 是一家虚构的公司,旨在通过示例来帮助解释机器学习的价值,但 Valiant 在销售线索管理方面面临的问题,以及使用机器学习解决这些问题的机会,都牢牢植根于现实。事实上,Valiant 的案例研究代表了几个类似数据科学项目的某种风格化融合,我和其他人过去都参与过这些项目。除了招聘之外,从金融和保险到旅游和汽车零售的各种行业都可以从更智能和可扩展的领导管理方法中受益匪浅。

最后,虽然越来越有可能购买软件即服务(SaaS)解决方案来进行销售线索管理,但对于公司来说,推动自己的销售线索管理议程仍然很重要。除其他事项外,议程应阐明铅管理的动机(“为什么”),规定 SaaS 系统的成功标准(例如,最低准确度、精确度等)。),并将它们链接回战略 KPI(例如,转换率、利润等)。)这将是公司高管和投资者最关心的问题。

机器学习介绍——面向经理

原文:https://towardsdatascience.com/machine-learning-for-managers-1599a26ca145?source=collection_archive---------35-----------------------

权威指南

机器学习项目成功所需的一切。

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

源作者

构建机器学习解决方案不同于构建通用软件解决方案。监督机器学习项目涉及一些独特的方面和潜在的陷阱。

在本指南中,我们将回顾交付一个成功的机器学习解决方案所需的所有见解。

对于更高层次的概述,也看一看什么是人工智能?首席执行官需要知道的一切人工智能的 4 个关键成功因素

这篇文章是写给谁的?

这篇文章是为那些为大中型企业构建机器学习解决方案的人而写的。如果你想学习机器学习是为了好玩或者获取一般知识,那么自己或者和一个没有经验的团队建立一个概念证明是完全可以的。但我们将假设你的任务是建立一个大规模的机器学习项目,承担真正的风险(如果失败)并产生真正的价值(当成功时)。

什么是机器学习,为什么它很重要?

虽然机器学习可以在许多不同的领域增加巨大的价值,但它也经常被夸大。我们都看过科幻电影,人们可能会很容易认为机器学习是赋予机器人类水平的智能。事实上,虽然机器学习可以在许多方面帮助你,但最好将其视为一种分析数据的专门工具,而不是解决任何问题的灵丹妙药。

什么是机器学习?

机器学习最终是在结构化数据中寻找模式并做出预测。这些可以是(而且经常是)对未来将要发生的事情的预测。但这不是你在机器学习解决方案中找到术语“预测”的唯一方式。通常这也意味着预测一些问题的答案,比如:“这张照片里是哪种狗?”后一种预测不是基于时间的预测(展望未来),而是这样一种预测:“如果问这个特定的问题,一个无所不知的先知会给出什么答案?”

机器学习和传统软件有什么不同?

机器学习也可以认为是“从数据中学习”。传统的软件解决方案是围绕演绎构建的(一个聪明的人确定一组规则,并将它们编码为一系列 if 语句,然后这些规则可以应用于数据),而机器学习解决方案是围绕归纳构建的(机器学习算法通过查看大量示例自动发现规则,然后这些规则可以应用于更多数据)。

传统的软件解决方案是围绕演绎构建的,而机器学习解决方案是围绕归纳构建的。

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

传统编程与机器学习——来源作者

机器学习和 AI 有什么不同?

作为题外话,我们将在整篇文章中使用术语“机器学习”,但在通常的用法中,术语“人工智能”或“AI”经常被代替使用。更详细的讨论见机器学习 vs .人工智能。他们不是同一个

为什么机器学习很重要?

机器学习,尤其是最近的进步,几乎肯定能给你的业务带来新的机会,无论你在哪个领域。机器学习受到如此多关注的原因之一是因为它被用于推动几个看似不相关的领域的突破,包括:

  • 图像处理(比如面部识别);
  • 声音处理(例如,带字幕的自动字幕视频);
  • 文本处理(比如不同自然语言之间的翻译);
  • 时间序列处理(例如预测未来能源使用量);
  • 数字建模(例如,估算一栋房子的合理价格,或者某个特定客户购买某种产品的概率)。

这些领域中的每一个都扩展到更多的子领域(例如,我们用于面部识别的相同算法也可以在 X 射线中检测癌症),更重要的是,非常相似的算法可以用于所有这些领域,这意味着一个算法的进步可以导致许多领域的进步。这适用于几乎每一个领域,包括医药营销金融,以及交易

这些领域中的机器学习都是由巨大的(并且不断增长的)数据集实现的。机器学习的改进释放了这些数据的更多价值,因此数据本身变得更有价值。随着对数据的更多关注,机器学习模型会进一步改进,从而形成良性循环。

机器学习是否很适合你的公司和项目?

机器学习有如此大的潜力,几乎每个公司都想使用它。但这并不意味着它总是一个好主意。

作为一名业务经理,你会面临两种风险:

  • 迫使机器学习成为一种解决方案,在这种情况下,它不能增加价值,以努力保持现代化和相关性;
  • 未能在解决方案中利用机器学习,而 it 增加价值。

虽然每种情况都是独特的,但关于机器学习是否对你的公司或项目有益,还是有一些好的经验法则。

机器学习解决方案可能非常适合的常见迹象。

  • 你依靠人工来完成看似重复的任务。这些“重复性”任务通常没有完全定义,也不像看起来那样重复。例如,如果你雇佣一些人来撰写销售电子邮件或处理支持案例,机器学习解决方案可能能够帮助他们提高效率,但它无法取代他们,因为他们的许多任务都依赖于同情心和创造力。
  • 你期望收集大量数据。团队抢先实施机器学习是很常见的,因为他们希望他们的应用程序一旦成功就能处理大数据。在这些情况下,最好先集中精力收集和组织数据,手动获得洞察力,然后在稍后阶段考虑机器学习**。**

机器学习解决方案可能不适合的常见迹象。

请记住,这些只是指导方针。几乎每个公司都能在某个地方找到机器学习用例。问题是你现在是否需要机器学习,投资回报率(ROI)会是多少。如果您的公司仍然很小,或者您只有一点点数据,您可能会从手动分析数据中获得更大的投资回报。但如果不是,机器学习很可能会帮你创造价值。

在生产中运行的机器学习解决方案实际上是什么样子的?

花 2-3 周时间拼凑一个 PoC(概念验证)可能很有诱惑力:一个可以接受你的公司拥有的一些数据并产生一些潜在有用的预测的模型。有数以百万计的教程向您展示如何使用一些标准库,用几行代码实现这一点,并且很容易认为生产您的模型会很容易。不会的。虽然许多人可能认为创建第一个模型会让他们走完 80%的机器学习解决方案之路,但之前构建和生产过机器学习解决方案的人会知道,PoC 更接近于旅程的 10%

  • 数据:用于发现已有模式,建立模型;
  • 代码:用于定义和服务模型,并与其他服务集成;
  • 模型:用于生成预测。

所有机器学习解决方案都可以大致分为三个概念:

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

机器学习解决方案:概念验证与生产-来源作者

在比较 PoC 和生产解决方案时,这三者看起来非常不同。

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

ML 解决方案中只有一小部分是真正的机器学习代码。-来源作者

生产解决方案也有更多的活动部分。概念验证通常涉及构建一个简单的模型,并验证它是否能够生成通过快速健全检查的预测。一切都可以在同一台机器上完成。相比之下,这只是生产流程的第一部分。在生产阶段,你需要一个强大的培训服务器和一个跟踪不同模型的良好流程。在将训练好的模型与您现有的生产服务集成之前,您需要一种方法来测试它们,大规模地执行推理,并监控一切以确保它们都是可靠的。最后,您将多次迭代这个过程,因为您可以改进数据、代码或模型组件。

你需要什么样的团队来生产机器学习解决方案?

当你在建立一个机器学习团队时,雇佣有学术背景的研究人员是很有诱惑力的。如果他们发明了新的机器学习算法,他们一定是使用这些算法的最佳人选,对吗?不总是。

雇用一名研究人员为你构建一个机器学习解决方案,通常就像雇用一名设计凯膳怡电器的人为你做饭一样。虽然研究人员提出了解决问题的新方法,并具有深厚的理论专业知识,但他们在使用现有工具、遵循良好的工程实践以及做出困难的时间/质量权衡方面往往缺乏更多的实践专业知识。

雇用一名研究人员为你构建一个机器学习解决方案,通常就像雇用一名设计凯膳怡电器的人为你做饭一样。

通常情况下,你希望有人能够使用现有的机器学习算法和工具——就像厨师使用标准食材和厨房电器熟练地拼凑出美味的一餐——而不是从头开始设计新工具。

术语仍然不完全一致,但你通常会找到至少一名机器学习工程师——专门为企业构建机器学习解决方案的人。

应该找还是建立一个机器学习团队?

你需要做出的主要选择是建立自己的机器学习团队还是聘请咨询公司。建立自己的团队可能需要很多年,如果你不需要立即看到结果,并且如果你希望机器学习成为你和你的竞争对手之间的关键区分因素,这可能是唯一正确的选择。

如果你建立了一个团队,你也可以选择提升现有员工的技能,而不是雇佣新员工。在这种情况下,您可能想知道是向您的数学家传授工程技能,还是向您的工程师传授数学和统计技能。无论哪种方式,这都是一个困难的飞跃,但一个好的工程师通常可以在大约 2 年内学到足够的数学和统计学知识(特别是如果他们已经有一些基础背景的话),成为一个伟大的机器学习工程师,而统计学家通常需要更长的时间来掌握所有的工程背景和所需的工具集(通常在 5 年左右)。

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

有效的机器学习团队应该是什么样子——来源作者

一个好的机器学习团队不仅仅依靠机器学习工程方面的专业知识。软件工程、DevOps 和管理方面的专业知识同样重要,常见的结构可能如下所示:

数据营收,我们团队的每个人都是机器学习工程师。这使我们比那些将机器学习视为达到目的的手段而不是目的本身的公司更有优势。但我们仍然花了 2 年的时间反复试验,建立了一个优秀的团队,花了 4 年时间,我们才完全相信我们招聘机器学习工程师的过程(我们现在每 150 名合格的申请人中就有 1 人被聘用)。

如果你认为人工智能是帮助你超越竞争对手的主要因素,那么建立一个团队是有意义的。如果机器学习只是让你达到顶峰的一部分,那么引入外部专家可能会更好。

但是雇佣中介也有风险,尤其是如果你雇佣了错误的中介。所以你需要知道如何选择机器学习咨询公司

机器学习项目的理想结构是什么?

仅仅构建机器学习解决方案的技术部分本身就具有挑战性。组织好整个项目需要商业和技术技能的罕见结合,在你开始之前,你会想好一个好的工作流程的所有不同阶段。

规划一个机器学习项目最重要的事情之一就是考虑到生产进行规划。如果你的目标是概念验证,那么这就是你将得到的。虽然这是一个好的开始,但是您希望从事 PoC 工作的人员不断地优先考虑投入生产的目标。

PoC 和生产之间的一个很好的中间阶段是试生产阶段。这看起来几乎完全像一个生产解决方案,但它可能在范围、面向多少用户或使用多少数据方面受到限制。

从一开始,你就应该仔细构建研究和实验阶段的结构和时间表。重要的是,每个人都知道目标是:“x 天内我们能得到的最好的模型是什么?”而不是“我们能得到的最好的模型是什么?”否则,你将永远陷入“再做一次实验”的怪圈。

弄清楚闪亮的新机器学习解决方案将会影响到公司的哪些内部和外部部门也是至关重要的。如果你要替换另一个团队开发的非机器学习解决方案,请记住,他们可能会依赖他们的方法。“此处未开发”是一个很难跨越的障碍,无论是在您公司内部的团队之间,还是在外部团队和您的团队之间。

在你开始建造之前,确保你的模型可以缩放。通常,一个解决方案在 PoC 甚至是试点阶段都工作得很好,但是机器学习解决方案具有密集和独特的资源需求,如果没有适当的规划,它很容易淹没您的基础架构。确保您的解决方案足够高效,可以扩展到在您的完整数据集上进行培训,并处理您希望它上线后收到的请求数量。

在更高的层面上,确保你在开始之前已经考虑了我们的机器学习项目清单中的一切。

为什么你仍然可能失败:常见的陷阱

  • **人们可能不信任你的模型:**即使你的模型产生了非常准确的预测,如果你不能解释你是如何得到答案的,也很难赢得你的团队和你的客户的信任。在你致力于机器学习解决方案之前,你应该理解任何关于可解释性和可解释性的硬性要求。在某些领域,比如药理学,可解释性也可能是一个法律要求。
  • 你可能会构建一个不可维护的解决方案:仅仅有一个现在可以工作的模型是不够的。您的解决方案需要维护、更新和修复。您将需要一个良好的管道来将模型、代码和数据的更改引入到未来的生产中,否则您将会得到一个今天有效明天无效的模型,并且在您的需求发生变化时无法修复。拥有一个已经犯过这些错误并从中吸取教训的有经验的团队是避免这种情况的好方法。
  • 你的模型可能过于复杂:即使你的模型产生正确的结果,在构建机器学习解决方案的所有工作完成之后发现一个更简单的解决方案也是令人惊讶的。例如,您的研究可能会发现,您可以通过查看一年前同一天的价格来预测价格。因此,在您构建任何模型之前,您应该首先创建最合理的基线,并在项目期间将其用作基准测试。
  • **你的模型可能会伤害或威胁某个特定的业务部门:**虽然机器学习通常会增强而不是取代人类的才能,但在某些情况下,人们可能会将你的解决方案视为对他们工作的威胁。例如,一个金融专业人员的整个职业生涯可能围绕着寻找数据模式,也许你的模型自动化了其中的每一个方面。坦率地说出你的模型的目标是什么,以及它是否会影响你公司现有的角色。与你的团队讨论他们的角色可能会如何改变,以及使用 ML 来完成一些更单调乏味的任务如何能让他们专注于算法不能做的事情。
  • **外部因素可能会发生变化:**机器学习解决方案自然对它们接受训练的数据非常敏感。如果外部事件意味着当前数据与历史数据非常不同,您可能会看到模型的可靠性急剧下降。例如,根据 2019 年 4 月的时态数据训练的模型在 2020 年 4 月可能非常不准确,因为新冠肺炎危机打破了许多模式和预期。
  • **你的模型可能会显示偏差:**在机器学习训练的数据中存在人类偏差是很常见的。例如,美国司法程序中用来决定提前释放哪些囚犯的 COMPAS 系统被发现有明显的种族偏见。如果你的机器学习解决方案存在偏见,尽早发现这一点是至关重要的,而不是在项目投入生产后就关闭整个项目。

我们已经提到了陷入 PoC 阶段的危险,有错误的团队,或者当机器学习不适合特定问题时使用机器学习。但是在前进之前,您应该知道更多潜在的陷阱:

构建机器学习解决方案肯定是一项艰巨的任务!我们希望你读完这篇文章后会对此更有信心。

【https://www.datarevenue.com】最初发表于

新生儿重症监护的机器学习

原文:https://towardsdatascience.com/machine-learning-for-neonatal-intensive-care-15b3874da1f6?source=collection_archive---------43-----------------------

告知最困难的决定

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

Unsplash 上的 Hush Naidoo 拍摄的照片

一个微小的新人类被机器和传感器包围着。一位医生担忧地看着。她知道几率。

29%

23 周出生婴儿的存活率。她把想法放在一边,做她能做的事。

NICU 内部

新生儿重症监护病房(NICU) 是一个做出改变人生决定的环境。新生儿学家使用各种来源的信息来构建新生儿的状况图,以确保他们得到正确的医疗护理。这些训练有素的专家根据源源不断的患者数据做出判断,以确保尽可能多的婴儿能够随父母回家。

正确解读这些海量数据并确定适当的护理是一项极其困难的任务。然而,机器学习正被用来识别和开发可以增强这些决策过程的方法。在这个最重要的领域,机器学习被应用于改善患者结果的方式有四种。

预测出生窒息

当婴儿在分娩过程之前、之中或之后缺氧时,就会发生出生窒息,这是五岁以下儿童死亡的第五大原因。它与同样大量的死产有关,并且由于由此导致的器官损伤,经常会导致长期残疾和损伤。

在设备齐全的医院,这种情况的诊断是通过观察血液中的酸水平,使用试探法,如阿普加试验,并通常寻找其他神经问题或呼吸窘迫的迹象。尽管有这些程序,症状可能并不总是立即明显,直到为时已晚。特别是,某些发展中国家的医院可能不具备能够进行常规决定性测试的设备或基础设施。

乌本瓦 是一款移动应用,使用语音识别领域的技术来检测新生儿哭声中出生窒息的早期迹象。2015 年,Charles Onu 开发了一个原型基于支持向量机的机器学习模型,它可以在实验室环境中以 89%的准确率对已知窒息婴儿的记录进行正确分类。2017 年,查尔斯和他的团队将这个模型构建成了一个原型移动应用,有可能成为一个广泛可用的工具,可以部署到资源匮乏的环境中。

一个主要障碍是缺乏窒息婴儿的临床注释数据(即哭声记录)。查尔斯和乌本瓦大学的其他人最近探索了一个想法,即迁移学习可以用来应用从成人言语中习得的表征,以克服训练数据的缺乏。

检测癫痫发作

新生儿癫痫发作是一种需要紧急护理的严重疾病——如果癫痫发作未被发现和治疗,可能会导致脑损伤甚至死亡。与较大的儿童和成人不同,婴儿的癫痫症状在临床上并不总是可见的,这使得他们很难被发现。

唯一可靠的检测方法是通过脑电图或 EEG 监测大脑的电活动——但这些信号是不断产生的,通常需要训练有素的专业人员来正确解释输出。

在 2011 年, Temko 等人发表了一篇论文,他们在论文中训练了另一个基于支持向量机的模型,将脑电图活动片段分类为癫痫发作/非癫痫发作事件。他们的模型能够在测试脑电图数据中检测到高达 100%的癫痫事件——尽管有一些假阳性结果。然而,该模型的灵敏度可以根据可以容忍的假阳性的数量来调整。调整到没有假阳性指示的水平,该模型仍然能够检测超过 50%的癫痫发作,这仍然是一个重要的和有希望的成就。

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

莎伦·麦卡琴在 Unsplash 上的照片

脓毒症的早期识别

当身体对感染反应过度,随后的免疫反应开始对身体自身的器官和组织造成损害时,就会发生脓毒症。这种情况与高死亡率有关,并且可能是如此具有破坏性,以至于被认为有风险的新生儿通常被尽快给予抗生素,直到败血症被排除。相对较少的足月儿(不是早产的婴儿)会受到败血症的影响,但是早产儿的风险要高得多。三分之一的极早产儿(出生时胎龄小于 28 周)在重症监护期间会发生败血症。
早期诊断对于最大限度地提高良好临床结果和恢复的机会至关重要,但诊断脓毒症的困难在于其迹象是非特异性的——也就是说,许多其他疾病和状况都可能产生类似的症状。

2019 年, Masino 等人 开始研究机器学习模型是否可以用来在婴儿败血症被临床怀疑前四小时识别它。他们在 30 个特征上训练了 8 个不同的机器学习模型,这些特征是在领域专业知识的帮助下选择的。从婴儿身上收集的这些特征包括生命体征、临床评估结果以及从各种实验室程序(如血液测试)中获得的值。发现八个模型中的六个表现良好,实现了 0.85-0.87 的 AUC。进一步的研究正在进行中,以确定这些模型是否可以在试验中提高临床效率。

预测呼吸窘迫综合征

新生儿呼吸窘迫综合征(NRDS)是生命第一个月死亡的主要原因之一。即使在发达国家,死亡率也可能高达 60 %( T10 ),而且很大一部分存活下来的婴儿仍然会发展成改变生活的障碍。 NRDS 发生在 10%的早产儿身上,通常发生在婴儿尚未产生足够的肺部所需物质来防止气道塌陷的时候。在严重的情况下,需要机械通气。

2016 年,数字诊断公司 SIME Dx 宣布,它已经开发出一种测试,可以准确预测哪些婴儿有患呼吸窘迫综合征的风险。这项测试利用了一种装置,该装置使一束红外光穿过胃液样本——一种通常从出生婴儿身上采集的物质。一个独特的签名产生了,然后通过管道进入 SIME 的人工智能工具,以高度的灵敏度预测 NRDS。反过来,这使医生能够判断哪些婴儿需要治疗,哪些不需要,确保及时护理,减少不必要的程序。2018 年,SIME 宣布了一种完全自动化测试的新设备,目前正在商业化的道路上。

结论

看到一个戴着呼吸机的小婴儿,人们不禁感到一阵激动,也许还有一种宇宙不公平感。除了我们保护和支持孩子的进化本能,每一个新生命都伴随着一种更深刻的价值感。那双不可思议的明亮而好奇的眼睛是一个光圈,背后隐藏着难以想象的无价潜力。一套独特的想法和观点将会改变世界。每一个不能被拯救的婴儿都是全人类的损失。

如果我们能提高 NICU 婴儿的存活率——哪怕只有一个百分点——谁知道会带来什么新的想法和观点。机器学习和人工智能可以帮助我们释放这种潜在的人类潜力,一次一个模型。

更多信息和积分

Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。

  • LinkedIn 上与我联系。
  • 在 andrewhetherington.com 查看我的网站。
  • 看看我在 GitHub 上摆弄什么。

图片:婴儿在保育箱里,由 Hush Naidoo 拍摄。戴着氧气面罩的婴儿。

科学废物管理的机器学习

原文:https://towardsdatascience.com/machine-learning-for-scientific-waste-management-a27e7c561d64?source=collection_archive---------55-----------------------

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

喀拉拉邦——上帝自己的国家(照片由 Avin CPUnsplash 上拍摄)

顶点案例研究

了解 ML 如何帮助防止气候变化和保护社区健康

T 他的案例研究是通过 Coursera 完成的 IBM 应用数据科学顶点项目的一部分。本研究的目的是为印度南部喀拉拉邦的高知市列举合适的城市垃圾管理地点。我选择高知市进行这个案例研究,不仅是因为它是我的故乡,而且高知市过去和现在都在努力有效地管理城市垃圾。

高知市——概述

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

高知湖(来源:照片由 Unsplash 上的 gaurav kumar 拍摄)

高知市(有时称为科钦市)是一个港口城市,至少有 600 年的贸易历史,主要是与中国、欧洲和阿拉伯商人,这使该市成为喀拉拉邦的金融中心。举几个例子,科钦证券交易所——喀拉拉邦唯一的证券交易所,国际集装箱转运站,造船工业,信息园——政府经营的信息技术园,露露购物中心——亚洲最大的购物中心证明了高知市的经济重要性[1]。高知市不仅是一个理想的商业场所,而且还提供负担得起的住房选择。高知也是一个旅游景点,吸引了来自世界各地的游客。所以基本上高知市都是限量版的全合一套餐。

废物管理危机

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

高知市雅鲁藏布江废物管理设施(来源:[5])

高知市每天产生约 380 吨垃圾,其中 150 吨可生物降解,其余为塑料垃圾[2]。目前,城市垃圾被送往雅鲁藏布江垃圾管理设施进行处理。从这个工厂建立之初,公众、环保主义者的抱怨和担忧就成了报纸上反对工厂选址和工厂选址方式的头条新闻。许多居民被政府带着补偿金迁移了。河水污染,因为该工厂与两条淡水河流接壤,而且由于选择废物管理工厂的位置时采用了不科学的方法,工厂的生命遭到了破坏。目前的工厂位置已经让雅鲁藏布江居民的生活变得悲惨——来自食物垃圾的令人作呕的恶臭和令人讨厌的家蝇和蚊子。此外,用于处理的输入废物是可生物降解的和塑料废物的混合物,并且可生物降解的材料在户外分解,因为据报道在工厂中的处理过程缓慢,这导致另一个恐怖——气候变化,因为可生物降解的材料正在分解,从而释放出甲烷,一种温室气体。此外,巨大的火灾越来越频繁,有毒气体扩散到整个城市,扰乱城市生活数日[3]。

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

雅鲁藏布江发生火灾(来源:《印度时报》)

由于这一事实,市政当局已经暂停从家庭收集垃圾,直到找到合适的解决方案。喀拉拉邦污染控制委员会进行了一项关于城市垃圾管理的研究,报告称垃圾发电不是解决高知市垃圾管理危机的经济有效的解决方案[4]。由于高知正在增长,每天产生的垃圾也在增加。布拉马普拉姆设施目前超负荷运转,因为除了商业和住宅废物之外,还必须容纳医疗废物,这使危机进一步复杂化。即使找到了管理城市垃圾的理想解决方案,工厂目前的位置对地下水储备以及流经的两条河流的质量构成了严重威胁。目前的工厂位置是一场灾难,将影响高知居民的生活以及高知的经济健康。

案例研究路线图

有几份报告和关切涉及在雅鲁藏布江最终确定当前城市废物管理设施的位置时采用的不科学方法。[5]

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

雅鲁藏布江的人们在工厂建成后逃离家园(来源:参考文献[2])

确定当前工厂位置的谬误的一个重要证据是它靠近高知自己的 IT 园区 InfoPark,离工厂只有 5 公里。另一个证据是,该地区是沼泽,地下水渗透废物分解的化学副产品的风险。所有这些问题促使我寻找一个理想的厂址来建立一个新的废物处理厂——一个不会损害自然和社会的工厂。然后下一个问题来了,怎么做?

这个想法是找到世界上最干净的城市,并在选择的城市中模拟该城市的垃圾管理设施的位置/邻近区域。在这里,我使用的逻辑是——如果有一个清洁的城市,那么它就有一个高效的废物管理设施,背后将有强大和成功的管理实践,这些管理实践将受到强大的环保和社会承诺的规则和政策的约束。因此,模拟这种废物管理设施的位置将等同于模拟那些非常成功的规则和政策。然后,我去打猎,发现加拿大的卡尔加里市是世界上最干净的城市之一,我选择它是因为卡尔加里市一直在世界上最干净的 10 个城市中占有一席之地。

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

卡尔加里市(来源:drpukka/Instagram)

卡尔加里市有两个商业废物管理设施,我选择了其中的一个,只是通过方便取样——东卡尔加里设施。然后,是时候用数学方法来表示东卡尔加里工厂了。这个问题的答案是,Foursquare API。它为全球数百万个场馆提供位置数据。使用 Foursquare API,获得了东卡尔加里设施 5000 米范围内的场馆,并使用场馆类别生成了东卡尔加里设施的向量。现在,要模拟的参考位置已准备就绪,是时候获取感兴趣的城市高知市所在的 Ernakulam 区的社区列表了。这些社区中的一些将被选为建立新的废物管理工厂的最佳选择。使用 BeautifulSoup 的 Webscraping 提取 Ernakulam 的所有邻居列表,使用 Geopy 提取所有这些邻居的地理位置数据。然后,就像东卡尔加里设施一样,Ernakulam 的每个街区都被表示为一个场地类别向量。然后是最后的预处理阶段——确保东卡尔加里社区和 Ernakulam 社区通过相同的场所类别来表示。用外行人的话来说,我确保所有的社区都在相同的基础上进行比较!

预处理后,东卡尔加里设施点矢量被合并到包含 Ernakulam 邻域的数据帧中,这就是我们的聚类数据集。

下一步是对邻域进行 K-均值聚类,并分割出不同的邻域,但在此之前,要进行肘形曲线分析,以确定最佳聚类数。有了最佳的聚类数,K-Means 被执行,并且我们的理想邻域(即东卡尔加里设施的邻域)被确定,并且 Ernakulam 的邻域属于相同的聚类。邻里模拟的最初部分已经结束。考虑到雅鲁藏布江现有废物管理设施的缺陷,我们对聚类后获得的 Ernakulam 社区列表进行了第二级细化。

最后结局

网络搜集和地理定位数据采集产生了 45 个基于邮政编码的 Ernakulam 社区。预处理阶段将邻域减少到 32 个。这样聚类数据集就准备好了,肘曲线分析表明聚类的最佳数量是 4。

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

获取最佳聚类数的肘形曲线分析

K-means 聚类在下面的可视化中进行了描述:

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

邻域聚类的可视化。蓝圈是高知中心,大头针标记是雅鲁藏布江废物管理设施

Ernakulam 有 16 个社区与东卡尔加里设施属于同一个集群。

但是,作为最后一步,考虑到雅鲁藏布江现有设施的一个重要缺点——靠近水体,我决定过滤掉获得的 Ernakulam 邻域。这一过滤过程进一步将选择的数量减少到 7 个(Palarivattom、Kaloor、Ernakulam North、Thammanam、Kadavanthra、Panampilly Nagar 和 Vyttila 是选择),如下图所示:

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

结论

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

高知回水邮轮旅游(来源)

长期以来,高知市在废物管理方面正经历着一场重大危机,这项研究提出了 7 个适合使用机器学习科学地建立新工厂的地点。现在,城市管理人员可以评估这些建议,并从中找出最佳点,从而加快城市管理,减少决策失误。由于模拟了世界上最干净的城市之一的垃圾管理设施,城市管理者可以使用卡尔加里市的垃圾管理政策和规则,并根据高知市的要求进行一些调整。因此,所有这些决定将使废物管理过程更加有效,从而可以防止废物在设施中堆积,从而最大限度地减少由此产生的甲烷排放量——这是对联合国可持续发展目标(目标 11) [7]的一种贡献。使用这种方法可以缓解严重的公共健康问题,如由于雨水停滞导致的疟疾等流行病,以及由于工厂位置不科学导致的肺部或皮肤疾病。本研究未考虑地理、政治和社区行为差异,考虑这些变量后,结果可能会有所不同。未来可能的扩展包括:基于密度的空间聚类应用研究(DBSCAN)、环境热点或人口密度变量包含、不同地理定位数据供应商的使用。这个项目的另一个优点是,它可以适用于政府和企业的目的,以及无论州或国家。

参考

  1. 高知经济
  2. 布拉马普拉姆邦火灾频发
  3. 高知废物管理危机
  4. 雅鲁藏布江的垃圾发电不划算
  5. 公众对雅鲁藏布江电站的担忧
  6. 全球十大最干净城市
  7. 联合国可持续发展目标

用于股票预测的机器学习。定量方法

原文:https://towardsdatascience.com/machine-learning-for-stock-prediction-a-quantitative-approach-4ca98c0bfb8c?source=collection_archive---------4-----------------------

训练用于股票价格预测的多个模型并分析它们的结果

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

马库斯·斯皮斯克在 Unsplash 上的照片

使用机器学习来预测股价可能具有挑战性,而可能很难。模拟股票价格的动态可能很难,在某些情况下,甚至是不可能的。

在本文中,我将介绍一些使用机器学习预测股票价格的技术。我们将看到一些模型的运行,它们的性能以及如何改进它们。所有的计算都将使用著名的 Pandas、NumPy 和 Scikit-learn 库在 Python 中完成。

数据准备

对于这个例子,我将使用微软过去 10 年的每日股票价格,从雅虎财经下载 CSV 格式。除了交易量之外,该数据集还包括最高价、最低价、开盘价和调整后的收盘价。

首先,让我们加载数据集。为了简单起见,我将用“调整后收盘价”来代替“收盘价”。

df = pd.read_csv("MSFT.csv",index_col=0)df['Close'] = df['Adj Close']
df = df.drop("Adj Close",axis=1)

生成输入要素

价格本身不足以产生有用的预测。对于本例,我将添加以下指示器,它们将用作我们模型的输入:

  • 移动平均线(最近 N 天的平均价格)
  • 布林线(移动平均线加上或减去一定量的标准差)
  • 唐奇安通道(过去 N 天的滚动最高价和最低价)

我们再加上周期为 5,10,20,50,100 200 的简单均线

for sma_period in [5,10,20,50,100,200]:
    indicator_name = "SMA_%d" % (sma_period)
    df[indicator_name] = df['Close'].rolling(sma_period).mean()

现在让我们添加布林线,设置如下:

  • 20 个周期,2 个标准差
  • 20 个周期,1 个标准差
  • 10 个周期,1 个标准差
  • 10 个周期,2 个标准差
df['BollingerBand_Up_20_2'] = df['Close'].rolling(20).mean() + 2*df['Close'].rolling(20).std()df['BollingerBand_Down_20_2'] = df['Close'].rolling(20).mean() - 2*df['Close'].rolling(20).std()df['BollingerBand_Up_20_1'] = df['Close'].rolling(20).mean() + df['Close'].rolling(20).std()df['BollingerBand_Down_20_1'] = df['Close'].rolling(20).mean() - df['Close'].rolling(20).std()df['BollingerBand_Up_10_1'] = df['Close'].rolling(10).mean() + df['Close'].rolling(10).std()df['BollingerBand_Down_10_1'] = df['Close'].rolling(10).mean() - df['Close'].rolling(10).std()df['BollingerBand_Up_10_2'] = df['Close'].rolling(10).mean() + 2*df['Close'].rolling(10).std()df['BollingerBand_Down_10_2'] = df['Close'].rolling(10).mean() - 2*df['Close'].rolling(10).std()

最后,让我们加上均线周期相同的唐契安通道。

for channel_period in [5,10,20,50,100,200]:
    up_name = "Donchian_Channel_Up_%d" % (channel_period)
    down_name = "Donchian_Channel_Down_%d" % (channel_period)

    df[up_name] = df['High'].rolling(channel_period).max()
    df[down_name] = df['Low'].rolling(channel_period).min()

现在我们想在的几个时间滞后中使用所有这些功能(即最后一天、最后两天等等),所以我们需要全部延迟一些时间。对于本例,我们将把它们从 1 天改为 10 天。

newdata = df['Close'].to_frame()
for lag in [1,2,3,4,5,6,7,8,9,10]:
    shift = lag
    shifted = df.shift(shift)
    shifted.columns = [str.format("%s_shifted_by_%d" % (column ,shift)) for column in shifted.columns]
    newdata = pd.concat((newdata,shifted),axis=1)

看一下数据集,我们现在会注意到像 SMA _ 5 _ shifted _ by _ 3 这样的特征。意思是“前 3 天计算的 5 期移动平均线”。

最后,我们将创建目标变量,这是我们希望预测的数字。对于这个例子,假设我们想预测未来 5 天的收盘价。

forward_lag = 5newdata['target'] = newdata['Close'].shift(-forward_lag)
newdata = newdata.drop('Close',axis=1)newdata = newdata.dropna()

我们现在有了大量的数据(2302 行× 311 列),如下图所示。

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

在训练集和测试集中拆分

像往常一样,我们将把数据集分成训练测试集。训练集将用于训练我们的模型并调整超参数,而测试集将仅用于性能计算。

随机执行分割**。**

X = newdata.drop("target",axis=1)
Y = newdata['target']X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)

特征选择

310 个特性是一个很大的数字。只拿最重要的非常有用。对于本例,我们将根据每个特征和目标的皮尔逊相关系数的绝对值对特征进行排序。这个想法是只选择与目标最相关的 50 个特征。

correlations = np.abs(X_train.corrwith(y_train))features =  list(correlations.sort_values(ascending=False)[0:50].index)X_train = X_train[features]
X_test = X_test[features]

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

现在我们可以从模型开始。

线性回归

先说有史以来最简单的回归模型,那就是线性回归**。**

首先,我们将训练模特。

lr = LinearRegression()lr.fit(X_train,y_train)

然后我们计算模型的预测**。**

y_pred = lr.predict(X_test)

预测可以与真实测试集数据进行比较,以计算预测误差**。对于这个例子,我将使用平均绝对误差。**

mean_absolute_error(y_test,y_pred)

误差为 1.325

我们最终可以绘制测试集的真实值预测值来检查它们是否位于穿过 0 的 45°线上

plt.scatter(y_test,y_pred)
plt.xlabel("Real")
plt.ylabel("Predicted")
plt.title("Linear regression")plt.show()

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

如你所见,真实值和预测值非常相似。

随机森林

下一个模型是来自 sklearn 库的随机森林回归器**。**

由于随机森林模型有许多超参数**,通过随机搜索微调它们是有用的。我们要调整的超参数是树的数量特征的数量。**

我们将使用 5 重交叉验证执行 20 步随机搜索,计算每重的平均绝对误差,然后在 5 重中取平均值。最小化误差(即最大化带负号的误差)的超参数值是最佳值。

rf = RandomizedSearchCV(RandomForestRegressor(),
param_distributions =  {
                  'n_estimators':np.arange(10,500,5),
                  'max_features':np.arange(1,10,1)
               },
                  cv=5, n_iter = 20,
                  iid=False,random_state=0,refit=True,
                  scoring="neg_mean_absolute_error")rf.fit(X_train,y_train)

超参数的最佳值是:

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

用用于线性回归的相同代码计算的平均绝对误差是 0.868

这是散点图。

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

随机森林显示出比线性回归更低的误差。

梯度推进树回归器

我们现在可以尝试使用梯度推进树回归器**,它使用推进技术来提高模型精度。**

我们仍然有两个超参数**,它们是在提升序列中使用的树的数量和特征的最大数量。**

gb = RandomizedSearchCV(GradientBoostingRegressor(),
param_distributions =  {
               'n_estimators':np.arange(10,500,5),
               'max_features':np.arange(1,10,1)
            },
          cv=5, n_iter = 20,
          iid=False,random_state=0,refit=True,
          scoring="neg_mean_absolute_error")gb.fit(X_train,y_train)

超参数的最佳值是:

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

平均绝对误差为 0.916,下面是散点图。

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

GBR 是一个很好的模型,但有一个略高于随机森林的误差。

k 个最近邻居

KNN 在许多应用程序中是一个非常强大模型,我们将在这个例子中使用它。我们将最近邻从 1 更改为 20,并将评分公式从“统一”(每个邻居都具有相同的权重)更改为“距离”(每个邻居都由它与输入向量之间的距离的倒数进行加权)。

由于这个超参数空间非常小,我们可以很容易地使用网格搜索来代替随机搜索。

knn = GridSearchCV(KNeighborsRegressor(),
param_grid =  {
            'n_neighbors':np.arange(1,20,1),
            'weights':['distance','uniform']
            },
          cv=5, 
          iid=False,refit=True,
          scoring="neg_mean_absolute_error")knn.fit(X_train,y_train)

最佳值是:

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

平均绝对误差为 0.830,这是散点图。

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

到目前为止,这是产生最低误差的模型。

神经网络

我们将使用单层人工神经网络完成我们的模型搜索,该网络具有 5000 个最大历元、自适应学习速率,并使用随机梯度下降优化算法。

我们的超参数是隐藏层的神经元的数量(我们将从 1 到 50 跨越)和它们的激活函数(T21)的数量(将跨越逻辑和逻辑)。

在将训练数据交给人工神经网络之前,我们必须对它们进行缩放**。我们将使用最小最大缩放器将每个特征缩放到0–1 区间。**

scaler = MinMaxScaler()scaler.fit(X_train)nnet = RandomizedSearchCV(MLPRegressor(max_iter=5000,learning_rate = 'adaptive',solver='sgd'),
param_distributions =  {
     'hidden_layer_sizes':[(x,) for x in np.arange(1,50,1)],
     'activation':['logistic','relu']
},
cv=5, n_iter = 20,
iid=False,random_state=0,refit=True,
scoring="neg_mean_absolute_error")

这些是最好的价值:

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

平均绝对误差为 1.407,这是散点图。

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

KNN 是量子交易的圣杯吗?不全是

到目前为止,一切似乎都在告诉我们,KNN 是最强大的模特。事实上,并非如此。

一切都取决于我们如何执行培训/测试分割**。如果我们随机分割记录,测试集中的一些记录可能非常接近训练集中的其他记录。这就是为什么 KNN 和树工作得很好。**

如果我们把前 70%** 的数据作为训练,把后 30% 的数据作为测试,会怎么样?测试记录现在与训练记录不同,所以事情会发生巨大的变化。**

我们可以通过下面的代码来执行这种分割,它替换了前面的 train_test_split 代码

X = newdata.drop("target",axis=1)
Y = newdata['target']train_size = int(X.shape[0]*0.7)X_train = X[0:train_size]
y_train = Y[0:train_size]X_test = X[train_size:]
y_test = Y[train_size:]

我们现在可以重复每个型号的培训程序。在计算误差之前,让我们看一下散点图。

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

很明显,KNN 和树现在表现很差。线性回归和神经网络仍然抵制。****

以下是每个模型的平均绝对误差:

  • 线性回归:2.379
  • 随机森林:42.591
  • 梯度推进回归量:42.594
  • k 最近邻:42.885
  • 神经网络:2.366

现在最好的模型是神经网络

发生了什么事?

请记住,我们正在使用经典的机器学习方法来模拟一种现象,这实际上是一个时间序列。记录并非完全互不相关,因此随机训练/测试分割可能是错误的。这就是为什么交易系统通常是以历史数据的第一部分作为训练集,只有最近的数据作为测试集。

此外,KNN 和树只能预测与它们被训练的输出相似的输出。线性回归和神经网络是参数公式,因此一旦参数已经通过训练过程固定,它们可以无限制地预测任何可能的值。

股票价格可以从 0 变到无穷大,这就是为什么我们需要一个数学模型而不是拓扑或几何模型。

提高线性回归的性能

我们都喜欢神经网络,但让我们面对一个简单的事实:在这个例子中,ANN 的表现比线性回归略好。这不是一个戏剧性的性能改进。

我认为当模型是简单的时候,机器学习会更有效。这就是为什么,为了这个目的,我宁愿选择线性回归

有没有办法让提升的性能?当然可以。

还记得随机森林和梯度推进回归器吗?它们的预测能力依赖于装袋助推技术。前者创建多个训练数据集重新采样原始记录并随机选择特征子集,而后者创建一系列模型,从之前的错误中学习

使用 sklearn 的 BaggingRegressorAdaBoostRegressor 模块,这些技术可适用于任何型号。

为了将 Bagging 应用于线性回归,我们将使用下面的代码。它对模型的数量和特征的数量执行超参数优化。

**lr_bag = RandomizedSearchCV(BaggingRegressor(LinearRegression()),
param_distributions =  {
               'n_estimators':np.arange(10,500,5),
               'max_features':np.arange(1,10,1)
          },
          cv=5, n_iter = 20,
          iid=False,random_state=0,refit=True,
          scoring="neg_mean_absolute_error")lr_bag.fit(X_train,y_train)**

最佳值是:

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

平均绝对误差为 2.343,下面是散点图。

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

最后,我们可以使用 Boosting 技术优化模型的数量(我们可以使用简单的网格搜索,因为我们只有一个超参数)。

代码如下:

**lr_boost = GridSearchCV(AdaBoostRegressor(LinearRegression()),
param_grid =  {
               'n_estimators':np.arange(20,500,5)
      },
      cv=5, 
      iid=False,refit=True,
      scoring="neg_mean_absolute_error")lr_boost.fit(X_train,y_train)**

最佳值是:

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

平均绝对误差为 2.580,散点图为:

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

到目前为止,通过使用 bagging 的线性回归获得了最佳结果。

可能的后续步骤

预测股票价格很难,而且非常困难。应该经常这样做,以便从最近的价格波动中吸取教训,并试图更好地预测未来的****

线性回归在 Bagging 技术的帮助下表现最佳,Bagging 技术减少过度拟合并试图减少输入特征之间的共线性

下一步可能是使用递归神经网络,特别是长短期记忆( LSTM )模型。在过去的几年里,它们越来越受欢迎,并证明了它们模拟非线性问题的能力。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

零售需求预测的机器学习

原文:https://towardsdatascience.com/machine-learning-for-store-demand-forecasting-and-inventory-optimization-part-1-xgboost-vs-9952d8303b48?source=collection_archive---------2-----------------------

零售店需求预测方法的比较研究(XGBoost 模型与滚动平均法)

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

UnsplashNeONBRAND 拍摄的照片

一、需求计划优化问题陈述

对于大多数零售商来说,需求计划系统采用固定的、基于规则的方法来进行预测和补货订单管理。

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

(1)需求计划优化问题陈述—(图片由作者提供)

这种方法对于稳定和可预测的产品类别足够有效,但是在库存和补货优化方面会显示出它的局限性。

这种潜在的优化可以通过以下方式降低运营成本:

  • 库存优化:店铺库存与实际需求相匹配,减少所需存储空间(租赁成本)
  • 补货优化:优化每笔订单的补货数量,使仓库与商店之间的补货次数最小(仓储&运输成本)

示例:拥有 50 家店铺的零售商

在这项研究中,我们将从 Kaggle 挑战中获取一个数据集:商店商品需求预测挑战

范围

  • 2013 年 1 月 1 日至 2017 年 12 月 31 日的交易
  • 91.3 万笔销售交易
  • 50 独特的 SKU
  • 10 店铺

💌新文章直接免费放入你的收件箱:时事通讯

(更新)改进模型

我一直致力于该模型的改进版本,并在下面的文章中分享我的见解(带完整代码)。目标是了解添加业务特征(价格变化、销售趋势、商店关闭等)对模型准确性的影响。

[## 零售预测的机器学习-特征工程

供应链优化了解与缺货、商店关闭日期或其他相关的额外功能的影响

www.samirsaci.com](https://www.samirsaci.com/machine-learning-for-retail-sales-forecasting-features-engineering/)

Github 库:链接

二。销售预测 XG boost

最初的数据集已被用于 Kaggle 挑战赛,在该挑战赛中,各团队竞相设计预测销售的最佳模型。

Kaggle 挑战的初始数据框架

这里的第一个目标是使用 XGBoost 设计一个预测模型;该模型将用于优化我们的补货策略,确保库存优化并减少从您的仓库发货的数量。

1.添加日期功能

2.列车的每日、每月平均值

3.将每日和每月平均值添加到测试和滚动平均值中

4.用于检查相关性的热图

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

皮尔森相关热图—(图片由作者提供)

让我们保留月平均值,因为它与销售额的相关性最高,并删除彼此高度相关的其他特征。

5.清理特征、训练/测试分割和运行模型

6.结果预测模型

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

预测与实际销售—(图片由作者提供)

基于这一预测模型,我们将构建一个模拟模型来改进商店补货的需求计划。

决赛成绩

数据帧特征

  • **日期:**交易日期
  • 货号: SKU 号码
  • **店铺:**店铺编号
  • **销售:**销售交易的实际值
  • sales_prd: XGBoost 预测
  • **错误 _ 预测:**销售 _prd —销售
  • repln: 补货天数的布尔值(如果该天在[‘星期一’,‘星期三’,‘星期五’,‘星期日’]中,则返回 True)

[## 萨米尔 Samir 供应链组合的数据科学

🏭使用高级数学概念的供应链网络优化👨‍🏭仓储的持续改进…

samirsaci.com](http://samirsaci.com)

三。需求计划:XGBoost 与滚动平均值

1。使用滚动平均值的需求计划

预测需求的第一种方法是以前销售的滚动平均值。在第 n-1 天结束时,您需要预测第 n 天、第 n+1 天、第 n+2 天的需求。

  1. 计算最近 p 天的平均销售量:滚动平均(第 n-1 天,…,第 n-p 天)
  2. 将此平均值应用于第 n 天、第 n+1 天、第 n+2 天的销售预测
  3. 预测需求=预测日 n +预测日(n+1) +预测日(n+2)

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

使用滚动平均法的需求预测—(图片由作者提供)

2。XGBoost 与滚动平均值

有了 XGBoost 模型,我们现在有两种滚动平均法需求计划方法。

让我们试着比较这两种方法在预测准确性方面的结果:

  1. 准备第 n-1 天补货
    我们需要预测第 n 天、第 n +1 天、第 n+2 天的补货量
  2. XGB 预测给我们一个需求预测
    Demand _ XGB = Forecast _ Day(n)+Forecast _ Day(n+1)+Forecast _ Day(n+2)
  3. 滚动平均法给我们一个需求预测
    Demand _ RM = 3 x Rolling _ Mean(Day(n-1),Day(n-2),…日(n-p))
  4. 实际需求
    需求 _ 实际=实际 _ 日(n) +实际 _ 日(n+1) +实际 _ 日(n+2)
  5. 预测误差Error _ RM =(Demand _ RM—Demand _ Actual)
    Error _ XGB =(Demand _ XGB—Demand _ Actual)

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

使用 XGBoost 和滚动平均的方法—(图片由作者提供)

a .参数整定:p 天滚动平均值

在将滚动平均值结果与 XGBoost 进行比较之前;让我们尝试找出 p 的最佳值,以获得最佳性能。

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

滚动平均值的最小误差—(图片由作者提供)

结果:-(p = 8)与(p = 1)的预测误差为 35%

因此,基于销售事务配置文件,我们可以通过使用过去 8 天的平均值来预测第二天的销售额,从而获得最佳的需求计划绩效。

b. XGBoost 对滚动平均值:p = 8 天

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

误差 XGBoost 与滚动平均值的关系—(图片由作者提供)

结果: -使用 XGBoost 与滚动平均值的预测误差为 32%

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

预测误差(x 轴:商店编号,y 轴:商品编号,z 轴:误差)——(图片由作者提供)

四。结论和下一步措施

关注我的 medium,了解更多与供应链数据科学相关的见解。

1.结论

利用滚动平均法进行需求预测,可以将预测误差降低 35% ,并找到最佳参数 p 天

然而,我们可以通过用 XGBoost 预测代替滚动平均值来预测第 n 天、第 n+1 天和第 n+2 天的需求,从而将误差降低 32%,从而获得更好的性能。

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

库存管理流程

2.可持续方法:绿色库存管理

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

(图片由作者提供)

如果我们降低商场补货的频率,会对二氧化碳排放量产生什么影响?

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

在这种情况下,研究如何使用数据分析来模拟商店补货频率的变化,并衡量对整体环境影响的影响。

[## 绿色库存管理-案例研究

可持续发展如何减少时尚零售物流运作的二氧化碳排放量?

www.samirsaci.com](https://www.samirsaci.com/green-inventory-management-case-study/)

关于我

让我们在 LinkedinTwitter 上连线,我是一名供应链工程师使用数据分析来改善物流运作和降低成本。

如果你对数据分析和供应链感兴趣,可以看看我的网站

[## Samir Saci |数据科学与生产力

专注于数据科学、个人生产力、自动化、运筹学和可持续发展的技术博客

samirsaci.com](https://samirsaci.com)

参考

[1] Kaggle 数据集,商店商品需求预测挑战,链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值