有火花的三角洲湖:什么和为什么?
了解支持 ACID 和 Spark 更新的存储层
弗兰基·查马基在 Unsplash 上拍摄的照片
让我首先介绍两个问题,这是我在使用 Apache Spark 的过程中反复遇到的问题:
- 同一路径上的数据“覆盖”会在作业失败时导致数据丢失。
- 数据的更新。
有时我通过设计变更解决上述问题,有时通过引入另一个层,如 Aerospike,或者有时通过维护历史增量数据。
维护历史数据通常是一个直接的解决方案,但是我不太喜欢处理的历史增量数据,如果不是真的需要的话,因为(至少对我来说)它会在失败的情况下引入回填的痛苦,虽然失败可能不太可能,但是不可避免。
以上两个问题都是“问题”,因为 Apache Spark 并不真正支持 ACID。我知道 Spark 从来没有处理事务的用例(你好,你不可能拥有一切),但有时,可能会有这样的场景(就像我上面的两个问题),ACID 合规性会派上用场。
当我读到德尔塔湖和它的耐酸性时,我认为它是我的两个问题的可能解决方案之一。请继续阅读,了解这两个问题如何与酸性合规失败相关联,以及三角洲湖如何被视为救世主?
三角洲湖是什么?
三角洲湖文档将三角洲湖介绍为:
Delta Lake 是开源存储层,为数据湖带来可靠性。Delta Lake 提供了 ACID 事务、可扩展的元数据处理,并统一了流式和批量数据处理。Delta Lake 运行在您现有的数据湖之上,并且与 Apache Spark APIs 完全兼容。
三角洲湖关键点:
- 支持酸
- 实现时间旅行
- 启用 UPSERT
火花如何失败酸?
考虑下面这段从数据集中删除重复项的代码:
# Read from HDFS
df = spark.read.parquet("/path/on/hdfs") # Line 1
# Remove duplicates
df = df.distinct() # Line 2
# Overwrite the data
df.cache() # Line 3
df.write.parquet("/path/on/hdfs", mode="overwrite") # Line 4
对于运行在这段代码上的 spark 应用程序,考虑一个场景,它在第 4 行失败,也就是在写入数据时失败。这可能会也可能不会导致数据丢失。【问题#1:如上所述】。您可以通过创建测试数据集来复制该场景,并在作业处于写阶段时终止作业。
让我们试着用上面的场景来理解 spark 中的酸失效。
酸中的 a 代表原子数,
- *什么是原子性:*要么所有的变化都发生,要么都不发生,系统永远不会处于中途状态。
- 【spark 如何失败:在写入数据时,(上面第 4 行),如果在旧数据被删除而新数据尚未写入的阶段发生失败,则发生数据丢失。我们丢失了旧数据,并且由于作业失败、原子性失败,我们无法写入新数据。[它可以根据使用的文件输出提交器而变化,请务必阅读文件输出提交器,以了解数据写入是如何发生的,我解释的场景是针对 v2 的]
酸中的 c 代表一致性,
- 什么是一致性:数据在系统中必须始终保持一致和有效。
- 【Spark 如何失败:如上所述,在失败和数据丢失的情况下,我们在系统中留下无效数据,一致性失败。
酸中的 I 代表隔离,
- *什么是隔离:*多个事务隔离发生
- *spark 如何失败:*考虑并行运行的两个作业,一个如上所述,另一个也使用相同的数据集,如果一个作业覆盖数据集,而另一个仍在使用它,可能会发生失败,隔离失败。
酸中的 d 代表耐久性,
- *什么是持久性:*更改一旦做出就永远不会丢失,即使在系统出现故障的情况下。
- Spark 可能如何失败: Spark 确实不影响耐用性,它主要由存储层管理,但由于我们在作业失败的情况下会丢失数据,在我看来,这是一个耐用性故障。
三角洲湖如何支持酸?
Delta lake 在写入数据的路径中维护一个 Delta 日志。增量日志维护如下详细信息:
- 类似于
的元数据-写入操作中添加的路径。
-写入操作中移除的路径。
-数据大小
-数据的变化 - 数据模式
- 提交信息,如
-输出行数
-输出字节数
-时间戳
在某些操作后创建的 delta_log directory 中的示例日志文件:
成功执行后,会在 delta_log 目录中创建一个日志文件。重要的是要注意,当你保存你的数据作为增量,没有文件一旦写入被删除。这个概念类似于版本控制。
通过在 delta_log 中跟踪删除、添加的路径和其他元数据信息,Delta lake 是 ACID 兼容的。
版本控制启用了 Delta Lake 的时间旅行属性,也就是说,我可以回到任何数据状态,因为所有这些信息都保存在 delta_log 中。
三角洲湖如何解决我上面提到的两个问题?
- 有了对 ACID 的支持,如果我的作业在“覆盖”操作期间失败,数据不会丢失,因为更改不会提交到 delta_log directory 的日志文件。此外,由于 Delta Lake 不会在“覆盖操作”中删除旧文件,因此我的数据会保持旧状态,不会有数据丢失。(是的,我测试过)
- Delta lake 支持上面提到的更新操作,因此它使得处理数据更新更加容易。
下次见,
再见。
需求预测:波士顿犯罪数据
能够预测某一天某一特定地点发生暴力犯罪可能性的模型。
需求预测是零售、供应链管理和物流领域的热门话题和永无止境的目标。决策者需要根据预测的需求优化他们的资源,因此它也与优化问题直接相关。
预测在其通常的机器学习用途中处理一维的时间序列数据。预测股票价格或跨年度购买数量是最常见的用例。像 ARIMA 这样的加性模型是这个领域中最古老的数学模型之一:
预测明确的趋势。看起来很简单,是吧?
使用这些众所周知的数据——几年来航空乘客的数量——来理解预测的基础当然是有帮助的。但即使乍一看,也不难猜到现实生活中的问题很少如此简单。
波士顿犯罪数据简介
马特·波波维奇在 Unsplash 上的照片
分析波士顿波士顿的开放数据中心发布各种城市数据。其犯罪事件报道就是其中之一。该市的表格数据列出了 2015 年以来的犯罪事件。我们可以在这里看到他们数据集中的主要特征(总共有 16 列):
- 事件编号:事件的唯一标识符
- 犯罪代码组:事件按犯罪类型分组
- 报告区域:报告区域的代码。
- 发生日期:事件发生的日期
- Lat:犯罪地点的纬度
- Long:犯罪地点的经度
他们的最新数据超过 40 万行。他们还将自己的数据集上传到 Kaggle 来介绍它并挑战数据科学界。
对犯罪类型及其趋势的分析肯定有助于我们了解这个城市的犯罪动态。但是如果我们能比这更进一步呢?
目标
历史数据集具有城市中不同类型犯罪的时间和空间维度。
因此,最令人兴奋的项目是在犯罪真正发生之前为社区预测犯罪。
不,不是那个方向! —图片由杰拉尔丁·杜克斯提供,来自皮克斯贝
现在我们需要一个框架来组织问题。仅仅预测一个街区或者大体上整个城市的犯罪数量,并没有说太多,也没有用。我们需要预测某个特定地区是否会发生罕见的犯罪。
此外……这类问题不常被研究,而波士顿的犯罪数据给了我们一个机会去调查一个具有挑战性的问题。为什么?更多信息请见挑战部分。
问题框架
这里我将遵循另一篇 论文中分享的方法,“使用数据分析的 犯罪预测:波士顿市的案例”。它包含了解决的核心。我将使用 Python 实现它,并对特性(较少的空间工程)和模型(Xgboost 以提高准确性)进行一些修改。我还会分享代码,这样每个人都可以跟着做,并尝试改进预测。我们可以总结如下:
- 我们需要预测一些罕见事件(在本例中为暴力犯罪)在特定日期以空间特征发生的概率。这样,警察可以利用这一点每天集中在城市的特定地区,以防止暴力犯罪,或至少增加在那里巡逻的机会。
这个框架如何塑造数据解决方案?无需过多思考,我们可以说我们将:
- A 汇总每天每个地区/报告区域的历史犯罪数据。
- 标记这些地点和日期的组合,以便当天是否发生暴力犯罪**。**
- ****用概率预测二进制值。这是一个分类问题。可以使用基于逻辑回归或决策树的模型。
由于我们的数据集将非常不平衡,对机器学习模型和决策阈值进行一些调整将是必要的。请记住,我们预测的是罕见事件。
挑战—为什么不使用时间序列预测?
请注意,我们已经将预测问题转化为传统的机器学习分类。这是为什么呢?
如果我们需要预测多个值,就会出现困难,因为设置和分析 ARIMA 类型的模型并不容易。
那么我们需要为此建立多个模型吗?如果我们需要为数百个时间序列数据建立模型,会发生什么?这可行吗?
让我们列出当需求分布在城市中且没有明确边界的情况下,在很长一段时间内如一年,预测需求所面临的挑战。
考虑出租车需求预测可能是一个很好的起点,因为我们将遵循类似的逻辑。在这种情况下,我们有在特定日期从特定位置开始的出租车出行数据。预测需求的挑战如下:
- 需求是空间分布的,是连续的。它没有中心。想想城市里的几个市场,它们都有固定的位置。您可以建立预测模型来预测它们中每一个的总销售额,但这里的情况并非如此。
- 即使您对需求进行聚类,也可能有太多的聚类中心来为每个聚类中心建立预测模型。
- 您知道某些特征(如天气或时间——如假期)会严重影响需求。但是在传统的时间序列建模中,不可能添加这些特征。深度学习( LSTM 模型举例)允许这样做。
现在,对于犯罪预测来说,还有一个额外的挑战。我们需要预测像暴力犯罪这样罕见的事件:
- 请记住,传统的时间序列预测处理的是数字数据。这里我们需要预测一个二进制值:0 或 1。
方法
****开始建造吧!谁需要方法?—马库斯·斯皮斯克在 Unsplash 上拍照
现在,让我们列出创建预测模型要做的事情:
- 划分空间以聚集每个空间单元(格网或报告区域)的需求
- 将犯罪类型分为暴力犯罪和非暴力犯罪。
- 每天汇总每个空间单元的历史犯罪数据。该行的标签将是 1 或 0,这取决于那天在该位置是否发生了暴力犯罪。
- 将历史天气数据集成为波士顿每天的一项功能。
- 将数据分为训练集和测试集。使用一个特定的日期,在该日期之前,训练数据约为 70%,在该日期之后,测试数据为所有数据集的 30%。
- 建立一个侧重于预测阳性标签的模型:增加真阳性率,即灵敏度。(稍后将详细介绍)
- 通过选择阈值来评估测试集的准确性和敏感性。
1-群需求
从这一点开始,你可以遵循 github repo 中的代码。
在对数据进行了一些探索之后,我们可以从“来自报告区域的集群中心”一节开始。通过取纬度和经度的平均值来计算报告区域中心:
用于可视化空间数据的 KeplerGL 包
显然,有一些异常值。通过使用此处的城市边界文件,我们绘制并提取波士顿多边形外的报告区域:
# load shape file for 500 cities
city_data = gpd.read_file("geodata/CityBoundaries.shp")# some spatial processing here...# select the reporting areas (points in geodf_ra) that are
# in geodf_boston polygon. using spatial join function
# in geopandas package
geodf_ra_inboston=gpd.sjoin(geodf_ra, geodf_boston, how="inner", op='within')
现在它们都在波士顿多边形内
在论文中,使用了 500 个网格。因此,按照同样的逻辑,我们可以创建 500 个集群,使需求中心更少,需求面分布更均匀。
# create 500 centers with K-means
clusterer = KMeans(n_clusters=500,random_state=101).fit(reporting_area_centers[["Long","Lat"]])
# get predictions from our Kmeans model
preds_1 = clusterer.predict(reporting_area_centers[["Long","Lat"]])
# set our new column: cluster_no
reporting_area_centers["cluster_no"]=preds_1
报告区域的 500 个集群中心。
报告区域聚集成 500 个中心。
2-集团犯罪类型
现在我们需要对犯罪类别进行分组(OFFENSE _ CODE _ GROUP ),以便将其中一些归类为暴力犯罪。我根据我的假设添加了这些类别,其中哪些是暴力犯罪,但是当然你可以交叉引用法律定义…
# check labeled crime groups: violent, property and other
# the crimes are grouped manually into 3 groups: violent, property or other
data_1718_ocg=pd.read_csv("./data/data_1718_ocg_grouped.csv")
被称为暴力犯罪的有:
3-汇总历史犯罪数据
至此,在笔记本文件中,我们已经到达了“为 ML 准备数据:为每个集群和日期组合聚集数据”部分。
我们有标有经纬度的聚类中心。现在我们需要预测功能!
****这是脚本的核心部分:每天计算所有聚类中心过去的犯罪统计数据。过去 120 天、30 天、7 天、1 天都是这样做的。
为了准备剧本,我先做了一天的计算。然后我写了一个全天的“for 循环”。
# check one of the lists:
# here we calculated sums for different crimes for the date: 2017-10-3
# they are aggregated for each clusters.
# in this table we see the results for the past 120 days
working_120_results.head()
在这里,我们可以看到仅一天内不同地区不同犯罪类型的总和。它是通过计算该地区前 120 天的相关犯罪类型来计算的。
在检查了结果的合理性之后,我们可以继续进行更大的计算:“计算过去 365 天和最后一天每天的统计数据。”现在我们运行一个循环来聚合每个集群和日期组合的历史犯罪数据。
# check resulting dataframe. This is going to be our baseline for train&test data
crime_stats_fordays_df.info()
所有历史预测特征被聚集
查看生成的数据框
4-整合天气数据
同样,根据这篇论文,我们希望将天气数据集成到我们的训练集中,作为一个预测功能。我们认为天气状况可能会影响暴力犯罪。
出于这个原因,我们可以使用 Python 包 wwo-hist ,它封装了来自世界天气在线的天气 API。我已经创建了一个免费试用帐户来收集所需的 API 密钥。你可以尝试其他选择,但这似乎是最快的解决方案。
# use package: [https://github.com/ekapope/WorldWeatherOnline](https://github.com/ekapope/WorldWeatherOnline)from wwo_hist import retrieve_hist_data# daily frequency.
frequency=24
start_date = '1-JAN-2015'
end_date = '31-DEC-2018'
api_key = 'your-api-key-comes-here'
location_list = ['boston,ma']# this one runs for all days from start_date to end_date
# and saves the results as csv to the current directory.
hist_weather_data = retrieve_hist_data(api_key,
location_list,
start_date,
end_date,
frequency,
location_label = False,
export_csv = True,
store_df = True)## some processing# include weather data to our aggregated data for: rain, cloud cover and minimum temperature.
# you can include more features herecrime_stats_fordays_df=pd.merge(crime_stats_fordays_df,weather_data[["date_time","precipMM","cloudcover","mintempC"]],left_on="theday",right_on="date_time")
我们使用云量、最低温度和降水量作为预测特征。
5-建模
首先,我们将数据分为训练集和测试集。因为这是时间序列预测,所以我们选择一个截止日期,使之前的数据对应于 70%的数据。
然后,我们决定功能列:
# feature set
x_columns=[ 'Lat', 'Long',
'sumviolentcrime120', 'sumpropertycrime120', 'sumothercrime120',
'sumviolentcrime30','sumpropertycrime30', 'sumothercrime30',
'sumviolentcrime7','sumpropertycrime7', 'sumothercrime7',
'sumviolentcrime1','sumpropertycrime1', 'sumothercrime1',
'precipMM','cloudcover', 'mintempC']# outcome
y_column=["isviolentcrime"]
请注意,与我们一直关注的论文不同,我们在这里使用经度和纬度来标识位置。这是因为如果您使用每个网格的收入数据,您将失去空间编码的“位置敏感”特性。简单来说,我们需要这样的空间特征,如果它们在二维空间中彼此接近,那么它们的编码就彼此接近。如果我们仅仅使用“收入数据”,我们就失去了这个特征,因为遥远的邻居可能有相同的平均收入。
这一选择的另一个结果是我们需要使用基于树的模型,因为纬度和经度在物流回归等线性模型中不携带信息**。**
我继续为模型使用“ Xgboost 分类器”。正如我们在开始时说的,这是一个分类问题。我们已经为每个聚类中心和每一天创建了聚合的历史特征。现在我们将根据这些历史特征和天气数据来预测那天是否发生了暴力犯罪。
我跳过了模型的调优,以免过多地扩展文章,但是可以在 Jupyter 笔记本的“调优参数”一节中查看。
# tuned parameters: in the next session we run hyperparameter search with cross validation
# these parameters are gathered from that tuning session.
# so you can just continue with the tuned parameters
# you can switch back and forth between the baseline model and the tuned model to see the
# change in accuracy and other parametersxgb_model=xgb.XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, learning_rate=0.1,
max_delta_step=0, missing=None,
n_estimators=100, n_jobs=1,
nthread=None,scale_pos_weight=83,
objective='binary:logistic', random_state=101,
subsample= 0.6,
min_child_weight= 10,
max_depth= 3,
gamma= 1,
colsample_bytree= 0.8)
6 阈值选择
现在我们有了将“isviolentcrime”目标标记为 1 或 0 的概率。但是,我们应该如何选择决策阈值来将行(区域和日期组合)标记为 1 或 0 呢?
从论文中得出的假设如下:让我们假设警察每天可以巡逻城市的 30%。这最终确定了我们问题的框架。我们需要这样一个模型,它能在 30%的时间里预测阳性标签。因此,警方每天将有 30%的区域被标记为阳性。
# 30 percent of the labels: 38250.0
X_train.shape[0]* 0.3# tune threshold so that 30 percent of all the labels are predicted as positive
# we found we can use 0.48 as our threshold# (38819,)
y_pred_prob_pos[y_pred_prob_pos>0.48].shape# it is 1 if greater than 0.48
xgb_predictions=np.where(y_pred_prob_pos>0.48,1,0)
7-评估
让我们检查一下培训数据的指标:
# my accuracy score: 0.7031058823529411
accuracy_score(y_train,xgb_predictions)train_confusion_matrix=confusion_matrix(y_train, xgb_predictions)pd.DataFrame.from_dict({"Negatives":train_confusion_matrix[0],
"Positives":train_confusion_matrix[1]},orient='index',columns=["Negative Pred.","Positive Pred."])
注意,在 1523 个阳性病例中,我们的模型正确预测了 1244 个,因此具有 1244/1523=0.82 的真实阳性率。
真实阳性率公式来自维基百科
我们可以看到总体评估指标。请注意,标签 1 的召回率为 0.82。
现在是测试集:
****
我们的真阳性率(召回)下降到 0.73** 。**
其计算方式为 191 / (191+524)
我们还为训练数据设置了 30%正标签的阈值。我们在测试集中使用了相同的阈值,如果您检查:
# our predictor predicts 28 percent positive labels
# police needs to travel 28 percent of the area
xgb_predictions_test.sum() /y_test.shape[0]
在测试集中,甚至有更少的正面预测标签,这甚至更好。
摘要和用法
那么我们在这里做了什么?而且最重要的是,这种方法怎么用?
- 首先,我们对犯罪报告区域进行聚类,使 500 个需求中心平稳地分布在波士顿市。
- 我们将一些犯罪类别归类为暴力犯罪。
- 然后,我们使用历史犯罪数据来创建一个训练数据集。对于每个聚类中心和每一天,我们汇总过去的犯罪数据以用作预测特征:该地区过去 120 天、30 天、7 天等的暴力犯罪总数…该地区过去 120 天、30 天、7 天等的财产犯罪总数…
- 我们整合了历史天气数据作为预测特征。
- 我们建立了一个机器学习模型来预测那天和那个地区是否发生了暴力犯罪。
我们的训练数据。一些特征和目标变量:“isviolentcrime”
- 我们为我们的分类模型选择了一个阈值,使得 30%的预测是肯定的。
这意味着,如果对每个空间单元(在我们的例子中是分布在城市中的 500 个需求中心)的历史犯罪数据进行相应的汇总,警方就可以使用该模型来预测暴力犯罪。每天,警察可以运行这个模型,他们将得到大约 30%的聚类中心对暴力犯罪的积极预测。这相当于 500 个地点中的 150 个。他们甚至可以订购那些贴有正面标签的区域。排序将考虑相应的概率,从而优先考虑暴力犯罪的最危险区域。
比尔·牛津在 Unsplash 上的照片
凭借该模型的这一性能,警察只需巡逻 30%的区域,就可以捕获 70%的暴力犯罪。如果你分析历史犯罪数据,你会发现每天大约有 7 起暴力犯罪。根据我们的真实阳性率,警方可以预计每天大约有五起暴力犯罪。
结论
预测整个波士顿市的暴力犯罪问题尤其具有挑战性。它不同于通常的需求预测问题:
- 通常的需求预测模型有固定的需求和供应中心。
- 需求是一个连续的特征,就像总销售额或总请求量一样。
在我们的案例中:
- 需求在城市中不断分布。需要聚类。
- 需求是一个分类特征。问题是那里是否发生过暴力犯罪。
- 而作为一个二元分类问题,我们的数据集是高度不平衡的。阳性标签只占 2%左右。这给建模和调整增加了额外的挑战。
未来的工作
我们知道波士顿市有 12 个警察局/区。因此,我们可以尝试找到 12 个供应中心的最佳位置,以捕捉暴力犯罪的需求。
这个问题对应于设施选址问题。实际上我已经用 Python 的优化包做到了。我的下一篇文章将介绍和实现这些包来解决一个线性优化问题。
源代码和注释
我在我的 github repo 中分享了我的 Python 代码和准备好的数据。
参考
[1] G. Martegiani,L. Berrada,利用数据分析进行犯罪预测:波士顿市的案例 (2016 年)
[2] A .贾恩,波士顿犯罪数据/ Kaggle 数据集,(2018)
[3]分析波士顿,波士顿犯罪/卡格尔数据集,(2018)
[4] G. Sharma,出租车需求预测—纽约市—好观众 (2018)
使用 FB-Prophet 进行需求预测
来源:维基百科,时间序列预测
实施简单有效的需求预测方法
预测未来需求是一个基本的商业问题,任何成功解决这一问题的解决方案都将在不同的商业领域找到有价值的商业应用。在零售环境中,实施需求预测方法来做出有关购买、供应、补货和财务规划的决策。应用于需求预测和供应的一些常见时间序列方法包括移动平均法、指数平滑法和 ARIMA。Kaggle 时间序列预测竞赛中最受欢迎的模型是梯度推进模型,该模型将时间序列数据转换为表格数据,时间序列中的滞后项作为“特征”或表格中的列。
脸书先知模型是 GAM(广义加法模型)的一种类型,专门解决商业/计量经济学-时间序列问题。我在这个项目中的目标是应用和调查脸书先知模型在需求预测问题上的表现,为此,我使用了卡格尔 M5 需求预测竞赛数据集并参加了竞赛。该竞赛旨在在产品商店层面生成 28 天前的积分预测。
该数据集涉及 3049 种产品的单位销售额,分为 3 个产品类别(爱好、食品和家居)和 7 个部门。这些产品在 3 个州(加利福尼亚州、德克萨斯州和威斯康星州)的 10 家商店销售。该图概述了产品的聚合级别。竞争数据由沃尔玛提供。
图 1:时间序列层次和聚合级别的分解[2]
图 2:数据层次图[2]
来源:-https://mofc.unic.ac.cy/m5-competition/
数据描述
销售数据的数据范围是从 2011 年 1 月 29 日到 2016 年 6 月 19 日。因此,产品最多有 1941 天或 5.4 年的可用数据。(不包括 28 天的测试数据集)。
数据集分为日历数据、价格数据和销售数据[3]。
日历数据— 包含日期、工作日、月份、年份以及德克萨斯州、加利福尼亚州和威斯康星州的快照日等列。此外,该表通过其列 event_type1 和 event_type2 包含有关假日和特殊事件(如超级碗)的信息。节日/特殊活动分为文化、民族、宗教和体育活动[3]。
价格数据——该表由列组成——商店、商品、周和价格。它提供了某一周某一商店某一商品的价格信息。
销售数据 —由验证和评估文件组成。评估文件包括额外 28 天的销售额,可用于模型评估。该表提供了特定部门、特定州和商店中特定商品的销售量信息[3]。
数据可以在链接中找到—【https://www.kaggle.com/c/m5-forecasting-accuracy/data
数据分析和故事讲述
图 3:各状态下的销售数量
图 4:每个类别的销售额百分比
图 5:每个州的销售额百分比
从上面的图表中可以看出,在每个类别中,CA 的销售额最高,其次是 TX 和 WI。CA 贡献了约 50%的业余爱好销售额。这三个州的销售类别分布是对称的,在每个州按销售降序排列的最高销售类别是食品、家居和爱好。
价格数据分析
图 6:价格变化百分比= 100*(最高价格-最低价格)/最高价格
图 7:原木分布(售价)
上面的图表显示百分比价格变化是高度右偏的。对 sell_price 执行对数变换,使其分布更加对称。
快照日的影响
图 8:平均值。销售与快照日
上图显示,在所有 3 个州的抢购日都有较高的销售额。
调查销售数据的季节性
图 9:跨类别的时间序列分解
图 10:跨状态的时间序列分解
使用stats models . TSA . seasonal _ decompose函数对时间序列进行季节性分解。上面的图表显示了随着时间的推移,销售的线性增长(跨类别和州)以及季节性的影响。从 2014 年开始,线性在时间序列的后半部分尤为明显。在所有州和类别中都可以看到年度季节性。
图 11:每周季节性:一周中各天的销售额
上图显示了所有 3 个类别的每周季节性。周末和周一的销售额比平日高。
图 12:月度季节性-当月各天的销售额
上图显示了不同类别的月度季节性。我们看到的模式是,销售额在月初很高,然后稳步下降,接近月底时再次回升。
图 13:2011-2016 年不同类别的年度季节性
上面的图表显示了 2011 年至 2016 年各个类别的年度季节性。销售行为在每个类别中都是对称的,例如,2011 年的家庭销售额与 2012 年的家庭销售额相似,以此类推。这种历史数据在预测某个类别的年销售额时会很有用,例如,2011 年家庭销售额的数据在预测 2012 年家庭销售额时会很有用。
模型描述
对 Prophet 模型进行训练,并在产品商店级别进行预测。因此,30490 个不同的 prophet 模型在产品商店级别针对 30490 个不同的时间序列进行了训练。两年的训练数据和 28 天的预测/评估数据用于每个系列的模型训练和评估。最后 28 天的测试数据被 Kaggle 隐藏。下表显示了培训、评估和测试数据的划分-
训练-评估-测试数据分割
在所有时间序列中尝试了两个模型—
模型 1
def run_prophet(id1,data):
holidays = get_holidays(id1)
model = Prophet(uncertainty_samples=False,
holidays=holidays,
weekly_seasonality = True,
yearly_seasonality= True,
changepoint_prior_scale = 0.5
)
model.add_seasonality(name='monthly', period=30.5, fourier_order=2)
模式二
def run_prophet(id1,data):
holidays = get_holidays(id1)
model = Prophet(uncertainty_samples=False,
holidays=holidays,
weekly_seasonality = True,
yearly_seasonality= True,
changepoint_prior_scale = 0.5
)
model.add_seasonality(name='monthly', period=30.5, fourier_order=2)
model.add_regressor('log_sell_price')
模型 1 由假期、周季节性、年季节性和月季节性组成。
模型 2 由以下部分组成——假期、每周季节性、每年季节性、每月季节性,此外还有回归变量 log_sell_price = log(sales_price)。假设每个 product-store 系列中的最新 sales_price 在 28 天的预测范围内保持不变,并用于预测未来的销售额。
脸书先知模型类似于 GAM(广义相加模型),使用一个可分解的时间序列模型,该模型由三个部分组成——趋势、季节性和节假日——y(t)= g(t)+s(t)+h(t)+e(t)[4]。
Growth g(t): 默认情况下,Prophet 允许您使用线性增长模型进行预测。这里使用的就是这种模式[4]。
**节假日 h(t):——**先知考虑节假日影响。这里模拟的假日有宗教假日、文化假日、国家假日和快照日。Prophet 允许用户添加一个“上窗口”和“下窗口”,在假日日期前后扩展假日的效果。在当前模型中,0 天的上下窗口应用于快照日,1 天的上下窗口应用于其他节假日。Prophet 假设每个假日 D_i 是相互独立的[4]。
季节性 s(t): — 傅立叶级数用于模拟季节性影响。在下面给出的公式中,P 是正常周期(每周— 7 天,每年— 365.25 天)。拟合季节参数,需要拟合 2 N 个参数— beta = (a1,b1,… an,bn) [4]。
季节性傅立叶级数[4]
例如,对于年度数据,N = 10,季节分量 S(t)= X(t)*β
N=10 时的 x(t )[ 4]
平滑先验—beta~Normal(0,sigma)应用于 beta。增加傅里叶级数的项数 N 会增加模型的复杂性,并增加过度拟合的风险[4]。
建模变点 : —几个变点的参数可以用超参数“changepoint_prior_scale”调整。这在 Prophet 中的变点参数之前施加了稀疏。增加这个参数可以增加模型的灵活性[4]。
实施多重处理和优化运行时
from joblib import Parallel, delayedsubmission = Parallel(n_jobs=4,
backend="multiprocessing")(delayed(run_prophet)(comb_lst[i][0],comb_lst[i][1]) for i in range(30490))model.make_future_dataframe(periods=28, include_history=False)
FB Prophet 中的模型训练和预测比 ARIMA 模型或指数平滑模型需要更长的时间。由于我们在产品商店级别拟合模型 30490 次,因此有必要减少单个系列的运行时间,并将 30490 系列的训练和预测并行化。前者通过 1)在模型 1 &模型 2 中使用的 Prophet() 函数中设置“不确定性 _ 样本=假”来实现。这可防止为预测创建不确定性区间,以及 2)在用于模型预测的 make_future_dataframe() 函数中设置“include_history=False”(如上所示),这可防止 Prophet 显示适合训练数据集的模型。
joblib。Parallel() 函数用于实现 30490 系列拟合和预测的多重处理,如上面的代码片段所示。
模型评估
使用三个指标评估点预测的准确性——RMSE、RMSSE 和 WRMSSE。度量 WRMSSE 是 Kaggle 在比赛中使用的评估度量。
均方根误差
均方根标度误差
加权均方根标度误差
wi 是数据集中 42,840 个(包括如图 1 所示的各种级别的聚合)时间序列中每个时间序列的权重。权重是根据一段时间内该系列的累计美元销售额计算的。竞赛指南中给出了重量的更多细节—https://mofc.unic.ac.cy/m5-competition/
结果
模型 1 和模型 2 的性能如下所示。通过计算所有 30490 个产品商店时间序列的平均 RMSE 或 RMSSE 来计算平均 RMSE 和平均 RMSSE。可以看出,模型 2 中包含 log_price 提高了所有指标的性能。Kaggle 计算了隐藏测试数据集上的性能。
预测结果
图 14:https://github.com/Ritvik29/Walmart-Demand-Prediction<10 ®
The graphs above show the RMSE distribution of the 30490 product-store time-series. As can be seen, the distribution is heavily right-skewed. The performance of both models is similar across all RMSE levels. For more details on the code and implementation kindly refer the GitHub repository -RMSE 分布(左)放大 RMSE 分布 RMSE
总之,FB- Prophet 中的季节性、变点、增长和假期等组件使其特别适合处理需求预测等商业时间序列问题。我建议分析师至少把 Prophet 作为建立需求预测模型的第一站。
参考
【1】https://www.kaggle.com/c/m5-forecasting-accuracy 卡格尔 M5 预测—准确率竞赛
https://mofc.unic.ac.cy/m5-competition/
【3】https://www.kaggle.com/c/m5-forecasting-accuracy/data 卡格尔 M5 —精准预测竞赛数据
****【4】泰勒·勒瑟姆(2017),《规模化预测》https://peerj.com/preprints/3190/
【5】FB prophet—quick starthttps://Facebook . github . io/prophet/docs/quick _ start . html # python-API
人工智能民主化
双刃剑
当公司领导人谈论民主化人工智能(AI)时,不难想象他们的想法。越多的人能够接触到构建人工智能系统所需的知识、工具和数据的原材料,必然会出现越多的创新。效率提高,参与度增加。面临技术人才短缺?微软、亚马逊和谷歌都发布了预制、拖放或无代码的人工智能工具,允许人们将人工智能集成到应用程序中,而无需知道如何建立机器学习模型。
但随着公司走向民主化,一个警示故事正在浮现。即使是由高度合格的工程师设计的最复杂的人工智能系统,也可能成为偏见、可解释性问题和其他缺陷的牺牲品。由没有经过适当培训的人构建的人工智能系统,或者在没有适当控制的情况下运行的人工智能系统,可能会产生非常危险的东西——引入歧视或严重错误。更糟糕的是,问题可能直到系统实施后才变得明显,让公司争先恐后地安抚利益相关者,消除损害,修复技术。
这并不是说 AI 的民主化不是没有价值。让这些新技术变得更容易获得和负担得起,扩大了企业和政府所能实现的可能性,并刺激了竞争。例如,与抗击 COVID19 相关的数据集、模型、论文和研究已经开源,使大型全球社区能够进行协作。公司领导人的关键是避免被宣传冲昏头脑,而是专注于确定他们到底要民主化什么(是简单的东西,如数据可视化,还是复杂的东西,如模型开发?),用户是谁(新手还是专家),以及他们的组织如何通过适当的培训和治理来最大化收益,同时管理或减轻风险。
技术领域——民主化什么?
发布人工智能和机器学习(ML)产品的技术供应商需要从确定他们的工具或平台将民主化价值链的哪个或哪些部分开始。在这里,考虑一个范围(见下面的图 1)是有帮助的,在这个范围内,工具和模型变得越来越复杂,并产生更大的价值。
一方面是数据,将数据接收到数据仓库和数据湖中。人工智能系统,尤其是人工智能,运行在大量的结构化和非结构化数据上——这是你可以从中产生见解、决策和结果的材料。在其原始形式中,它很容易民主化,使人们能够进行基本的分析。许多技术提供商已经创建了数据浏览器,帮助用户搜索和可视化公开可用的数据集。
接下来是数据输入的算法。在这里,随着数据投入使用,价值和复杂性都在增加。在这一点上,民主化还是比较容易实现的,事实上算法是广泛可及的。像 GitHub 这样的开源代码库在过去的十年里有了显著的增长。2018 年 11 月,有超过 1 亿个代码库,其中相当一部分与人工智能相关。理解算法需要对计算机科学有一个基本的了解,并有一定的数学或统计学背景,才能理解算法的作用。
随着我们继续向存储和计算平台发展,复杂性也在增加。在过去的五年里,人工智能的技术平台随着亚马逊网络服务(AWS)、微软 Azure 和谷歌计算平台三大人工智能/人工智能提供商转移到了云。这使得中央处理单元和图形处理单元(对训练相当大的深度学习模型至关重要)可以在按需付费的基础上供最终用户使用,大大降低了准入门槛。然而,尽管算法是硬件不可知的(例如,它们通常可以在任何硬件或云平台上运行),但云存储和计算平台需要技术供应商(亚马逊、微软或谷歌)的特定培训和认证。
现在我们来看模型开发。模型解决具体问题:有的成为推荐引擎,有的成为面部识别,等等。在这里,我们看到了使用自动化平台和工具的民主化。例如,自动化接收各种数据格式(结构化、半结构化和非结构化)的能力,以及在同一数据集上运行多种算法并选择最佳算法集合的能力,使模型开发过程变得更容易(也更快)。但是,如果用户没有经过适当的培训,则很有可能在模型中产生偏见,无法解释模型的结果,甚至做出错误的决策。
最后,在光谱的远端,我们正处于创建数据、算法和模型市场的早期阶段。对于问题和能够解决这些问题的人才,也有一个新兴的市场。Kaggle 创建于 2010 年,于 2017 年被谷歌收购,是数据科学或人工智能市场最知名的例子之一。奖金丰厚的数据科学挑战赛,如卡格尔·网飞电影推荐挑战赛,让世界上任何地方的任何人都可以参与竞争并展示他们的技能。随着我们在这些市场中筛选数据、算法和模型,曲解它们并将其应用于错误环境的风险会显著增加。在这种情况下,系统滥用模型的危险将会增加。
图 1:民主化什么?
了解你的用户——为谁民主化?
设计一个人工智能系统需要广泛的技术知识和对数据科学的牢固掌握。就像你希望确保一名外科医生合格、训练有素并有手术室经验一样,人工智能系统应该由拥有扎实技术功底、了解人工智能系统关键组件并致力于负责任的人工智能的人来设计、测试和维护。
供应商经常发表笼统的声明,称他们已经通过创建拖放工具使数据接收、数据清理和数据挖掘民主化。或者他们通过自动化整个机器学习或数据科学过程,使复杂的统计和计算模型开发民主化。但是谁在使用这些工具和模型呢?他们是否接受过适当的培训——不仅是在工具方面,而且在基本概念方面?
在一个例子中,一个已经广泛使用拖放工具的组织的商业用户建立了一个机器学习模型,而没有留出数据样本用于验证和测试。因为模型过度符合训练数据,所以报告的模型准确性是有缺陷的。如果部署了该模型,可能会导致重大的财务损失。
AI 民主化的受益者存在于三大类——高级用户专业开发者* 。临时用户和专业开发人员处于相反的极端,而高级用户介于两者之间;后一组比临时用户更有知识,训练有素,但不是专家水平。商业用户通常是临时用户;他们既没有接受过模型背后的统计和数学概念方面的广泛培训,也没有接受过建立模型所需的具体过程方面的培训。专业开发人员或数据科学家通常具有很强的资格或适当的认证。*
公司需要确定他们的各种计划针对的是这三个类别中的哪一个。例如,当我们使数据可视化大众化时,我们使所有三种类型的用户能够快速创建各种各样的可视化,只需很少或不需要编程——这是一个低风险的提议。然而,当我们说我们正在使模型开发民主化时,我们是在为专业数据科学家做这件事,让他们能够运行不同的算法,评估它们,并选择正确的模型集合吗?或者,我们是不是也在尝试为临时用户和高级用户普及它?如果是后者,就需要格外小心。
民主化的好处——为什么要民主化?
人工智能的民主化提供了三个主要好处。首先,它降低了个人和组织开始尝试人工智能的门槛。他们可以利用公开可用的数据和算法,开始尝试在云基础设施上构建人工智能模型。世界上任何地方的个人,只要很少或没有金融投资(可能只是接入互联网),就可以进入令人兴奋的人工智能世界。他们不仅可以学习人工智能,还可以解决 Kaggle 等市场中的重要问题,以获得重大奖励。
其次,随着程序员和用户社区开始使用和扩展数据、算法和工具来构建更强大的解决方案,民主化降低了构建人工智能解决方案的总成本。民主化的开放性也有助于培养必要的人才。在民主化中,数据或算法可以免费提供给其他人。ImageNet 的管理和使其公开提供定义的性能指标帮助许多研究人员建立了更快、更准确的模型。开源深度学习框架的可用性,如 Caffe、TensorFlow、PyTorch 等,极大地促进了有才华的深度学习专家数量的增长。因此, 减少了人才发展的时间 也是民主化的一个显著好处。**
所有这些方面都在增加学术和商业世界采用人工智能的速度。自然语言处理的各个方面,如从文本文档中分析和提取结构化信息、分析来自社交媒体或呼叫中心的客户情绪、使用对话界面或聊天机器人,正在成为常见的商业应用。同样,使用机器学习和深度学习来获取见解、识别或分类数据、自动化任务或增强人类决策也变得越来越普遍。
民主化的价值杠杆——如何民主化?
当前围绕民主化的大部分努力都集中在 访问 数据、算法、存储、计算、模型开发和市场。然而,我们需要超越仅仅使人工智能的访问民主化,转向民主化的许多价值驱动因素,这些因素可以确保人工智能不被滥用,还可以提高整体价值(见图 2)。
对人工智能不同组成部分的访问需要是负担得起的——在某些情况下,如开放数据倡议或通过 GitHub 共享算法——甚至是免费的。超越 实惠接入 以上每一层都需要 好用 。如果每个人都需要编写 SQL 查询来访问数据,或者理解线性代数和微分方程,以便能够使用一些算法,那么很难说我们已经使人工智能民主化。
民主化进程的下一步是能够用 控制 堆栈中的不同元素。例如,如果在一个层(比如计算平台)中提供服务的技术供应商坚持他们将在有空闲周期时运行计算,并限制您可以从他们的平台之外获取的内容,民主化就变得不那么有用了。为了让人工智能真正民主化,用户需要控制他们运行什么,何时运行,以及如何使用运行的结果。
超越控制 所有权 的概念需要解决。数据是由生成数据的组织/人员、处理数据的组织还是从中获取见解的组织/人员所有。所有权真的可以在多方之间分割吗?我们能让区块链调解或分配所有权的概念吗?这些都是在寻求民主化过程中有待解决的悬而未决的问题。
访问、使用、控制和所有权是越来越多的价值杠杆,使人工智能民主化的供应商,以及寻求从人工智能中受益的用户和企业都需要考虑。这些价值杠杆的另一面是与民主化相关的风险。最初提供免费访问以获取市场份额或获取数据,然后收费或使用数据来加强模型和货币化数据是一种成熟的商业模式。明确这一点,并为数据的 使用 提供安全保障,对于建立消费者的信任大有帮助。
其次,如果一个人提供免费使用数据,算法,模型等。,但不要对临时用户或高级用户进行有关获取数据的环境、开发模型的假设或解释模型结果的必要数学的培训,结果可能是灾难性的。在过去的几年中,已经有许多记录在案的误用模型的实例,甚至是由专家构建的模型,例如,机器学习模型中的数据偏差、恶意攻击等。如果没有关于算法和模型的使用和解释的培训,这种现象只会增加。
图 2:如何民主化?
将所有这些结合在一起——民主化框架
设计一个人工智能系统需要广泛的技术知识和对数据科学的牢固掌握。正如你希望确保一名外科医生合格、训练有素并在手术室有丰富的经验一样,人工智能系统应该由拥有扎实技术功底、了解人工智能系统关键组件并致力于负责任的人工智能的人来设计、测试和维护。
需要采取四种不同的行动(见图 3)来确保一个人从不同的价值层次——获取、使用、控制和所有权——中获得民主化的全部好处。同时避免误用、滥用、偏见和其他问题。领导者需要采取五项行动:
1。培训。在人工智能开发和实施方面缺乏足够的培训可能是灾难性的——特别是在涉及到处理人们健康或财务福祉的系统时。例如,如果不经意或未经训练的用户不理解将数据分成桶用于训练、验证和测试的重要性,他们很容易以产生不准确或意外结果的人工智能而告终。如果我们想从仅仅提供访问权限转向刺激这些工具的使用,那么培训具有适当数据科学基础的临时或高级用户对于安全使用人工智能至关重要。
****2。治理。公司领导人需要明确输入人工智能平台的数据的所有权和控制权,以及权利与所产生的洞察力之间的关系。当为特定的 AI/ML 程序收集数据,然后用于不同的应用程序时(开源数据湖可能就是这种情况),很容易看不到数据的来源、收集数据的目的、修改数据的方式以及如何(或是否)适当地保护数据。“影子人工智能”(Shadow AI),即使用数据创建的人工智能,而这些数据不是由组织内负责确保数据完整性的团队管理的,也是一个令人担忧的问题。为了最小化风险,AI/ML 模型应该使用被监控、保护和理解的数据来构建。
组织通常将数据治理作为公司合规活动的一部分,但很少有人像应有的那样密切监控 AI 系统中涉及的其他元素。控制需要到位,以确保模型的开发具有适当的成功或验证指标(准确性、公平性、可解释性的平衡),以避免开发和部署结果有偏差或不容易解释或理解的 AI 模型。
3。知识产权。如果不决定谁拥有知识产权,民主化的预期好处可能无法实现。许多公司拒绝使用云平台进行图像处理或音频处理,因为他们担心机密信息会在他们的四面墙之外被处理,而云解决方案提供商正在使用并受益于从他们的数据中产生的重要见解。随着越来越多的公司意识到民主化的全部力量来自他们的数据(以及他们竞争对手的数据),而不是来自工具和平台本身,他们可能会要求某种程度的知识产权。
****4。开源。要实现民主化,需要所有政党在不侵犯隐私、保密和竞争动态的前提下,公开他们所做的事情。如果不能完成从所有权到使用权的循环,基本上会造成一种单向流动,一些参与者——通常是资金充裕的大公司或政府——将在短期内从民主化中受益,但那些资源较少的人将被抛在后面。
图 3:民主化框架
可以肯定的是,让人工智能变得更容易获得和负担得起是有好处的。这样做扩大了企业和政府通过让实验变得更容易而实现的可能性。总的来说,开源运动刺激了竞争,使得质量和客户体验成为最终的赢家。
在一个开源越来越普遍,技术专家和早期采用者都渴望降低门槛以追求进步的世界里,让人工智能民主化的想法似乎是一个好主意。事实上,如果我们不能从彼此的人工智能项目中学习,我们就有可能创造一个单向流,让一些参与者——通常是拥有充足资金的大公司或政府——受益,而那些资源较少的人被抛在后面。正如世界经济论坛人工智能和机器学习负责人 Kay Firth-Butterfield 最近写道,人工智能的长期成功取决于“协作的敏捷性、数据的多样性和完整性以及风险评估的准确性。”
但是,允许拖放或新手创建人工智能模型的技术,特别是在极端情况下,对问题的严重性是不公平的。当训练有素的数据科学家在创造道德和负责任的人工智能时会遇到困难,将鲁棒性的负担放在未经训练的人身上是不公平的,也有潜在的危险。通过承认真正民主化可能带来的负面影响,工业界可以探索确保任何可能的风险都不会被打开的标准和准则。通过使人工智能透明并建立治理,可以将其从“黑箱”中移除,并产生信任。因为如果人们不信任 AI,它就不可能真正进步。
通过承认 AI 民主化可能带来的负面影响,行业可以探索确保创新与安全实施齐头并进所需的标准和指南。通过使人工智能透明并建立治理,它可以从其“黑箱”中取出,并可以产生信任。
像 Zynga、脸书和易贝一样将数据民主化
数据民主化的三大支柱&自助服务分析。Zynga 的数据法,易贝的廉价易得,脸书的数据基础设施。(所有图片由作者提供)
多年来,Zynga、脸书和易贝一直在民主化他们的数据,让他们公司的每个人都可以访问和轻松使用这些数据。数据民主化是自助服务分析的基础,所以让我们看看您如何也能做到这一点。
这三家公司对他们的流程都非常开放,所以我们可以看到,尽管他们选择了三种不同的技术架构,但他们都遵循相同的流程来实现基于三大支柱的自助服务分析的数据民主化。
这三大支柱分别是“数据法”、“数据基础设施”和“廉价数据访问”。
在本文的最后,您将有一个三大支柱的蓝图,以及三个清单来指导您的数据民主化工作。
但是在我们深入所有的技术术语之前,让我们回到 150 年前,回到巴黎…
关于污水的寓言
1870 年一个温暖阳光的日子,尤金·贝尔格兰德沿着巴黎的塞纳河散步。阳光明媚的日子是可爱的,但不是在 1870 年的巴黎。1870 年,塞纳河是 180 万巴黎人的“厕所”。它一定很难闻。但更糟糕的是,霍乱和伤寒刚刚开始席卷整个城市。
贝尔格兰德心想一定有更好的办法。
因此,他和他同时代的人,奥斯曼将军以及所有其他聪明的法国人决定着手解决污水问题。
首先,他们通过了一项法律;法律规定它不再被允许倒入塞纳河,因为这是霍乱传播的主要原因之一,嗯,还有气味。
然而,人们开始在街上倒空家中的厕所,这让事情变得更糟。
贝尔格兰德和其他人意识到他们不能强迫人们保持卫生。他们需要给他们提供一个合适的方法。所以,他们建立了一个基础设施。而且是巨大的。贝尔格兰德在巴黎修建了 600 公里的下水道,有效地给每个人提供了放置一次性用品的地方。
但即使这样还不够,变化只是慢慢来的,人们仍然有“简单的出路”,仍然只有富人有连接到这个庞大污水系统的厕所。他们意识到,他们的最后一步将是使这种 像清空街道上的 一样容易和便宜。所以他们降低了下水道和厕所的价格,并开始教育人们。
因此,到 1914 年,68%的家庭有了下水道,从接近 0%上升到现在。人们不再死于霍乱和伤寒,巴黎繁荣了。
快进 150 年…贝尔格兰德和其他人发现的三大支柱是:
- 法律,或者用现代术语来说激励人们做出正确的选择并就此教育他们。
- 基础设施,给了他们所有的可能性。
- 的轻松,使访问尽可能的容易和便宜。
让我们看看今天的科技公司如何构建这三大支柱来支持他们的数据民主化和自助式分析工作。
Zynga 和数据法
Zynga 成立于 2007 年,是 FarmVille 和许多其他非常成功的手机游戏背后的公司;2018 年,他们的收入接近 10 亿美元,净收入 1500 万美元,员工接近 2000 人。
在他们 12 年的公司历史中,他们引入了一种数据驱动的崇拜,将数据作为 Zynga 每一项决策的核心。
Zynga 致力于为每一款游戏分析和设计实验。跟踪点必须是他们构建的每个新应用程序的一部分。Zynga 甚至开发了一个名为 ZTrack 的系统,能够追踪用户如何与游戏互动。
通过这些工具,Zynga 能够改变整个游戏的方向,就像他们对 FarmVille 所做的一样。
那么在 Zynga,人们实际上是如何访问这些数据来做出决策的呢?
Zyngas 架构特点两个重要决策:
- 它们为特定的 SQL 访问提供专用的“服务”。他们只是简单地复制了公司中任何人都可以访问的所有数据,提供了一套不同的数据保证,没有运营数据那么严格。
- 它们至少提供两种类型的访问,面向所有人的专用 SQL 访问,以及计划报告和商业智能工具。
示意性地,访问看起来像下面的图片。
终端用户有两种途径来访问数据。一条路径是通过某个组件,即某个报告功能,然后访问其中一个数据库。第二条路径是对另一个数据库的特定直接 SQL 访问。
Zynga 和“数据法则”的浓缩:
- 基于数据的决策被灌输到公司的价值观中。
- 每一个产品决策都具有 a 假设,A/B 测试以及测量它的可能方式。
- 不通过实施跟踪来了解如何进一步开发该产品,就不会开发出任何产品。
让我们转向一家大得多的公司,看看他们有什么不同。
脸书和数据基础设施
当脸书选择如何建立他们的数据仓库时,他们决定走稍微不同的方向。Zynga 的数据是海量的,所以脸书选择建立一个巨大的 Hadoop 集群,让公司的每个人都能访问这个 T21。
意识到这种规模的访问是一个问题,不是简单地提供访问并说“你必须使用数据就能解决的。facebook 做了 Belgrand 做的事情,他们开始建立基础设施。
今天,脸书有一个完整的部门,其中充满了数据基础架构团队。数据工程师在技术团队中工作,支持产品决策,整个部门帮助公司做出更好的决策。
但是回到 2007-2009 年,facebook 之前存储数据的方法碰壁了。所以他们决定转向 Hadoop。在此之前,数据是一个 SQL 查询,但现在它要复杂得多。
非技术用户无法访问这些数据,所以脸书决定采取行动。
脸书开发了 Hive,给用户一个类似 SQL 的界面,即使非技术用户也可以使用。现在,通过这个基础设施,就像下水道系统一样,每个人都可以轻松地访问所有的数据。
如果你比较访问架构,它与 Zynga 略有不同,但它在 Facebooks 规模上提供了类似的好处。它可能看起来像这样。
与第一种模式不同,第二种模式有一个主要界面,可以将非技术性的最终用户问题转化为技术性问题,这些问题可以在公司拥有的所有数据中运行。
Facebook 和“数据基础设施”的浓缩:
- 访问数据应该像问一个问题一样简单。这就是“SQL”所提供的。
- 非技术人员应该能够访问大部分或全部数据。脸书的基础设施能够访问所有的 Pb 级数据,不仅仅是一小部分,而是全部。就像巴黎 600 公里的污水。
贝尔格兰德和他的朋友们最重要的一步,在几年内将污水的采用率从 1%提高到 68%,是使变得便宜和容易。我们看到的最后一家公司正是这样做的。
易贝和廉价数据访问
多年来,易贝一直致力于让每个人都能廉价、便捷地获取数据。
他们经历了一系列步骤,尽可能方便地访问数据。
易贝选择的建筑又是一个不同的建筑。易贝集中收集数据,然后为每个团队提供一个“桶或立方体”和他们的数据。这种方法从一个"Datensparsamkeitsperspektive开始就很棒,并且使得把" 数据转换靠近最终用户 "成为可能。
与前两种模式不同,第三种模式认识到不同最终用户群之间的数据需求可能会有很大差异。因此,终端用户拥有自己的小数据“集市”,他们可以直接访问,也可以通过他们选择在组中使用的任何工具访问。
为了让人们使用数据,他们需要知道数据在哪里。易贝只是从一个维基开始,解释什么是与元数据仓库相结合。
然后他们添加了图片,展示了数据是如何连接的,标记了数据,并把整个系统变成了一个产品叫做“数据中枢”。一个查找数据的中心位置。
但是他们并没有就此止步,2015 年他们的最先进的数据民主化平台功能:
- 作为元数据目录,
- 讨论板,以及拥有数据并了解数据的团队的链接,
- 与元数据存储库相结合的 SQL 助手,
使其成为检查数据的无缝体验。易贝提供全程幻灯片。
易贝的廉价和简单的数据访问方法压缩:
事实证明,facebook 所遵循的可以被理解为在数据网格方法中使用的属性的“ 数据列表 ”。适用于易贝的标准是:
- 使数据对每个人都是可发现的;易贝通过提供像“数据中心”或 Alation 这样的中心工具做到了这一点。
- 使数据可寻址;易贝通过在其元数据存储库中的一个中心位置提供连接信息来做到这一点。
- 使数据可信;易贝通过提供知情人士的姓名、数据的 SLA 等等来做到这一点。
- 使其自描述;易贝通过提供适当的元数据做到了这一点。
- 使互操作;易贝通过提供 SQL 帮助做到了这一点,并把一切都建立在 SQL 之上。
- 确保安全。
很好,我们现在有三个支柱,每个支柱都有一个清单。现在怎么办?
你从哪里开始?
你从瓶颈所在开始。
这些柱子很好地反映了正在发生的事情。如果你还没有屋顶,你可以从任何地方开始。你可以提供三块短木头来支撑一个轻型铁皮屋顶。
但是如果你想支撑一个完整的石头屋顶,你就必须在所有的三根柱子上下功夫,一次又一次地使它们变得坚固。
在你让公司做出基于数据的快速决策的过程中,这三个支柱都可能成为瓶颈。
如果没有人知道如何做出基于数据的决策和编写 SQL,你就需要研究“数据法则”,对人们进行这方面的教育,在产品中建立跟踪等等。这就是为什么 Zynga 非常重视它,也是为什么 Spotify 有整个团队为特定产品做基于数据库的决策。
如果人们不能以一致的方式访问数据,就没有人能获得数据来做出基于数据的决策。Zynga 似乎还不是这种情况,因为它使用了多个数据库,所以这不是它们的瓶颈。但对于像网飞这样的公司来说,情况似乎就是如此。网飞开发了一个名为 Metacat 的工具来解决这个问题,并提供一个统一的基础设施。
最后,如果访问数据不够容易,人们将无法及时获得数据,从而无法做出基于数据的快速决策。
因此,你必须关注这三个方面,从一个瓶颈到另一个瓶颈,以便在你的公司做出比以往更好更快的决策。
我必须给他们直接的临时 SQL 访问权限吗?
不要!尽管 Zynga、脸书和易贝显然是这样做的,但这实际上是你的具体组织如何运作的问题。通过提供一个中央数据湖,提供一个中央商业智能工具,并教育人们如何使用它,你的瓶颈可能会得到解决。
但是上面的三个支柱依然存在,每个支柱的详细计划都符合你所能想到的最集中的架构,就像它符合你所能想象的最分散的架构一样。
更多资源
下面链接的所有资源都为本文提供了信息。
- 看看巴黎下水道系统的真实故事,也许还有可爱的巴黎博物馆。我喜欢它!
- 易贝现在使用 alation 作为元数据和 SQL 完成工具,他们与易贝就数据治理和自助服务分析进行了会谈。
- 此幻灯片分享提供了易贝案例的大部分背景,以及这篇关于易贝数据治理的文章。
- 最后,DJ Patil 的这本短文提供了这三个案例的背景。
使数据科学民主化
数据科学/观点
学习一些基本技能可能会让你成为一名数据科学家!
伊尔哈姆·拉赫曼萨在 Unsplash 上的照片
偶尔,我会看到一篇文章,谴责在线数据科学课程和训练营是获得数据科学工作的途径。大多数文章的目的不是打击,而是提醒我们先照照镜子,意识到我们面临的是什么。然而,一些批评者宣称,这些在线课程和训练营的激增导致了该行业的退化。
对于后者,我坚决不同意。
弥合技能差距
自从《哈佛商业评论》将数据科学家称为21 世纪最性感的工作以来,数据科学就抓住了大众的想象力。七年多后,数据科学仍然是当今最受欢迎的就业市场之一。事实上,由于供需动态,“预计到 2024 年,仅美国就将面临约 25 万数据科学家的缺口。”
因此,资本主义和企业家精神响应了这一号召,像 Codeup 这样的公司发誓要“帮助弥合公司和希望进入这一领域的人之间的差距。”
此外,像 PyCaret 这样的 AutoML 库“通过为业务分析师、领域专家、公民数据科学家和经验丰富的数据科学家提供免费、开源和低代码的机器学习解决方案,使机器学习和高级分析的使用民主化”。
在线课程、训练营和 AutoML 库的可用性让许多数据科学家皱起了眉头。他们担心新兵训练营的校友和自学的候选人会以某种方式降低数据科学家的整体素质,给这个领域抹黑。此外,他们担心像 AutoML 这样的工具会让任何人成为数据科学家。
我的意思是,上帝禁止任何人认为他们也可以成为数据科学家!对吗?
不对。
街头智能数据科学家
像我一样,新兵训练营的校友和自学者都有一个优势:我们的新秀智慧。引用《新秀智慧》一书的作者利兹·怀斯曼的话:
在一个快速变化的世界里,经验可能是一种诅咒。新的,天真的,甚至是无知的可能是一种资产。——利兹·怀斯曼
菜鸟无牵无挂。我们像狩猎采集者一样警觉而不断地寻找,像火行者一样谨慎而敏捷,像 frontiersmen⁴.一样饥饿而无情换句话说,我们很聪明。
许多人陷入了“你必须学会这个”和“你必须学会那个”的困境,以至于他们忘记了强调这样一个事实,即数据科学如此庞大,你不可能知道任何事情的一切。这没关系。
我们学得快,适应得也快。
归根结底,我们为组织带来的价值才是最重要的。毕竟,是他们在为我们买单。我们不会因为记住公式或者知道如何从头开始编写算法而得到报酬。
我们解决问题是有报酬的。
这是街头智能数据科学家擅长的地方。我们不会遭受分析瘫痪或被理论所困扰,至少在上班的时候不会。我们关注的中心是基于对问题的务实解决方案,而不是学术辩论。
这并不是说我们对最新的研究不感兴趣。其实恰恰相反。我们是机器学习和人工智能最新发展的贪婪消费者。我们对自然语言处理的最新发展垂涎三尺。我们总是在寻找最新的工具,让我们的工作变得更简单,不那么无聊。
和 AutoML
那么如果我们必须使用 AutoML 呢?如果它让我们进入一个自动管道,分析师可以在没有数据科学家人工干预的情况下获得机器学习的结果,那就更好了。我们没有被自动化所威胁,我们被它所振奋!
不要让完美成为进步的敌人。——温斯顿·丘吉尔
通过建立自动管道,必然会有一些权衡。但是以这种方式构建它将解放我们的脑细胞,让我们有更多的时间专注于解决其他更高层次的问题,并产生更有影响力的解决方案。
我们不关心工作保障,因为我们知道它不存在。我们所知道的是,我们给企业带来的价值越多,从长远来看我们就越好。
也许他们是对的?
经过这一切,我会让步一点。为了便于讨论,也许他们是对的。也许在线课程、训练营和低代码机器学习库真的会产生低水平的数据科学家。
也许很大。
但是,我认为,这并不意味着我们没有价值。数据科学技能取决于一个范围,公司在数据方面的成熟度也是如此。当你的组织几乎没有可识别的机器学习基础设施时,为什么要雇用一名六位数的员工?
也许吧。
独角兽
也许,要被贴上数据科学家的标签,首先必须是独角兽。独角兽数据科学家是在数据科学的所有方面都表现出色的数据科学家。
hckum/CC BY-SA(https://creativecommons.org/licenses/by-sa/4.0)
数据科学长期以来被描述为计算机科学、应用统计学和商业或领域知识之间的交叉。对此,他们问,一个人怎么可能在短短几个月内积累所有这些知识?对此,我们也提出同样的问题,一个大学毕业生如何才能?
我相信独角兽确实存在,但它们也必须从某个地方开始。
那么我们为什么不能呢?
结论
一系列在线课程和工具承诺将数据科学民主化,这是一件好事。
感谢您的阅读。如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
我的无学位数据科学之旅。
towardsdatascience.com](/from-slacker-to-data-scientist-b4f34aa10ea1)
如果你正在考虑改变方向,进入数据科学领域,现在就开始考虑重塑品牌:
给我们其他人的固执己见的建议。热爱数学,选修。
towardsdatascience.com](/the-slackers-guide-to-rebranding-yourself-as-a-data-scientist-b34424d45540)
敬请期待!
[1]哈佛商业评论。(2020 年 6 月 3 日)。在您的组织中实现数据科学的民主化。https://HBR . org/sponsored/2019/04/democrating-data-science-in-your-organization
[2]圣安东尼奥快报-新闻。(2020 年 6 月 3 日)。软件开发训练营 Codeup 推出新的数据科学计划。https://www . mysanantonio . com/business/technology/article/Software-development-boot camp-code up-launching-13271597 . PHP
[3]走向数据科学。(2020 年 6 月 4 日)。Power BI 中使用 PyCaret 的机器学习。https://towardsdatascience . com/machine-learning-in-power-bi-using-py caret-34307 f 09394 a
[4]怀斯曼集团。(2020 年 6 月 4 日)。为什么在新的工作游戏中,学习胜过了解。https://thewisemangroup.com/books/rookie-smarts/
将人工智能大众化
“AI 黑匣子”是给所有人的。
照片由 Unsplash 上的 h heyerlein 拍摄
“领导者的真正标志是愿意坚持大胆的行动路线——非传统的商业战略、独特的产品开发路线图、有争议的营销活动——即使世界上其他人都想知道为什么你不与现状保持一致。换句话说,真正的领导者乐于曲折前进,而其他人则乐于曲折前进。他们明白,在一个高度竞争和不间断破坏的时代,脱颖而出的唯一方式就是代表一些特别的东西。”——比尔·泰勒。
谷歌、脸书、亚马逊等科技巨头在人工智能领域的成功经验。证明了投资先进技术新时代的效率。他们的重要结果将人们分为两类:一类是愿意掌握人工智能艺术的支持者,另一类是声称这只不过是炒作的怀疑者。有一件事是肯定的,从那以后,工业一直在发展。
人工智能研究的发展。
- 1998 年至 2018 年间,经过同行评审的人工智能论文数量增长了 300%以上,占同行评审期刊出版物的 3%,占已发表会议论文的 9%。
- 中国现在每年发表的人工智能期刊和会议论文与欧洲一样多,已经在 2006 年超过了美国。美国出版物的领域加权引用影响仍比中国高出约 50%。
- 新加坡、瑞士、澳大利亚、以色列、荷兰和卢森堡人均在 arXiv 上发表的深度学习论文数量相对较高。
- 超过 32%的世界人工智能期刊引用来自东亚。超过 40%的世界人工智能会议论文被北美引用。
- 北美占 2014 年至 2018 年全球人工智能专利引用活动的 60%以上。
- 许多西欧国家,特别是荷兰和丹麦,以及阿根廷、加拿大和伊朗,在人工智能研究中显示了相对较高的女性比例。
开源软件。
在过去的十年里,许多机器学习和人工智能库都是开源的,可供广大公众使用,这使得开发人员更容易开发智能产品和平台。这种开源代码受到了社区的广泛关注和欢迎。
衡量各种人工智能编程框架受欢迎程度的标准之一是 Github stars。它们表明一个人在 GitHub 上表达了对特定代码或项目的兴趣,类似于 Twitter 和脸书等社交媒体服务上的“赞”可以表明某个帖子的受欢迎程度。
下图显示了各种 AI 和 ML 软件包在 GitHub 上被打上星号的次数。
人工智能库累积 Github 星级-来源:Github,2019 年
人工智能库(不包括 TensorFlow)累积 Github 星级—来源:Github,2019
每个人的人工智能!
最近对人工智能的兴趣激增,对该领域产生了重大影响。除了开源人工智能系统的可用性,其他因素也使人工智能越来越容易为每个人所用:
教育
教育已经延伸到大学之外。Moocs 越来越多地为全球劳动力提供不同人工智能技能的课程。人工智能和相关学科的入学人数继续成倍增长,无论是在线课程还是美国和国际上的传统大学。
人工智能在大学和 Moocs 中的应用。
云的力量
- 大数据平台提供了捕获和存储大型数据集的能力。
- 计算时间显著减少。在一年半的时间里,在云基础设施上训练大型图像分类系统所需的时间从 2017 年 10 月的约 3 小时下降到 2019 年 7 月的约 88 秒。
- 培训模特的成本也有类似的下降。
人工智能的民主化正在增加与之互动的人数。这种扩张允许人工智能应用扩展到新的领域,并释放人工智能专家的时间来从事前沿开发。
人工智能不再被视为在工业界和学术界输出神奇结果的黑匣子。越来越多的公众可以使用不同的技术。
** 参考文献 : 上述统计数据来自斯坦福海 2019 年度报告。
自动化大众化
让每个人都从人工智能热潮中受益可能比一些人预期的更具挑战性。
我们如何平衡人工智能的超能力——在少数人手中——对其他人的眼睛和生活的影响?通过各种文章、播客和对话,我对基于自动化的产品如何进一步分化我们的社会产生了一些担忧。我写了三个主题,我们需要解决,以推动智能系统走向公平。
- 机器的情感容量及其对用户的影响。
- 如何让数据驱动的系统没有偏见?
- 如何缓解科技公司权力聚集后的财富聚集?
为什么我说这很难?看到这个国家对冠状病毒的反应平平,表明我们几乎无法应对一个紧迫的问题。我会把对自动化民主化的需求循环为仅次于气候变化的社会不稳定风险。这些问题是相似的,因为它们慢慢地悄悄逼近我们,逐渐改变我们的生活方式,而我们却没有意识到未来就在眼前。
自动化不是一个零和游戏——也就是说,每个人都可以从它的实施中获得胜利和收益——但肯定会对服务不足的群体和社会产生一些巨大的成本。我希望尽自己的一份力量,建立一个能帮助所有人的系统,而不是一个以增加他人成本的方式过度帮助少数人的系统。
这篇文章启发了我,使我的博客和我的方向正式化,你可以在这里找到更多https://robotic.substack.com/。
人工智能中的情感能力
现代生活已经给我们的人性带来了很大的压力,因为我们将如此多的互动转移到了屏幕后面,智能繁荣也将如此(对于成年人来说,屏幕后面的时间长达 34 年)。数据驱动方法的革命还很年轻。我担心当我们再也看不到咖啡店里的笑脸时会发生什么。我并不是说这是人们渴望和需要的互动,但这是事实。这是一种联系。 这些微小而众多的联系累积起来,关系到个人的长期心理健康 。我对我的精神健康斗争非常开放,这种斗争是由通信的技术漏斗加强的。它影响到每个人,我看不出有什么方法可以让它不那么成问题。
自动咖啡机能让人类感觉自己是整个系统的一部分吗?我们都有变焦疲劳 ( 来源,来源)在一个月的在线工作中,如果生活重新开始,我们只能看到屏幕,那会怎么样——我不认为这将是一个巨大的胜利。消除人与人之间的互动对客户来说也是一种负担;这不仅仅是一种节省成本的技术。
情感人工智能
一家公司开始提高患有某些疾病的人的情绪智商,这些疾病使他们很难融入正常社会,情感人工智能 ( 链接)在这一领域拥有许多关键。创始人希望为那些未被充分代表的人和那些获益最多的人服务。
我强烈推荐下面这一集人工智能播客,它定义并深入探讨了这些问题。
[## 罗莎琳德·皮卡德:情感计算、情感、隐私和健康|麻省理工学院|人工智能……
罗莎琳德·皮卡德是麻省理工学院的教授,麻省理工学院媒体实验室情感计算研究组的主任,以及…
lexfridman.com](https://lexfridman.com/rosalind-picard/)
科技公司将情感货币化
我们希望机器也能跟踪我们的情绪吗?我看到在接下来的几年里,某些社交应用程序想要追踪眼球运动来衡量广告的参与度(来源一或二)。如果先进的面部识别硬件作为我们手机的生物护照,成为优化广告技术的情感测量设备,会怎么样?老实说,我不知道也没有听到足够多的人谈论这种担忧(来源关于情感如何进入广告技术)。
随着科技公司能够随时改变服务条款,我认为这是一个时间问题,而不是是否的问题。消费者需要对被跟踪的内容有发言权,否则功能蔓延会将情感添加到持续跟踪的内容列表中(位置、浏览、购买等)。
无偏差数据
数据驱动方法(也称为基于学习的方法)接受给它们的信号,并优化一些输出。
科技领域的当前偏见
谁在移动设备上花费最多?富裕人群(主要在苹果设备上)。来源。
面部识别工具上谁的成功率最高?白种人。来源。
这只是我们日常生活中已经存在的有偏见的数据的两个例子。我想说它们并不具有超级影响力,但当自动化系统影响我们生活的更多领域时,它会发人深省。
科技领域的未来偏见
如果人工智能系统被用来招聘工作,如果某些人口统计数据被排除在训练集之外,因此他们永远不会被选中,那会怎么样?来源。
在医疗系统中,已经存在跨人口统计学的治疗有效性的系统性差异,当决策被输入计算机时会发生什么?来源。
在这两种情况下,计算机会复制给它们的数据。例如,当神经网络在拟合数据时,其精度与训练数据的密度成比例。关于如何解决这个问题的工作很少,只有很多关于这些问题将如何影响我们的白皮书。
我认为我们需要在数据处理和汇总方面做更多的工作。我刚才谈到的数据是推动公司价值的,但我们也需要一些数据的透明度。这是麻省理工学院斯隆管理学院关于数据偏差问题的一个很好的总结。
谁驾驶这个?
我也很高兴看到伯克利 EECS 分校聘请了一个对这些问题感兴趣的新教师团队。欢迎光临!我认为教职员工有一个表达问题的大平台,但运营这个平台的公司能更早地看到潜在的问题。这是一件很难监管的事情,所以我认为工程师们应该意识到这个问题。这就是为什么我认为最优秀的计算机科学家都有某种程度上多样化的背景——理解更广泛问题的能力。
参见脸书、谷歌、亚马逊和微软对公平的推动。这些只是公共方法。
金融公平
2020 年上半年将是技术领域的一次重大聚合事件。枯竭的种子资金,失败的走向市场战略,以及经济封锁的随机打击。大的变得更大(FAANG 或其他更受欢迎的五大科技公司的缩写)。我在自动化领域工作,并期望大量资金流向那里,但这一切都隐藏在隐形模式初创公司和根深蒂固的工程公司的面纱后面。
每个人都在谈论即将到来的自动化,但为什么它如此难找(即使对于该领域的专家来说)?
我的目标是研究什么样的自动化会以其前所未有的影响规模让人们措手不及(例如自动驾驶汽车),以及什么会成为一个具有良好公共关系的玩具应用程序?我想继续写自动化的民主化。我想打造工具,了解趋势。
(软银在 Q1 的财报电话会议上对科技独角兽的陨落进行了滑稽的想象;来源。)
基于人工智能的万亿 GPD 增长
我们能不能让更多的美国科技巨头立足于美国。我不会说任何关于改变税收结构的话,但我们需要找到一种方法,随着 GDP 的飙升,它不仅会创造更多的亿万富翁。每个数字用户的边际增值是惊人的。如果你有好的资源,可以让财务收益正常化并保留资本主义的好处,请联系我们或发表评论。
人工智能(AI)工具和技术在商业和全球经济中的作用是一个热门话题。这个…
www.mckinsey.com](https://www.mckinsey.com/featured-insights/artificial-intelligence/notes-from-the-ai-frontier-modeling-the-impact-of-ai-on-the-world-economy)
这个国家的一些地区不用走很远就可以到达令人惊叹的地方。
科技公司没有动力通过解决这些长期风险来限制其增长。我们需要有效的政府来调节技术的长期轨迹——因为他们是唯一可以为长远的未来安全承担财务风险的人。
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
民主化图像分类
用 Kubernetes 构建基于网络的迁移学习门户
创建定制的图像分类模型需要详细了解 TensorFlow 或其他类似的深度学习框架。它还需要大量的 CPU。虽然存在更高级的工具,如苹果的桌面应用程序, CreateML ,但它们要求你在本地机器上运行软件,这可能会很慢且效率低下。
我们的项目旨在使机器学习民主化,并使任何软件工程师都可以建立图像分类模型,不管他们的 ML 知识如何。
站在巨人的肩膀上
我们在几个现有资源的基础上开发了一个 web 服务,它可以无缝地接收图像并输出定制的图像分类模型。
- 基本模型:使用的基本模型来自 Google 开发的 MobileNet v2 模型。这是在 ImageNet 数据集上预先训练的,这是一个由 1.4 M 图像和 1000 个类组成的大型数据集
- 迁移学习:我们利用 MobileNet 基础模型为用户训练定制的图像分类模型
- Docker:我们将迁移学习模型容器化,这样它就可以部署在 GCP 的实例中
- Kubernetes:利用 Kubernetes,我们可以在创建每个分类模型时自动扩展和管理工作
- GitHub:我们服务前端和后端的所有代码都在 GitHub repo 中维护
产品组件和基础设施
我们的产品包含三个不同的组件:用于管理用户上传的部署和服务,用于管理模型训练的作业定义,以及用于在训练期间存储数据的持久性存储。组件已连接,如下所示。
在谷歌云上部署到 Kubernetes
对于这个项目,我们需要动态的计算能力来应对需求高峰。Kubernetes 自动管理可伸缩的容器化应用程序,是一个完美的选择。谷歌云让快速建立新的 Kubernetes 集群变得简单。
接下来,我们需要设置持久存储,以便上传图像,然后供培训作业使用。Kubernetes Pods 可以使用永久卷共享文件。永久卷有三种访问模式 : ReadWriteOnce、ReadOnlyMany 和 ReadWriteMany(这些名称表明了每种卷类型的使用方式)。对于这个项目,我们需要前端能够将文件写入存储;然后,相应的培训工作需要能够读取这些文件。因此,我们需要一个支持读写的卷。
我们选择使用 Filestore ,这是一个托管的谷歌服务,其工作方式类似于 NAS 服务器。Filestore 至少需要 1Tb 的磁盘空间,并且有些昂贵,因此对于长期项目来说,它可能不是一个理想的选择,除非您计划存储大量数据。但是对于一个短期项目(并且有学分),它很容易建立并且对我们的用例有意义。为了建立一个文件存储实例,创建了一个新实例,并跟踪文件共享名和 IP 地址。
接下来,我们使用该文件存储信息创建了一个持久卷。
最后,我们创建了一个持久的卷声明,可以由前端和各种作业共享。
版本管理和自动部署
这个项目发生在新冠肺炎,所以我们不得不远程合作,因为庇护所的订单。因此,使用源代码控制和协作工具甚至更加重要。我们将代码存储在 GitHub 中,并使用 GitHub 动作管理我们所有的部署。设置 autodeploy 需要首先在 Google Cloud 中创建一个服务帐户。
服务帐户角色需要设置为编辑器**,这样 GitHub 才能向 Google Cloud 发送命令。在最后阶段,我们为服务帐户生成并下载了一个密钥。**
接下来,我们将构建并部署到 GKE 工作流添加到 GitHub 项目中。默认模板使用 Github secrets 作为 GKE_EMAIL、GKE_KEY 和 GKE_PROJECT 环境变量。GKE 电子邮件和 GKE 项目分别对应于服务帐户电子邮件地址和项目 ID。GitHub 在这里提供指令生成 GKE _ 密钥(使用你上面下载的服务账号密钥 JSON 文件)。
最后,我们对动作文件做了一些修改。首先,为了避免为每个部署削减一个新的发布,我们在每次有新的提交到主分支时触发工作流。
其次,我们构建了两个 Docker 容器,而不是一个——一个用于主服务,一个用于作业(下面将详细介绍)。
建立核心服务和工作岗位
设置前端
我们使用 Flask 和 Bootstrap 设置前端。前端服务被打包成一个容器,并部署在 Kubernetes 集群中。
为了帮助用户完成这个过程,我们设计了一个如下所示的 3 步表单(尽管你可以随意定制!).第一步,我们收集一个. zip 文件,其中包含用户希望模型学习的不同新类的图片。的内容。zip 文件必须匹配keras . preprocessing . images . imagedata generator . flow _ from _ directory使用的结构。然后,我们要求用户输入他们希望接收训练模型的电子邮件。最后,我们向用户提供一个摘要和通知,以检查所有细节是否正确。
与作业共享图像数据
上传. zip 文件后,我们使用 Kubernetes Python 包创建一个作业。我们使用 UUID 生成器包给每个作业一个唯一的 UUID。作为环境变量的 zip 文件路径。请注意,创建作业时会附加永久卷声明。
前端需要特殊权限才能创建作业。对于这个项目,我们给默认角色 Admin 访问权限。在生产环境中,前端的访问应该仅限于必要的权限。
(重新)教授模型
为了创建定制的图像分类模型,我们在预训练的神经网络上使用了迁移学习技术。文章Transfer Learning using Mobilenet and Keras非常有用,并被用作这项工作的框架。
在图像分类的背景下,迁移学习的理论是,已经在大量图像上训练过的预训练模型可以有效地充当大多数图像的通用模型。我们可以利用神经网络的大多数层,只在新图像上重新训练最后几层。这使我们能够减少开发定制图像分类模型所需的时间和计算资源。它还减少了我们添加新类所需的新图像的数量。
在这个项目中,我们使用 Google 开发的 MobileNet v2 的基本模型。该网络在 ImageNet 数据集(由 140 万幅图像和 1000 个类组成)上进行预训练。我们冻结了第一批预训练层的大部分,只重新训练最后几个密集层。然后,我们打开分类图像的 zip 文件,重新训练模型。模型被保存为一个. h5 文件,并保存到一个 dropbox 文件中,然后通过电子邮件发送回给用户。
集装化的转移学习
将我们的机器学习模型产品化的第一步是将其放入 Docker 容器中,以便我们可以将其部署为微服务。利用 Docker,我们可以维护统一的环境、库需求,并使用 Kubernetes 在云中扩展模型。
Dockerfile 本质上是一个命令文档,存储在启动容器映像的文本文件中。在我们的 token 文件中,我们安装了 python 和 requirements.txt 中定义的所有包。我们还实例化了几个可以传递到 main.py 文件中的环境变量:图像的 zip 文件位置、用户电子邮件以及 dropbox 密钥和令牌。
创建 docker 文件后,我们构建映像并进行测试,以确保输入和输出在本地工作。最后,我们将图像推送到 Google 云平台,在那里它可以被我们的 Kubernetes 集群部署。
共享模型并通知用户
由于 Google Drive 存储昂贵,我们决定使用 Dropbox API 来临时存储重新训练的模型。训练完成后,模型被上传到 Dropbox,并生成一个可共享的链接。
该链接随后被传递给 SendGrid API,以生成一封通知电子邮件供用户检索。下面可以看到这封漂亮邮件的样本!
后续步骤
我们所创造的服务只是这个产品未来发展的一个起点。为了更好地满足那些希望利用分类模型的人的需求,可以结合以下特征:
进一步产品化
- 改进 web 应用程序,为用户提供更多指导
- 关于培训状态、后端如何工作等更多信息。
- 提供更多基本型号的选择(目前只有 MobileNet)
- 让用户选择超参数
合并模型蒸馏和压缩
- 模型文件相当大;输出可用于移动电话的版本可能有用
提高用户测试能力
- 提供一个界面,允许用户测试模型的准确性
承认
我们要感谢 Pavlos Protopapas 和哈佛应用计算 295 课程的其他教学人员的指导和支持。
为手机游戏出版平民化 PySpark
与朋友的话 2(来源:https://www.zynga.com)
2020 年火花峰会上的 Zynga Analytics
在过去的两年里,Zynga 的分析越来越多地使用 PySpark,这是 Spark 大数据平台的 Python 接口。我们的中央和嵌入式分析团队使用 PySpark 支持移动出版运营,包括分析和报告、实验、个性化服务和营销优化。我在 2020 年 Spark 峰会上介绍了我们如何向整个分析组织开放这个强大的平台,并讨论了我们面临的一些挑战以及我们团队开发的新应用。这篇文章提供了视频演示的文本版本,可在这里获得。我们的机器学习(ML)工程团队也在峰会上展示了强化学习的新应用。
我是 Zynga 的一名杰出的数据科学家,我的职责是探索新技术,并倡导扩大我们分析团队的技术堆栈。本次会议符合大会的主题,即实现人工智能和大数据工具的民主化。在 Zynga,我们通过向我们的完整分析团队开放 Spark 生态系统,与这一主题保持一致。我们确实面临着这种方法的成长烦恼和扩展挑战,但我们将讨论我们如何克服这些障碍,并提供一些在您的分析组织内扩展 Spark 的最佳实践。
我们正处于前所未有的时代,今年的虚拟会议反映了这一现实。Zynga 回应 COVID 疫情的方式之一是领导与世界卫生组织的一项倡议,我们与数十家游戏出版商和工作室合作,通过游戏传播关于社交距离的信息。 Play Apart Together 倡议扩大了关于如何在这些充满挑战的时期保持安全,同时通过游戏与朋友和家人保持联系的沟通。我们的使命是通过游戏连接世界,我很自豪 Zynga 在这一举措中发挥了至关重要的作用。
我们在 Zynga 的分析团队现在超过 50 人,我们已经向整个组织开放了 PySpark 平台。Zynga analytics 的任何成员现在都可以使用该平台将分析和 ML 模型扩展到大规模数据集。虽然开放这一强大的工具有助于加快我们分析组织的产出,但随着越来越多的团队成员采用该平台处理日常任务,我们确实面临着一些挑战和成长的烦恼,我们将重点介绍我们克服这些问题的几种方法。我们应对这些挑战的一个关键方法是将一套广泛的培训材料放在一起,并制定政策来保持集群的可维护性和成本可控性。虽然开发 PySpark 并推动该平台的采用需要一些努力,但我们发现我们的团队以新颖的方式使用 Spark,为我们的游戏团队和直播服务带来了有用的分析和工具。
Zynga 拥有多样化的游戏组合,并有嵌入式分析师和数据科学家支持开发这些游戏的工作室。我们把每年收入超过 1 亿美元的游戏称为“永远的专营权”,我们预计这些游戏将持续几年繁荣发展。在录制这个环节的时候,我们有 6 个游戏符合这个标准。从那以后,我们收购了 Peak Games,将玩具爆炸和卡通爆炸加入到我们的投资组合中,使这个数字达到了 8。
作为一个分析组织,我们面临的挑战之一是,我们的游戏组合会生成非常不同的数据集。例如,我们有赌场游戏、社交吃角子老虎机游戏、赛车游戏和基于比赛 3 的游戏,它们具有不同的事件分类。虽然数据集在不同的游戏中差异很大,但我们在过去几年的目标之一是标准化基础设施和工具,我们的嵌入式团队使用这些基础设施和工具来处理这些大规模数据集,并为我们的工作室找到见解。我们发现 Spark 非常适合集中式平台,因为它可以与我们所有的数据源很好地集成,并且可以扩展到处理巨大的工作负载。
就 Zynga analytics 的结构而言,我们是我们的分析工程、嵌入式分析和中央分析团队的组合。虽然这个团队是不同学科的混合体,但我们有一个共同的目标,那就是帮助我们的游戏团队找到洞察力和个性化的游戏体验。
嵌入式分析师和数据科学家与他们支持的工作室位于同一地点,并与产品经理和工作室领导密切合作,以支持游戏发布和直播服务。这些团队负责监控游戏的性能,进行个性化实验,并探索如何改善我们游戏中的用户体验。我所在的中央分析部门专注于构建工具,这些工具可以扩展到我们所有的分析团队,并支持发布运营,如用户获取和企业发展。这两个团队都利用了我们的数据平台,该平台提供了跟踪事件数据、处理不同数据集以及构建支持我们实时服务的数据产品的能力。我们的分析工程团队负责构建和维护这个平台,它是我们分析能力的支柱。
虽然我们的分析团队执行各种不同的职能,但我们在不同的团队中看到了几个共同的主题,即作为游戏发行商支持工作室。第一个是 Zynga 分析的核心功能之一,即利用我们的数据平台来衡量游戏的性能,并为改善我们的玩家体验提供见解。我们看到的第二个常见主题是在我们的游戏中进行实验,并与产品经理密切合作,以确定实验的结果以及如何基于这些发现。第三个主题是构建数据产品,推动游戏中的个性化体验。例如,我们建立倾向模型,预测哪些用户可能会在游戏中失败,并可以根据这些信号定制体验。最后的主题是营销优化,这是产品营销和用户获取的交叉点。虽然这通常是中央分析团队的职能,但在构建支持这一职能的 ML 模型时,利用我们的嵌入式分析师和数据科学家的领域知识是非常有用的。
自 Zynga 于 2007 年成立以来,我们的数据平台已经经历了几次迭代,但在过去的几年里,随着我们对分析团队使用的工具进行标准化,我们已经看到了巨大而有益的变化。十多年来,我们一直使用 Vertica 作为数据存储,该数据库为我们的核心分析功能提供了动力,如报告、探索性数据分析和游戏中的 A/B 测试。虽然这个数据库在过去十年中一直是我们数据平台的一部分,但我们的分析师使用的许多工具已经随着时间的推移发生了变化。我将这些不同的工具转变归类为 Zynga 的三个分析时代。
我将第一个时代称为 SQL 时代,因为分析师和数据科学家花了大部分时间直接与我们的数据库打交道。这包括构建报告、探索新用户漏斗的指标、计算实验结果以及将数据整理成可用于预测和倾向建模等任务的格式。在这个时代,分析师使用的主要工具是连接和查询我们的数据存储的 IDE。虽然一些分析师和数据科学家使用 R 编程语言来构建 ML 模型,但不同的嵌入式分析团队之间并没有标准化。
2017 年,我们组建了中央分析团队,这是我们工具标准化的转折点。我们决定将 Python 作为 Zynga 的标准分析语言,并建立一个托管的 Jupyter 笔记本环境,分析师可以在其中进行项目合作。我们称之为笔记本时代,因为我们的分析师开始花更多的时间在笔记本环境中,而不是直接与我们的数据库打交道。其中一个巨大的成果是,为笔记本电脑使用一个通用的托管环境意味着跨团队共享脚本变得更加容易,因为该环境有固定数量的特定版本的库。虽然我们的团队花了一些时间将 Python 作为我们分析团队的通用语言,但好处很快超过了培训我们团队的成本,因为团队可以更容易地协作,并且更容易对我们的整个游戏组合进行分析,而不是单个游戏。
Zynga 当前的分析时代被称为生产时代,因为我们的分析团队现在正在利用工具将 ML 模型投入生产。我们的分析师现在正在利用 PySpark 构建可扩展到数千万玩家的批量 ML 管道,我们正在使用 Flask 构建端点和 web 工具来支持游戏和发布团队,我们正在与分析工程合作,使用 AWS SageMaker 构建实时预测模型。我们的分析团队现在更多地参与构建基于这些见解为直播服务提供动力的系统,而不是寻找见解并将这些见解交给游戏团队。
过去几年发生的变化之一是,我们为分析团队提供了比以前更多的工具。虽然我们现在已经向整个团队开放了我们的 Spark 环境,但我们从有限的访问开始,并在扩展到所有 Zynga Analytics 之前展示了该平台的实用性。当我们看到我们的分析师和数据科学家可以构建端到端的 ML 模型时,我们希望让越来越多的团队能够使用这个平台。
我们希望向所有分析师开放我们的 Spark 生态系统有几个原因。其中一个核心动机是,我们希望为我们的分析师提供一条继续发展他们的技术能力和提升他们的技能集的途径。接触 Spark 并建立端到端的渠道是分析师在 Zynga 继续职业发展的方式之一。
另一个动机是,我们希望对工具进行标准化,使我们的分析师能够处理机器集群,而不是单个实例,这是我们 Jupyter 笔记本电脑生态系统中的一个限制。我们使用 Databricks 作为我们的 Spark 平台,它提供集群管理、作业调度和协作笔记本。与此动机类似,我们希望更新我们的平台,以涵盖我们的团队正在执行的更多类型的任务。例如,一些团队需要处理我们数据库中没有的大型数据集,而 Spark 有多种数据连接器,这意味着我们可以将该平台用作统一的解决方案。同样相关的是,我们希望我们的团队能够扩展到更大的问题,例如为我们的整个用户群而不是一个游戏或一群玩家创建倾向模型。
我们希望向所有分析师开放平台的最后一个原因是为了分配在平台上运行的作业的所有权。不是让我们的分析工程团队负责所有计划作业的监控,而是设置作业的分析团队也负责监控作业失败以及模型维护。随着平台上运行的作业和任务数量的增加,分配所有权变得至关重要。
当我们过渡到 PySpark 作为大规模分析的标准化平台时,我们面临的第一个问题是我们的团队需要学习 PySpark,这可以被描述为 Python 语言的一种方言。虽然 PySpark 可以运行任何 Python 命令,但是当您利用使用这种分布式数据结构的 Spark 数据帧和库时,PySpark 的真正潜力将被释放出来,这种分布式数据结构使命令能够在一个机器集群上运行,而不仅仅是在一个驱动程序节点上运行。
为了启动采用 PySpark 运行日常任务的流程,我们开始收集培训材料,以帮助我们的团队适应这个新的生态系统。我们的培训材料包括执行常见操作的示例笔记本、我们为开始使用该平台而编写的入职培训材料,以及作为场外团队活动一部分的培训课程。我们希望提供足够的材料,以确保我们的团队能够在这个新平台上执行日常任务。
我们在这个平台上进行培训的下一步是指导。除了录制培训课程的场外活动之外,我们还提供了更直接的指导。我们举行了办公时间,在那里我们更有经验的 PySpark 用户可以为我们仍在学习该平台的团队成员回答问题。这种方法的结果喜忧参半,但一个积极的结果是,最活跃的参与者与能够提供定向反馈的导师结成了伙伴关系。
虽然我们试图在培训材料方面走在前面,但一旦平台推广到整个团队,推动平台的采用仍然是一个挑战。我们发现,推动平台采用的最佳方式之一是将需要利用平台来完成项目的不同团队配对,从而实现跨团队协作。例如,我们有一个团队正在我们的 Jupyter 笔记本电脑环境中进行强化学习项目,当我们将我们的 ML 工程团队添加到该项目中时,数据科学家了解了如何通过将现有工作流移植到 PySpark 来扩展它们。
我们加快平台采用的另一种方法是利用 Python 编码人员熟悉的 PySpark 生态系统的功能,但在幕后使笔记本电脑能够在一个机器集群上以分布式方式运行。Pandas UDFs 是一种以分而治之的方式创作函数的方法,在这种方法中,您可以定义如何对数据集进行分区,编写标准 Python 代码以对数据子集进行操作,然后将结果组合回分布式数据框中。我在 2019 年 Spark 峰会上讨论了【Zynga 如何使用这种方法。
考拉是 PySpark 中的另一个特性,我们探索这个特性是为了让我们的分析师和数据科学家能够从 Python 代码跳到 PySpark。它提供了与 Pandas dataframes 相同的接口,但是以分布式模式执行。虽然由于实现的限制,目前不可能简单地替换这些库来使现有的 Python 代码在集群环境中工作,但它确实为学习如何使用分布式数据集提供了一个有用的桥梁。
我们已经为 ML 模型分配了数据管道的所有权,这使得我们的分析团队能够将我们生产的模型数量扩大一个数量级。虽然我们以前的方法是让数据科学家构建模型规范,并将其交给我们的分析工程团队进行生产,但我们的新模型是在这些团队之间进行合作,让分析师和数据科学家拥有更多实时 ML 模型的 DevOps 方面。我们有多种方法将模型投入生产,例如构建批处理管道,将预测推送到我们的应用程序数据库,或者与 ML engineering 合作,使用 AWS SageMaker 将模型设置为 web 端点。虽然我们的分析师和数据科学家不负责监控支持这些模型的基础架构,但他们负责监控为预测服务的模型的正常运行时间和性能。
我们让我们的团队更容易访问该平台的另一种方式是创作一个内部库,该库执行我们的分析团队需要执行的常见功能。这包括读取和写入各种数据源,以及将 ML 输出发布到我们的应用程序数据库,在那里我们的实时服务可以使用预测。我们也构建了一些模型维护工具,但是随着库的成熟和提供更多的特性,我们一直在向 MLflow 迁移。
随着我们向更多的团队成员开放平台,我们面临的一个问题是不同笔记本之间的库版本冲突。我们也不想为每个用户增加一个集群,因为成本可能会失控。我们决定采用一种策略,在这种策略中,交互式集群有固定的库版本,调度的作业被设置为在临时集群上运行,这意味着调度的作业不会干扰任何其他任务。此外,对于处理新工作流的团队,团队可以请求开发集群在迁移到运行在临时集群上的计划作业之前测试工作流。
虽然我们将所有权分配给了运行作业的嵌入式团队,但我们在确定作业所有者方面仍然存在差距。在我们向所有团队开放平台之前,我们对现有作业进行了审核,并确保所有正在运行的作业都产生了可供我们的游戏团队使用的输出。一旦我们完成了审计,我们就建立了一个安排新工作的流程。现在作业需要一个所有者、一个备份所有者和一个团队别名来调度,我们收集游戏工作室正在使用的模型输出的日志。对于我们计划长期运行的任务,我们将工作流迁移到气流,在那里我们有强大的监控。
我们学到的另一课是关于成本跟踪。我们在一个新的平台上释放了一个兴奋的团队,我们的团队渴望使用 GPU 等功能来训练深度学习网络。虽然任何人都可以连接笔记本电脑和运行 PySpark 脚本,但我们将集群创建限制在我们的 ML 工程团队,这是分析工程的一部分。为了控制成本,我们使用脚本标记所有集群,以确保我们可以监控费用。我们还会淘汰旧集群,并根据需要淘汰特定于项目的集群。我们的目标是避免需要特定库的长时间运行的集群,而是建立具有最新库的共享集群。
我们打开了这个新平台的闸门,但需要一些推动才能让团队探索这个平台。虽然这是一个类似于 Jupyter 的笔记本电脑环境,但它也面临着挑战。例如,Spark 中任务的延迟执行给我们的团队带来了具有挑战性的调试工作。任务不会立即失败,脚本可能会在失败前完成几个步骤。
虽然我们最初的方法是有一个松散的频道作为 Spark 问题的总括,但当我们将较新的 Spark 用户与有经验的 Spark 用户配对时,我们发现信噪比更高。我们还关注跨团队合作,以确保我们有不同经验水平的人在项目中工作。
我们发现成功采用 PySpark 的第一个项目是 AutoModel 系统,该系统每天构建数百个倾向模型。这是一个端到端的工作流,它从我们的数据湖中提取数据,使用 Featuretools 库应用自动化特征工程,并使用 Spark 附带的 MLib 库训练分类模型。工作流的输出是写入我们的应用程序数据库的预测分数,该数据库构建在 Couchbase 上。一旦结果发布到 Couchbase,我们的游戏团队就可以使用预测值来设置实验和个性化游戏体验。虽然我们对这个系统有一些用例,这为我们所有的游戏创造了失效的可能性和购买预测的可能性,但我们的产品经理为这些预测值提出了我们没有预料到的新应用。
Zynga 的 PySpark 的另一个用例是使用我们的数据将玩家分为不同的玩家原型,这使我们能够更好地了解我们的玩家群。虽然一些嵌入式分析师已经为特定的游戏做了这种类型的工作,但这通常是一次性的工作,而不是为我们的游戏团队提供最新细分市场的计划任务。我们能够使用 PySpark 将这些细分模型投入生产,使这些细分能够用于我们的实验堆栈。虽然与 scikit-learn 相比,我们在 MLlib 中可用于聚类玩家的算法较少,但我们能够标准化我们的方法,并将此管道应用于我们产品组合中的多个游戏。
我们的分析团队在过去几年中参加了黑客马拉松,这是我们的分析团队在 PySpark 上尝试项目的绝佳机会。这些项目产生的一个新颖应用是使用深度学习的异常检测系统。该系统将用户活动编码为 1D 图像,使用自动编码器将图像压缩到潜在空间,然后使用自动编码器解压缩图像。输入和输出图像之间有很大差异的玩家会被进一步调查。虽然这个工作流仅限于单个机器而不是集群,但我们的团队能够利用 GPU 设置的大型实例来快速迭代 Tensorflow 模型。这是开放这个平台真正有利于我们正在探索的一些工作的一个很好的方式。
我们在 PySpark 中看到的一个主题是,它支持组合规模分析,为特定游戏开发的方法通常可以扩展到多个游戏。这方面的一个例子是我们的老虎机分析团队最初探索的经济模拟项目。虽然这个工作流的最初版本是针对这种类型的游戏的,但该团队能够将模拟游戏经济概括为马尔可夫链,并将该方法移植到使用 Spark 数据框架。其结果是一种方法,可以提升到跨我们的几个游戏的大型模拟。
虽然我们发现的大多数新应用程序都专注于构建 ML 管道,但我们也发现 PySpark 对于扩展其他类型数值计算的工作负载很有用。使用 Pandas UDFs,我们能够使用现有的笔记本,并使用分而治之的方法使代码在一个机器集群上并发运行。这使我们能够使用 scipy、numpy 和 statsmodels 库进行分布式工作,并帮助完成缩放任务,例如 A/B 测试的显著性测量。
我还想展示 Zynga 的另一个项目,这是我们的强化学习管道,名为 RL Bakery 。虽然这个工作流没有直接使用 PySpark,但我们发现我们的一些数据科学家正在使用 Spark 进行深度学习模型的离线训练,我们需要一个管道来实时服务这些模型,并为模型提供在线更新。我们已经使用这个管道为 Word With Friends 2 和 CSR Racing 2 的生产中的强化学习模型提供服务,示例应用程序包括通知计时。
回顾本次会议的收获,我们已经向我们的整个分析团队开放了我们的 Spark 基础设施,结果是为游戏工作室开发了新颖的应用程序,这些应用程序现在正在为直播服务提供支持。虽然推动该平台的采用需要一些时间,但随着更多团队成员开始使用该平台,我们确实建立了势头,并且我们专注于能够利用 PySpark 快速扩大规模的跨团队项目。我们还面临着管理机器集群和库版本的挑战,以及控制成本的挑战,但产出的提高完全值得付出这些成本。Zynga 的 PySpark 民主化使我们的分析组织能够解决新的大规模问题,并使我们的分析团队能够接触到更多大数据工具。
感谢您参与本次会议。Zynga analytics 正在招聘,你可以在这里找到空缺职位的名单。
揭开员工离开 EDA 的神秘面纱
解释性数据分析,具有深刻的视觉效果和有趣的发现
来自 pixabay 的 Img 通过链接
在之前的帖子中,我试图预测一个银行客户是否可能离开,或者一个应用程序用户是否可能流失或订阅。现在,我将分享最近在人力资源领域的工作,给那些努力留住员工的公司带来一些预测能力。
在这第一篇文章中,我将重点探索数据集的任何有趣的模式。一如既往,它分为以下几部分:
1.问题陈述
2.数据审查
3.分布分析
4.独立变量相关分析
5.响应变量相关分析
6.外卖食品
让我们开始旅程吧🏃♂️🏃♀️.
1。问题陈述
如果你来自人力资源部门,你可能会同意雇佣和留住员工是复杂的任务,需要资金、时间和技能。
根据 toggle hire 的说法,公司花费员工工资的 15%-20%来招聘一名新的候选人。在一家拥有 0-500 名员工的公司中,雇佣一名员工的平均成本为 7645 美元🙀🙀。
作为一名数据科学家,你的任务是开发一个可以预测哪些员工更有可能辞职的模型。您的发现将有助于更有效地留住员工。
2。数据回顾
这里使用的数据集是来自 Kaggle 的 IBM HR Analytics 数据集。共有 1470 条记录,包含 35 个特征。查看下面的视频,真正接触原始数据集。
为了更好地理解每个特性的含义,我在下面做了一个易于查看的图。
图 1 数据变量概述
要了解数值变量的分布,请使用下面的。
employee_df.describe()
对于数据质量检查(如果每列中有任何空数据或缺失数据)和查看数据类型,请使用以下内容:
employee_df.info()
请注意,您还可以使用下面的命令来检查数据帧中是否有 NA 值:
employee_df.isna().any()
employee_df.isnull().any()
通过以上所有内容,我们发现 26 个数值变量和 9 个分类变量没有缺失值。
3。分布分析
我们使用直方图作为数值变量分布分析的简单可视化。
首先,让我们将二进制分类数据转换成数字。使用带有 lambda 的单行函数来应用于整个列。然后,pandas 内置绘图功能来创建直方图。具体来说,
employee_df[‘Attrition’] = employee_df[‘Attrition’].apply(lambda x: 1 if x == ‘Yes’ else 0)
employee_df[‘OverTime’] = employee_df[‘OverTime’].apply(lambda x: 1 if x == ‘Yes’ else 0)
employee_df[‘Over18’] = employee_df[‘Over18’].apply(lambda x: 1 if x == ‘Y’ else 0)
employee_df.hist(bins = 30, figsize= (15, 15), color = 'r')
图 2 数值变量的分布分析
回顾图 2,您可能会发现“员工人数”、“18 岁以上”和“标准工时”栏没有价值,因为这些对所有员工都是一样的。因此,让我们删除它们:
employee_df.drop([‘EmployeeCount’, ‘EmployeeNumber’, ‘Over18’, ‘StandardHours’], axis = 1, inplace = True)
4。自变量相关性分析
变量相关性是一个值得每个数据科学家关注的重要问题。
通常,相关要素不会提高模型性能。考虑到维数灾难和模型的可解释性,移除相关特征是明智的。要执行相关性分析,请使用:
correlations = employee_df.corr()
plt.subplots(figsize = (20, 20))
sns.heatmap(correlations, annot = True)
图 3 显示了一些明显的相关性。例如,*‘总工作年数’与‘工作级别’和‘月度收入’*有很强的相关性。一般来说,我们可以看到相当多的变量相关性很差。太好了,因为我们希望用彼此不高度相关的特征来训练预测模型。
图 3 预测因子的相关性分析
5。响应变量相关性分析
为了分析每个特征如何影响员工休假,我们可以检查每个变量相对于响应变量的分布。
首先,对于员工*【年龄】*,我们用计数图,
plt.figure(figsize = (25, 10), dpi = 300)
sns.countplot(x = ‘Age’, hue = ‘Attrition’, data = employee_df )
图 4 显示了 25-35 岁之间的员工,与其他年龄组相比,显示了较高的休假比率。在 21 岁以下,可以看到很高的离职率,表明年轻的专业人士更有可能离开公司🤭。
图 4 员工休假计数图与年龄
第二,对于*‘job role’*,计数情节为:
sns.countplot(x = ‘JobRole’, hue = ‘Attrition’, data = employee_df)
图 5 显示 【销售主管】【销售代表】【实验室技术员】*相比其他角色*更有可能离职。
图 5 员工休假曲线图与工作职责
第三,让我们用 KDE(核密度估计)来分析数值变量的概率密度函数。
KDE 采用带宽和核函数,通过加权每个样本附近的距离来近似人口的真实分布。附近的数据点越多,估计值就越高,表示看到一个点的概率。带宽决定了最终曲线的“平滑”程度。较低的带宽意味着只有靠近当前位置的点被赋予权重。解释的够多了,如果想要更多的介绍,试试这个链接。我们来看看如何实现。
对于变量*‘距离原点’*,
sns.kdeplot(left_df[‘DistanceFromHome’], label = ‘Employee left’, shade = True, color = ‘r’, )
sns.kdeplot(stayed_df[‘DistanceFromHome’], label = ‘Employee stay’, shade = True, color = ‘b’)
如图 6 所示,当离家的距离大于 10 公里时,更多的员工倾向于离开🆒🆒。
图 6 KDE 距离图
对于变量*【任职年限】*,更多的员工倾向于在任职不到 2 年的情况下离开,现任经理,倾向于在任职超过 5 年的情况下留在🧨🧨,如图 7 所示
图 7 使用 CurrManager 的年 KDE 曲线图
对于变量*‘总工作年数’*,更多的员工倾向于在工作不到 7 年时离开 ️📣如图 8 所示
图 8总工作年限的 KDE 曲线图
现在,让我们用箱线图来形象化地比较*【每月收入】在【性别】*之间的分布。如图 9 所示,女性和男性月收入显示出相似的可变性,具有相似的中位数、75%和 25%四分位值👏👏如图 9 所示
图 9月收入 btw 性别箱线图
最后,让我们看看不同的*【工作角色】收入分配。图 10 显示了不同角色的月收入分布和可变性。有趣的是,我们发现“销售代表”的分布很紧凑,收入普遍低于其他职位🙀。这可以解释为什么【销售代表】*倾向于离开更多,如图 5 所示
图 10月收入 btw 岗位职责箱线图
6。外卖
- 数据质量检查告诉我们,我们的数据集非常干净,没有丢失值。
- 独立变量相关性分析表明,相当多的特征似乎彼此相关性很差。
- 自变量和响应变量之间有趣的模式显示了员工可能离职的一些线索。
希望这能对如何更好地理解你的员工或同事的离职决定有所启发。
太好了!这趟旅程的终点。在下一篇文章中,我们将关注真正有趣的部分:建模。在那里见💕💕
用机器学习揭开员工离职之谜
用于休假预测的少数机器学习模型的创建和评估
来自 unsplash 的 Img 通过链接
在以前的帖子中,我试图预测银行客户是否可能离开,或者应用程序用户是否可能流失或订阅。在这里,我将分享最近在人力资源领域的工作,给任何努力留住员工的公司带来一些预测能力。
在这第二篇文章中,我的目标是评估和对比一些不同模型的性能。一如既往,它分为:
1.数据工程
2.数据处理
3.模型创建和评估
4.外卖食品
1。数据工程
在第一篇帖子中完成了简短的数据探索之后,让我们继续进行特征工程和数据编码。特征工程包括从当前特征创建新特征和关系。
首先,让我们把分类变量和数字变量分开。我们可以使用 数据类型方法 来查找分类变量,因为它们的 数据类型 将是*‘对象’。您可能会注意到,在使用**employee _ df . info()***时,已经显示了数据类型。
然后,我们可以对分类变量进行编码。有两种方法可用。一个是用来自 sklearn 的 OneHotEncoder,一个是来自 熊猫 的get _ dummies()。我更喜欢后者,因为它返回一个 dataframe,使下面的步骤变得容易。具体来说,
employee_df_cat = pd.get_dummies(employee_df_cat)
然后,将编码的分类变量和数字变量连接在一起。具体来说,
X_all = pd.concat([X_cat, X_numerical], axis = 1)
最后一步是生成目标变量。
employee_df[‘Attrition’] = employee_df[‘Attrition’].apply(lambda x: 1 if x == ‘Yes’ else 0)
y = employee_df[‘Attrition’]
2。数据处理
现在我们准备好处理数据,包括数据分割、缩放和平衡。
为了使数据为训练做好准备,我们需要缩放特征以避免任何变量支配其他变量,即采取更高的权重和对模型学习的强烈影响。具体来说,
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X_all)
现在,让我们将数据集划分为训练集和测试集。要拆分数据,
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
我们已经注意到员工去留严重失衡。所以让我们实现 SMOTE 方法来对少数类进行过采样。具体来说,
oversampler = SMOTE(random_state=0)
X_smote_train, y_smote_train = oversampler.fit_sample(X_train,y_train)
太好了!现在模型的数据已经准备好了📣📣。
3。模型创建&评估
正如本文开头提到的,我们的目标是评估和比较一些模型的性能。
3.1 逻辑回归
简单地说,逻辑回归对独立变量的线性组合使用对数变换,这允许我们以线性方式对非线性问题建模。通常用于二元分类问题,其中假设预测值和响应变量之间存在某种相关性。
为了创建一个逻辑回归分类器,我们使用 sklearn 如下。
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_smote_train, y_smote_train)
为了评估性能,我们使用混淆矩阵。
y_pred = model.predict(X_test)
cm = confusion_matrix(y_pred, y_test)
sns.heatmap(cm, annot= True)
如图 1 所示,逻辑回归分类器给出的准确度为 0.75,F1 值为 0.52。
图 1 逻辑回归模型的混淆矩阵
3.2 随机森林
随机森林是一种以决策树为构建块的集成模型。它创建了一组决策树,并使用它们的集体预测能力来获得相对较强的性能。要想真正了解兰登森林的基础知识,可以参考这个公民网博客。
要创建随机森林分类器,
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_smote_train, y_smote_train)
使用相同的方法来评估性能,我们获得了 0.85 的准确度和 0.39 的 F1 分数。
图 2 随机森林模型的混淆矩阵
3.3 人工神经网络
最后的尝试是创建和训练一个人工神经网络。在这里,我们将建立一个具有几个密集层的顺序模型,并使用剔除技术来减少过拟合。具体来说,
from keras.models import Sequential
from keras.layers import Dense, Dropout
model = Sequential()
model.add(Dense(units = 50, activation = ‘relu’, input_shape = (50, )))
model.add(Dense(units = 500, activation = ‘relu’))
model.add(Dropout(0.3))
model.add(Dense(units = 500, activation = ‘relu’))
model.add(Dropout(0.3))
model.add(Dense(units = 50, activation = ‘relu’))
model.add(Dense(units = 1, activation = ‘sigmoid’))
为了编译神经网络,我们使用*‘亚当’*优化器和二元交叉熵作为损失函数。
model.compile(optimizer=’adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
epochs_hist = model.fit(X_smote_train, y_smote_train, epochs = 50, batch_size = 50)
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5)
如上所述,我们将 sigmoid 函数输出的阈值概率设置为 0.5。因此,任何大于 0.5 的输出被视为“离开”,否则被视为“停留”。图 3 显示了训练期间的模型损失。似乎该模型在 20 个纪元内达到了收敛。
图 3 训练过程中的模型丢失
最后,如图 4 所示的混淆矩阵热图给出了 0.88 的准确度和 0.41 的 F1 分数。
图 4 人工神经网络的混淆矩阵
4。外卖
最后,让我们将性能汇总在表 1 中。为了更好地理解指标,后退一步。我们的任务是预测员工是否可能离职。由于类别之间的高度不平衡,准确性不是一个好的指标。在我看来,减少假阴性错误比假阳性更有意义,因为该模型可以识别更多正在离开的人🤔。基于这个逻辑,逻辑回归模型是赢家。但显然,还有相当大的提升空间。
表 1 模型性能概述
太好了!希望这篇文章为不同的 EDA 和机器学习技术打下良好的基础。像往常一样,如果你对代码感兴趣,可以查看我的 GitHub 资源库 这里 🤞🤞。
揭开阿帕奇箭的神秘面纱
了解关于一种工具的更多信息,该工具可以在两秒钟内在您的笔记本电脑上过滤和聚合 20 亿行
在我作为数据科学家的工作中,我在一系列看似不相关的情况下遇到过 Apache Arrow。然而,我总是很难准确地描述它是什么,它做什么。
Arrow 的官方描述是:
用于内存分析的跨语言开发平台
这很抽象——而且有充分的理由。该项目雄心勃勃,旨在为大范围的数据处理任务提供主干。这意味着它位于较低的级别,为更高级的、面向用户的分析工具(如 pandas 或 dplyr)提供构建模块。
因此,对于那些在日常工作中偶尔遇到这个项目的用户来说,这个项目的重要性可能很难理解,因为它的大部分工作都是在幕后进行的。
在这篇文章中,我描述了我在工作中遇到的 Apache Arrow 的一些面向用户的特性,并解释了为什么它们都是 Apache Arrow 旨在解决的更基本问题的各个方面。
通过连接这些点,可以清楚地了解为什么 Arrow 不仅是解决当今一些实际问题的有用工具,而且是最令人兴奋的新兴工具之一,有可能成为未来数据科学工作流的大部分背后的引擎。
更快的 csv 读取
Arrow 的一个显著特点是,它可以将 CSV 读入熊猫图,比pandas.read.csv
快 10 倍以上。
这实际上是一个两步过程:Arrow 将数据读入内存中的 Arrow 表,该表实际上只是记录批次的集合,然后将 Arrow 表转换为 pandas 数据帧。
因此,加速是 Arrow 底层设计的结果:
- Arrow 有自己的内存存储格式。当我们使用 Arrow 将数据加载到 pandas 时,我们实际上是将数据加载到 Arrow 格式(数据帧的内存格式),然后将其转换为 Pandas 内存格式。因此,读取 CSV 的部分加速来自于箭头列格式本身的精心设计。
- 箭头中的数据以记录批的形式存储在内存中,记录批是一种 2D 数据结构,包含等长的连续数据列。可以从这些批处理中创建一个’表,而不需要额外的内存复制,因为表可以有“分块”列(即数据段,每个部分代表一个连续的内存块)。这种设计意味着可以并行读取数据,而不是 pandas 的单线程方法。
PySpark 中更快的用户定义函数(UDF)
在 Apache Spark 中运行 Python 用户定义函数一直非常慢——慢到通常建议不要在任何大规模的数据集上运行。
最近,Apache Arrow 使得在 JVM 和 Python 进程之间高效地传输数据成为可能。结合矢量化 UDF,这导致了巨大的加速。
这是怎么回事?
在引入 Arrow 之前,将数据从 Java 表示转换为 Python 表示的过程非常缓慢——包括序列化和解序列化。它也是一次一行,速度较慢,因为许多优化的数据处理操作对以列格式保存的数据最有效,每列中的数据保存在内存的连续部分中。
Arrow 的使用几乎完全消除了序列化和解序列化步骤,还允许以列批处理方式处理数据,这意味着可以使用更高效的矢量化算法。
Arrow 能够在不同语言之间传输数据,而不会产生很大的序列化/反序列化开销,这是一个关键特性,使得用一种语言实现的算法更容易被使用其他语言的数据科学家使用。
将文件夹中的文件作为单个表格读取
Arrow 能够将包含许多数据文件的文件夹读入单个数据帧。Arrow 还支持读取数据被划分到子文件夹的文件夹。
此功能说明了记录批次周围的箭头的高级设计。如果所有东西都是一个记录批,那么源数据是存储在一个文件中还是多个文件中就无关紧要了。
读取拼花文件
Arrow 可用于将 parquet 文件读入 Python 和 R 等数据科学工具,正确表示目标工具中的数据类型。由于 parquet 是一种自描述格式,并且在模式中指定了列的数据类型,因此获得正确的数据类型似乎并不困难。但是仍然需要一个翻译的过程来将数据加载到不同的数据科学工具中,这是令人惊讶的复杂。
例如,在历史上,pandas 整数类型不允许整数为空,尽管在 parquet 文件中这是可能的。类似的怪癖也适用于其他语言。Arrow 为我们处理这个翻译过程。数据总是首先被加载到 Arrow 格式中,但是 Arrow 提供了翻译器,然后能够将其转换成特定于语言的内存格式,比如 pandas dataframe。这意味着对于每个目标格式,需要一个格式到箭头的翻译器,这是对当前需要“n 取 2”个翻译器(每对工具一个)的巨大改进。
Arrow 的目标是最终完全消除这个翻译问题:理想情况下,数据帧应该有单一的内存格式,而不是每个工具都有自己的表示形式。
编写拼花文件
Arrow 可以很容易地将 pandas 和 R 等工具中保存在内存中的数据以 Parquet 格式写入磁盘。
为什么不直接将数据以 Arrow 格式保存到磁盘上,从而拥有一个在磁盘上和内存中相同的单一的跨语言数据格式呢?一个最大的原因是,Parquet 通常产生较小的数据文件,如果您是 IO 绑定的,这是更可取的。如果你从像 AWS S3 这样的云存储中加载数据,情况尤其如此。
Julien LeDem 在一篇讨论两种格式的博客文章中进一步解释了这一点:
列数据和内存中数据的权衡是不同的。对于磁盘上的数据,通常 IO 主导延迟,这可以通过以 CPU 为代价的激进压缩来解决。在内存中,访问速度要快得多,我们希望通过关注缓存局部性、流水线和 SIMD 指令来优化 CPU 吞吐量。
这使得在内存和磁盘格式的开发中密切合作,在两种表示之间进行可预测和快速的转换是可取的——这正是 Arrow 和 Parquet 格式所提供的。
这些想法是如何联系在一起的?
虽然非常有用,但迄今为止讨论的面向用户的特性并不是革命性的。真正的力量在于底层构建模块的潜力,它可以实现数据科学工具的新方法。目前(2020 年秋季),Arrow 背后的团队仍在进行一些工作。
记录批次和分块
在 Apache Arrow 中,数据帧由记录批次组成。如果存储在磁盘上的 Parquet 文件中,这些批处理可以非常快地读入内存中的 Arrow 格式。
我们已经看到这可以用来将 csv 文件读入内存。但更广泛地说,这一概念打开了整个数据科学工作流的大门,这些工作流是并行的,并对记录批次进行操作,从而消除了将整个表存储在内存中的需要。
数据帧的一种常见(跨语言)内存表示
目前,数据科学工具及其数据帧的内存表示的紧密耦合意味着用一种语言编写的算法不容易移植到其他语言。这意味着相同的标准操作,如过滤器和聚合,会被无休止地重写,优化不容易在工具之间转换。
Arrow 提供了在内存中表示数据帧的标准,以及允许多种语言和引用相同内存数据的机制。
这为的发展创造了机会
C++中的一个原生箭头列查询执行引擎,不仅用于 C++中,也用于 Python、R 和 Ruby 等用户空间语言中。
这将提供一个单一的、高度优化的代码库,可用于多种语言。对维护和贡献这个库感兴趣的开发人员将会更多,因为它可以在各种工具上使用。
伟大的想法
这些想法在 Arrow 作为“数据 API”的描述中结合在一起。其思想是 Arrow 提供了一种跨语言的内存数据格式,以及一种相关的查询执行语言,为分析库提供了构建块。像任何好的 API 一样,Arrow 为常见问题提供了一个高性能的解决方案,用户不需要完全理解实现。
借助分析库,这为数据处理能力的重大变革铺平了道路:
- 默认情况下被并行化
- 在数据帧上应用高度优化的计算
- 不再需要处理整个数据集必须适合内存的约束
同时通过在单台机器上或通过网络在工具之间更快地传输数据,打破工具之间共享数据的障碍。
我们可以在 R 中 Arrow 包的插图中一窥这种方法的潜力,其中一个 37gb 的数据集有 20 亿行,在一台笔记本电脑上处理和聚合不到 2 秒钟。
这将现有的高级数据科学工具和语言(如 SQL、pandas 和 R)置于何处?
正如插图所示,Arrow 的目的不是直接与这些工具竞争。相反,更高级的工具可以使用箭头,对它们面向用户的 API 施加很少的约束。因此,它允许在不同工具的表达能力和特性方面继续创新,同时提高性能并为作者节省重新发明通用组件的任务。
进一步阅读
https://arrow.apache.org/overview/
https://arrow.apache.org/use_cases/
https://arrow.apache.org/powered_by/
https://arrow.apache.org/blog/
https://ursalabs.org/blog/
https://wesmckinney.com/archives.html
https://www.youtube.com/watch?v=fyj4FyH3XdU
箭头设计文档:
文件系统 API
数据集 API
数据框架 API
C++查询引擎
揭秘人工智能!
打破人工智能领域和它的未来。
GIF 来自 GIPHY
根据麦肯锡全球研究所的一项研究,预计到 2030 年,人工智能每年将创造 13 万亿美元的额外价值。即使在今天,人工智能技术也产生了巨大的收入,但主要是在软件领域。
然而,到 2030 年,将产生的收入将在软件行业之外,特别是在零售、旅游、运输、汽车、材料、制造等行业。
人工智能将在几个领域产生巨大影响,但围绕它也有很多不必要的炒作。人工智能的“金发姑娘法则”指出,人们不应该对人工智能技术持乐观或过于悲观的态度。
虽然承认人工智能将拥抱世界的现实期望是令人敬畏的,但理解和揭穿围绕人工智能的神话同样重要。
人工智能、机器学习(ML)和深度学习(DL)这些热门词汇在最近被频繁使用。让我们分别反省一下每个方面,以便真正理解这些概念。
在这篇文章中,我们将揭开人工智能的所有概念,并完美地理解它的每个方面,以便在这个问题上没有任何困惑。
所以,事不宜迟,让我们开始打击——人工智能。
缩小人工智能的领域
人工智能的主题是巨大的,类似于巨大的银河系。人工智能(AI)是一个广泛的领域,有许多子类别,如自然语言处理(NLP)、人工神经网络、计算机视觉、机器学习、深度学习、机器人等等。人工智能的正式定义是—
“能够执行通常需要人类智能的任务的计算机系统的理论和发展,如视觉感知、语音识别、决策和语言之间的翻译。”
然而,即使在我们开始深入这些其他领域之前,人工智能也可以缩小到以下两个独立的更广泛的领域:
- 人工狭义智能— 执行一项或几项特定的任务,这些任务是通过编程来完成的。这些例子包括自动驾驶汽车、下一个单词预测、自动更正等。这是我们将关注的主要概念。
- 人工通用智能— 它们执行类似人类的活动和任务。通用人工智能是一种智能,可以像人类一样高效地执行任何智力任务。在这一领域仍有许多进展要做。
还有另一个术语叫做超级人工智能或强人工智能,被认为是超越人类的人工智能。然而,这只是一个假设的概念,本文不会讨论,因为我们在未来几年还远远没有达到这种智能水平。
为了理解人工智能的概念和围绕它的各个方面,我开发了一个关于宇宙的简单类比。
浩瀚的银河系类似于人工智能的广阔领域。它包含了数十亿个太阳系,类似于人工智能是如何由这么多子领域组成的。我们的太阳系类似于人工智能中的一个子领域,即“机器学习”。地球是我们太阳系中唯一可居住的星球,可以被称为“深度学习”。
通过我们的类比,我们可以得出这样的结论:人工智能类似于浩瀚的银河系,这是一个由子课题组成的广阔领域,如可以与我们的太阳系相提并论的机器学习,深度学习是机器学习的子课题,类似于太阳系中的地球。下面是一个简单的参考,以便更好地理解这个类比。
AI =银河系| ML =太阳系| DL =地球
让我们讨论一下人工智能的其他重要方面,即机器学习、深度学习和数据。
机器学习:
机器学习是程序自动学习和提高效率的能力,而无需显式编程。这意味着给定一个训练集,你可以训练机器学习模型,它将理解一个模型到底是如何工作的。在对测试集、验证集或任何其他看不见的数据进行测试时,模型仍然能够评估特定的任务。
让我们用一个简单的例子来理解这一点。假设我们有一个 30,000 封电子邮件的数据集,其中一些被分类为垃圾邮件,一些被分类为非垃圾邮件。机器学习模型将在数据集上训练。一旦训练过程完成,我们可以用一封没有包含在我们的训练数据集中的邮件来测试它。机器学习模型可以对以下输入进行预测,并正确分类输入的电子邮件是否是垃圾邮件。
机器学习的三种主要类型如下:
- 监督学习— 这是一种用专门标记的数据集训练模型的方法。数据集可以是二元分类,也可以是多类分类。这些数据集将具有指定正确和错误选项或一系列选项的标注数据。在监督下,即在这些标记数据的帮助下,对模型进行预训练。
- 无监督学习— 无监督学习是在无标签数据集上训练模型。这意味着模型没有先验信息。它通过将相似的特征和模式组合在一起来训练自己。无监督学习的一个例子可以是狗和猫的分类。
- 强化学习— 强化学习是一种试凑法模型。这是模型通过重复失败来学习的方法。当一个模型没有达到期望的结果时,该模型将重新训练。这可以应用于像下棋这样的概念,在玩了数百万局游戏后,模型将能够学习适当的模式和移动。
随着对机器学习的想法和认识的清晰,我们现在可以继续前进到数据的基本概念以及为什么它对我们如此重要。
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片
数据:
数据可以被认为是适用于执行机器学习或深度学习任务的任何可用的有用资源或信息。您想要构建的每个模型都有大量数据可用。重要的是搜集并找到完成评估所需的有价值的数据。
数据集是数据的集合。在表格数据的情况下,数据集对应于一个或多个数据库表,其中表的每一列代表一个特定变量,每一行对应于所讨论的数据集的给定记录。
在当今时代,人工智能的普及速度比以往任何时候都快,为此,我们必须感谢数据的丰富和增长。由于数据量的增加,人工智能的增长速度大大加快。
更多的数据可以更好地训练机器学习或深度学习模型,因为我们能够在更大的数据集上训练模型,这有助于模型在训练中更好地学习,通常可以更好地执行手头的任务。
数据科学就是关于数据的。这个术语有时可能会被随意抛弃,但它对任何项目来说都是最有价值的资源。大数据、数据科学和数据分析领域正在迅猛发展。科技巨头正在加大对有用数据收集的投资。
数据收集是在一个已建立的系统中收集和测量目标变量信息的过程,然后使人们能够回答相关问题并评估结果。要了解更多关于数据收集和每个机器学习和数据科学项目所需的其他基本技术,请查看下面的文章。
详细讨论构建您的机器学习和数据科学项目的最佳方法…
towardsdatascience.com](/10-step-ultimate-guide-for-machine-learning-and-data-science-projects-ed61ae9aa301)
深度学习:
深度学习是机器学习的一个子领域,它基于人工神经网络的概念来执行特定的任务。人工神经网络从人脑中提取灵感。
然而,最重要的是要注意,它们在理论上并不像我们的大脑那样运作,一点也不像!它们被命名为人工神经网络,因为它们可以完成精确的任务,同时达到理想的精度,而无需用任何特定的规则显式编程。
几十年前,深度学习非常流行,但由于缺乏计算复杂计算的数据和技术,它最终失去了大部分宣传。
然而,在过去几年里,这种情况发生了显著变化。大量的数据每天都在激增,因为大型科技巨头和跨国公司正在投资这些数据。由于强大的图形处理单元(GPU),计算能力也不再是一个大问题。
深度学习的强化每天都在快速增加,尤其是有了巨大的改进。深度学习在今天非常受欢迎,并且具有远远超过现代大多数机器学习算法的巨大潜力。
如果你有兴趣了解更多关于深度学习和人工神经网络的历史,那么请随意访问下面的文章。
重温人工神经网络发展背后的迷人历史
towardsdatascience.com](/the-complete-interesting-and-convoluted-history-of-neural-networks-2764a54e9e76)
库纳尔·辛德在 Unsplash 上拍摄的照片
结论:
人工智能是当今发展最快的领域。据财富报道,统计数据显示,人工智能专家的雇佣量在过去 4 年里增长了 74%。人工智能被认为是当代人最热门的工作。
对熟练人工智能专家的需求正以前所未有的速度增长。对机器学习、深度学习、计算机视觉、统计学和自然语言处理等人工智能子领域专家的需求和空缺职位每天都在激增。
由于我们周围存在巨大的机会,我们很幸运处于人工智能兴起的时代。我们被人工智能包围着,我发现这个领域的快速进步非常令人着迷。我对未来更新的技术和人工智能的兴起感到兴奋。
我很想知道你们所有人对人工智能的不断进步和崛起有何看法。是让你兴奋,还是你真的不太在乎?不管怎样,知道这个会很酷。😄
看看我的其他一些文章,你可能会喜欢读!
[## 用代码和例子简化函数的 args 和 kwargs!
理解 python 编程和机器学习的args 和kwargs 的完整概念。
towardsdatascience.com](/simplifying-args-and-kwargs-for-functions-with-codes-and-examples-b785a289c2c2) [## 简单有趣的万圣节 Python 项目!
这是一个有趣的“不给糖就捣蛋”的游戏,让你在万圣节愉快地学习 python 编程
towardsdatascience.com](/simple-fun-python-project-for-halloween-ff93bbd072ad) [## 5+独特的 Python 模块,用于创建脱颖而出的机器学习和数据科学项目!
超过 5 个酷 Python 库模块的指南,用于创建令人敬畏的机器学习和数据科学项目。
towardsdatascience.com](/5-unique-python-modules-for-creating-machine-learning-and-data-science-projects-that-stand-out-a890519de3ae) [## 用代码和例子理解 Python 中的高级函数!
详细了解 python 中的匿名函数和高级函数及其实际应用…
towardsdatascience.com](/understanding-advanced-functions-in-python-with-codes-and-examples-2e68bbb04094)
谢谢你们坚持到最后。我希望你们喜欢阅读这篇文章。我希望你们都有美好的一天!
揭秘二分搜索法
搜索算法指南
升级你的搜索游戏!
在之前的文章中,我们一直在讲线性搜索。如果你没看过,建议你先浏览一下。现在你已经理解了线性搜索的概念,是时候让你知道一个更强大的搜索方法,那就是二分搜索法。
图片由 Unsplash 上的 Annie Theby 拍摄
在编程中,你会遇到很多需要在一个有序数组中找到一个元素的确切位置/索引的情况。大多数时候,二分搜索法将是正确的方法。这就是为什么二分搜索法是程序员工具箱中必不可少的工具。
什么是二分搜索法?
二分搜索法是一种有效的搜索技术。唯一的缺点是它只能在有序列表上运行。二分搜索法也称为对数搜索、二分法或半区间搜索。
通过从数组的中间开始,该算法可以通过确定所需的关键字是放在前半部分还是后半部分来有效地将搜索空间减半。
它是如何工作的?
这些是在二分搜索法完成的步骤:
- 从中间元素开始,将该元素与所需的键进行比较。
- 如果键匹配中间的元素,则返回中间的位置。
- 如果键小于中间的元素,那么键只能位于左半部分的子数组中。我们只将焦点移到左半部分的子阵列。
- 否则,我们只关注右半部分的子阵列。
- 重复步骤 1、2、3 和 4,直到找到所需的键或检查完每个子阵列。
- 如果数组中没有匹配项,则返回-1
二分搜索法的例子
在这里,我将为您提供一个二分搜索法算法的伪代码。阅读伪代码将帮助你更好地理解算法中到底发生了什么。
二分搜索法伪码
我还将提供 3 种不同编程语言的示例代码,Python、C 和 JavaScript。
Python 中的二分搜索法代码
C 语言中的二分搜索法码
JavaScript 中的二分搜索法代码
二分搜索法的时间复杂性
二分搜索法的最佳情况发生在所需密钥位于数组中间的时候,在这种情况下,时间复杂度为 O(1)。而对于最坏的情况,我们将需要进行 log2(n)比较,因为在每次迭代中,数组的长度变成一半。
例如,我们有一个长度为 8 的数组。在最坏的情况下,我们需要经历 3 次迭代。
- 在第一次迭代之后,我们关心的子阵列的长度是 8/2 = 4
- 在第二次迭代时,剩余子阵列的长度是 4/2 = 2
- 这是最后一次迭代,因为在这一步之后,子数组是一个单元素数组。
我们知道 log2(8)等于 3,这就是为什么二分搜索法的时间复杂度是 O(log n)。对于一般情况,所做的比较次数与最差情况大致相同。因此,平均情况下的时间复杂度也是 O(log n)。
最后的话
尽管二分搜索法很实用,但我们应该始终记住它有一些局限性:
- 必须对列表进行排序。
- 我们必须能直接接触到中间元素。
学习二分搜索法对每个想发展编程技能的人来说都是必不可少的。二分搜索法是一个伟大的工具,它将帮助你克服你在成为一名专业程序员的道路上所面临的许多问题。
“一步一个脚印是让你达到目标的唯一办法.”
—艾米莉·狄金森
永远不要说以后再往前走一步!
问候,
弧度克里斯诺
揭开冒泡排序的神秘面纱
排序算法指南
升级你的排序游戏!
在前面的文章中,我们一直在讨论搜索算法。您可能还记得二分搜索法和插值搜索只对有序数组有效。可以肯定地说,排序是搜索算法的补充。排序是将数据结构中的元素重新排列成某种特定顺序(升序或降序)的操作。为了简单起见,我们将对所有数组进行升序排序。
有许多可用的排序算法,其中一些比另一些更好。然而,对我们来说,重要的是理解它们中的每一个,给我们一个完整的算法基础。在本文中,我们将从最简单的冒泡排序开始。
什么是冒泡排序?
冒泡排序也称为下沉排序,是一种简单的排序算法,它通过比较每对相邻元素来进行操作。首先,它比较第一个和第二个元素,然后是第二个和第三个元素,依此类推。如果前一个元素大于后一个元素,这两个元素将互换。
该算法因较大的元素会向最右边的位置“冒泡”而得名。在每个周期之后,最大的元素将是数组中未排序部分的最后一个元素。
它是如何工作的?
冒泡排序中完成的操作:
- 比较前两个元素。
- 如果前一个元素较大,则互换这两个元素。
- 重复步骤 1 和 2,直到到达数组的末尾。
- 重复步骤 1、2 和 3,直到所有元素都排序完毕。
需要注意的是,在第一次运行中,假设数组中的元素数量为 n,您需要进行 n-1 次比较。在第二次运行中,您只需要进行 n-2 次比较,而不需要进行最后一次比较,因为此时最后一个元素是最大的。这意味着,在每次运行中,比较的次数减少 1。
冒泡排序示例
在我们用 3 种不同的编程语言进行真正的实现之前,我会先给你们提供伪代码。
冒泡排序伪代码
是时候继续学习 Python、C 和 JavaScript 的真正代码了。
Python 中的冒泡排序代码
C 中的冒泡排序代码
JavaScript 中的冒泡排序代码
冒泡排序的时间复杂度
冒泡排序操作是基本的,但是它的时间复杂度不是最好的。最佳情况/最差情况/平均情况的时间复杂度是 O(n ),因为在任何阵列中,比较的总数是:
(n-1) + (n-2) + … + 3 + 2 + 1 = n(n-1)/2
对于任何数组,尽管该数组已经被排序,但是算法将精确地进行 n(n-1)/2 次比较。由于冒泡排序的时间复杂度为 O(N ),所以它很少在实际实现中使用。随着 n 变大,运行时间的增长会非常大。
放弃
虽然冒泡排序可能很少使用。学习冒泡排序绝对值得。学习冒泡排序将帮助你更容易地学习更高级的主题,因为它将充当你理解更高级概念的桥梁。
“我没有学到新东西的一天就是虚度的一天.”
— B. B .金
每天愉快地学习新概念!
问候,
弧度克里斯诺
揭秘置信区间和误差范围
从统计学上说,我有 95%的信心到底意味着什么?
我最近看到了盖洛普国际协会电晕跟踪器的调查
我们都喜欢阴谋论!全球 36%的人将新冠肺炎归咎于外国势力。在 95%的置信水平下,调查的误差幅度为 3。本次调查在全球范围内进行了 20,000 多次采访。
我试图找到更多关于置信区间和误差幅度的信息,但对于没有深入统计学知识的人来说,它们似乎很难理解。挑战在于,大多数解释依赖于大量外行可能不知道的行话。
在这篇文章中,我会试着解释误差范围和置信区间的概念,而不用太多的数学和花哨的统计术语。
照片由 Element5 数码在 Unsplash 上拍摄
比方说,一家新闻机构正在试图计算在即将到来的选举中,有百分之多少的人会投票给一个政党。由于几乎不可能采访全部人口,他们随机选择了 100 人作为样本。在接受采访的 100 人中,有 43 人愿意投 A 。
让我们用数学术语来转换这个问题。我们要说,抽样一个将要投 A 的人相当于抽样 1,抽样一个不打算投 A 的人相当于抽样 0。这意味着在这 100 个样本中,43 个是 1,其余 57 个是 0。
现在让我们定义一些数学符号:
这里你可能会奇怪为什么计算标准差的分母是 n-1 而不是 n *。*这是通过使用贝塞尔修正来消除总体方差估计中的偏差。更多信息,请参考此处的。
对于均值 μ_p (未知)、标准差 σ_p (未知)的总体,中心极限定理告诉我们:
- 如果我们从替换总体中随机抽取足够多的样本,那么样本均值的分布将是近似正态的。
- 抽样分布的平均值可以用来估计真实的总体平均值 μ_p
- 抽样分布的样本标准差( σ_x) 由 σ_p/√n 给出(即总体的标准差除以样本中的观察数)。
**重要的补充说明:**只有当我们的样本是随机的,即它们代表总体时,上述估计才成立。
为了计算 **σ_x,**我们需要未知总体的标准差( σ_p )。相反,我们使用样本的标准偏差( σ_s )来估计 σ_p 在使用贝塞尔校正去除偏差之后。
置信区间(CI)和误差范围的计算:
从上面的分布中,让我们找到一个区间,即我们可以 95%确定包含真实总体均值( **μ_p,**其值与抽样分布的均值( μ_s ))的值范围。说总体均值( μ_p )有 95%的概率在区间内,这是不太正确的。总体均值( μ_p )有一个我们不知道的固定值。如果我们重复进行相同的实验,它不会改变总体平均值( μ_p )。因此,询问总体均值( μ_p )在一定范围内的概率是不正确的。相比之下,我们计算的置信区间取决于收集的样本。如果我们重复这个实验,置信区间几乎肯定会不同。所以我们应该问区间包含总体均值的概率。
95%的置信区间仅仅意味着,在重复的随机样本中,真实总体均值( μ_p )有 95%的可能性位于区间内。
置信区间是频率统计中最广泛使用的区间估计方法,经常与可信区间混淆,可信区间是贝叶斯统计中的一个类似概念。关于这些差异的更专业的解释,请参考这里:置信区间和可信区间有什么区别?
现在让我们找出 z 的值,使得阴影区域的面积为 0.95 。 z 是偏离样本均值的标准偏差数,也称为临界值。
计算 ci 的公式采用以下通用形式:
CI =样本平均 z 值×平均值的标准误差(SEM)
CI =样本平均 z 值×(标准差/√n)
如果我们正在计算平均值的 95%置信区间,要使用的 z 值将是 1.96。
在我们的虚拟例子中,误差幅度是 0.098,或者大约 10% ( 1.96*σ_x )。
上述陈述可以解释为“我们有 95%的把握认为0.332(0.43–0.098)和 0.528(0.43+0.098) 之间的区间,捕捉到了将投票给*的人口的真实平均比例。”这意味着,如果对来自同一总体的随机样本重复采样过程,那么预计 95%的计算区间将包含真实值。*
误解:
我们不应该说总体的真实均值( μ_p )在 0.332 到 0.528 之间有 95%的几率,因为这暗示着均值可能在这个区间内,也可能在别的地方。这使得总体均值看起来是可变的,但事实并非如此。这个区间要么抓住了平均值,要么没有。样本与样本之间的间隔会发生变化,但是我们试图获取的总体参数不会发生变化。
95%的置信区间并不意味着 95%的样本数据位于该区间内。置信区间不是样本的可信值范围,而是总体参数的可信值的区间估计。
置信区间模拟。http://www.rossmanchance.com/applets/ConfSim.html
在第一个实验中,我随机选择了 1000 个样本,样本量为 5,95.5%的时间我们的置信区间包含真参数。需要注意的重要一点是,如果我们希望区间更窄,我们需要增加样本量,因为它与样本量的平方根成反比。
我希望置信区间和误差幅度这两个术语不再是一个陌生的概念。虽然这篇介绍遗漏了一些技术部分,但是有很多非常好的资源,可以提供更多的细节。我总是乐于接受问题和建议。通过 LinkedIn 联系我,别忘了点击👏🏻如果你喜欢邮报。
参考:
*Morey,R.D .,Hoekstra,r .,Rouder,J.N. 等将信心置于置信区间的谬误。心理牛 Rev **23,*103–123(2016)。https://doi.org/10.3758/s13423-015-0947-8
用购物篮分析揭开客户行为的神秘面纱
在这篇博客中,我们将看到如何通过使用关联规则进行市场购物篮分析来预测客户行为。
来源:oracle.com
购物篮分析简介
购物篮分析是大型零售商用来发现商品之间关联的关键技术之一。它通过寻找在交易中频繁出现的项目组合来工作。换句话说,它允许零售商识别人们购买的商品之间的关系。
该方法基于这样的理论,即购买某一商品的顾客更有可能购买另一特定商品)。
例如,买面包的人通常也会买黄油。零售店的营销团队应该瞄准购买面包和黄油的顾客,并向他们提供优惠,让他们购买第三样东西,如鸡蛋。
来源:爱德华卡
因此,如果顾客购买面包和黄油,看到鸡蛋打折或打折,他们就会被鼓励花更多的钱去买鸡蛋。这就是市场篮子分析的全部内容。
这只是一个小例子。因此,如果你把你的超级市场的 10000 或 20000 项数据带给一个数据科学家,想象一下你能得到多少洞见。这就是为什么关联规则挖掘如此重要。
现实生活应用
购物篮分析也可用于交叉销售产品。众所周知,亚马逊使用一种算法,根据你的浏览历史或其他人购买的东西,推荐你可能感兴趣的商品。
一个众所周知的城市传说是,一家超市,在运行商业部门蒲式耳检查后,发现男子可能会一起购买啤酒和尿布。Deals 通过将贮藏啤酒放在尿布旁边来扩大交易。
这听起来很简单(大多数时候确实如此)。尽管如此,纠结要知道:
- 对于巨大的库存(例如超过 10,000),这些东西的组合可能会爆炸成数十亿,这使得数学几乎是古怪的。
- 信息是定期从大量的交易记录中挖掘出来的。许多信息通常由特定的可测量程序处理
关联规则挖掘
关联规则挖掘主要用于当我们必须在给定的集合中找到对象之间的关联,或者在任何一条信息中找到一些隐藏的模式。
购物篮分析或购物篮数据分析在零售或聚类中是关联规则挖掘的一些应用。
处理这些例子最广泛使用的方法是市场篮子分析。这是零售领域许多大公司使用的一个关键系统,如亚马逊、Flipkart 等,通过识别用户放入其“购物容器”中的各种东西之间的关系来细分用户的购买行为。这些从属关系的揭示可以帮助零售商通过获取知识来创建广告程序,这些知识是客户尽可能经常一起获取的。这些方法可以包括:
- 根据趋势改变商店布局
- 网上商店的交叉营销
- 顾客购买的流行商品是什么
- 带附加销售的定制电子邮件
- 客户行为分析
- 目录设计
注:关于购物篮分析和推荐系统的相似性,大家心里都有很多困惑
联想和推荐的区别
正如已经讨论过的,关联规则对个人的偏好不起作用。它总是发现每笔交易的一些元素集之间的关系。这使得它们与被称为协作过滤的推荐系统方法完全不同。
如果你想了解一下推荐系统,可以去看看我之前的博客推荐引擎。
示例:
为了更好地理解它,请看下面来自 Amazon.com 的快照。你会注意到在每个产品的信息页面上有两个标题“经常一起购买”和“购买该商品的顾客也购买了”。
经常一起买→买了这件物品的协会客户也买了→推荐
这就是关联规则和推荐之间的区别。
现在,我们来谈谈主要的联想机器学习算法之一。即。 Apriori 算法
Apriori 算法
假设我们有一个包含集合{Banana,菠萝,芒果}的事务,也包含另一个集合{Banana,芒果}。所以,根据先验原理,如果{香蕉,菠萝,芒果}是频繁的,那么{香蕉,芒果}也一定是频繁的。
我们有一个由一些交易组成的数据集。
0 ->缺少项目
1->项目的存在
为了从这个小型企业场景的多个可能规则中找出有趣的规则,我们将使用以下矩阵:
**支持度:**支持度是一个物品的受欢迎程度(出现的频率)。它可以通过包含该项目的交易数量占交易总数的比例来计算。所以,如果我们想计算香蕉的支持度,这里是:
支持(香蕉)=(涉及葡萄的交易)/(总交易)
支持度(香蕉)= 0.666
**置信度:**如果 A 项发生,B 项发生的可能性(条件概率)。
置信度(A => B) =(涉及 A 和 B 的事务)/(仅涉及 A 的事务)
信心({香蕉,菠萝} = > {芒果}) =支持(香蕉,菠萝,芒果)/支持(香蕉,菠萝)
= 2/6 / 3/6
= 0.667
**提升:**如果 A 项出现,B 项出现的几率增加。
升力(A => B) =信心(A,B) /支持(B)
lift({香蕉,菠萝} = > {芒果}) = 1
因此,客户同时购买 A 和 B 的可能性是单独购买的机会的“提升价值”倍。
- Lift (A= > B) = 1 表示项目集合内没有相关性。
- Lift (A = > B)
- Lift (A = > B) < 1 表示项目集内部存在负相关,即项目集中的产品, A *,*和 B 不太可能一起购买。
履行
你可以从这里得到数据。
该数据集包含一家商店的各种产品的交易数据。
在导入库之前安装 apyori 包
conda install --yes apyori
OR
pip3 install --yes apyori
导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from apyori import apriori
我们已经导入了所有必需的库:
- NumPy 和熊猫用于基本操作
- 用于数据可视化的 Matplotlib
- apyori 用于我们的数据建模
导入数据
store_data = pd.read_csv("store_data.csv",header = None)
我们已经使用 pandas 将数据集读入名为“store_data”的数据框中。现在让我们看看数据
store_data.head()
所以,这是我们数据的样子,它包含了各种产品的所有交易历史。
store_data.shape
7501 表示不同物品一起购买的交易总数。20 表示显示项目的列数
数据预处理
因为 Apriori 库要求我们的数据集是列表的列表形式。因此,整个数据集是一个大列表,数据集中的每个事务都是外部大列表中的内部列表。[[交易 1],[交易 2],。。[交易 7501] ]
让我们将熊猫的数据框转换成如下的列表列表:
records = []
for i in range(0,7501):
records.append([str(store_data.values[i,j]) for j in range(0,20)])
让我们看看这些事务集:
for sets in records:
print(sets)
Apriori 算法
先验的参数:
- 记录:列表列表
- min_support :选择支持值大于参数指定值的项目的概率值
- min_confidence :过滤置信度大于指定阈值的规则的概率值
- min_lift :入围规则列表的最小提升值
- min_length :您希望在规则中包含的最小项目数
association_rules = apriori(records, min_support = 0.0055, min_confidence = .3, min_lift = 3, min_length = 2)
将上述规则转换为规则列表:
association_results = list(association_rules)
现在让我们看看我们的算法生成了多少规则:
print(len(association_results))
因此,我们总共有 18 条规则,这些规则比我们预期的有更高的支持、信心和提升。让我们看看一些规则
print(association_results[5])
我们可以看到,规则 5 包含(意大利面条、碎牛肉、冷冻蔬菜)之间有很好的关联。
显示规则列表
for item in association_results:
pair = item[0]
items = [x for x in pair]
print("Rule :"+ str(items[0]) + "->" + str(items[1]))
print("Support : {}".format(item[1]))
print("Confidence : {}".format(item[2][0][2]))
print("List : {}".format(item[2][0][3]))
print("\n-------------------------------------------------\n")
所以,这是关于如何实现 apriori 算法,在我们的事务集中找到关联性。
保持曲调,快乐学习🙂
最初发布在 Knoldus 博客上:https://blog . knold us . com/machinex-demystifying-market-basket-analysis/
关注 MachineX Intelligence 了解更多信息: