工具变量:一个实用的解释
简介
在统计分析中,我们很容易忽略预测变量带来的某些问题。也就是说,我们的自变量通常具有直接影响模型结果有效性的潜在属性。
在回归分析中,我们的任务是估计自变量和因变量之间的因果关系。我们假设这种因果关系在整个实验中是一致的。然而,当我们认为这一假设被违反时,我们将使用工具变量(IV)来正确预测给定自变量的“治疗”效果。因此,工具变量被用来提供真实的效果,而不是有偏见的效果。
在这篇博客中,我将通过一个教育回报的例子来说明为什么 IV 估计为统计框架提供了价值。同样重要的是要注意,使用 IVs 并不总是必需的,但是这个博客将会告诉你什么时候是合适的。
为什么使用静脉注射?
有时在回归分析中,我们会忽略一些与相关自变量有内在联系的因素。回归分析的目的是找出自变量对因变量的因果效应*,其他条件不变*。然而,在现实中,通常情况是,通过增加所述自变量,我们观察到与我们的模型所预测的不同的变化。
约书亚·安格里斯特(Joshua Angrist)在估算基于越南军事参与的工资回报方面的开创性工作显示了一些启发性的结果,即在引擎盖下,像军事参与这样的独立变量是如何不完全提供信息的。安格里斯特发现,虽然许多人是自愿的,但也有许多男性被征召入伍,这对工资回报产生了不同的影响。
因此,安格里斯特将征兵作为一个工具变量,我们期望它与军事参与相关,但与我们的误差项无关,因此与工资无关。通过这种方法,获得了不同的估计数,这些估计数更好地反映了军事参与的真实效果。
解读 OLS 系数
假设我们观察到使用普通最小二乘法(OLS)获得的以下回归:
y = α + βX + ε
在模型预测中,如果我们将 X 增加一个单位,我们将推断出对 y 的以下影响:
δy =β×1
当上述情况不是对 X 增加的真实估计时,就需要使用工具变量。本质上,我试图传达一个信息,独立变量可能与误差项ε相关。
当 X 与误差项相关时 y 的变化:
δy =β×1+δε
在无偏 OLS 估计中,解释变量不能与误差项相关。解释变量被说成是与误差项相关的外生和,不应该能够解释误差。因此,上述独立变量可能与误差相关的情况违反了 OLS 假设,必须以某种方式加以考虑。以这种方式表现的变量被称为内生变量。
你好工具变量
四假设和方法
在解释了为什么我们可能想要使用工具变量之后,我们需要一个工具, Z ,以满足以下假设:
- 相关性 : Z 可以预测δX 即 cov(Z,X) ≠0
- 外生性 : Z 与误差项不相关,即 cov(Z,ε) = 0
相关性很重要,因为它本质上说明了我们选择的工具与我们选择的自变量相关
外生性很重要,因为它表明我们的工具与误差项不相关
换句话说,这些假设意味着仪器必须仅通过 X 影响 y ,并且它必须对 X 有一些影响。
图 1:IV 是如何工作的
四申请:返校
在试图确定学校教育的回报时,我们可能会遇到以下回归:
log(工资)= α + βEdu + ε
- 其中 log(工资)是我们试图预测的结果变量
- α是某个常数
- Edu 是一个自变量,它将受教育年限作为一个连续变量
- ε是误差
我们可以相信 Edu 和我们的误差项有一定的关联。出现此问题可能有几个原因:
- 家庭背景可能会影响受教育年限
- 能力可以用智商来衡量,可能会影响受教育的年限
现在,我们可以用其中的一个来控制我们的自变量。我们必须确保它们满足我们的两个假设:相关性和外生性。它必须能够预测 Edu ,并且与误差项不相关。
下一步:2SLS
我们使用两阶段最小二乘法来估计一个新的 Edu 参数,然后将它代入我们的初始回归线。
图 2:两阶段最小二乘法
首先,我们使用家庭背景的工具变量来计算教育的估计值
第二步是将这一估计值代入我们对工资估计值的初始回归中
结果
现在,我们有希望获得一个关于学校教育对工资影响的无偏估计。如果我们相信我们的预测违反了外生性的性质,那么 IV 估计据说比 OLS 估计更有效
结论
我希望这篇博文已经告诉了你在统计框架中使用工具变量背后的直觉。虽然这是一个相当简单的例子,但通常有机会使用几个工具变量来控制估计量。此外,用户一定会感到厌倦,因为工具变量并不总是能够提高模型的有效性或稳健性。
参考
约书亚·d·安格里斯特,终生收入和越战时期的征兵彩票:来自社会保障行政记录的证据,1990 年 6 月(【https://www.jstor.org/stable/2006669?seq=1】T2)
保险风险定价——特威迪方法
在 GLMs 和机器学习中使用 Tweedie 模型估计纯保费的说明性指南
背景
保险业是一个独特的行业,可能是为数不多的不知道销售产品实际成本的行业之一,他们处理不可预见事件的风险。因此,在过去的几个世纪里,该行业一直依靠数学来理解其客户和前景的风险行为,以估计预期损失成本。当然,方法已经从帕斯卡三角、概率应用、最小偏差程序发展到广义线性模型,以及现在的机器学习。
目标
我们已经在之前的文章中详细讨论了计数模型(用于索赔频率)和伽玛模型(用于索赔严重度)。纯保费,也称为“损失成本”,只是两个模型估计的产品。
索赔频率=索赔次数/风险
索赔严重程度=索赔成本/索赔次数
损失成本=索赔频率 x 索赔严重程度
在当前的文章中,我们将讨论一种非常重要和有趣的分布,称为 Tweedie,这种分布很有趣,因为它通过改变单个参数,提供了从高斯到逆高斯的许多其他分布。
这种分布将有助于我们直接建模纯保费,而不需要两个不同的模型。
特威迪分布
Tweedie 分布是指数分散模型的一种特殊情况,通常用作广义线性模型的分布。它可以有一组为零的数据项,这种特殊的属性使它在保险业的索赔建模中非常有用。该模型还可以应用于其他行业的用例,在这些用例中,您会发现零和非负连续数据点的混合。
如果你看到下图中峰值为零的直方图,它可能适合 Tweedie 模型。
这一系列分布具有以下特征
平均值,E(Y)= 1
方差,Var(Y)= ϕ ᵖ
我们用这个表达式“Y ~ Twₚ( ,ϕ”来理解吧,其中 y 表示响应变量,Twₚ( ,ϕ)表示一个 Tweedie 随机变量,具有均值和方差ϕ ᵖ和ϕ>0,p ∈ (-∞,0]∩[1,∞)。
方差函数中的 p 是分布的附加形状参数。
需要注意的重要一点是,这种分布不是针对 0 到 1 之间的 p 值定义的。
- 如果 1 < p <2, the distribution are continuous for Y> 0,正质量为 Y=0
- 如果 p > 2,对于 Y > 0,分布是连续的
让我们看看 Tweedie 分布族的一些常用成员及其指数参数§、方差函数(V())和离差( ф )
指数离差模型
一个分布能够拟合许多其他分布。设置 p = 0 表示正态分布,p = 1 表示泊松分布,p = 2 表示伽马分布,p = 3 表示逆高斯分布。
参数从一种形式转换到另一种形式。
我们知道 Tweedie 是一种复合泊松-伽马分布,其中 N ~泊松(λ)为计数,Z ~伽马(α,θ)为连续数,在这种情况下,参数可以很容易地转换为 Tweedie 参数,如下所示:
泊松-伽马到特威迪
方差也可以平移— Var[Y] = ϕ ᵖ =λ⋅θ ⋅α (α+1)
类似地,Tweedie 参数也可以转换为泊松和伽马参数,如下所示:
特威迪呼叫波松伽玛
现在,我们对这种有趣的分布及其与近亲如泊松和伽马的关系有了一些了解。
接下来,我们将使用一个数据集并检查该分布的适用性。
回想一下我们在以前的文章中使用的保险数据集。我们希望 Tweedie 分布是该数据集的理想候选,让我们研究该数据以证实我们的假设。
这个数据集(dataCar)可以从一个名为“insuranceData”的 R 包中下载。
library(insuranceData)
data(dataCar)
数据集的简要概述
该数据集基于 2004 年或 2005 年购买的一年期车辆保险。共有 67,856 份保单,其中 4,624 份(6.8%的通知索赔)提出了索赔。
数据快照
只有 7%的观察值具有响应变量的正值,其余的值为零。让我们独立地看一下索赔计数和成本的分布。
正如我们在上面看到的
- 损失成本=索赔频率 x 索赔严重程度
让我们用原始变量来重写
- 损失成本=索赔成本/风险
响应变量 —我们将使用“索赔成本”作为响应变量,将“风险敞口”作为补偿,这是一种建议的费率和平均值建模方法。
我们来看看这个变量的分布。
我们可以看到这个数据不能符合正态分布,泊松也可以被丢弃,因为这不是一个计数数据。另一个选择是伽玛,但是这个分布不取零值。因此,最后,我们只剩下特威迪分布,它可能最适合这个数据。
现在,看看独立变量。对于这些变量的详细探索性分析和转换,您可以参考与本文一起分享的源代码。
独立变量 —我们将使用车身、车龄、驾驶员年龄类别、性别、面积和车辆价值作为预测变量。索赔发生指标和索赔数量不能使用,因为它们与因变量有关,只能在事件发生后才知道。
衍生变量和转换——可以对低频率的车身类型进行分组,也为车辆价值创建了一个替代分类变量,可以对其进行显著性测试。
为 Tweedie 模型选择最佳“p”
基于这种探索性分析,我们可以确定 Tweedie 分布是拟合模型的理想候选,但我们尚未找到“p”的最佳值,我们知道该值在 1 到 2 之间变化。
方法 1 —手动选择方差幂。
- 通过运行迭代模型来测试 1 到 2 之间的“p”序列。
- 对数似然显示出一个倒“U”形。
- 选择对应于“最大”对数似然值的“p”。
- 使用该“p”值拟合最终模型。
方法 2——使用统计包自动选择方差功率
统计软件包(宏)在各种软件中可用,如 R、SAS、Python 和徽(行业专用软件),用于计算一系列“p”值的最大似然估计。这些是对方法 1 的一种改进,增加了许多其他特性,如可视化。我们可以看到下面的示例输出,它是使用“Tweedie”包从 R 生成的图形。
#Maximum likelihood estimation of the Tweedie index parameter pest_p <-tweedie.profile(claimcst0 ~ veh_value+veh_body+veh_age+ gender+area+agecat,data=training,link.power = 0,do.smooth = TRUE, do.plot = TRUE)#Note
**link.power** - Index of power link function, link.power=0 produces a log-link
**do.smooth** - logical flag. If TRUE (the default), a spline is fitted to the data to smooth the profile likelihood plot. If FALSE, no smoothing is used (and the function is quicker)
**do.plot** - logical flag. If TRUE, a plot of the profile likelihood is produce. If FALSE (the default), no plot is produced
该图显示最佳“p”值位于 1.5 和 1.6 之间。我们可以使用建议值来拟合 Tweedie 模型。
在 Python 中,statsmodels 有一个名为 estimate_tweedie_power 的函数,用于获得一个最优值。
现在,让我们训练模型
我们使用 R 和 Python 来拟合广义线性模型。r 在统计模型方面已经相当成熟,python 也在追赶它的 statsmodels 包。我觉得缺少关于 statsmodels 的适当例子和文档是唯一的缺点。
在机器学习模型中,Tweedie 损失函数可用于许多算法,如 GBM、LightGBM、XGBOOST 等。在这里,我将带您了解 XGBOOST 的实现。
R 和 Python 中的广义线性模型
R 中的实现
library(tweedie)
library(statmod)#Model
tweedie_model <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender+ area+agecat,data=training, family = tweedie(var.power=1.6, link. power=0),offset=log(exposure))#Note
var.power -index of power variance function, for Tweedie it ranges between 1 to 2, here we are using 1.6.
link.power -index of power link function, link.power=0 produces a log-link
Python 中的实现,Statsmodels
import pandas as pd
import numpy as np
from patsy import dmatrices
import statsmodels.api as sm# Training and test splitmask = np.random.rand(len(df3)) < 0.8
df_train = df3[mask]
df_test = df3[~mask]
print('Training data set length='+str(len(df_train)))
print('Testing data set length='+str(len(df_test)))# Model expression
expr = """claimcst0 ~ veh_value_cat+veh_age+gender+area+agecat"""# Converting data into dmatrices
y_train, X_train = dmatrices(expr,df_train,return_type='dataframe')
y_test, X_test = dmatrices(expr, df_test, return_type='dataframe')# Training modeltweedie_model = sm.GLM(y_train, X_train,exposure=df_train.exposure, family=sm.families.Tweedie(link=None,var_power= 1.6,eql=True))tweedie_result = tweedie_model.fit()#Note
**link -** The default link for the Tweedie family is the log link. Available links are log and Power
**var_power -** The variance power. The default is 1
**eql -** If True, the Extended Quasi-Likelihood is used, else the likelihood is used (however the latter is not implemented). If eql is True, var_power must be between 1 and 2.
GLMs 中的模型验证和拟合优度
抽样输出
我们可以像任何其他回归一样,通过查看结果摘要来分析结果。
- 如果 p 值小于或等于显著性水平,则可以断定该变量是显著的
- 其他指标,如 AIC、偏差和对数似然,对于比较相关模型也很有用。AIC 和偏差越低,模型越好,而似然值越高越好。
Python 中的实现,XGBOOST
import xgboost as xgb
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split#Segregating response and predictor variables in different data frameX, y = data.iloc[:,:-1],data.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split (X,y,test_size =.2, random_state=123)#Creating DMatrix as required for this algorithmdtrain = xgb.DMatrix(data=X_train.iloc[:,1:28],label=y_train)
dtest = xgb.DMatrix(data=X_test.iloc[:,1:28],label=y_test)#Applying offsetdtrain.set_base_margin(np.log(X_train['exposure']))
dtest.set_base_margin(np.log(X_test['exposure']))#Setting Parametersparams =
{"objective":"reg:tweedie",'colsample_bytree': 1.0, 'learning_rate': 0.01,'gamma':1.5,'max_depth': 2, 'subsample':0.6, 'reg_alpha': 0,'reg_lambda':1,'min_child_weight':5, 'n_estimators':2000,
'tweedie_variance_power':1.6}xg_reg = xgb.train(params=params, dtrain=dtrain, num_boost_round=1000)#Note
**reg:tweedie** - Tweedie regression with log-link
**tweedie_variance_power -** default=1.5, range: (1,2)
XGBOOST 中的模型验证
均方根误差(rmse)、平均绝对误差(mae)和 k 倍交叉验证技术等评估指标是验证和比较模型的一些方法。
preds = xg_reg.predict(dtest)
rmse = np.sqrt(mean_squared_error(y_test, preds))
print("RMSE: %f" % (rmse))
请随时访问我的要点路径完整的代码。
摘要
我们已经讨论了保险行业中最常用的分布之一 Tweedie 分布,以及它与其他指数分布模型(如泊松分布和伽马分布)的关系。我们还学会了估计 Tweedie 方差幂,这是拟合精确模型所需的最重要的参数。
尽管我们在一些流行的开源包中讨论了 Tweedie 实现的例子,但是很少有其他软件有这样的实现,比如 H2O、SAS 和徽。
感谢您的阅读,希望您发现这篇文章内容丰富。如有任何疑问或建议,请随时联系我。
参考
[1]Tweedie,M. C. K .,“区分一些重要指数族的指数”,《统计学:应用和新方向》,印度统计金禧国际会议记录,J. K. Ghosh 和 J. Roy(编辑。),印度统计研究所,1984 年,579–604 页
[## [2]XGBoost 参数—XGBoost 1 . 1 . 0—快照文档
max_delta_step [default=0]我们允许每个叶片输出的最大 delta 步长为。如果该值设置为 0,则表示存在…
xgboost.readthedocs.io](https://xgboost.readthedocs.io/en/latest/parameter.html) [## 3 tweedie . profile
Tweedie 分布:Tweedie 指数参数§的极大似然估计。用法…
www.rdocumentation.org](https://www.rdocumentation.org/packages/tweedie/versions/2.3.2/topics/tweedie.profile) [## [4]特威迪
Tweedie 广义线性模型产生一个广义线性模型家庭对象与任何权力方差函数…
www.rdocumentation.org](https://www.rdocumentation.org/packages/statmod/versions/1.4.33/topics/tweedie) [## [5]简介—统计模型
statsmodels 是一个 Python 模块,它为许多不同的统计数据的估计提供了类和函数
www.statsmodels.org](https://www.statsmodels.org/stable/index.html)
将 JupyterLab 与 Google Drive 集成
自动将您的笔记本同步到云
我们的工作机器内存有限。不仅如此,它们还可能发生一些事情——磁盘故障或其他灾难性问题,导致无法访问您的数据。
作为一名数据科学家,你的工作、见解和结论至关重要,无论它们是与工作相关,还是只是你一直在兼职做的事情。当然,你可以随身携带一个闪存盘,但这也是一个不方便的选择,不用说,闪存盘很容易丢失。
这就是云存储的用武之地。这个想法很简单,把所有对你重要的东西都存储在某个你可以从任何地方访问的“安全”的远程位置。这些文件不会存储在你的电脑上,因此不太可能丢失——前提是你没有忘记密码和电子邮件。
说到云存储选项,有太多可供选择的了——对于普通人来说,有 Google Drive 、 OneDrive 和 Dropbox ,如果你想要更安全的东西,还有 Tresorit 或 PCloud 。我不太喜欢这些,主要是因为我想知道我的数据在哪里,而“坐在某个偏远的地方”这个答案并不令人满意。这就是我更喜欢家庭云解决方案的原因,比如来自 WD 的解决方案。
但是我跑题了。
在结束这篇冗长的介绍性文章之前,我只想说,今天我们将看看如何用 JupyterLab 设置 Google Drive,这样你就可以一劳永逸地抛弃那个烦人的 flask drive 了。
我们开始吧。
安装延伸部分
第一部分,你已经猜到了,在你的电脑上安装 Google Drive 扩展。我假设您已经运行了 Python 和 JupyterLab。
启动命令提示符或终端,输入以下命令:
jupyter labextension install @jupyterlab/google-drive
如果你得到一些错误,确保你已经安装了节点和。
大约一分钟后,扩展将被安装,现在您可以启动 JupyterLab 了。侧边栏现在看起来有点不同:
这意味着扩展已经成功安装,可以使用了。嗯,不完全是,但一会儿会更详细。现在,当你打开 Google Drive 时,你只能看到它的标志:
这并不好——因为你没有用你的谷歌账户登录。这个过程可能相当繁琐,但是在下一节中,我会尽量让它变得简单。
一点配置
首先,你需要打开谷歌开发者控制台,创建一个新的项目:
下面是我如何配置我的:
一旦完成,按下创建。此外,确保在顶部栏上选择了项目:
现在转到 OAuth 同意屏幕 —选择外部和创建。然后给应用命名,滚动到底部,点击保存:
现在在凭证选项卡下选择下的 OAuth 客户端 ID 创建凭证:
在下一个屏幕上,在应用程序类型下选择 Web 应用程序,在授权的 JavaScript 源下给它一个名称和 URL。默认情况下,URL 应该是 http://localhost:8888 ,至少我的 JuypterLab 运行在那里。如果您没有进行一些手动配置,情况也是如此:
现在转到库下:
并启用以下 API:
- Google Drive API
- 谷歌选择器 API
- 谷歌实时应用编程接口
这就是谷歌开发者控制台,现在你可以返回到 JupyterLab。选择设置 — 高级设置编辑器:
然后在 Google Drive 下输入分配给您的 ClientID :
现在,您将最终看到登录选项:
一旦你这样做了,接受了一切,你就准备好了!
让我们测试一下
为了测试一切是否正常,我制作了一个虚拟笔记本,并将其命名为 TestNotebook 。几乎立刻就被保存到了谷歌硬盘上:
现在你知道了。你的工作被同步到云端,这使得它的存储更加安全。
整个过程有点乏味,但我希望你已经设法完成了。如有任何问题,请随时联系我。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
将文本特征并入分类项目
比较了波特、斯诺鲍和兰开斯特·斯特默斯。将评论整合到客户数据中,以提高模型的性能。
内容表
项目摘要
该项目旨在研究非结构化文本数据如何为机器学习分类项目增加价值。
我有来自一家公司的两个数据集。其中一个包含了所有客户的基本信息。customer 数据集也有 target 列,它指示客户是持有成员资格还是已经取消了成员资格。另一个数据集包含客户留给公司的评论。我的任务是将顾客的评论与顾客现有的信息结合起来,预测他们是否会取消或保留会员资格。
在这个项目中,我研究了如何使用自然语言工具包(NLTK)将文本挖掘技术整合到机器学习模型中,以提高二元分类的性能。
我在这个项目中使用了 Porter stemmer、Snowball stemmer、Lancaster stemmer、word_tokenize、CountVectorizer、TfidfTransformer、LabelEncoder、XGBClassifier 和 CatBoostClassifier。我选择 ROC 分数作为主要的评估标准。
点击此处返回顶部
数据
客户数据集有 2070 条记录和 17 个变量,包括每个客户的 ID。评论数据集包含公司从每个客户那里收集的信息。
图 1 显示了目标列的频率。其中 1266 人是该公司的会员,804 人已经取消了会员资格。我认为这是非常平衡的数据,所以我没有应用过采样技术。
图 1 —目标的频率
因为我要计算 ROC 得分,所以我将目标值转换为二进制变量。代码如下:
# Encoding the Targetle = LabelEncoder()label = le.fit(customer["TARGET"]).transform(customer["TARGET"])
点击此处返回页首
文本挖掘
首先,我必须标记注释。原始评论可能包含错别字、无关内容、冗余信息等,这些会增加计算负担并降低模型的效率。利用分词器将这些句子分解成单个的单词使我能够提取评论的核心信息。图 2 比较了原始注释和标记化注释。
# First, tokenize the comments
comment["TokenizedComments"]
=comment["Comments"].apply(word_tokenize)comment.head()
图 2 —标记化的注释
为了减少高维度,我应用了三种不同的词干分析器:Porter、Snowball (Porter 2)和 Lancaster。图 3 显示了不同算法的输出。每一种都有利弊。我们可以看看这里:
图 3 —不同词干分析器的输出
1.看起来 Porter 倾向于保存原始内容的大写或小写
2.兰卡斯特非常好斗。例如,对于 ID 3034,当其他两个保留单词“nee”时,Lancaster 将其转换为“nee”
3.波特也很难识别简单的单词。例如,在大多数情况下,波特不知何故将“his”转换成了“hi”
4.因此,我选择了 Snowball stemmer 来完成项目的剩余部分
词干化之后,我构建了术语-文档矩阵并删除了停用词。术语文档矩阵的维数是 2070×354。它可以告诉我们一个特定的单词是否存在于一个特定的文档中。
# Contruct term-document matrix
count_vect = CountVectorizer(stop_words='english',lowercase=False)TD_counts = count_vect.fit_transform(newTextData["Snow"])DF_TD_Counts=pd.DataFrame(TD_counts.toarray())DF_TD_Counts.columns = count_vect.get_feature_names()
图 4 —术语文档矩阵
然后,我从术语文档矩阵中构造了 TF-IDF 矩阵。有许多方法可以量化文档集合中的文本内容,比如可读性分数。在我之前的一篇博客中,我也写过关于计算样板分数的内容,这也是一种量化文本内容的方法。TF-IDF 是最常见的量化方法之一,用于评估一个单词与文档集合中的一个文档的相关程度。图 5 是 TF-IDF 矩阵的一部分。
#Compute TF-IDF Matrix
tfidf_transformer = TfidfTransformer()tfidf = tfidf_transformer.fit_transform(TD_counts)DF_TF_IDF=pd.DataFrame(tfidf.toarray())DF_TF_IDF.columns=count_vect.get_feature_names()
图 5 — TFIDF 矩阵
在构建了 TF-IDF 矩阵之后,我将该矩阵与原始客户数据集相结合。组合数据集有 2070 条记录和 387 列。
点击此处返回页首
建模
为了验证我构建的模型,比较原始数据和组合数据,并避免过度拟合,我将两个数据集分别以 4:1 的比例分为训练数据集和测试数据集。
# split data at 80% 20% for orginal data and combined datadata_train, data_test, label_train, label_test =
train_test_split (pd.get_dummies(data.drop(["ID"],axis=1),
test_size = 0.2, random_state = 42)X_train, X_test, y_train, y_test = train_test_split(EncodeData.drop(["ID"],axis=1), label,
test_size = 0.2, random_state = 42)
首先,我对没有 TF-IDF 矩阵的数据应用了 CatBoost 和 XGBoost。输出如图 6 和图 7 所示。
cat=CatBoostClassifier()
cat.fit(data_train,label_train)
cat_predictions = cat.predict_proba(data_test)
图 CatBoostClassifier 的分类报告
xgb = XGBClassifier()
xgb.fit(data_train,label_train)
xgb_predictions = xgb.predict_proba(data_test)
图 XGBClassifier 的分类报告
然后,我把同样的模型应用到综合数据中。CatBoost 和 XGBoost 的 ROC 得分分别为 0.917173 和 0.911844 。图 8 显示了 CatBoost 模型的对数损失如何随着学习轮次的增加而变化。
图 8-CatBoostClassifier 学习曲线
图 9 是 CatBoostClassifier 结合数据的分类报告,这也是我在这个项目中得到的最好的结果。
图 9-包含组合数据的 catboost 分类器的分类报告
点击此处返回顶部
结论
我比较了三种不同的词干法:波特、雪球和兰卡斯特。兰开斯特比另外两个梗工更有侵略性。波特倾向于保留更多的信息,并且很难识别最基本的单词,比如“他的”斯诺鲍似乎落在了另外两个词干作者之间:不像兰开斯特那样咄咄逼人,但保持了基本的词。
量化文本特征并将其添加到机器学习模型中有助于捕捉原始数据中不会发现的信息。此外,TF-IDF 并不是唯一有帮助的方法。通过改变量化文本内容的方式,可以进一步改进模型。
你可以在这里找到代码和数据。
点击此处返回页首
以前的文章:
将亚马逊 SageMaker 机器学习模型与 QuickSight 集成。
使用 Amazon SageMaker 和 QuickSight 构建的增强机器学习模型概述。
您是否想过如何以更简单的方式将 ML 预测添加到您的 BI 平台中,并与商业客户分享?放心吧!AWS ML Insights 的一个用 SageMaker 增强的 QuickSight 已经覆盖了你!
假设您已经构建了一个优化的模型,并获得了 x%的精度。但是在实时场景中,将模型引入生产并分享商业见解是很重要的。
将 SageMaker 模型与 QuickSight 集成(使用 app.diagrams.net 设计)
将 ML 预测添加到 BI 的典型步骤需要开发人员参与更新结果。传统上,将来自训练模型的预测输入到 BI 工具中需要相当大的工作量。您必须编写代码将数据 ETL 到亚马逊简单存储服务(亚马逊 S3),调用推理 API 来获得预测,将来自亚马逊 S3 的模型输出 ETL 到可查询的源,每当新数据可用时编排该过程,并为每个模型重复该工作流。推理端点使得模型的使用更加容易,但是代价是在不使用时可能会产生费用。最后,您使用像 Excel 这样的第三方工具来执行分析和报告预测,这使得向大量用户更新和共享结果变得困难。从模型中获取价值的端到端过程是无差别的,在模型的预测到达业务决策者手中之前,可能需要几天或几周的时间。
来源:AWS re:Invent 2019。
将 QuickSight 与 SageMaker 集成在一起,可以更轻松地添加预测、分享见解,同时减少开发人员的参与。QuickSight 中的 SageMaker 推理消除了管理数据移动和编写代码的需要。QuickSight 负责繁重的工作:从数据源中提取数据,对数据进行分块,通过 SageMaker 批处理转换作业运行数据,并清理和存储推理结果以进行可视化和报告。您只需将 QuickSight 指向您的数据和 SageMaker 模型,它就会管理端到端流程。QuickSight 还负责编排,因此您可以安排它在午夜有新数据时运行,或者以编程方式触发新的推理。
来源:AWS re:Invent 2019。
- 您可以根据需要选择数据源。
- ML 模型可以从 AWS MarketPlace、SageMaker Autopilot(它自动为输入数据创建模型)或您的自定义模型中使用。
在这里,我将解释用 QuickSight 增强定制的虹膜分类模型。在扩充之前,确保 QuickSight 管理员授予进行 Sagemaker API 调用的权限。
向 QuickSIght 添加 SageMaker 权限。
涉及的步骤:
1 .连接到数据或上传数据
数据源
注意:您的数据必须只包含输入列,使用 SageMaker 增加的模型预测并追加输出列。
2.单击编辑设置和预览数据
3.点击用 SageMaker 增强
4。选择您的型号
5.上传模式( JSON 格式)文件
**注意:**允许的数据类型有整数(整数值)、小数(浮点值)、字符串(日期、分类变量等)…)
6.映射输入和输出数据字段。
7.单击下一步,保存并可视化
**注意:**至少需要 4 分钟来执行批量转换作业,并将预测的输出附加到给定的测试数据集。
预测结果作为列追加。
关于构建定制模型、定义模式文件、添加 SageMaker 的详细说明可以在这里找到。
结论:
将 Amazon QuickSight 与 Amazon SageMaker 模型结合使用可以节省您管理数据移动和编写代码的时间。结果对于评估模型非常有用,当您对结果满意时,还可以与决策者分享。您可以在模型构建完成后立即开始。这样做可以展现数据科学家的预建模型,并使您能够将数据科学应用于数据集。然后,您可以在预测仪表板中分享这些见解。使用 Amazon QuickSight 无服务器方法,该过程可以无缝扩展,因此您不需要担心推理或查询能力。
最后的想法…
我将在试验其他 ML 见解时回复你,例如预测时间序列和异常检测。
取得联系
希望你觉得它很有见地。我很乐意听到你的反馈,以即兴发挥,使之更好!。如果你想联系,在LinkedIn上联系我。感谢阅读!
为每日报告整合气流和松弛度
使用 Airflow + Docker 向 Slack 发布天气预报的分步指南
在 Unsplash 上由 Austin Distel 拍摄的照片
技术栈: Python 3.7,Airflow (1.10.10),Docker
**GitHub 链接:**所有的代码都可以在这里找到。
气流+松弛
Slack 是一款越来越受欢迎的工作场所聊天应用。Apache Airflow 是一个用于编排工作流的开源平台。使用气流的最大优势之一是其挂钩和操作器的多功能性。钩子是外部平台、数据库的接口,也是操作符的基本构件。
松紧网钩操作器可用于整合气流和松紧。该操作符通常用于报告和警报目的,在满足某些触发条件时将传入消息调度到空闲通道。
我将向您展示如何利用这些工具在您的空闲工作空间中执行一些非常简单的报告:向频道发送每日天气预报。
这些基础可以扩展,以创建更复杂的气流+松弛集成。我们开始吧!
如果您有兴趣了解更多关于数据工程基础的知识,这里有一门课程可以帮助您入门。
为数据工程职业打下基础。开发 Python、SQL 和关系型数据库的实践经验…
click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.18321546102&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Fspecializations%2Fdata-engineering-foundations)
设置宽松的工作空间
注意:如果你已经熟悉在 Slack 上设置应用程序和 Slack webhook,请跳到“air flow+Docker”
工作区是一个共享的渠道中心,队友和协作者可以在这里一起交流。我创建了一个名为天气爱好者的工作空间。
在我们的工作区,我们需要:
- 接受这些信息的渠道
- webhook url
让气流发布到一个名为#每日天气信息的公共频道。如果消息内容敏感,请考虑将其更改为私人频道。
接下来,我们想为工作区创建一个 Airflow 应用程序。前往 https://api.slack.com/apps的点击Create New App
这将引导您进入一个可以设置应用程序名称的模式。Airflow 会以您选择的名称发布消息。为了简单起见,我将我的应用程序命名为airflow
。
退出模式后会出现一个页面,你可以在其中添加“传入网页挂钩”作为应用程序功能。
确保传入的网络钩子打开**。**
滚动到页面底部,点击“添加新的 Webhook 到工作区”。
这将生成一个 WebHook URL,可用于对 Airflow 进行身份验证。
WebHook URL 还允许您以编程方式向 Slack 发送消息。这里有一个非常简单的 POST 请求,您可以在终端中尝试。别忘了用你的网址替换我的。
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hi, this is an automated message!"}' https://hooks.slack.com/services/XXXX
请检查您的频道以查看自动消息。
如果你有兴趣学习更多关于在软件工程环境中使用 API 和 Python 的知识,这是一个非常适合初学者的 Coursera 专业。
由密歇根大学提供。这种专业化建立在 Python 面向所有人课程的成功基础上,并且…
click.linksynergy.com](https://click.linksynergy.com/fs-bin/click?id=J2RDo*Rlzkk&offerid=759505.31&type=3&subid=0)
气流+ Docker
我将向您展示如何使用 Docker 设置气流,以适当地容器化您的应用程序。我使用了 puckel/docker-airflow 的部分设置。
Airflow 附带了许多设置复杂的配置。使用 Docker 可以更容易地获得可重现的结果。
Docker 是什么? Docker 是一种独立于您的本地设置打包单个应用程序的方法。每个应用程序都在自己的 Docker 容器中。这里有一些关于 Docker 的有用资源,包括我写的一个关于 Docker 命令的资源。
学习使用 Docker 轻松构建和部署您的分布式应用程序到云中,Docker 由…
docker-curriculum.com](https://docker-curriculum.com/) [## 码头工人的 1–2–3
我(几乎)每天使用的 6 个 docker 命令。
towardsdatascience.com](/the-1-2-3s-of-docker-ea123d7c5f91)
对于带有 AWS 服务的更高级 Docker 应用程序:
由亚马逊网络服务提供。本课程向您介绍容器技术,以及如何将它们用于…
click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.16005422530&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Flearn%2Fcontainerized-apps-on-aws)
气流
整个 Airflow 平台可以分为四个部分:调度器、执行器、元数据数据库和 web 服务器。
- 调度程序决定运行哪些作业以及在什么时间/以什么顺序运行
- 执行者执行每个作业的指令
- 数据库存储气流状态(这项工作是成功还是失败?跑了多长时间?)
- 网络服务器是用户界面,使其更容易与气流接口;网络服务器是一个隐蔽的烧瓶应用程序
这是 web 服务器的样子(摘自 Apache Airflow 的文档)
有向无环图
Dag 是气流中一个非常重要的概念。每个 DAG 都是相似任务的集合,这些任务以反映其依赖性和关系的方式进行组织。这些图不能有有向循环,换句话说,不能有相互依赖的作业。
Dag 是在 Python 脚本中定义的,它们帮助调度程序确定要运行哪些作业。在所有上游作业成功完成之前,下游作业无法运行。
箭头代表依赖关系;run_after_loop 仅在 runme_0、runme_1、runme_2 成功完成时运行
设置气流
为您的 Airflow 服务器创建存储库。我会给我的取名slack-airflow
。我的存储库又一次被托管在这里。这些是目录中的组件:
- requirements.txt
- Dockerfile 文件
- 用于管理配置的气流子目录
- docker-compose.yml
- 启动气流的外壳脚本
- 一个 DAG 文件(我们将在后面得到更多)
requirements.txt
这是为了安装所需的气流库(以及任何其他所需的库)。
apache-airflow[crypto,celery,postgres,jdbc,ssh,statsd,slack]==1.10.10
air flow/config/air flow . CFG
气流配置文件通常作为气流安装的一部分下载(使用 Docker 的额外好处是:您不需要完成安装过程)。默认配置本身很好,但是可以针对您的特定用例调整设置。
下面是一个综合列表,说明每个字段对应的内容:https://air flow . Apache . org/docs/stable/configuration s-ref . html
这是气流目录中唯一需要的文件。
Dockerfile
这包含了你的 Docker 镜像的说明。我们为运行pip install
指定了一些环境变量、更多的依赖项和指令,并用我们的entrypoint.sh
shell 脚本定义了图像入口点。最后一行还启动 web 服务器。
我还使用 Dockerfile 将秘密存储到 Slack 和 Open Weather API。理想情况下,秘密应该存储在它们自己的环境文件中,并在构建时放入 Docker 容器中。环境文件应该添加到.gitignore
中,这样它就不会出现在代码库中。
冒着使这个设置过于复杂的风险,我们将把秘密留在 over 文件中。
请将你的秘密填入这两行。在共享您的代码时请记住,这些是敏感的凭证!weather_api_key
用于获取每日天气预报——下一节将介绍如何获取这个令牌。现在,你可以空着它。
ENV weather_api_key=
ENV slack_webhook_url=
docker-compose.yml
docker-compose 是一种处理 docker 设置的有组织的方式。如果您正在处理多个相互依赖的容器,这将特别有帮助。
第一个服务postgres
创建负责存储气流状态的 Postgres 数据库。凭证在 docker 文件中设置,可用于连接到本地网络上的数据库。
这是完整的数据库 URL。凭证组件分散在 Dockerfile 文件和启动脚本中。您可以使用此 URL 从本地网络连接并查询气流数据库。
postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
要了解关于如何连接到 DBAPI 的更多信息,请查看我关于 Postgres DBs 的另一篇文章。
[## 成为全栈数据科学家:设置并连接到 Postgres 数据库
全栈数据科学家是所有数据角色梦寐以求的海报儿童雇员。这位顶级数据科学家是…
towardsdatascience.com](/becoming-the-full-stack-data-scientist-part-1-e0d933280b)
对于那些想要更详细地探索 Pythonic 与数据库的联系的人来说,这里有一个有用的 Coursera 课程:
由密歇根大学提供。本课程将向学生介绍结构化查询语言的基础…
click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.1560524593&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Flearn%2Fpython-databases)
第二部分定义了 web 服务器,它将被托管在本地网络的 8080 端口上。
开放天气 API
照片由 Gavin Allanwood 在 Unsplash 上拍摄
我们可以利用开放天气 API 获取每日天气预报。创建一个帐户并为您的帐户生成一个 API 令牌。
回到 token 文件,用您的令牌设置这个环境变量:
ENV weather_api_key=
天气日报
这是我的天气 DAG 的链接。我把它放在一个叫做dags
的文件夹里。
步骤 1: 加载依赖项
步骤 2: 指定默认参数
我将自己添加为这条 DAG 的所有者。这是每个 DAG 的必需参数。如果depends_on_past
设置为真,则后续任务将不会运行,除非之前的运行成功。从过去挑一个start_date
。我选择了昨天的日期。retries
设置为 0 意味着气流不会尝试重新运行失败的任务。
步骤 3: 获取每日预测的简单类
我们向 Open Weather 发送 GET 请求,以获取多伦多的天气详情。有效负载被解析,描述字段用于描述预测。
API 键是从 docker 文件中实例化的环境变量中获取的。
步骤 4: DAG 定义
我们在 DAG 中使用SlackWebhookOperator
。您可以随意命名http_conn_id
,但是**需要在 Airflow 服务器上设置相同的连接(这将在“在 Airflow 上设置您的 Slack 连接”一节中介绍)。**从环境变量中获取 webhook 令牌。
除了预定间隔和catchup=False
(这防止气流运行回填)之外,这里还引用了默认参数。
schedule_interval
是一个 cron 语法,它决定了运行 DAG 的节奏。参数对应于(按顺序):分钟、小时、日、月和星期几。
我通常用这个网站来破译 Cron 语法:https://crontab.guru/
启动 Docker 容器
在根目录下运行这两个命令。
这将构建图像并将其标记为airflow
。重要的是不要改变标记名,因为它在启动脚本中被引用。
docker build . -t airflow
这将根据 docker-compose 中的指令启动相关的 Docker 容器。
docker-compose -f docker-compose.yml up -d
第一次运行这些步骤需要几分钟时间。完成后,web 服务器将暴露于您的本地 8080 端口。
您可以通过本地网络localhost:8080
访问它。这是我的样子。
在气流上设置松弛连接
我们差不多完成了。
我们需要做的最后一件事是在 Airflow 中设置slack_connection
(这个名称需要与 DAG 文件中指定的http_conn_id
相匹配)。
步骤 1:进入管理>连接
转到localhost:8080
访问网络服务器并点击管理>连接。
步骤 2:创建新连接
点击Create
并相应地填写字段。对于松弛连接,您只需要Conn id
和Host
- conn _ id = slack _ 连接
- host =您的 webhook URL
测试 DAG
如果您不想等待预定的时间间隔来观察结果,可通过点击Trigger DAG
按钮手动触发 DAG 运行。
任务成功运行后,此消息将出现在“时差”中。今天的天气预报是*晴,*听起来差不多是☀️
厉害!向天气网络说再见,向程序化预报问好😃
要获得每天的天气预报,让气流服务器运行。
我希望这篇文章对你有所帮助。对于额外的气流资源,查看官方文件,这是一个非常全面的指南。
Airflow 是一个以编程方式创作、调度和监控工作流的平台。使用 Airflow 将工作流程创作为…
airflow.readthedocs.io](https://airflow.readthedocs.io/)
感谢您的阅读!
请通过 Medium 关注我的最新消息。😃
作为一个业余爱好项目,我还在www.dscrashcourse.com建立了一套全面的免费数据科学课程和练习题。
再次感谢您的阅读!📕
集成图像和表格数据用于深度学习
使用 fastai 和 image_tabular 整合用于深度学习的图像和表格数据,并使用整合的数据训练联合模型
凯文·Ku 在 Unsplash 上拍摄的照片。由设计的图标被美化。
我最近在 Kaggle 上参加了 SIIM-ISIC 黑色素瘤分类竞赛。在这场比赛中,参与者被要求识别皮肤病变图像中的黑色素瘤。有趣的是,除了图像之外,它们还提供关于患者和解剖位置的元数据。本质上,对于每个示例,我们都有图像和结构化或表格数据。对于图像,我们可以使用基于 CNN 的模型,对于表格数据,我们可以使用嵌入和完全连接的层,正如我在以前关于 UFC 和英雄联盟预测的文章中所探讨的。很容易为每个数据形态建立两个独立的模型。但是,如果我们想建立一个联合模型,同时训练两种数据形态呢?比赛论坛里有鼓舞人心的讨论包括这个的帖子。在这篇文章中,我将演示如何集成这两种数据模式,并使用 fastai 和我专门为这些任务创建的 image_tabular 库来训练一个联合深度学习模型。
SIIM-国际标准行业分类数据集
SIIM-ISIC 黑色素瘤分类数据集可以在这里下载。训练集由 32542 幅良性图像和 584 幅恶性黑色素瘤图像组成。请注意,这个数据集极度不平衡。下图显示了每个班级的一个例子。恶性病变似乎比良性病变更大、更弥散。
良性对恶性
如上所述,除了图像之外,还有如下所示的元数据:
作为熊猫数据框架的元数据
我们可以执行一些基本分析来调查这些特征中的一些是否与目标相关联。有趣的是,男性比女性更容易患恶性黑色素瘤,年龄似乎也是患恶性黑色素瘤的一个风险因素,如下图所示。此外,恶性黑色素瘤的频率在成像部位的位置之间不同,其中头/颈显示最高的恶性率。因此,这些特征包含有用的信息,将它们与图像结合可以帮助我们的模型做出更好的预测。这是有意义的,因为医生可能不仅会检查皮肤病变的图像,还会考虑其他因素以做出诊断。
元数据特征与目标相关联
方法
我们整合图像和表格数据的方法与 ISIC 2019 皮肤病变分类挑战赛获胜者采用的方法非常相似,正如他们在论文中所述,如下图所示。基本上,我们首先加载每个样本的图像和表格数据,分别输入 CNN 模型和完全连接的神经网络。随后,这两个网络的输出将被连接起来,并输入到另一个完全连接的神经网络中,以生成最终预测。
名词(noun 的缩写)Gessert,M. Nielsen 和 M. Shaikh 等人/ MethodsX 7 (2020) 100864
用 image_tabular 库实现
为了实现这个想法,我们将使用 Pytorch 和 fastai 。更具体地说,我们将使用 fastai 加载图像和表格数据,并将它们打包到 fastai LabelLists 中。
接下来,我们将使用 image_tabular 库集成这两种数据形态,可以通过运行以下命令来安装:
pip install image_tabular
我们将使用来自 image_tabular 的get_imagetabdatasets
函数来集成图像和表格标签。
databunch 包含图像和表格数据,可用于训练和预测。
一旦数据准备就绪,我们就可以继续构建模型了。首先,我们需要创建一个 CNN 模型,在本例中是 resnet50,并使用 fastai 创建一个表格模型。我们将性别和解剖位置视为分类特征,并在表格模型中使用嵌入来表示它们。
我们现在准备构建一个联合模型,再次使用 image_tabular 库。我们可以通过指定 layers 参数来自定义完全连接的层。
最后,我们可以把所有东西打包成一个 fastai 学习器,训练联合模型。
整个工作流程都详细记录在这个 Jupyter 笔记本里。
结果
在训练 15 个时期后,该模型在验证集上获得了约 0.87 的 ROC AUC 分数。我随后将训练好的模型在测试集上做出的预测提交给 Kaggle,得到了 0.864 的公开分数。肯定有很大的提升空间。
Kaggle 公共评分
摘要
在本文中,我们使用 fastai 和 image_tabular 来集成图像和表格数据,并构建了一个同时在两种数据模式上训练的联合模型。如上所述,有许多进一步改进的机会。比如可以尝试更高级的 CNN 架构比如 ResNeXt。另一个问题是,在连接之前,我们应该为图像和表格数据分配多少神经元,换句话说,我们应该如何决定这两种数据形式的相对重要性或权重?我希望这可以作为进一步试验和改进的框架。
源代码
SIIM-ISIC 黑色素瘤分类竞赛的 image_tabular 和 jupyter 笔记本的源代码可以在这里找到。
感谢
image_tabular 库依赖于神奇的 fastai 库,并受到 John F. Wu 的代码的启发。
我是一名具有生物信息学和编程技能的免疫学家。我对数据分析、机器学习和深度学习感兴趣。
网址: www.ytian.me
博客:https://medium.com/@yuan_tian领英:https://www.linkedin.com/in/ytianimmune/推特:https://twitter.com/ytian
将机器学习模型与 Tableau 集成
使用 TabPy 库将 Python 中训练好的机器学习模型直接部署到 tableau 中
Tableau 是快速创建交互式数据可视化的非常有效的工具,也是数据科学社区中的顶级工具。所有使用过 tableau 的数据科学家都知道 Tableau 对于数据可视化来说是多么强大和简单。
大多数数据科学家/分析师使用 tableau 来创建令人惊叹的可视化效果,并将可用数据用于演示。然而,对于任何数据科学家来说,以吸引人的方式向最终用户展示经过训练的机器模型与展示探索性数据分析一样重要。假设有一种方法可以直接在 Tableau 中可视化训练过的机器模型,使这个过程更加舒适。从 Jupyter 笔记本到 Tableau 部署训练有素的机器学习比你想象的要容易。这就是 TabPy 有用的地方。本文讨论了使用 Jupyter notebook 和 TabPy 部署机器学习模型的过程
数据
这个项目的数据集由 Fernando Silva 通过 Mendeley 数据仓库使用 Creative Commons 4.0 许可证透明地维护。该数据集由 DataCo Global 公司三年来使用的供应链的大约 18 万笔交易组成。数据集可以在这里下载,因为这是一家供应链公司。确保订单按时交付并防止欺诈至关重要。
我们在这里的目标是建立一个交互式仪表板,用最佳变量来预测欺诈和延迟交付发生的概率,以防止它们发生。
最终仪表板集成了 ML 模型。
数据清理和建模
数据集由 52 个变量组成。所有不需要的变量都将被删除,大纲视图也将被移除。在剩余的 40 个变量中,使用前向选择来选择预测欺诈和延迟交付的最佳变量。预测延迟交货的最佳变量是订单国家和为订单安排的装运日期。对于预测欺诈,最佳变量是运送订单所用的实际天数以及订单国家安排的运送天数。为了便于构建仪表板,选择了常见的优化变量。
我用了一个简单的随机森林模型来预测。除了随机森林,可以使用任何机器学习模型,包括复杂的神经网络模型。
将模型部署到场景中
Python 3 和 Anaconda 应该安装在设备上。如果你没有安装,你可以直接从他们的网站 Anaconda 和 Python 免费安装。要将 python 环境与 Tableau 连接起来,有一个非常优秀的库叫做 Tabpy,我们需要先安装它。TabPy 运行在 anaconda 环境中,非常容易安装。要安装 TabPy,打开命令提示符并运行下面的命令pip install tabpy
一旦安装了 tabpy。我们还需要一个名为 tabpy _ client 的额外库,将 Jupyter 笔记本环境连接到 tableau,并直接部署机器学习模型。甚至这个库也可以使用下面的命令pip install tabpy_client
安装
一旦成功安装了 tabby,您就可以通过运行tabpy
来启动 tabby 环境
运行此程序后,您应该会看到一条消息,说明 tabpy 服务器成功启动,并且端口被设置为“9004 ”,类似于下图所示。
如果您在安装 tabby 时遇到任何问题,可以在tabby GitHub页面上找到更多信息。
将 TabPy 服务器连接到 Tableau
成功安装 tabpy 库后,您可以在 Tableau 桌面中的 Tableau 应用程序设置帮助>设置和性能>管理分析扩展连接中轻松地将 TabPy 服务器连接到 Tableau。在服务器中选择本地主机,并输入端口号。
单击“测试连接”查看您的服务器连接是否成功。如果连接成功。然后你就可以开始把你的机器学习模型直接部署到 Tableau 上了。
- 要将模型部署到 tableau 中,首先要使用 tabpy_client 将笔记本连接到 Tableau 服务器。
- 单个函数应该以适合 Tableau 的格式定义。新变量 as _arg1,_arg2 是相对于已训练的机器学习模型中的变量计数来声明的。
- 假设我们在仪表板中使用的任何变量都在字符串中。它们应该被转换成数字格式。
如果您在部署模型时遇到任何错误,请检查是否所有的库都是最新的。在 deploy 语句中使用“override = True”将会用一个新模型覆盖已经训练好的模型。如果您希望使用新数据再次训练现有模型,这可能会很有帮助。
一旦模型部署成功,就可以在 Tableau 中访问经过训练的模型。
- 通过导入 CSV 文件将数据加载到 Tableau 中。
- 接下来,应该使用模型部署代码中使用的相同名称来创建新参数。参数可以是字符串或数字格式,具体取决于您的模型。如果使用字符串,请确保编写了将字符串转换为数字格式的代码。
- 最后,使用以下脚本创建一个新的计算字段,并传递参数以连接到 TabPy 服务器。
欺诈预测的 Tableau 脚本
延迟交货预测的 Tableau 脚本
根据输出选择 SCRIPT_REAL 或 SCRIPT_STR。一旦你输入脚本,如果你看到“计算是有效的”点击应用,它就完成了。机器学习模型已经准备就绪,现在您可以使用我们创建的参数和计算字段轻松创建交互式可视化。
数据和代码可以在我的 Github 库中找到。
希望那有用!非常感谢你读到这里。你真棒!如果你对这篇文章有任何问题,或者想要联系和交谈,请随时在 LinkedIn 上给我发信息。我将非常乐意与您联系,并尽我所能提供帮助。
错误修复
有些人在 Linkedin 上联系我,说他们有时会得到“runtime error:Load failed:’ Load failed:unsupported pickle protocol:5 '。我猜如果你尝试两次部署同一个 ML 模型,就会发生这种情况,解决这个错误的快速方法是从你的 pc 上删除已经保存的 pickle 模型,或者在 Jupyter notebook 和 Tableau 中用新的名称重新部署这个模型。
集成 Python 和 MySQL
汉斯-彼得·高斯特在 Unsplash 上拍摄的照片
如何将数据动态加载到数据库中
数据分析师或数据科学家有很多机会使用 Python 和 SQL。Python 及其庞大的库支持为数据分析师提供了一根魔棒来操纵和可视化数据。同样,SQL 帮助我们存储数百万条记录,并与其他表建立关系,以实现最佳的数据管理。有些场景需要 Python 程序将数据直接加载到后端数据库中。例如,如果定期或随机动态修改数据帧,则将每次数据更新的 csv 文件上传到数据库是不可行的。在本帖中,我们将介绍如何将 Python 程序与 MySQL 数据库集成。
首先,我用 Python 创建了一个小数据集。它有两列,第一列存储索引,第二列存储时间戳。
from datetime import datetime # Current date time in local system
col_1 = col_1+1
col_2 = datetime.now()
print('ID:',col_1)
print('Timestamp:',col_2)
在 MySQL 中创建表格
同时,我们可以在 MySQL db 中创建一个表,用于存储我们在第一步中生成的数据。也可以在 MySQL 中从 python 本身创建一个表。因为这是一个一次性的过程,所以直接在数据库中创建表会更容易。
#Create table called details.
create table `details`(
Id int(20) not null,
Time datetime null
);
连接 Python 和 MySQL
首先,我们需要导入 mysql.connector 包,如果它不可用,那么我们需要使用下面的代码安装它
pip install mysql.connector
#or
!pip install mysql.connector
我们需要从 mysql.connector 导入错误代码。这将有助于在插入数据库时识别问题(如果有的话)。可能遇到的一些错误是主键空错误和重复条目(如果表设置了主键)。
我们需要在代码中指定我们的 MySQL 凭证。我们首先打开一个到 MySQL 服务器的连接,并将变量 connection 对象存储在变量 cnct 中。然后,我们使用连接的 cursor()方法创建一个新的游标。
我们将 insert 语句存储在变量 sql_query 中,变量 info 中的数据用于替换查询中的%s 标记。
execute 语句将执行存储在变量 sql_query 中的查询
一旦执行了上面的代码,让我们检查一下数据库,看看数据是否是动态加载的。
精彩!!数据已经加载。
现在让我们看看如果我运行代码 5 次,数据是如何加载到数据库中的。
每次运行代码或作业时,都会动态加载和刷新数据库。
结论
同样,我们可以从 Python 接口本身执行任何操作,如创建数据库或表、插入、更新、删除和选择操作,这将反映在 MySQL 数据库中。
事实证明,这种集成对于涉及不断变化的数据的场景非常有用。例如,经常从网站上搜集的数据,或者从 Twitter 或脸书 feeds 上获取的实时数据。
Jupyter 笔记本在 Github 上有售。
参考:
[1]https://dev . MySQL . com/doc/connector-python/en/connector-python-example-cursor-select . html
集成 Tableau 和 R 进行回归分析
为什么这些工具结合在一起会更好
Tableau 在数据可视化领域掀起了风暴,这是有充分理由的。在其用户友好的界面中,可以快速创建漂亮而复杂的可视化效果、仪表板和报告,而无需任何编码经验。Tableau 对于交互式可视化的创建特别有用,因为只需几次点击就可以将过滤器添加到单个可视化或完整的仪表板中。然而,Tableau 的分析能力有限。计算字段功能允许计算简单的度量值,如平均值、总和以及日期差异,Tableau 具有一些用于添加回归线或识别聚类的内置功能。然而,对于任何类型的高级分析,Tableau 都有所欠缺。
另一方面,r 是由统计学家创造的,因此具有非凡的分析能力。从分析的角度来看,在 R 的内置函数和似乎无穷无尽的可用包列表中包含的函数之间,没有什么是不能做的。然而,R 中的可视化提出了更多的挑战。像 ggplot2 和 plotly 这样的包的开发已经显著地提高了 R 的数据可视化能力,但是这些包仍然没有 Tableau 的界面那么容易使用。在 R 中构建一个设计良好的交互式仪表板或可视化需要相当多的编码能力。即使对于那些具有编码专业知识的人来说,编写 R 代码来使仪表板中的一个图充当其他图的过滤器、添加说明性文本、为特定的可视化重构数据(在 Tableau 中通常甚至是不必要的)、调整仪表板中的图形大小、应用颜色或完成任何数量的其他任务(这些任务可以在 Tableau 的拖放环境中快速完成)也要花费更多的时间。
幸运的是,Tableau 能够连接到 R,使用户能够同时获得这两种工具的好处。为了演示这个过程及其有用性,我将通过一个使用 R 代码和 Tableau 可视化进行的样本回归分析。
步骤 1:在 Tableau 和 R 之间建立连接
为了让 R 和 Tableau 一起使用,必须使用“Rserve”包建立连接。
首先,在 R 中安装“ Rserve ”包,第一个代码选项只是从 CRAN 安装 R 包的标准代码。我还包含了从 RForge 安装“Rserve”包的代码,因为 CRAN install 经常出错。
install.packages('Rserve')ORinstall.packages('Rserve',, "[http://rforge.net/](http://rforge.net/)", type = "source")
接下来,只需加载新安装的“Rserve”包:
library(Rserve)
在 R 中需要采取的另一个步骤是运行下面的命令,该命令设置一个套接字服务器并允许请求发送到 R:
Rserve(args = "--no-save")
Rserve 现在应该可以工作了,所以让我们切换到 Tableau。
在“帮助”下,单击“设置和性能”,然后单击“管理分析扩展连接”:
下面的“分析扩展连接”窗口应该会打开。选择“Rserve”作为分析扩展,选择“localhost”作为服务器,选择“6311”作为端口。输入完毕后,单击窗口左下角的“测试连接”按钮:
单击“测试连接”按钮后,您应该会收到以下消息,表明您的连接已成功建立:
如果你收到这条信息,那么你就可以走了。在本教程的剩余部分,我们将呆在 Tableau 中,尽管我们需要保持 R 运行以维持连接。
步骤 2:运行回归分析
我将在本教程中使用的数据来自 NYC OpenData,代表纽约市在押的囚犯。包括的变量表示属性,例如精神健康指定、种族、性别、年龄、监护级别、法律状态、密封状态、安全风险组成员资格、最高费用和违规标志。这些数据是公开的,可以在这里下载。
我很好奇监管级别(最低、中等或最高)是否能预测一个人是否有精神健康标志,并将创建一个逻辑回归模型,以精神健康标志作为我的结果,监管级别作为我的预测因素。在建立到 Tableau 的连接之前,我使用下面的 R 代码来准备这些数据,并编写一个包含已清理数据的 csv 文件:
library(tidyverse)data = read.csv("./Daily_Inmates_In_Custody.csv") %>%
mutate(
bradh_numeric = ifelse(BRADH == "Y", "1",
ifelse(BRADH == "N", "0", BRADH)),
bradh_numeric = as.numeric(bradh_numeric),
custody_numeric = ifelse(CUSTODY_LEVEL == "MIN", "0",
ifelse(CUSTODY_LEVEL == "MED", "1",
ifelse(CUSTODY_LEVEL == "MAX", "2", CUSTODY_LEVEL))
),
custody_numeric = as.numeric(custody_numeric)) %>%
filter(
custody_numeric == 0 | custody_numeric == 1 | custody_numeric == 2
)write_csv(data, "./daily_inmates.csv")
一旦此文件连接到 Tableau(在 Tableau 中,单击“连接到数据”,选择“文本文件”,并导航到您的 csv),我们将使用计算字段来创建我们的回归模型。从数据面板的下拉菜单中选择“创建计算字段”:
我将我的计算字段命名为“回归”在 SCRIPT_REAL()计算函数中,您可以在 R 中输入用于分析的代码。如果您熟悉在 R 中使用逻辑回归模型,那么下面的代码看起来会非常熟悉。在 Tableau 中要习惯的一个重要区别是,它不是将变量名直接输入到 glm()函数中。arg”占位符,变量在 glm()代码下指定(参见 Bradh Numeric 和保管数字)。一开始适应起来有点不直观,所以我建议在 R 中运行您的分析,这样您可以检查您的工作。
如果你的计算可以完成,你会看到“计算是有效的。“在左下角。如果你收到这条信息,请点击绿色的“确定”按钮。
现在,您将在屏幕的左侧看到您的计算字段(由#前的等号表示),以及您的数值表元素。
步骤 3:可视化并探索您的回归结果
首先,让我们通过将“保管级别”药丸拖到列中,将“回归”药丸拖到行中,来可视化我们分析中包括的三个保管级别的拟合值。我还在颜色下添加了“保管级别”:
这些拟合值徘徊在 0.5 左右,表明监护水平不是一个人心理健康状况的重要预测指标。但这是 Tableau 真正闪光的地方。假设我们想看看这种关系在种族和性别上有什么不同。在 R 中,回答这个问题需要将种族和性别添加到我们的回归模型中,并根据得到的系数计算出特定人群的合适值。然而,在 Tableau 中,我们可以简单地将这些变量作为过滤器添加到我们的可视化中,并与产品进行交互,以查看哪里的关系更有趣。
将“种族”和“性别”药丸拖到过滤器框中,如下所示:
为了与这些过滤器互动,右击过滤器药丸并选择“显示过滤器”您会看到过滤器出现在屏幕上:
选中所有复选框后,回归拟合值保持不变,因为整个样本仍包含在分析中。然而,通过选择某些方框,很容易看到黑人女性的监护水平和精神健康状况之间的关系:
或者白人女性:
或者亚洲男人:
这些过滤器很容易看出,某些亚人群确实在监护水平和精神健康指定之间存在有意义的关系,并且这些关系在不同的种族和性别群体中非常不同。
*注:该数据集的数据字典不提供所包括的种族群体的描述。因此,我假设单字母的名称代表什么。也不清楚性别指标是否真正代表了性别,或者它是否真的捕捉到了性。
其他应用
在这个例子中,我们使用逻辑回归分析来回答一个解释性问题(精神健康的定义如何因监护级别、种族和性别而不同?),可视化服务于探索这种关系的主要目的。其他分析技术也可以采用类似的方法,如 k-means 聚类,因为 Tableau 的可视化功能提供了一种有用的方法来探索您的聚类在不同的数据子集内如何变化。
然而,Tableau 和 R 的集成具有超越简单探索的巨大潜力。例如,这些工具的集成对于地理空间分析特别有用,因为 Tableau 确实擅长制作地图,但缺乏这种高级的分析能力。此外,这些工具可以结合使用,以更好地可视化预测分析,如线性回归或时间序列分析。需要任何种类的高级分析,以及复杂的交互式可视化和仪表板的项目,可能会从 Tableau 和 r 的组合功能中受益。
Tableau 和 R 的优势可以很好地互补,学习如何一起使用它们可以最大化您的效率,同时增强您的数据可视化产品。
整合 Tensorflow 和 Qiskit 用于量子机器学习
来源: Pixabay
概观
在标准深度学习库中存在两种流行的量子计算包集成:
- 张量流和 Cirq 为张量流量子
- Pytorch 和 Qiskit
在本文中,我们将讨论在自定义 Keras 层中集成 Qiskit。
介绍
量子机器学习有一个有趣的应用,即使用量子层来帮助经典神经网络,这些量子层涉及经典无法实现的计算。学术界最近的工作强调了量子辅助深度学习的应用,它可以具有复杂的激活、更好的表示和其他在经典网络中无法实现的显著特征。
对于实现方面,这意味着找到一种在正常的深度神经网络中集成量子处理的方法。有几种方法可以实现这一点。在这里,我们讨论集成 Qiskit 作为 Keras 层的子类。让我们开始吧。
定义量子层
这显然取决于具体的应用。需要记住的是,这一层的输入和输出要保持一致。Tensorflow 2.x 中默认使用eager_execution
,因此很自然地会使用numpy
数组作为所有量子层的默认输入和输出。
样品量子层
这是一个任意的量子层,接收四个输入,输出一个长度为 4 的 numpy 数组。我们计算标准泡利算符的期望,创建一个列表,并返回它。这一层将根据底层应用程序的具体情况而变化。
与量子层相互作用
现在我们需要创建一个Keras
层来整合我们之前定义的量子层。为此,我们需要扩展允许为 Keras 模型编写定制层的tensorflow.keras.Layer
类。
子类层
该层根据训练的batch_size
接收输入。因此,我们需要确保每个训练示例都通过量子层来创建输出,因此需要循环。
tf.executing_eagerly()
很重要,因为它允许我们通过inputs.numpy()
将默认输入Tensor
转换成一个numpy
数组。如果应用程序依赖于 Tensorflow 1.x,则可能会调用tf.enable_eager_execution()
来启用急切执行。直观地说,急切执行允许我们在张量的值可用时访问它们。如果它被禁用,我们需要引入 tensorflow 的会话和执行图的复杂性。
构建模型
构建模型很简单。我们可以建立一个功能模型或顺序模型供我们使用。
模型工作流
用run_eagerly
编译模型很重要。我观察到一些保存的模型在加载后不能像预期的那样工作,如果它们不是在run_eagerly
设置为True
的情况下编译的话。
保存和加载模型
保存照常进行。然而,加载要求您为我们创建的自定义层定义自定义类。
保存和加载模型
custom_objects
允许您定义自定义对象。它需要一个字典,其中的keys
对应于您拥有的定制层,它们的values
对应于您希望定制层与之相关联的定制类。这有一个微妙的警告:在一些模型的不同训练会话之间,可以改变这些层的实现。如果你有一个在本文前面给出的量子层上训练的模型,可以加载这样一个模型,并在其他一些量子逻辑上重新训练它。
结论
这篇文章是使用 Qiskit 和 Tensorflow 建立一个工作的量子辅助深度学习架构的基本框架。有些事情需要注意:
- 计算期望值是一个主要的瓶颈。对于大批量,可能会经历巨大的减速,因为我们已经完全放弃了经典深度学习中矩阵乘法的优势。
- 期望值可能真的很小。可以使用适当的标量乘数来放大它们。
希望这将帮助您开始在 Tensorflow 网络中使用 Qiskit powered 层。祝您愉快:)
AI 技术融入课堂:塞翁失马焉知非福?
意见
伦理辩论
斯蒂芬·道森在 Unsplash 上拍摄的照片
想象一下一个未来主义的教室,在那里你作为一名学生不必挣扎着每一秒都集中注意力。您可以获得定制的学习体验,因为该技术可以识别您的个人需求并相应地满足您的需求。你对某个主题缺乏理解的情况会被实时识别出来,你的讲座会被调整以适应你的学习曲线。
另一方面,想象一下在教室或演讲厅里,你的一举一动都被监视着。从你踏进这里的那一刻起。传感器和摄像机会跟踪你的每一个动作,并记录下来作为*“数据参考”*。您的隐私是毫无疑问的,您的实时敏感数据会受到损害,从而影响教学服务质量的提高。
最终你倾向于哪一方?
这两种情况就像一枚硬币的两面:整合和交错。人工智能又名人工智能技术已经成为改善和升级现有教育系统的焦点。它的主要目标是改善大多数学生当前的学习体验。这项技术的范围和能力是无限的,并且发展势头稳定。各种组织开展了一些研究,以了解人工智能技术对评估他们的能力、风险以及回答某些道德问题的影响。教室中人工智能的当前技术主要是数据敏感、模式识别和通过软件算法进行处理。这些数据可以很容易地整合到机器学习中,以建立一个更强大的平台。
Alex Kotliarskyi 在 Unsplash 上的照片
AI 技术在课堂上我们还有多远?
我们大多数人都没有意识到,我们已经在我们目前的教育系统中集成了人工智能技术的微妙痕迹。例如,预装在 blackboard(在线提交 *平台)*中的语法检查或抄袭软件就是人工智能的完美例子。这些软件可以很容易地检测出作业是否直接引用了他人的作品,而没有经过他们适当的引用或认可。很快,这种类似的软件就可以升级,以包括检测对等提交之间的转述作业的功能。他们甚至可能使用机器学习(ML)来识别同行之间的常见做法。
已经在许多国家使用的其他基于人工智能的教育模型项目包括:基于人工智能的教学模型,该模型包括实时监控和分析教师和学生在课堂上的表现。然而,在西方世界采用这种模式会引起争议和对隐私问题的担忧。此外,大多数学生可能不适应在教室环境中学习,而更喜欢按照自己的节奏学习。学生也可能有不同的学习风格,并可能不太适应特定讲座中提供的当前教学方法,因为它是实时发生的。因此,通过监控和分析实时表现来定量测量课堂表现可能不是一种合适的方法。
某些 K-12 教室已经在他们的教室中纳入了基于人工智能的项目。它为这些参与的学生提供了发展批判性思维能力的空间。正是这种批判性思维能力最终将发展成为一种高科技编程技能。学生和教育工作者都认为这种方法是积极的,并允许在课堂环境中进行更多的合作互动。
人工智能的未来在我们的教室里会是什么样子?
教育机构正在考虑使用这项新技术来监控和收集学生的表现。它最终将允许量化单个学生的学习轨迹。定量研究将允许提前警告班上不及格的学生。人们可以很容易地争辩说,这些方法已经由真诚的教师亲自采用。然而,对于已经全神贯注于他们研究和课程教学职责的教师来说,这样的任务通常是耗时的。其次,当老师接近学生时,这也可能会侵犯学生的自尊。相反,让人工智能技术执行这样的任务可以允许早期检测(通过分析来自人工心理学的模式),并且得出的结论可以通过更高的准确性(忽略人类偏差的影响)来超越。这些信息可以通过应用程序直接传递给学生,以便他们可以调整自己或采取必要的行动。
人工智能技术还可以通过分析之前课程学分和成绩的数据,为个别学生确定选修课程的最佳选择提供空间。这些可以很容易地辅以工业前景,最终最大限度地发挥学生的潜力。人工智能肯定可以补充顾问的角色,并且随着教室中学生人数的增长,人工智能将大有裨益。
将人工智能融入课堂的最大问题和挑战都与网络安全和信息隐私有关。因此,给学生个人选择这种技术应用的自由裁量权可以停止侵犯他们的隐私问题。人工智能的未来充满希望,技术进步的加速将确保我们最终都成为智能城市的一部分。
然而,你的看法是什么?请随意分享你的想法。
免责声明:本文中表达的观点是作者的唯一看法,并不反映出版物的意见或观点。
集成降维方法和神经网络的图像分类
莫里茨·金德勒在 Unsplash 上拍摄的照片
使用原始数字图像构建深度网络需要学习许多参数,这可能会降低准确率。可以通过使用降维方法来压缩图像,并且可以将提取的降维特征馈送到深度网络中用于分类。因此,在网络的训练阶段,参数的数量将会减少。主成分分析是一种众所周知的降维技术,它利用原始数据的正交线性变换。在本文中,我们展示了一个基于神经网络的框架,名为 Fusion-Net,它在图像数据集(CIFAR-10)上实现 PCA,然后神经网络应用于提取主成分。我们还在缩减的数据集上实现了逻辑回归。最后,我们比较了使用原始特征和精简特征的结果。实验结果表明,融合网络优于其他方法。
在本文中,我们应用一个名为融合网络的神经网络框架进行图像分类。实施遵循两个步骤:
- 我们对原始数据集实施降维技术(PCA)以提取主成分
- 提取的成分然后被用作 ML 分类器的输入,如神经网络、逻辑回归等。
数据集规范
我们在一个名为 CIFAR 的图像数据集上进行了实验。CIFAR 数据集是由 Alex Krizhevsky、Vinod Nair 和 Geoffrey Hinton [1]收集的 10 类图像的多类分类的著名图像数据。数据集中的图像有 10 类不同的对象:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。
图 1 示出了带有图像类别标签的一些样本图像。在本文中,我们使用由 60,000 张图像组成的 CIFAR-10 数据集,它是 8,000 万个微小图像数据集(CIFAR)的子集。数据集中的每个图像都是具有维度的彩色图像(包含 3 个通道)。CIFAR-10 数据集是一个平衡数据,其中每个类包含 6,000 幅图像。我们将数据集分成 50,000 个训练图像和 10,000 个测试图像,保持类别的比例。
图 1: CIFAR-10 数据集
方法
融合网络包括两个主要部分:降维和神经网络。图 2 示出了融合网络的架构,其中神经网络包含四层:输入层、两个隐藏层和输出层。输入层包含由 PCA 提取的特征数量的神经元。第一和第二隐藏层分别包含 128 和 64 个神经元,并且输出层包括 10 个神经元,因为问题是 10 类分类。我们使用类别交叉熵作为损失函数,使用自适应矩估计(Adam)优化器来计算误差和更新参数。
图 2:融合网络的体系结构
我们提出了三种不同版本的融合方法,其中简化的特征分别保留了第一、第二和第三版本的 99%、95%和 90%的数据变化。
降维
我们将每一幅三维彩色图像转换到一维空间,以便应用主成分分析。转换后,每个观察值由 32×32×3=3072 个特征组成,因此对转换后的数据集实施 PCA。图 3 显示了由特征数量解释的变化。原始数据变异的 99%、95%和 90%可以分别由前 658、217 和 99 个主成分解释。仅使用前 21 个分量就可以提取 80%的数据变化。
图 3:由主成分解释的变化
我们在原始数据集上实现了具有相同架构的逻辑回归和神经网络
**在 CIFAR-10 原始数据集上的性能评估:**我们使用早期停止训练神经网络 100 个时期,并且逻辑回归也应用于原始数据集。通过在测试数据上实现训练好的模型来测量模型性能。表 I 展示了这两个模型在这个数据集上的实验结果。
表 1:不同分类器在 CIFAR-10 原始数据集上的实验结果
神经网络优于 LR 方法,并获得 0.46 的最高准确度分数,而 LR 获得 0.3954 的准确度分数。
**在 CIFAR-10 缩减数据集上的性能评估:**我们在原始数据集上实施 PCA,并缩减数据集,提取包含 658、217 和 99 个特征的三个不同数据集,它们分别解释了原始数据的 99%、95%和 90%的变化。
我们将具有相同架构的神经网络应用于缩减的数据集。逻辑回归也适用于简化的数据集。表 II 示出了模型在数据集上的实验结果。融合网络优于(PCA+LR)方法,并在三种不同情况下获得了最高的准确率。通过 99 个主成分,融合网络达到了 53.41%的最高准确率。用 217 个特征获得了 0.5307 的几乎相似的精度。Fusion-Net 使用 658 个主成分实现了 0.5194 的精度。对于三个简化的数据集,逻辑回归达到了几乎相似的准确度。
表二:不同分类器在 CIFAR-10 精简数据集上的实验结果
讨论
表 III 显示了 Fusion-Net 针对不同数量的特征尺寸学习的参数数量。随着特征数量的减少,参数的总数呈指数减少。由于训练参数的数量随着特征的减少而减少,训练的计算成本也将随着数据集的减少而减少。
表 III:不同数量特征尺寸的神经网络中的总参数
神经网络使用缩减的数据集比原始数据集产生了更好的结果。通过减少特征,网络学习更少的权重,这可能是产生更好结果的原因,因为我们用 100 个时期训练模型。具有许多时期的微调神经网络模型可能优于融合网络。
图 4 显示了用于构建神经网络的代码。
图 4:神经网络的代码
总之,降维技术可应用于图像数据集,以减少特征的数量,同时保留原始数据集的模式和趋势。深度学习网络可以在减少的数据集而不是原始数据上训练,从而减少训练参数的数量。我们在数据集(原始数据集和精简数据集)上进行了所有实验来评估融合网络。我们通过与融合 LR (PCA+LR)方法的性能进行比较来评估融合网络的性能。实验结果表明,融合网络优于其他方法。
阅读默罕默德·马苏姆博士(以及媒体上成千上万的其他作家)的每一个故事。
你的会员费将直接支持和激励穆罕默德·马苏曼德和你所阅读的成千上万的其他作家。你还可以在媒体上看到所有的故事—【https://masum-math8065.medium.com/membership】
快乐阅读!
商业模式中生成性对抗网络的整合
由于生成性对抗网络,大公司如何试图创造新的商业模式和改善内部流程
迪米塔尔·贝尔切夫在 Unsplash 上拍摄的照片
对于总是在寻找新的竞争优势的公司来说,生成性对抗网络(GANs)正在成为一个战略话题。事实上,科技公司和消费品牌已经在尝试使用 GANs。
在本文中,我将分享我作为人工智能顾问参与开发基于 GANs 的几个 POC 时学到的东西,帮助您更好地理解它们的技术限制,以及它们从战略业务角度的重要性。
事实上,我的主要任务是找出 GANs 如何改变我们的商业模式,预测它们对我们内部流程的影响,并确定使用 GANs 进行可能合作的有前途的初创公司。
生成性对抗网络?
简而言之,生成对抗网络(GANs)是一类机器学习框架,通过使两个神经网络相互对抗来运行。
GAN 架构首先在 2014 年由 Ian Goodfellow 等人题为“生成对抗网络的论文中描述这是一个在生产、评估和再加工一个创造方面有效率的系统,这就是为什么它被称为人工智能的创造性方面。
这种神经网络架构与之前的生成方法相比,表现出了令人印象深刻的改进,例如变分自动编码器或受限玻尔兹曼机器。
在不涉及太多细节的情况下,一个被称为生成器的神经网络生成新数据。同时,另一个神经网络,称为鉴别器,评估它们的真实性。鉴别器决定它检查的每个数据实例是否属于实际的训练数据集。
发生器输出连接到鉴频器输入。通过使用反向传播,鉴别器的分类提供了生成器用来更新其权重的信号。两者之间的反馈回路可以提高彼此的性能。
在大多数情况下,可以在使用生成模型和技术(如变分自动编码器和像素神经网络)的地方使用 GANs。大多数 GANs 项目依赖于图像数据,并使用卷积神经网络作为生成器和鉴别器模型。使用 GANs 的优势在于,与波尔兹曼机器等传统方法相比,它们更快、更容易训练。
大多数应用程序似乎都与图像/内容生成相关,但可能性非常多。
有条件地产生产出的可能性使得公司对 GANs 非常感兴趣。
GAN 架构
GAN 模型可以以来自领域的示例(例如图像)为条件的事实是一个游戏改变者。事实上,这允许以下应用:
- 文本到图像的翻译
- 图像到图像的翻译
从顾问的角度来看,我更倾向于把 GANs 看作一种新的表述问题的方式,而不仅仅是一种特定的算法。事实上,它们可以用来以新的方式重新制定和解决几个现存的商业和 ML 问题。
ML 项目的数据生成
我们想到的 GANs 的第一个直接应用与我们内部项目的数据生成有关。事实上,所有数据科学家都同意的一点是,我们总是需要更多相关数据。
根据使用案例,我们认为 GANs 可以用于在“数据有限的情况下”产生新数据。尽管如此,我们仍然可以依靠数据扩充技术或合成数据,GANs 代表了一个有趣的选择。
此外,GANs 可以发现数据中的结构,从而生成真实的数据。如果我们自己看不到那个结构或者不能依靠其他现有的方法,这可能是战略性的。
GANs 已经被用于数据扩充,例如,为分类生成新的训练图像,改进[合成图像、](http://I expect to see more startups developing offers related to data creating using GANs in the near future. Tailored-made data creation using GANs can become a new business model for startups.)等。这里的关键思想是利用 GANs 生成新的样本来改进其他模型。由于我们已经能够在内部项目中利用 GAN 生成的合成图像进行数据增强,因此结果非常有希望。
一个很好的例子就是医学图像。事实上,收集它们既费钱又费时。我的公司生产许多医疗设备。因此,我们也对应用于医学成像领域的氮化镓感兴趣。
预测#1: 我希望看到更多的创业公司开发与使用 GANs 创建数据相关的服务。使用 GANs 定制的数据创建可以成为创业公司的一种新的商业模式。他们可以根据项目的性质或时间投资将创建的数据货币化。
创造力
GANs 将影响的主要领域之一是创造力。今天,我们已经在考虑为我们的产品启动几个与图像生成相关的概念验证。我相信“ CycleGAN”可能会成为第一个广泛应用于企业的解决方案。
CycleGAN 使用周期一致性损失来实现训练,而无需配对数据。换句话说,它可以从一个域转换到另一个域,而不需要源域和目标域之间的一对一映射。
我们打算使用 GANs 来帮助我们设计未来的产品(照片增强、图像彩色化、风格转换等)。事实上,通过基于机器学习、设计师和 GANs 的专用于情绪分析(社交媒体数据)的工具,我们可以获得新的想法,探索新的未知趋势,并快速确定我们的目标是否会喜欢它们。
预测#2: 我希望看到一些初创公司凭借数据和 GANs,变得专门帮助品牌增强创意流程。创意总监的角色可能会“扩大”。
或许,在不久的将来,无代码人工智能平台将开发一种产品,专门用于根据用户提供的数据集来创造新的设计。这种商业模式可能会引起设计品牌的高度兴趣。GANs 的业务成果可以独立销售,也可以作为订阅模式的一部分。
营销
总的来说,GANs 将对营销职能产生重大影响。我们的目标是使用 GANs 快速增强我们的营销部门。下面,我只提到了我们正在研究的一些内容。
产品描述的改进 在这篇论文的基础上,我们还相信 GAN 模型可以从成功的产品列表或描述中复制文本模式,就我们在电子商务网站上的情况而言。
事实上,即使是最伟大的产品也会因为营销不善而失败。我们的想法是利用 GANs 作为一种测试营销的形式来预测和改善消费者对新产品的反应。
或多或少地使用迪尔-马丁内斯-卡马卢(DMK) 损失函数作为一类新的函数,迫使模型生成的输出包括一组用户定义的关键字,我们相信这将使 GAN 能够推荐一种重新措辞产品描述(在网站或包装上)的方法。
预测#3: 我相信 Airbnb 的经验将激励新的创业公司开发与营销文本样本创建相关的工具。根据产品的不同,初创公司可以收取不同的价格,以帮助小公司改善他们的营销活动。
GAN 生成的内容将变得越来越难以与真实内容区分开来。
跟进这一想法,改进与电子商务相关的流程。营销人员知道,由于冗长的照片,制作模特的视觉效果可能成本很高。GANs 已经被用来创造“人造”模型,比如 Lil Miquela。这种依靠 GANs 来创建与我们的目标受众完全相似的模型的想法可以帮助我们减少营销预算并改善我们的品牌形象…如果这种方法被证明是可扩展的。
预测#4:专门从事 GANs 的初创公司将开发一种利用社交媒体为小品牌创建“人工模型”的服务。他们可能会“出售”它们,或者通过与品牌合作来管理它们。创造这些模式的初创公司也可以采用与传统动画工作室相同的商业模式。我们可能还会看到新的工具,使营销专业人员能够通过订阅模式使用无代码平台创建自己的“人工模型”。
无需创建“人工模型”,我们也在探索姿势引导的人物生成网络。这个研究项目的目的是将图像中的一个对象变换成不同的姿势。这样做的价值在于,我们的产品摄影师可以专注于拍摄一张参考照片,并让 GAN 生成所有其他产品角度。可以想象,这也将转化为电子商务企业的大量时间和成本节约。
预测 5:主要的在线市场或大型科技公司可以开发一个功能,使卖家能够自动生成给定产品的图片,这要归功于 GANs。初创公司也可以通过在线销售产品的甘来专门制作视觉效果(例如 标识 或 视频 )。
显然,你们中的一些人可能想知道所有的模特和摄影师会发生什么。我相信“真实”内容总会有市场,也许一些客户会更喜欢在社交媒体上推广“真实内容”。然而,对获取高质量培训数据的需求将会增加。
在未来十年,GANs 将加强生殖媒体行业。我可以想象在电影行业的应用(例如:许可一个演员的脸),虚拟现实,设计,艺术等。可以肯定的是,像 Adobe 这样的计算机软件公司将对 GANs 进行大量投资。
我们的客户细分和推荐系统也将受到 GANs 发展的影响。事实上,亚马逊印度机器学习公司的一些研究人员训练电子商务机器人(ecGAN)来达到这个结果。具体来说,ecGAN 探索客户可能做出的所有订单的空间,并找出客户实际上会做出哪些订单。
生成器创建可能的订单组合,而鉴别器决定该订单是否现实。另一个非常有趣的元素是,GANs 的原始训练数据集也可以更新,以包括新的趋势,允许 GANs 推荐当前和未来客户实际上想要一起购买的产品。我们相信这种新模式将提高网站上产品推荐的准确性。
亚马逊印度机器学习的研究人员开发了电子商务条件 GAN (ec2GAN)来预测客户的人口统计数据、销售价格和销售的一般日期。ec2GAN 能够使用其生成的与真实世界数据相似的场景进行准确预测。当跨客户人口统计、价格和季节使用时,ec2GAN 可以为零售商提供宝贵的信息。
我们正在考虑的另一个关键项目是语音营销、AIoT 和 GANs 的结合。
事实上,我们的目标是通过增加一项功能来增强我们的产品,例如,当用户查看产品时,可以使用智能设备提出以下问题:
“你能告诉我,如果我上次去法国南部旅行时买了这件夹克,我会是什么样子吗?”
**语音营销:**用于通过由人工智能助手(如 Alexa、谷歌助手和苹果 Siri)支持的语音设备接触目标受众的战略和战术。
当谈到营销体验和数据收集时,能够利用生成模型获得非常具体的输出(如上所述)的想法可能会改变游戏规则。
预测#6: 相信 GANs 会成为所有智能设备的嵌入式,会给用户更个性化的体验。大型科技公司可能会使用 GANs 或零射击学习快速开发新功能,并与品牌合作,使用户能够在购物体验中创建独特的内容。
最后,我们也对文本到图像的合成非常感兴趣。想象一下,有一种工具,你可以通过给出描述来创造新的视觉效果。除了为我们的产品创建视觉效果,我们还可以使用这个工具从文本中创建信息图表,或者生成网站设计。
gan 面临的挑战
尽管有这些有前途的应用,但 GAN 在这些配方中的哪一种上比目前的 ML 溶液具有更好的性能仍有待观察。此外,答案可能取决于数据是图像、文本还是两者的组合。
从战略角度来看,GANs 将进一步增加公司对专有数据的需求。这将成为公司之间更大的区分因素。
从技术的角度来看,我们面临着几个与内部 POC 相关的问题。最重要的是可伸缩性。除了部署问题之外,像 GAN 这样的计算密集型神经网络可能很难管理,通常需要几天时间来训练它们。
我还可以提一下,GAN 模型对超参数选择非常敏感,由于发生器和鉴别器之间的不平衡,很容易出现过拟合,发生器往往会崩溃,结果产生的样本种类有限,或者鉴别器可能过于成功,以至于发生器梯度什么也学不到。
有关 GANs 的更多信息,我推荐以下链接:
- https://papers . nips . cc/paper/6644-pose-guided-person-image-generation . pdff
- https://people.eecs.berkeley.edu/~pathak/papers/cvpr16.pdff
- 【https://arxiv.org/pdf/1605.05396.pdff
- https://github.com/zhangqianhui/AdversarialNetsPaperss
- https://arxiv.org/pdf/1801.03244.pdff
- https://www.nature.com/articles/s41598-019-52737-xx
数据科学家的知识产权
可以说是知识产权法 101
卢克·迈克尔在 Unsplash 上的照片
D 数据科学家几乎总是使用他们没有编写的软件和他们不拥有的数据。正是由于开源,他们才能使用 Python 和 R 这样的编程语言,或者 Scikit-Learn 和 TensorFlow 这样的库,或者 SQLite 和 MongoDB 这样的数据库。这不应该被认为是理所当然的。事实上,考虑到知识产权在数据科学领域的重要性和无处不在性,我认为对它的讨论还不够。这就是我写这篇博文的原因。
我将尝试回答以下问题:
- 哪些知识产权适用于数据科学?
- 可以随机复制公开的 GitHub 代码吗,别人可以用你的吗?
- 谁拥有数据和存储数据的数据库?
- 为什么没有人给神经网络申请专利?
让我们从一个不同的问题开始,为什么知识产权会存在?这不是没有争议的。事实上,对于它们是否应该在如此大的范围内存在,存在着争论。
保护知识产权的主要社会目的是鼓励和奖励创造性工作。人们认为,知识产权刺激投资(时间和金钱)并导致创新。
知识产权的三个主要概念是版权、商标和专利。
版权授予原创作品的作者对(商业和非商业)发行的所有权和专有权。这项权利从产生之时起就存在,这意味着它不需要登记,尽管它可以登记。然而,作品必须固定在有形的介质中(例如在纸上或作为计算机上的比特),所以你头脑中的想法不受保护。显然,除了书籍、绘画和音乐之外,计算机软件也受版权保护。当涉及到数据时,事情变得更加复杂(稍后会有更多的介绍)。然而,重要的是,只有表达本身受到保护,而不是其背后的想法。版权在作者死后至少 50 年内有效。
商标是一个公司(或其商品)区别于其他公司的标志。一个组织的 logo 是受商标保护的,但也可以是像耐克的 Just Do It 这样的一句话。商标不需要注册,而且可以无限期使用。然而,它与数据科学没有太大的关联。
专利相比之下,并不是自动存在的。它们需要应用程序。与版权和商标不同,专利保护的是思想和发明,而不是表达形式。哪些发明获得了专利,哪些不是,一般来说艺术多于科学。专利授予所有者对发明进行商业开发的专有权,期限通常为 20 年。一个著名的专利是 Swiffer 的湿地板片(见专利申请这里)。给软件申请专利也是可能的,但是以后会更多。
除了这三种,商业秘密也经常被认为是知识产权保护的一种方法,尽管不是一种正式的方法。未公开的代码或数据可能被视为商业秘密。
开源许可
知识产权不仅可以通过销售其保护的产品来商业化,还可以通过许可协议来放弃权利本身。换句话说,知识产权的所有者可以将他们的权利授予另一方,通常以版税作为交换(有时甚至是免费的)。这种协议可以专门授予另一方或多方(非排他性许可)。
在数据科学领域,许可非常重要,几乎无处不在。请记住,每一个软件都受版权保护。这意味着,原则上只有他们各自的作者才可以使用 Python、R、Scikit-Learn、TensorFlow 或任何其他软件。令人欣慰的是,开源许可在今天非常普遍。关于开源的确切定义,请参见这里的。大致说来,它的三大支柱是
- 源代码是公开可访问的
- 该软件可以免费使用(没有版税)
- 可以用它制作衍生作品
虽然每个人都可以简单地为一个软件编写自己的开源许可证,但是有许多标准许可证被广泛使用。好处是对于它们包括哪些权利没有(或更少)混淆。根据作者授予的权限程度,开源许可证通常分为三类:
- 公有土地
- 许可许可证
- 版权所有许可证
公共领域(许可)
当一部作品的版权到期时,它就进入了公共领域,这意味着它不再有所有者。任何人都可以随心所欲地使用它。如果作者愿意,现有的版权是否可以转移到公共领域还存在争议。大多数人说不。因此,所谓的公共领域等效许可证被设计成授予与公共领域同等程度的权利。这些都是最不屑一顾的许可证,你可以想象。他们放弃尽可能多的权利;例如,他们通常甚至不要求你注明作者。最常见的公共领域等效许可证是 Unilicense 、 Zero Clause BSD License 、Creative Commons Zero License(CC0)和Do the Fuck You Want To Public License(WTFPL)。后者很好地概括了这一切。有了这样的许可证,你唯一不能做的事情就是声称作品是你的,因为它属于公共领域。公共领域的现代软件的一个例子是 SQLite。
以下是 CC0 许可证文本的示例。
CC0 许可
无版权
在法律允许的范围内,将作品与本契约相关联的人通过放弃其在全球范围内对该作品的所有权利,包括所有相关和邻接权,将该作品奉献给公共领域。您可以复制、修改、分发和执行作品,即使是出于商业目的,都无需征得许可。
许可软件许可
仅包含最小限制(如归属条款)的许可证被称为许可软件许可证。在属于这一类别的各种许可证之间,有一些微妙的(和一些显著的)差异。但粗略的说,他们都允许你自由使用和再分发软件,只要你在任何衍生作品中注明原作者的归属(归属条款)。然而,许可许可证的一个主要限制是,它们不保证软件的未来版本仍然可以公开获得,即软件可以在以后由作者拥有。最常见的许可软件许可证是麻省理工学院许可证。同样很常见的还有 BSD 许可证和 Apache 2.0 许可证。
数据科学家使用的许多软件都有某种许可的开源许可证,包括 Python、Julia、PyTorch 等等。Apache 软件基金会维护的项目值得特别关注,因为它们包括 TensorFlow、Hadoop 和 Spark。这里有一个例子。
麻省理工学院许可证
版权所有 2020 Andreas stffelbauer
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地经营本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利,并允许接受本软件的人按照下列条件这样做:上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的担保[…]
版权所有许可
与许可软件许可证相反,所谓的左版权许可证是互惠的,因为它们要求任何衍生作品具有相同的许可证条款,即具有完全相同的版权许可证。一个主要的动机可能是确保软件保持自由,这在许可许可证下是没有保证的。GNU 通用公共许可证 (GPT)和 AGPL 是最常见的左版权许可证。受版权保护的最著名的软件是 Linux。
数据科学家和软件许可
您可能已经意识到,您不能简单地复制和使用您在 GitHub 上找到的任何代码。如果存储库中包含许可证,请检查允许您对代码做什么。但是如果没有许可证,代码仍然受到版权法的保护,不允许你复制它——代码是公开的这一事实没有任何区别。然而,话虽如此,你并没有因为一段无关紧要且显而易见的代码而侵犯版权;说一个简单的 for 循环;通常只有一种显而易见的编码方式。另外,记住受版权保护的只是代码,而不是背后的想法。因此,举例来说,只要你按照自己的方式去做,就没有什么可以阻止你构建一个新的张量流(就像 PyTorch 所做的那样)。
通常,当涉及到常见的数据科学工具时,数据科学家不必过于小心。只要他们有某种开源许可(他们通常都有),你就可以开始了。当然,也有专有的数据科学软件如 MATLAB、SAS、Tableau,但你无论如何都不会在 GitHub 上找到那些。专有软件的许可通常更加个性化。
**如何开源自己的代码?**要开源您自己的库或项目,您首先必须考虑哪种许可证适合您的需求。GitHub 有一个专门的帮助页面(见这里)。主要步骤非常简单:您需要做的就是将您的条款和条件作为许可文件包含在您的存储库中。同样,GitHub 让您只需点击几下鼠标就可以添加最常用的许可证。这就是为什么你会在很多 GitHub 仓库中找到 license.md 或 license.txt 文件。
数据科学家的软件专利
如前所述,版权只保护计算机程序的文字表达,而不保护其背后的思想,后者通常更有价值。因此,许多公司想要开源的反面,即保护他们的代码。专利将是合理的解决方案。然而,给软件申请专利相对来说并不常见。首先,想想这样一个事实,专利要求完全公开源代码,这将允许其他人对其进行逆向工程。相比之下,简单地将代码保密(商业秘密)在许多情况下可能比专利更有效。
**神经网络等算法呢?**专利算法是一个更加微妙的问题,随着人工智能的进步,它将变得更加重要。这不仅是一个法律问题,尤其是一个道德问题。
原则上,事实是不可专利的,因为像神经网络这样的机器学习算法基本上是数学方法,所以它们不受保护。但是,应用到某个问题上,算法可能会成为专利的一部分。所以,是的,如果以正确的方式设计,为算法申请专利是可能的。例如,生成某种音频的深度学习算法可能是合格的。但这并不妨碍该网络应用于任何其他问题。
此外,我认为软件专利的执行非常困难,机器学习领域发展太快,许多专利不值得冗长的申请。或许一旦更强大的人工智能算法出现,专利将发挥更大的作用。但是,这也有伦理问题。
知识产权和数据
对于数据科学家来说,数据所有权显然是一个重要的话题,但它并没有被真正地讨论过很多。一般来说,版权适用于数据。然而,数据不同于软件或其他创造性的表达方式,因此值得仔细研究。
首先,任何受版权保护的东西都必须是创造性的。这排除了仅仅代表事实的数据,如天气、体育赛事或股票价格的数据——也许大多数存在的数据由于这个原因而免于保护。
版权保护除了创意,总是需要固定在某种有形的媒介上。就数据而言,这自然意味着数据集和数据库发挥着核心作用。事实上,数据库的版权必须与其内容(即数据)的版权区分开来。完全可以想象(甚至常见)的是,在数据库中组合数据的创造性方式享有版权保护,而数据本身却没有。例如,著名的 MNIST 数据集有版权(但作者将其公之于众)。
然而,就像软件一样,保护数据知识产权的最有效方法可能就是保密。不管有没有版权,这意味着其他人不能使用它。道德问题再次出现,尤其是涉及到个人数据的时候。
简而言之,虽然大多数数据不受版权保护,但数据的组织方式有时却受版权保护。然而,就数据而言,商业秘密可能比版权起着更重要的作用。
结论
虽然我很想为数据科学家写更多关于知识产权的东西,但这是一个很大的话题,这篇博文只是一个介绍。特别是关于软件专利和数据所有权的部分需要更多的解释。事实上,例如,关于知识产权如何与机器学习和人工智能相关联,还有很多要说的。此外,我没有谈到版权和专利是否超越国界适用。我只涉及了一些伦理问题。这些只是我想更多了解自己的一些话题。
带有随机森林和开放街道地图的智能建筑简介
如何开始
我们能否根据位置数据创建一个建筑物预测系统?图片作者。
鲁特维克·德什潘德和塞杰尔·维贾伊·帕特尔
智能建筑简报
每一个建筑设计都是建筑师对客户简报的回应,这是一份包含项目所有要求的文件。它的工作是解释所有的设计约束和目标,并涵盖诸如建筑面积,潜在租户和建筑类型等主题[1]。要写一份好的简报,客户必须考虑各种因素,包括城市分区、现金流预测、土地价值以及隐性商业知识。甚至在画出一条线之前,一份好的简报就能影响财务可行性、可持续性,甚至建筑设计的质量。
在这篇文章中,我们将探讨如何应用机器学习(ML)来增强简报过程。目前,任何人都可以访问描述建筑类型、租户、财产价值和位置能源使用的免费数据宝库。使用 ML 可以识别这些数据集之间的隐藏关系,从而预测特定位置新建筑的需求。
在下一节中,我们将解释如何做到这一点。我们展示了如何用 Python 建立一个项目,从一个免费的数据源中学习,为一个假想的苏黎世开发项目做出基于位置的预测。
我们将展示如何用 Python 建立一个项目,从一个免费数据源中学习,为苏黎世的一个假想开发项目做出基于位置的预测。
入门指南
为了简单起见,下面的示例主要基于从上下文数据中提取的属性来预测建筑类型。要完成本教程,您需要注册 Jupyter Notebook,这是一个 web 应用程序,允许您创建和共享包含实时代码、等式、可视化和叙述性文本的文档。
为了帮助你,我们在 GitHub 资源库 这里 共享了这个项目的所有代码。
公式化问题
ML 开发流程概述。图片作者。
第一步是想出一个你试图回答的好问题。这将需要一些数据科学的技术知识以及你给定主题的领域知识。一个正在进行的建筑辩论是是否采取“突出”或“适应”的位置。对于这个项目,我们采取了“合群”的方式。基于这种方法,我们需要考虑我们有什么可用的数据,以及 ML 模型可以提供什么类型的答案。
一个正在进行的建筑辩论是是否采取“突出”或“适应”的位置
数据收集
第二步是收集用于训练模型的数据。对于这个例子,我们使用 OpenStreetMaps(OSM);一个协作性的免费全球制图 API,以 JSON 文件格式提供关于不同城市的 2D 和 3D 地理数据。OSM 是一个“结构化数据集”,这意味着坐标、街道名称、邮政编码、建筑物几何图形和建筑物属性等文本和数字元素都以表格格式组织。结构化数据使得训练机器学习模型变得更加容易。
OpenStreetMaps 搜索苏黎世,显示 2D 和 3D 上下文信息。图片作者。
由于我们的代码是用 Python 编写的,而 OpenStreetMap 的数据是以 JSON 格式存储的,所以第一步是将其转换成一种叫做“Pandas DataFrame”的 Python 数据结构。
# Inspect the OSM Datawith open(‘Desktop\osm-Zurich.json’, ‘r’) as f:# Loading the json datadata = json.load(f)# normalizing it and converting to pandas data framedata = pd.json_normalize(data)print(data.columns)# Columns> [‘highway’, ‘route’, ‘oneway’, ‘crossing’, ‘sidewalk’, ‘building’,‘building_3d’, ‘building_3d_random’, ‘craft’, ‘geological’,‘topography’, ‘contours’, ‘waterway’, ‘leisure’, ‘amenity’, ‘emergency’,‘cycleway’, ‘busway’, ‘bicycle_road’, ‘driving_side’, ‘embedded_rails’,‘historic’, ‘landuse’, ‘man_made’, ‘military’, ‘natural’, ‘office’,‘power’, ‘public_transport’, ‘railway’, ‘bridge’, ‘shop’, ‘sport’,‘tourism’, ‘telecom’, ‘place’]
预处理
第三步是处理我们的输入数据。我们必须清理数据,这意味着我们只使用与我们的设计问题相关的数据点。这个过程被称为特征工程[3]。OSM 数据包含各种各样的要素,找到正确且有用的要素是一项艰巨的任务。正如人们所说的“垃圾进来,垃圾出去”;因此,拥有正确的数据作为机器学习模型的输入是必要的一步。
目标变量是我们将使用数据中的其他输入要素进行预测的要素或变量。对于这个示例项目,我们关注的目标变量是建筑属性类型(即。建筑使用)。为了训练我们的机器学习模型,我们将使用 OpenStreetMap 数据的以下特征来预测新开发站点的目标变量。
- 建筑周长
- 相邻建筑的数量
- 邮递区号
- 行号代名
- 发射阵地地域
- 现场周界
- 半径为 50 米、100 米和 200 米的建筑物数量
我们将把点(建筑物的坐标)转换成的几何图形。Shapely 是一个 Python 包,用于平面数据的空间分析以及处理计算几何。
*# Converting the points into shapely geometriesdf[‘geometry’] = df[‘points’].apply(lambda x : (Polygon(x)))# Extracting various features using “geometry”df[‘centroid’] = df[‘geometry’].apply(lambda x : x.centroid)df[‘perimeter’] = df[‘geometry’].apply(lambda x : x.length)df[‘Site’] = df[‘geometry’].apply(lambda x : x.minimum_rotated_rectangle)df[‘Site_Perimeter’] = df[‘Site’].apply(lambda x : x.length)df[‘Site_Area’] = df[‘Site’].apply(lambda x : x.area)df[‘area’] = df[‘geometry’].apply(lambda x : x.area)# Finding the number of neighbors at different distances using pySAL libraryrW = Rook.from_dataframe(df)df[‘neighbors’] = rW.cardinalities.values()dis_band = DistanceBand.from_dataframe(df, threshold = 200)df[‘neighbors_in_200’] = dis_band.cardinalities.values()dis_band1 = DistanceBand.from_dataframe(df, threshold = 100)df[‘neighbors_in_100’] = dis_band1.cardinalities.values()dis_band2 = DistanceBand.from_dataframe(df, threshold = 50)df[‘neighbors_in_50’] = dis_band2.cardinalities.values()*
预处理后,数据被分成训练集和测试集,这两个集的每一个又被分成标签和特征。
*# Divide the data into features and labels(Building Programs)y = df1[‘attributes.type’]df1.drop([‘attributes.type’],axis = 1, inplace = True)# Divide the dataset into training and testing data; X_train — training features, X_test — testing features, y_train — training labels, y_test — testing featuresX_train, X_test, y_train, y_test = train_test_split(df1, y, test_size=0.2)*
培养
在这个例子中,我们开发了一个 ML 模型,根据位置和周围的上下文信息来预测建筑物的属性。图片作者。
第四步,训练我们的机器学习模型。机器学习模型是一个经过训练的文件,可以识别数据集中要素之间的隐藏关系。训练是模型使用特殊算法分析部分数据集的过程。在这一步,输入特征(预测变量)被映射到我们预测的变量(目标变量)。然后将这些学习到的模式应用于测试数据的输入特征,以预测所需的结果,即标签。
我们使用“随机森林分类器”来分类(预测)一组离散值,在这种情况下,是特定位置的建筑物属性。虽然这里可以使用其他分类算法,但我们选择随机森林,因为它相对容易实现。随机森林的工作原理是基于训练数据的随机片段构建一组决策树。最终输出是每个单独决策树输出的平均值[4]。
*# Fit the modelclf = RandomForestClassifier(random_state=0)param_grid = {‘n_estimators’: np.arange(50, 200)}grid_search = GridSearchCV(clf, param_grid=param_grid, cv=10, verbose=3, return_train_score=True)# Hyperparameter tuning using Grid Searchgrid_search.fit(X_train, y_train);*
这里我们使用交叉验证和超参数调节梯度搜索的方法来确定模型训练的最佳参数。
*# We want optimal number of estimators for the model, so this would be the parameter for Grid # Searchparam_grid = {'n_estimators': np.arange(50, 200)}grid_search = GridSearchCV(clf, param_grid=param_grid, cv = 5, verbose=3, return_train_score=True)# Hyperparameter tuning using Grid Searchgrid_search.fit(X_train, y_train);*
模型评估
一旦我们在训练数据上训练了 ML 模型,我们需要使用测试数据集来评估它。
在本例中,我们使用测试数据(X_test)的输入特征/变量来预测建筑物属性,即我们的目标变量(y_test)。该模型将从训练数据中学到的模式应用于测试数据。
*# Predict the building programs for test data sety_pre = grid_search.predict(X_test)*
最后一步是评估模型,以计算其准确性,这样我们就可以了解我们对预测结果的信心程度。
*# Get the Accuracy Scoreprint(‘Accuracy: %.4f’ % accuracy_score(y_test, y_pred))*
在这种情况下,预测准确率为 61.1 %。准确性是一种衡量标准,用于评估我们的机器学习算法基于输出所取得的成功。在这个示例中,准确性很低,因为我们在训练数据中仅使用了 100 个数据点。
最终想法
这篇文章概述了一个初步的想法和一个例子来强调 ML 和开放数据可以在架构师-客户简报过程中使用。虽然我们已经提供了一个相对简单的例子,这里描述的方法可以进一步改进,并应用于预测设计概要的更具体和有用的方面。这可以扩展到建筑规模、理想租户和能源使用,形成简报推荐系统的基础。
N O T E S
- 詹森,我叫安克尔。"包容性简报和用户参与:丹麦媒体中心案例研究."建筑工程与设计管理 7.1(2011):38–49。网络。
- 关于融入与突出环境的更多信息,请参见“清晰的城市:让杰出的建筑融入日常环境”
- 参见’特征工程’<https://en . Wikipedia . org/wiki/Feature _ Engineering #:~:text = Feature % 20 Engineering % 20 is % 20 过程,as % 20 applied % 20 machine % 20 learning % 20 本身。>
- https:见“随机森林分类”</https:>
关于作者
鲁特维克·德什潘德是 Digital Blue Foam 的机器学习和数据科学研究实习生,也是 @NITRR 的建筑学学生。他对 AEC 行业的数据科学、机器学习和人工智能感兴趣。他还是一名计算设计、城市分析爱好者,也是一名卡格勒。
Sayjel Vijay Patel 是 Digital Blue Foam 的联合创始人兼首席技术官,也是迪拜设计与创新学院的创始助理教授。他毕业于麻省理工学院建筑与规划学院。Sayjel 因其为 3D 打印行业开发概念设计软件的研究获得了广受好评的红点设计奖
智能自动化 RPA 和数据科学之间的共生关系
组织应该如何建立他们的自动化和分析任务组,同时避免“孤岛化”陷阱?
列宁·艾斯特拉达在 Unsplash 上的照片
在这篇文章中,第一部分是我试图澄清 RPA 和 AI 之间的误解。然后,我介绍了一个组织的技术采用图,这些组织正在开始这个“智能自动化”之旅。第 3 部分是我为 RPA 和数据科学这两个部门提出的合作框架。最后,第 4 部分通过提供协作用例来结束本文,在这些用例中,双方都可以发挥他们的真正潜力。
目录
1。从 RPA 到数据科学(?)
2。RPA &数据科学采用图
3。4.0 时代的设计
4。协作用例
1.从 RPA 到数据科学(?)
对于那些不知道什么是机器人过程自动化(RPA)的人来说,这里有一个来自 KPMG 的 3 分钟的简短介绍
RPA:它是如何工作的?来源:毕马威 Youtube 频道
总而言之,RPA 是可以轻松编程的软件,可以像人类工人一样跨应用程序执行基本任务。RPA 软件旨在减轻员工重复、简单任务的负担。
来源:Investopedia
RPA 和机器学习程序如何以不同的方式处理这些问题,如下所示:
**图一。**机器人流程自动化 vs 机器学习工作流程
RPA 可以被认为是“基于规则”的软件机器人,需要从开发人员那里获得手动指令,而机器学习程序可以“学习变得更聪明”版本的自己。
任何精通 RPA 的人在其职业生涯中都至少见过一次下图 3 中的图表。这是一个渐进的图表,讲述了基于规则的软件机器人进化成为自主生物的故事,假设组织遵循正确的道路。虽然这对大众来说很容易理解,但我认为这不应该被用作“智能自动化”的标准蓝图。
**图二。**从流程驱动到数据驱动。由 CFB 机器人上T5【机器人过程自动化与人工智能的区别】
原因如下:
- 图表中“机器学习”(ML)和“人工智能”(AI)的定义具有误导性。我们大多数业内人士都会同意一个更“清晰”的版本,如下图 3 所示。简而言之,RPA 应该已经被归类为人工智能,或者更具体地说是“低级人工智能”。因此图 2 中的线性关系不正确。
**图 3。**深度学习如何是机器学习的子集,机器学习如何是人工智能(AI)的子集。照片由avimanyu 786/CC BY-SA
2.这并不意味着你的公司必须先有 RPA,然后再向“ML & AI”前进。许多组织已经开始同时投资这两个领域。然而,在大多数情况下,负责这两个工具包的部门并没有紧密合作。
“智能模块”有一个价格标签:它们通常是“黑匣子”,成本很高!
3.许多 RPA 提供商现在已经将 ML“模块”注入到他们的工具中,以便客户可以体验“智能自动化”。对于希望部署智能 RPA 机器人而无需在数据科学能力上投入大量资金的客户来说,这是一个很好的方法。然而,常见的情况是,这些模块通常以“黑盒”的形式出现——这意味着客户端的定制程度很低,必须依赖于提供者。因此,从长远来看,这可能会导致成本增加和失控。
RPA 开发人员不是被雇佣来构建机器学习代码的(或者至少…现在还不是)
4.这扩展了上面的原因(3):大多数时候,RPA 提供商免费创建智能模块,并允许客户定制它们(例如, UiPath Marketplace ,在那里人们可以共享和重用智能活动)。虽然组织可以培训已经熟悉标准化流程的员工(或雇用外部人员)成为 RPA 开发人员,但对于这些人来说,调试或从头构建定制智能模块以完成预测任务是一项挑战— 您需要数据分析师/科学家来完成这项任务 。
在进入下一部分之前,我强烈推荐大家阅读CFB 机器人的《机器人过程自动化和人工智能的区别》,他们从不同的角度解释了图 1 。
RPA 和数据科学采用图
图 5。 RPA &数据科学采用图
我在上面创建了一个简单的地图,旨在可视化组织在通往真正智能自动化的道路上的旅程:
低 RPA —低 ML
- 这个方框代表仍然对这两个工具包持怀疑态度的组织。也许他们没有看到他们的行业对技术的需求,或者他们只是喜欢等待其他结果。
- 此处列出了针对 RPA 和数据科学开展试点案例的组织。许多项目处于酝酿阶段,还没有向整个组织发布。
- 此时,根据“创新扩散”理论,它们可以被归类为“后多数”或“落后者”。
高 RPA —低 ML
- 这一部分的公司通常是保守的,喜欢走稳定的道路。他们已经成功地让员工加入 RPA-train(以及法律和合规部门),并拥有合适的基础设施和专家。
- *RPA 是一种简单明了的技术,可以很容易地向人们解释,而数据科学(尤其是“机器学习和深度学习”)听起来仍然“神秘”和“难以”理解。RPA 可以通过**可衡量的 KPI(ROI)*快速产生结果
- 于是,这就是中短期内容易捕捉且性价比极高的“低挂果实”。
RPA 可以通过可衡量的 KPI(如 ROI) 快速产生结果
低 RPA —高 ML
- 这是一个有趣的盒子:属于这里的组织不一定忽视RPA 的存在。他们中的许多人被组织的文化或法律(例如法律、工会、合规……)所禁止。
- 如上所述,RPA 是一种简单明了的技术,这也意味着每个人都可以理解它的工作原理。工人们害怕被取代,这已经在许多地方发生了。因此,如果这个机构没有一个关于如何获得每个人支持的可接受的计划,这可能是一个的艰难旅程。
- 另一方面,这些机构的高级分析能力已经建立起来,因为它们是从通信、营销和销售等其他部门发展而来的。该组织中的数据科学家/分析师/工程师可能会专注于描述性和预测性任务,但会留在各自的部门中支持高级决策流程。
作为许多行业中数据科学项目的本质,在大多数情况下,结果需要很长时间来通过活动和反馈进行验证(细分或预测的情况)。
高 RPA —高 ML
- 截至 2020 年,我相信有一些公司已经达到了这个黄金标准。他们已经成功建立了高级分析和自动化任务组。
- 数据科学部门帮助开发认知模块,而 RPA 部门推出机器人进行测试,并将结果反馈到循环中,以更智能地训练 ML 模块。
- 这需要两个部门之间的紧密合作:可以建立不同的敏捷团队(任务组),共同关注和处理来自内部客户的一些特定请求。或者构建一个中央 RPA 中心,让一些专门的数据科学家/分析师坐在同一个地方。
4.0 时代的设计支柱
那么,我们如何确保这两个部门之间以及他们与客户之间的合作呢?下面的信息图展示了工业化 4.0 时代的四大设计支柱。遵循这些支柱不仅可以帮助 RPA 和数据科学这两个部门使用共同语言,还可以建设性地向业务客户展示他们的项目。
4.0 时代的设计支柱
协作用例
在这一部分,我解释了两个用例,它们代表了这两个部门如何和谐地一起工作。
每周预测报告
发送每周预测报告
在这个假设的用例中,业务客户希望每周将所有的销售预测报告发送给他们*。*输入包含历史数据、沟通材料(新闻稿、财务报表等)。),以及内部数据(CRM)。
- RPA 部门创建机器人将数据收集到一个合并的地方→ 将数据转发到财务部手动执行预测 离线 → 通过电子邮件将预测结果自动发送给客户将输入内容反馈到* 仪表板。*
财务部门手动离线准备预测报告可以由 RPA 部门在数据科学团队的帮助下构建的预测模块取代*。***
- 数据科学部门也可以自己搭建数据采集模块。然而,他们往往没有正确的权限访问所有的原始数据(由于敏感性或隐私问题)。RPA 团队(已经获得法律部门的许可)可以从程序接口获取数据(从邮箱读取电子邮件、从 SAP 系统下载文件等)。)因此,轻松构建提取脚本。
- 当预测结果被最终确定时,RPA 团队可以创建机器人每周将这些报告直接发送给客户*。在一些迭代之后,真实数据被再次反馈到 ML 模块以重新训练算法。因此,这是一个循环,一旦它完成,维护将是最低限度的优化成本。***
总结和报告
对文件进行汇总和分类,然后向客户发送反馈和报告
此用例扩展了上面的用例,其中业务客户希望汇总、分析、的所有沟通材料,并将其放入各自的模板(例如,财务报告、时事通讯、特定主题格式……等。)和用于 KPI 查看的仪表板。
在这里,RPA 部门将负责输入和输出流,而数据科学部门构建 *natural language processing scripts*
来处理需求。
*在测试了针对*sentiment analysis*
和*text classification*
*、的解决方案后,数据科学团队可以将其 ML 模块集成到 RPA 工作流中。RPA 团队只需自定义模块的输入和输出即可正常工作。
最后,当计算结果时,RPA 机器人可以将它们放入模板中,并自动向相应的客户端发送电子邮件。还可能为他们提供一个交互式反馈链接,将数据反馈给工作流。
关闭
组织可以通过多种方式开始他们的数字化之旅,其中之一就是建立数据科学和流程自动化部门。然而,为了确保两个部门之间的合作,机构需要定义明确的职责,让合适的人参与进来,并实施共同的工作框架。
感谢阅读!如果你能留下回复,我会很高兴,我们可以进一步讨论这个话题。
放弃
本文中表达的所有观点都是我个人的观点,不代表我曾经、现在或将来隶属的任何实体的观点。
注释者间协议(IAA)
作者图片
分类标注的成对 Cohen kappa 和群 fleiss kappa(𝜅)系数
在这个故事中,我们将探索注释者间协议(IAA ),这是对多个注释者为某个类别做出相同的注释决定的一种度量。受监督的自然语言处理算法使用带标签的数据集,该数据集通常由人来注释。一个例子是我硕士论文的注释方案,其中推文被标记为辱骂性的或非辱骂性的。**
IAA 向您展示了您的注释准则有多清晰,您的注释者对它的理解有多一致,以及注释任务的可重复性有多高。这是分类结果的验证和重现性的重要部分。
准确性和 F1 得分没有考虑到人们注释实例时很可能出现的期望机会一致。考虑预期机会协议的措施:
- 科恩的𝜅:两个注释者用一个类别注释每个实例
- 弗莱斯的《𝜅:》每一个例子都用一个类别进行了注释《𝑛时报》
这个故事涵盖了注释的最佳实践,并探索了定性注释的两个 IAA 度量标准:Cohen 和 Fleiss 的 kappa。Cohen kappa 是在一对注释者之间计算的,而 Fleiss 的 kappa 是在一组多个注释者之间计算的。
Kappa 统计定义
注释设置
监督学习是基于示例输入-输出对学习将输入映射到输出的函数的机器学习任务。它从由一组训练样本组成的带标签的训练数据中推断出该函数。
在注释数据时,最好让多个注释者注释同一个训练实例来验证标签。当多个注释者注释数据的相同部分时,我们能够计算观察者之间的一致或 IAA。
为了我的硕士论文,我和 44 个本科生一起工作,分成 11 组。每个人都标注了 100 条独特的推文和 50 条重叠的推文,其他三个小组成员也标注了这些推文。这导致四个不同的注释者发布了 50 条带注释的 tweet,一个注释者发布了 400 条 tweet。
科恩卡帕
Cohen 的 kappa 系数( κ )是一个统计量,用于度量标注者之间对于定性(分类)项目的可靠性。这是一个比简单的百分比协议计算更稳健的衡量标准,因为 κ 考虑了协议偶然发生的可能性。它是两个标注器之间成对的可靠性度量。
科恩的卡帕统计量是两个评价人之间的一致,其中 Po 是评价人之间相对观察到的一致(等同于准确度),而 Pe 是机会一致的假设概率。下面是该评估指标的编程实现。
****注意注释列表必须按照相同的索引排序。ann1[0]
和ann2[0]
应该代表同一个带注释的实例(tweet)。
弗莱斯卡帕
Fleiss’ kappa 是一种统计方法,用于在给几个项目分配分类评级或对项目进行分类时,评估固定数量的评价人之间的一致性的可靠性。它是 Scott 的 pi (𝜋)评估度量的一种推广,将两个标注器扩展到多个标注器。斯科特的 pi 和科恩的 kappa 只适用于两位评分者,而弗莱斯的 kappa 适用于任何数量的评分者,他们对固定数量的项目进行分类评分。除此之外,并不是所有的评定者都需要对所有项目进行注释。
感谢 Skylander86 对用 Python 实现 Fleiss kappa 的贡献。我只是复制了他的代码,并添加了注释来解释发生了什么。
Kappa 统计解释
如果评定者完全同意,那么 κ = 1 。如果评定者之间没有达成一致(除了偶然预期的情况),那么 κ ≤ 0 。
卡帕诠释,来源
摘要
- Cohen kappa 只有两个注释器,每个注释器注释每个项目。
- 由于机会协议的计算方式,科恩的𝜅比斯科特的𝜋信息量更大:后者对每个评分者使用一种分布,而前者使用不同的分布。
- 弗莱斯的卡帕是斯科特的𝜋对两位编码员的延伸(不是科恩的𝜅).
- Fleiss 的 kappa 可以有任意数量的注释器,每个项目不一定都由每个注释器进行注释!
在下面的包中也有 Cohen 和 Fleiss 的 kappa 统计的实现,所以您不必为它们编写单独的函数(尽管这是一个很好的实践!).
**import sklearn
from sklearn.metrics import cohen_kappa_scoreimport statsmodels
from statsmodels.stats.inter_rater import fleiss_kappa**
希望这个故事向您展示了如何计算 IAA 来验证您的结果并提高您的实验的可重复性!完整的脚本可以在这里找到。
干扰分析——对控制变量进行适当调整(第 4 部分)
交互分析中夸大的假阳性,以及如何消除它们。
[这最初发布在我的博客
在本系列的前几篇文章中,我谈到了交互分析的计算能力(第 1 部分),解释交互效应大小(第 2 部分),以及交互需要多大的样本量(第 3 部分)。在这里,我要谈谈一个我非常关心的问题——控制变量!
“什么?”你问,“交互控制变量不是和其他回归一样吗?”答案很简单……不会!
假设你有一个回归— Y ~ X + C 。这是我的“控制”变量——这些变量代表了我们想要考虑的潜在影响。如果我们想要测试一个交互,也就是“适度”,我们的回归可能看起来像这样— Y ~ XM + X + M + C* 。x * M’是我们感兴趣测试的交互作用。但是我们还没完!我们还没有对控制变量的所有可能影响进行调整。直觉上,由于我们的假设是相互作用,我们需要控制潜在的替代相互作用。我们最终的回归方程应该是这样的——Y ~ X * M+X+M+C * X+C * M+C*。*
我第一次意识到这个问题是因为 Matthew Keller 博士的一篇关于 x 基因环境分析的统计控制的优秀文章。他引用了 1992 年由赫尔、泰德里和赫恩撰写的一篇文章,该文章指出了这个问题(这是我所知道的关于这个问题的最古老的文章)。还有一篇由 Yzerbyt、Muller 和 Judd 于 2004 年撰写的优秀论文,在我看来,这篇论文对驱动这些额外控制的必要性的潜在因素给出了最好的解释。
真的,你应该去看看 Yzerbyt、Muller 和 Judd 的论文。简而言之,在两种情况下,不包含而不包含协变量 x 预测因子交互项的回归模型将具有增加的假阳性 : (1)当协变量和预测因子相关时,以及(2)当协变量 x 预测因子交互本身与因变量 y 相关时。这里我复制了它们的图 1 ,显示了这些影响:
模拟数据,所有变量都是连续的,正态的。模拟样本量 N=200,X 和 M 的主效应 r=0.2,X 和 M 不相关,X*M 交互效应 r=0。c 具有 r=0 的主效应,并且与 M (r=0)不相关。每个点代表 10,000 次模拟中假阳性的比例,总共 190 万次模拟。代码在这里可用。
该图清楚地表明了假阳性(I 型错误;当真实效应为 0 时,检测到显著效应)随着协变量和预测因子之间的相关性增加,以及随着协变量 x 预测因子交互作用的影响增加而增加。这是个问题吗?我真的觉得是。即使是 6%的假阳性率对任何个人发现来说都是一个巨大的问题,并且在一个领域或知识体的水平上,可能导致高度偏见的文献。(注意这不是特定领域的,这适用于任何交互分析,所以我在这里不只是谈论心理学或神经科学)。我没有关于这个问题有多大的可靠数据,但是我已经阅读和评论了很多不包括这些额外协变量的论文。
最简单的解决方法是在你的模型中包含所有的预测协变量交互作用!当然,这种解决方案的一个不利方面是,这将使模型中的协变量数量增加两倍——如果你有 5 个协变量,现在你将有 15 个!如果你的自由度很少,这可能是一个问题,尽管老实说,如果你的 df 很少,额外的 10 个变量会产生很大的差异,你可能一开始就不应该测试交互。您可能会想,如果您要测试每个协变量的潜在偏差源,并且只包含重要的附加项,会怎么样?很清楚为什么这不会起作用,因为(1)首先你必须对每个统计测试进行校正(例如在我的 5 个初始协变量的例子中的 20 个,C 和 X/M 之间的相关性,加上 CX 和 CM 相互作用的影响),在这一点上(2)图 2 清楚地表明,你很可能没有能力检测仍然会使你的结果产生偏差的影响( Yzerbyt、Muller 和 Judd 所以不能保证你能只包括潜在的偏见来源。唯一的解决方法是包含所有的交互协变量。
现在,如何为您的分析生成协变量?据我所知,像 SPSS 和 GraphPad 这样的即插即用的统计软件并没有提供一种简单的方法来动态地生成这些变量,尽管你当然可以手动地一个接一个地生成它们(或者如果你知道如何在 SPSS 中编写脚本,它应该也很快)。然而,我开始真正欣赏 R 的一点是,这些交互协变量可以直接在你的回归模型中指定。例如,代替:
lm(Y~ X:M + X + M + C)
你会写:
lm(Y~ X:M + X + M + C + C:(X+M))
真的就这么简单!
多元回归中的交互效应
了解交互效应以及如何使用 Python sklearn 库在数据集中识别交互效应。
图片来源:www.pixabay.com
什么是互动效应?
互动效应不仅存在于统计学中,也存在于市场营销中。在市场营销中,这个相同的概念被称为协同效应。交互效应是指两个或更多的特征/变量组合在一起,与单独的单个变量的总和相比,对一个特征具有明显更大的影响。当我们试图研究几个变量对单个响应变量的影响时,在回归中理解这种影响是很重要的。
线性回归方程可以表示如下:
这里,我们试图找到自变量(X₁和 X₂)与响应变量 y 和ε之间的线性关系是不可约误差。为了检查预测变量和反应变量之间是否有任何显著的统计关系,我们进行了假设检验。如果我们对预测变量 X₁进行测试,我们将有两个假设:
零假设(h₀):x₁和 y 之间没有关系(β₁ = 0)
另类假设(h₁):x₁and y(β₁≠0)之间有关系
然后,我们根据 p 值决定是否拒绝零假设。假设零假设为真,p 值是测试结果的概率。
例如,如果我们在测试结果中得到非零值的β₁,这表明 X₁和 y 之间存在关系。但如果 p 值很大,这表明即使零假设实际上为真,我们也很有可能得到非零值的β₁。在这种情况下,我们无法拒绝零假设,并得出结论,预测和反应变量之间没有关系。但是,如果 p 值很低(通常 p 值截止值被认为是 0.05),那么即使β₁的非零值很小,也表明预测值和响应变量之间存在显著关系。
如果我们得出 X₁和 y 之间有关系的结论,我们认为 X₁每增加一个单位,y 就增加/减少β₁个单位。在上面的线性方程中,我们假设 X₁对 y 的影响与 X₂.无关这也称为线性回归中的加法假设。
但是如果 X₁对 y 的影响也依赖于 X₂呢?我们可以在许多商业问题中看到这种关系。例如,我们想找出两种不同投资类型的投资回报率。本例的线性回归方程为:
在这个例子中,如果我们部分投资于这两种类型的投资,而不是完全投资于其中一种,可能会有更大的利润。例如,如果我们有 1000 单位的资金进行投资,将 500 单位的资金同时投资于这两种投资,与将 1000 单位的资金全部投资于其中一种投资相比,可以获得更大的利润。在这种情况下,投资 1 与投资回报的关系将取决于投资 2。这种关系可以包含在我们的等式中,如下所示:
在上面的等式中,我们包括了投资 1 和投资 2 之间的“相互作用”,用于预测总投资回报。对于任何线性回归方程,我们都可以包括这样的相互作用
上述等式可以改写为:
这里,β₃是相互作用项的系数。同样,为了验证回归中交互作用的存在,我们进行假设检验并检查我们系数的 p 值(在这种情况下是β₃).
使用 sklearn 在数据集中查找交互术语
现在让我们看看如何验证数据集中交互作用的存在。我们将使用自动数据集作为我们的例子。数据集可以从这里下载。让我们看一下数据集
import pandas as pd
data = pd.read_csv('data/auto-mpg.csv')
将数据集转换为数字并填充缺失的值
#removing irrelevant 'car name' column
data.drop('car name',axis=1,inplace=True)
#converting all columns to numeric
for col in data.columns:
data[col] = pd.to_numeric(data[col], errors ='coerce')
#replacing missing values in horsepower with its median
horse_med = data['horsepower'].median()
data['horsepower'] = data['horsepower'].fillna(horse_med)
让我们在这个数据集上拟合一个 OLS(普通最小二乘法)模型。该模型存在于 statsmodels 库中。
from statsmodels.regression import linear_model
X = data.drop('mpg', axis=1)
y = data['mpg']
model = linear_model.OLS(y, X).fit()
从这个模型中,我们可以得到系数值,以及它们是否在统计上有意义,以包括在模型中。
model.summary()
下面是模型摘要的快照。
在上面的模型总结中,我们可以看到除了加速度、之外,其他所有特征的 p 值都小于 0.05,具有统计学意义。即使加速度独立对 mpg 的预测没有帮助,我们也有兴趣找出加速度在与其他变量相互作用后是否对 **mpg 有影响。**此外,我们有兴趣了解所有重要交互术语的存在。
我们首先需要创建所有可能的交互项。通过使用 sklearn 库中的多项式特性,这在 python 中是可能的
from sklearn.preprocessing import PolynomialFeatures#generating interaction terms
x_interaction = PolynomialFeatures(2, interaction_only=True, include_bias=False).fit_transform(X)#creating a new dataframe with the interaction terms included
interaction_df = pd.DataFrame(x_interaction, columns = ['cylinders','displacement','horsepower','weight','acceleration','year','origin',
'cylinders:displacement','cylinders:horsepower','cylinders:weight','cylinders:acceleration',
'cylinders:year','cylinders:origin','displacement:horsepower','displacement:weight',
'displacement:acceleration','displacement:year','displacement:origin','horsepower:weight',
'horsepower:acceleration','horsepower:year','horsepower:origin','weight:acceleration',
'weight:year','weight:origin','acceleration:year','acceleration:origin','year:origin'])
当创建了包括交互项的新数据框架时,我们可以为其拟合新的模型,并查看哪些交互项是重要的。
interaction_model = linear_model.OLS(y, interaction_df).fit()
现在我们只需要那些统计上有意义的相互作用项(p 值小于 0.05)
interaction_model.pvalues[interaction_model.pvalues < 0.05]
正如我们所看到的,存在交互项。另外,加速度本身并不重要,但是它与马力和年份的相互作用被证明对于 mpg 的预测非常重要。
值得注意的是,在上面的例子中,加速度的 p 值很高,但它包含在交互项中。在这种情况下,我们必须将加速度的主效应包括在模型中,即加速度的系数,即使由于**等级原则它在统计上不显著。**等级原则规定,如果在交互项中有两个特征 X₁和 X₂,我们必须在模型中包括它们的 coefficients(β₁和β₂,即使与它们相关的 p 值非常高。
带有散景的交互式条形图
和其他视觉增强技术
介绍
这篇文章是我的散景爱情故事的第二部分。完整的故事(包括 Jupyter 笔记本和所有文件)在我的 Github 上。故事的第一部分在媒体文章“使用散景的简单数据可视化技术”中有所描述。
条形图
没有可视化,你的数据故事是不可能完整的,条形图可以说是最受欢迎的分类数据表示类型之一。这种类似乐高积木的图形有无数种类型、调色板和风格,这就是为什么我决定为它们写一篇单独的文章。
让我们从简单的垂直和水平条形图开始。我们马上会谈到更复杂的问题。
用散景绘制条形图非常简单。像往常一样,我们需要指定一种图表类型(或者选择一种字形)并将数据传递给绘图函数。让我们使用相同的联合国世界卫生保健指标数据库创建一个垂直条形图,显示 2000-2015 年间美国麻疹发病率的变化。
# Creating a list of categories
years = data[data['country']=='United States of America']['year']#Creating the list of values
values = data[data['country']=='United States of America']['measles']# Initializing the plot
p = figure( plot_height=300,
title="Measles in the USA 2000-2015",
tools=TOOLS)#Plotting
p.vbar(years, #categories
top = values, #bar heights
width = .9,
fill_alpha = .5,
fill_color = 'salmon',
line_alpha = .5,
line_color='green',
line_dash='dashed'
)#Signing the axis
p.xaxis.axis_label="Years"
p.yaxis.axis_label="Measles stats"show(p)
瞧啊。
完全以同样的方式,我们可以创建水平条形图。让我们以阿根廷 2000-2015 年报告的脊髓灰质炎发病率为例进行说明。
# Creating a list of categories
years = data[data['country']=='Argentina']['year']#Creating the list of values
values = data[data['country']=='Argentina']['polio'].values# Initializing the plot
p = figure( plot_height=300,
title="Polio in the Argentina 2000-2015")#Plotting
p.hbar(years,
left = 0,
right = values,
height = .9,
fill_color = 'azure',
line_color='green',
line_alpha=.5
)p.xaxis.axis_label="Years"
p.yaxis.axis_label="Polio stats"show(p)
代码超级直观;我们只需要记住我们是在练习单杠。
我们的条形图以一种非常简单的方式呈现,它们肯定可以从一些附加的构成中受益。
条形图样式
有关一些可用调色板的列表,请访问散景调色板文档。为了配合散景使用它们,我们需要专门导入它们。
让我们来看看 2015 年一些国家的麻疹数据——我们将使用预设调色板和随机选择的颜色来绘制两个图表,并且我们将使用gridplot技术。
调色板和网格图
#Importing a pallettefrom bokeh.palettes import Spectral5, Viridis256, Colorblind, Magma256, Turbo256# Creating a list of categorical values values = data[(data['year']==2015)&(data['country'].isin(countries))]['measles']# Set the x_range to the list of categories abovep1 = figure(x_range=countries,
plot_height=250,
title="Measles in the world in 2015 (pre-set pallette)")# Categorical values can also be used as coordinatesp1.vbar(x=countries, top=values, width=0.9,
color = Spectral5, fill_alpha=.75)# Set some properties to make the plot look betterp1.yaxis.axis_label="Measles stats"
p1.xgrid.grid_line_color='gray'
p1.xgrid.grid_line_alpha=.75
p1.xgrid.grid_line_dash = 'dashed'
p1.ygrid.grid_line_color='blue'
p1.ygrid.grid_line_alpha = .55
p1.ygrid.grid_line_dash = 'dotted'p2 = figure(x_range=countries,
plot_height=250,
title="Measles in the world in 2015 (randomly selected colors from a pallette)")# Categorical values can also be used as coordinatesp2.vbar(x=countries, top=values, width=0.9,
color = random.sample(Viridis256,5), fill_alpha=.75)# Set some properties to make the plot look betterp2.yaxis.axis_label="Measles stats"
p2.xgrid.grid_line_color='gray'
p2.xgrid.grid_line_alpha=.75
p2.xgrid.grid_line_dash = 'dashed'
p2.ygrid.grid_line_color='blue'
p2.ygrid.grid_line_alpha = .55
p2.ygrid.grid_line_dash = 'dotted'p = gridplot([[p1,None],[p2,None]], toolbar_location='right')
show(p)
这是结果:
这个情节看起来比我们开始时的要友好得多。对颜色和调色板的实验永无止境。
分组条形图
有时我们需要绘制分组条形图。例如,我们可能需要对一些国家的健康指标进行分组。为此,我们需要从 bokeh.models 模块导入一个特殊的过程— FactorRange。让我们看看 2014 年国家名单中麻疹、脊髓灰质炎和艾滋病毒/艾滋病*1000 的数据。
from bokeh.models import FactorRange#List of used statisticsstats = ['measles','polio','hiv/aids*1000']#Creating a dictionary of our datamdata = {'countries' : countries,
'measles' : data[data['year']==2014][data['country'].isin(countries)]['measles'],
'polio' : data[data['year']==2014][data['country'].isin(countries)]['polio'],
'hiv/aids*1000' : data[data['year']==2014][data['country'].isin(countries)]['hiv/aids']*1000}# Creating tuples for individual bars [ ("France", "measles"), ("France", "polio"), ("France", "hiv/aids*1000"), ("Canada", "measles"), ... ]x = [ (country, stat) for country in countries for stat in stats ]
counts = sum(zip(mdata['measles'], mdata['polio'], mdata['hiv/aids*1000']), ())#Creating a column data source - Bokeh's own data type with the fields (Country,[stats],[values],[colors]) source = ColumnDataSource(data=dict(x=x, counts=counts, color=random.sample(Turbo256,15)))#Initializing our plotp = figure(x_range=FactorRange(*x), plot_height=350, title="Health Stats by Country")#Plotting our vertical bar chartp.vbar(x='x', top='counts', width=0.9 ,fill_color='color', source=source)#Enhancing our graphp.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = .9
p.xgrid.grid_line_color = Noneshow(p)
情节是这样的:
我们也可以使用无数种可能的内置方法来根据我们的喜好调整视觉效果。
颜色转换
我们经常对预设或随机的调色板不满意,我们需要使用一些额外的色彩映射。我们用 bokeh.transform 模块导入的 factor_cmap 函数就是这种情况。我们来看看加拿大分别在 2000 年、2005 年、2010 年和 2015 年的麻疹、脊髓灰质炎和艾滋病*1000 的数据。
from bokeh.transform import factor_cmap#List of used statisticsstats = ['measles','polio','hiv/aids*1000']
years = ['2000','2005','2010','2015']#Creating a dictionary of our datamdata = {'years' : years,
'measles' : data[data['country']=="Canada"][data['year'].isin(years)]['measles'],
'polio' : data[data['country']=="Canada"][data['year'].isin(years)]['polio'],
'hiv/aids*1000' : data[data['country']=="Canada"][data['year'].isin(years)]['hiv/aids']*1000}# Creating tuples for individual bars x = [ (year, stat) for year in years for stat in stats ]
counts = sum(zip(mdata['measles'], mdata['polio'], mdata['hiv/aids*1000']), ())#Creating a column data source source = ColumnDataSource(data=dict(x=x, counts=counts, color=random.sample(Turbo256,12)))#Initializing our plot with random colorsp1 = figure(x_range=FactorRange(*x), plot_height=350, title="Health Stats in Canada 2000-2015")#Plotting our vertical bar chartp1.vbar(x='x', top='counts', width=0.9 ,fill_color='color', source=source)#Enhancing our graphp1.y_range.start = 0
p1.x_range.range_padding = 0.1
p1.xaxis.major_label_orientation = .9
p1.xgrid.grid_line_color = None#Creating a new column data source without set colors
source1 = ColumnDataSource(data=dict(x=x, counts=counts))#Initializing our plot with synchronized fill colors with factor_cmapp2 = figure(x_range=FactorRange(*x), plot_height=350,
title="Health Stats in Canada 2000-2015, color mapped"
)p2.vbar(x='x', top='counts', width=0.9,
source=source1,
fill_color=factor_cmap('x', palette=['salmon', 'green', 'navy'],
factors=stats, start=1, end=2))p2.xaxis.major_label_orientation = .7
p=gridplot([[p1,None],[p2,None]], toolbar_location='right')show(p)
我们在这里——第一个图表有一些随机的颜色,第二个是颜色因素:
尽管第一个看起来更怪异,但第二个在色彩映射统计时有更清晰的信息。
向视觉效果添加标签
在散景中绘制单个标签非常简单,不需要任何特殊的技巧。我们只需要从 bokeh.models.annotations 模块导入 Label 类,它的语法非常简单。人们只需要知道散景使用一个单独的图层来绘图,另一个图层来标记,等等。我们将使用 add_layer()方法来组装我们的视觉效果。让我们看一个例子,并创建一个 2000-2015 年西班牙麻疹的图表。
from bokeh.models.annotations import Label#Initializing our plotp = figure(x_range=(2000,2015), title='Measles in Spain 2000-2015')#Plotting a linep.line(data[data['country']=='Spain']['year'],
data[data['country']=='Spain']['measles'],
line_color='navy',
line_width=3)#Plotting data points as cirlesp.circle(data[data['country']=='Spain']['year'],
data[data['country']=='Spain']['measles'],
radius=.2,
fill_color='yellow',
line_color='salmon')#Instance of Label class as our 2011 Measles Outbreak labellabel = Label(x=2011,
y=max(data[data['country']=='Spain']['measles']),
x_offset=10,
text="2011 Outbreak",
text_baseline="top")#Adding a layout with our label to the graphp.add_layout(label)#Styling the graphp.xaxis.axis_label = 'Year'
p.yaxis.axis_label = 'Measles stats'
p.xgrid.grid_line_dash = 'dashed'
p.xgrid.grid_line_color ='gray'
p.ygrid.grid_line_dash ='dotted'
p.ygrid.grid_line_color = 'gray'
p.background_fill_color='green'
p.background_fill_alpha=.05show(p)
瞧啊。
添加一个“自定义”标签真的很简单。散景的美妙之处在于,添加一整套标签并没有多一点困难。让我们看看 2000-2015 年印度的脊髓灰质炎的例子,并尝试给每个数据点添加值。我们只需要使用 ColumnDataSource 类的一个实例,并从 bokeh.models 模块导入 LabelSet 类。
from bokeh.models import LabelSet#Instance of ColumnDataSourcesource = ColumnDataSource(data=dict(
x=data[data['country']=='India']['year'],
y=data[data['country']=='India']['polio'],
labels=data[data['country']=='India']['polio'].values))#Initializing our plotp = figure(x_range=(1999,2016),
y_range=(50,90),
title='Polio in India 2000-2015')#Plotting data points as vertical barsp.vbar(x = 'x',
top = 'y',
width = .8,
fill_color='azure', fill_alpha = 1,
line_color='navy', line_alpha=.25,
line_width=2, line_dash='dotted',
source=source)#Plotting a linep.line(x = 'x',
y = 'y',
line_color='red',line_width=4,
line_alpha=.5,
source=source)#Plotting data points as circlesp.circle(x='x',y='y',
radius=.2,
fill_color='yellow', line_color='red', line_width=2,
source=source)#Instance of the LabelSet classlabels = LabelSet(x='x', #positions of labeled datapoints
y='y',
text='labels', #labels' text
level='glyph', #labeling level
x_offset=-10, y_offset=15, #move from datapoints
source=source,
render_mode='canvas',
text_baseline='bottom' #relative position to datapoints
)p.add_layout(labels)p.xaxis.axis_label = 'Year'
p.yaxis.axis_label = 'Measles stats'
p.xgrid.grid_line_dash = 'dashed'
p.xgrid.grid_line_color ='gray'
p.ygrid.grid_line_dash ='dotted'
p.ygrid.grid_line_color = 'gray'
p.background_fill_color='salmon'
p.background_fill_alpha=.05show(p)
就是这样:
其他互动技术
有相当多的其他互动技术可以真正重塑你的形象,给你的数据驱动的故事一个全新的维度。仅举几个例子——与平移链接、与刷动链接、悬停等。其中一些在 Github 上相应的项目的笔记本中有说明。
散景确实是灵感的无尽源泉。我对它的简单性、流畅的学习曲线和精彩的互动视觉效果赞不绝口。!