如何确保 SaaS 应用程序的安全性
杰佛森·桑多斯在 Unsplash 上拍摄的照片
随着企业将数据和应用程序迁移到云中,他们不断面临着在提高生产力和降低成本的优势与重大的合规性和安全性问题之间进行平衡的任务。
随着 94%的企业使用云,企业开始关注数据和业务流程,如记录、交易、定价信息等。对于遵从性策略和访问控制至关重要。
虽然软件即服务(SaaS)是一个很好的软件分发模型,它提供了已经在云中安装和配置的易于使用的产品,但它也存在一些挑战。
这些挑战是什么?
例如,SaaS 应用程序通常存储敏感信息,如客户的信用卡信息,但这也带来了潜在的 SaaS 安全风险。网络犯罪分子可能会出于恶意的原因试图破坏数据以获取这些信息或窃取凭据。
所有这些因素都构成了重大应用程序安全漏洞和数据泄露的威胁,这可能会导致法律和财务责任。这就是为什么对于企业来说,确保 SaaS 应用程序的安全性至关重要——保护客户的数据免受攻击者的攻击,并且不成为可能导致法律或财务问题的网络攻击的受害者。
以下是每个 SaaS 提供商为保护其应用而必须具备的一些基本安全控制措施:
保护 SaaS 应用程序的最佳实践
为了成功安全地保护您的 SaaS 应用程序,企业必须致力于实施一流的 SaaS 安全性。
通过评估 SaaS 应用程序环境中的应用程序安全风险和威胁,您可以了解应用程序的漏洞。
一旦确定了 SaaS 应用中的漏洞,您不仅可以保护易受攻击的热点,还可以采用更好的解决方案来保护您的 SaaS 应用,使其免受新的 SaaS 安全风险的威胁。
我们收集了一系列提高 SaaS 应用程序安全性的最佳实践和方法。这些将让您更好地了解如何在体验云服务带来的好处的同时,在您的 SaaS 应用程序中实现安全控制。
制定安全审查核对表
数据泄露会对您的公司造成不利影响,并且可能需要几个月甚至几年的时间才能从泄露造成的损害中恢复过来。
此外,如果数据泄露导致敏感信息丢失、品牌声誉下降或对您保护数据安全的能力失去信心,这可能是您公司成败的关键。
因此,企业必须创建一个清晰、简明的安全审查清单,以确保您的网络、设备和用户符合所需的安全标准。
安全审查核对表应该包括什么?
安全审查清单上可能包含许多内容。以下是一些宽泛的类别,可能涵盖了许多重要的网络安全方面:
管理
- 创造安全第一的文化。
- 制定强有力的安全策略,记录这些策略,并通过培训和技术控制来实施这些策略。
- 确保符合适当的合规框架以及自己的内部和外部审计
员工
- 实施强密码策略和多因素身份验证。
- 就最新的网络安全威胁以及如何有效应对这些威胁进行定期培训。
- 为所有员工举办安全意识培训,使安全成为共同的责任。
保护数据
- 根据用途和敏感度对数据进行分类,并针对每个分类级别适当地保护数据。
- 启用加密。
- 为每个客户端数据集使用单独的加密密钥,强制实施强数据分段。
- 安全网络、移动设备、计算机和存储设备。
- 加固所有设备。
- 定期扫描漏洞和与批准配置的偏差。
- 识别敏感数据,并对其使用和访问实施严格的策略。
- 为客户端启用多因素身份验证。
- 确保应用程序具有传输套接字层(TSL ),通过强大的算法、密钥长度和密码配置来保护数据传输。
- 通过强制最低权限访问来强制实施强用户访问控制。
- 确保实施强大的检测控制来识别恶意/可疑行为。
- 确保建立强大的审核日志记录,并将其输入到经过调整的事件和事件管理器中。
- 确保建立健全的事件响应计划和灾难恢复计划,并定期进行测试。
- 确保您拥有完全安全的软件开发生命周期(SDLC ),部署了自动扫描、威胁建模和安全专家的手动审查。
安全审查核对表可能因您使用的平台而异,但对于组织来说,定期审查并使用最新威胁更新核对表至关重要,这将有助于他们在保持质量的同时确定应用程序安全的优先级。
确保认证和审计的合规性
对于组织来说,关注像支付卡行业数据安全标准 (PCI DSS)这样的认证是至关重要的。这些认证有助于公司确保其敏感数据得到全面保护。
SaaS 提供商如何确保符合认证和审计要求?
对于 PCI DSS,SaaS 提供商必须执行全面的审核,以确保敏感数据以安全的方式传输、处理和存储。
它需要一个全面的安全标准,其中包含对云安全策略、程序、管理、网络架构、软件设计和其他重要保护措施的要求。
SaaS 提供商的另一项重要认证是系统和组织控制(SOC 2)II 型,该认证用于监督法规遵从性、供应商管理流程和内部风险管理流程。
它确保云服务得到部署和主动监控,以保持高安全性控制,从而确保数据安全。
这两项认证将保护您的组织免受数据泄露的影响,并确保维护适当的机密性和完整性。
实施数据保留策略
数据保留是 SaaS 应用程序安全性的一个重要方面。虽然许多 SaaS 应用程序有不同的保留策略,但有些应用程序没有任何可用的保留选项。
企业必须为其 SaaS 应用程序制定数据保留政策,尤其是在账户管理和订阅方面。
为什么这很重要?
您需要了解哪些数据需要保留。虽然法律要求将一些数据保留一段特定的时间,但其他数据可能对您的业务很重要,但不一定需要保留。
数据保留策略不仅有助于创建备份和释放文件空间,而且通常是法规遵从性的必要条件。
除了公司的内部合规性规则,还有一些法规和法律要求拥有云服务的公司制定数据保留政策。
例如 PCI DSS 和萨班斯-奥克斯利法案。遵守法律法规是企业非常关心的问题。对不合规行为的处罚从高额罚款到名誉损失不等。
确保安全部署
通过专门的 SaaS 供应商,如亚马逊或谷歌,他们通过提供安全的基础设施服务来帮助确保数据隔离、数据安全、网络安全等,共同承担保护 SaaS 应用的责任。
在我们的例子中,我们使用 Amazon Elastic Beanstalk,它允许我们将敏感凭证隔离到生产栈。所有其他开发者都不被允许访问这个环境,而只能使用他们在本地生成的开发证书。
自托管部署呢?
在自托管部署中,您必须确保采取适当的安全措施,并制定严格的应用程序安全策略来保护您的应用程序免受 DoS 攻击和网络渗透攻击。
如果您选择在公共云上部署 SaaS 应用程序,请确保遵循公共云供应商推荐的最佳实践和规范。
端到端加密传输数据
在 SaaS 应用程序中保护数据的另一个有效方法是对传输数据进行加密。
加密使您能够对数据进行编码,以防止未经授权或无法访问的用户对数据进行攻击。它通过提供完整性、不可否认性、机密性和身份验证来保护您的数据。
简而言之,即使未经授权的用户能够访问您的数据,如果没有加密密钥,他们也无法解码。
要加密传输数据,请确保与服务器的所有交互都通过 TLS(传输层安全性)传输进行。TLS 应仅在云服务提供商内部终止。
除了传输中的数据,存储中的数据也应该适当加密,以保护敏感信息。理想情况下,云服务提供商通常提供字段级加密,因此您可以选择想要加密的字段,并确保您的数据安全传输和存储。
监控用户级数据安全性
对于企业来说,监控用户级数据安全性以确保符合内部和外部应用程序安全标准至关重要。
您的云服务提供商可能会为您提供基于角色的访问控制(RBAC)功能,使您能够指定特定于用户的访问和其他操作权限。
其理念是将正确的访问权限授予正确的人,确保只有经过授权的个人才能访问 SaaS 应用程序上的数据。
这种系统能够实现精确的、基于访问控制的、强制的应用程序安全级别,该安全级别隔离用户以及用户如何访问企业内 SaaS 应用程序中的数据。
集成实时保护
SaaS 应用程序为最终用户提供了巨大的价值,因为它们易于安装和协作。
保护您的 SaaS 应用程序的最有效方法之一是集成实时监控,这将为您的 SaaS 应用程序提供更好的可见性、控制、策略管理和合规性,以保护您的数据不被暴露。
实时监控如何帮助保护 SaaS 应用程序?
SQL 注入、XSS 和账户接管等攻击是攻击 SaaS 产品的一些常用方法。
实时监控可以通过保护逻辑帮助您区分合法查询和恶意攻击。实时保护工具可以在开发阶段集成到代码中。
它帮助您在开发过程的早期检测攻击,并通过采取适当的措施来降低 SaaS 安全风险。
采用安全的软件开发生命周期(SDLC)
传统的 SDLC 侧重于满足特性和功能方面的需求。然而,在 SDLC 的不同阶段发生的一组动作可能并不总是本质上符合设定的应用安全标准。
要解决这个问题,可以考虑从开发阶段的开始就将安全性集成到 SDLC 的所有阶段。
在 SDLC 流程的早期嵌入安全性的想法是为了让安全性融入到流程中,而不是附加上去。
通过将安全性向左转移,也就是向开发阶段这样的初始阶段转移,您可以在 SDLC 的早期轻松地检测到应用程序中潜在的漏洞或弱点。
使用这种方法,您可以创建一个安全的应用程序,在其中您可以实现安全编码的最佳实践,尤其是在代码审查期间。
此外,在 SDLC 流程的早期实施安全指南有助于防止 SaaS 安全漏洞的侵入,并消除潜在的挫折。
准备好确保 SaaS 应用程序的安全性了吗?
SaaS 提供了各种好处,如降低成本和提高运营效率。然而,从合规到安全部署,采用 SaaS 安全实践至关重要,并确保您提前解决云安全挑战,以保护您的 SaaS 应用。
虽然这些问题大多源于我们对 SaaS 提供商如何存储我们的数据缺乏可见性和控制,但您必须遵循上述最佳实践,以确保您的 SaaS 应用程序的云安全。
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
如何确保您的数据科学项目每次都成功
在 2017 年的一项调查中,Gartner 分析师发现超过一半的数据科学项目从未部署。这可能会导致一些人认为数据、分析工具或潜在的 ML 模型中存在缺陷,但事实并非如此。在 Plotly,我们从经验中了解到,产品发布失败通常是因为无法将模型输出与实际业务或组织的后续步骤联系起来。
正如统计数据所显示的,这是整个行业的一个主要症结。为了帮助克服这一障碍,我们总结了多年来与客户合作的经验以及从 Plotly 社区听到的信息。它始终回到三个要点——如果你把这些做对了,你就能确保你的项目在每次开发时都有真正的商业影响。
首先,问正确的问题。这是一个典型的故事——另一个部门的一位同事带着一个数据集过来,他们问类似这样的问题:“我应该使用哪种图表类型?”那不是正确的方法。不要粗制滥造一些潜在无益的模型或图表,而是问问你的同事他们正在试图解决什么问题,理想的结果和目标是什么。理解你想问数据什么问题是关键。而且,成功项目的唯一途径是清楚地识别团队试图获得的知识,并从那里逆向工程出解决方案。
大多数团队已经转向 Python 或 R 作为他们在人工智能和数据科学计划中选择的语言,使用数据管理和机器学习(ML)模型构建的工具。这可能是最熟悉的领域,大多数团队都有自己选择的工具来完成这一步。这也是从模型到分析型 web 应用的第一步。
嗯,什么是分析型网络应用?将分析 web 应用程序视为模型和数据的前端。它明显不同于 BI 工具或仪表板,因为它使最终用户能够直接与模型和数据交互,而不需要理解代码。想象一下,给你的同事一个模型,他们可以通过交互式图形和 UI 控件进行研究,以执行自己的下游分析。
以分析应用为最终目标,第二步是构建合适的 UI 。一旦您充分理解了为什么一组特定的数据很重要,以及业务和组织合作伙伴希望对结果做些什么,您就可以专注于开发一个模型 UI,为您的分析提供最准确和最具探索性的视图。它更多的是关于开发和定制一种理解人工智能模型或数据集的方式,而不是呈现结果。随着您的受众需求的变化,让他们有机会接触数据。有许多工具可以帮助可视化数据,这些工具既美观又易于任何人理解和交互。找到一个对你和你的组织有用的,但是记住,你要的是交互式的,所以不要局限于静态的图表,这样其他人可以探索和试验。
第三步**,定义应用程序的操作结构**。通常情况下,模型、数据,甚至是交互式应用程序都可能会卡在某人机器上的笔记本中。这是大规模共享的主要障碍。解决方案(和挑战)是部署一个任何人都可以访问的独立应用程序——换句话说,释放数据。有效的解决方案考虑了供应、安全性、视觉设计/品牌和维护,允许用户通过将数据科学与实际业务结果相结合来真正实施关键项目。实现这个有很多方法,从耗时且昂贵的全栈开发团队,到帮助您自己完成这个任务的工具。同样,您需要找到适合您的部署流程。一旦你这样做了,你就成功地开发了一个端到端的过程。
现在是成为数据科学家的绝佳时机。社会几乎淹没在数据中,需要收集、整理、分析和操作的海量数据每天都呈指数级增长。最后一块——操作化数据和模型——是最重要的。在我们的工作中,我们必须确保我们不仅要展现洞察力,而且要以与业务和组织成功相关、易于理解、易于互动的方式来实现。
如何参加你的第一次 Kaggle 比赛
Arny Mogensen 在 Unsplash 上拍摄的照片
用 python 中的自然语言处理预测灾难微博
Kaggle 可能是最知名的机器学习竞赛网站。Kaggle 竞赛由网站上提供的数据集组成,其中包含一个要用机器、深度学习或其他数据科学技术解决的问题。一旦你开发出一个解决方案,你将把你的预测上传到网站上,根据你解决方案的成功,你将在竞赛排行榜上赢得一个位置,甚至可能获得现金奖励。
Kaggle 可以是一个磨练你的机器学习和数据科学技能的好地方,让你与他人进行比较,并学习新技术。在下面的文章中,我将提供一个如何第一次参加 Kaggle 比赛的演示。在本文中,我们将:
- 开发一个模型来预测一条推文是否是关于一场真正的灾难。
- 使用该模型对 Kaggle 提供的测试数据集进行预测。
- 第一次提交,就能登上 Kaggle 排行榜。
检测灾难微博
该网站上的最新比赛之一提供了一个数据集,其中包含推文以及一个标签,可以告诉我们它们是否真的是关于一场灾难。这项比赛有一个排行榜,有近 3000 个参赛项目,最高现金奖为 10,000 美元。数据和比赛大纲可以在这里查看。
如果您还没有 Kaggle 帐户,您可以在这里免费创建一个帐户。
如果您从竞赛页面选择“下载全部”,您将获得一个包含三个 CSV 文件的 zip 文件。
第一个包含一组用于训练目的的特征及其相应的目标标签。该数据集由以下属性组成:
- tweet 的数字标识符。当我们将预测上传到排行榜时,这将非常重要。
- 关键词:来自 tweet 的关键词,在某些情况下可能会丢失。
- 位置:发送推文的位置。这也可能不存在。
- 文本:推文的完整文本。
- 目标:这是我们试图预测的标签。如果推文确实是关于一场灾难,这将是 1,如果不是,这将是 0。
让我们阅读这些文件,并对它们有更多的了解。你会注意到在下面的代码中,我包含了一个set_option
命令。熊猫 set_options 允许你控制数据帧结果的显示格式。我在这里包含了这个命令,以确保显示文本列的全部内容,这使得我的结果和分析更容易查看。
import pandas as pd
pd.set_option('display.max_colwidth', -1)train_data = pd.read_csv('train.csv')
train_data.head()
第二个数据集仅包含特性,对于该数据集,我们将预测目标标签,并使用结果在排行榜上获得一席之地。
test_data = pd.read_csv('test.csv')
test_data.head()
第三个例子展示了我们的提交文件应该是什么样子。这个文件将包含来自test.csv
文件的 id 列和我们用模型预测的目标。一旦我们创建了此文件,我们将把它提交到网站,并在排行榜上获得一个位置。
sample_submission = pd.read_csv('sample_submission.csv')
sample_submission.head()
为机器学习准备数据
对于任何机器学习任务,在我们可以训练模型之前,我们必须执行一些数据清理和预处理。这在处理文本数据时尤其重要。
为了使我们的第一个模型简单,并且因为这些列中有很多缺失的数据,我们将放弃位置和关键字特征,只使用 tweet 中的实际文本进行训练。我们还将删除id
列,因为这对训练模型没有用。
train_data = train_data.drop(['keyword', 'location', 'id'], axis=1)
train_data.head()
我们的数据集现在看起来像这样。
文本,尤其是推文,通常会包含许多对机器学习算法来说不一定有意义的特殊字符。因此,我采取的第一个步骤是删除这些。我也把所有的单词都变成小写。
import redef clean_text(df, text_field):
df[text_field] = df[text_field].str.lower()
df[text_field] = df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem))
return dfdata_clean = clean_text(train_data, "text")data_clean.head()
另一个有用的文本清理过程是删除停用词。停用词是非常常用的词,通常没有什么意义。在英语中,这些词包括“the”、“it”和“as”等。如果我们将这些单词留在文本中,它们将产生大量噪声,这将使算法更难学习。
NLTK 是用于处理文本数据的 python 库和工具的集合,完整的文档可以在这里访问。除了处理工具之外,NLTK 还有大量的文本语料库和词汇资源,包括一个包含各种语言的所有停用词的语料库。我们将使用这个库从数据集中删除停用词。
NLTK 库可以通过 pip 安装。安装后,您需要导入库语料库,然后下载停用词文件。
import nltk.corpus
nltk.download('stopwords')
一旦这一步完成,你就可以读入停用词,并使用它从推文中删除它们。
from nltk.corpus import stopwords
stop = stopwords.words('english')data_clean['text'] = data_clean['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))data_clean.head()
数据预处理
清理后,数据需要进一步预处理,以准备在机器学习算法中使用。
所有机器学习算法都使用数学计算来映射特征中的模式,在我们的情况下是文本或单词,以及目标变量。因此,在可以训练机器学习模型之前,必须将文本转换成数字表示,以便可以执行这些计算。
这种类型的预处理有很多方法,但是在这个例子中,我将使用 scikit-learn 库中的两种方法。
这个过程的第一步是将数据分割成记号或单个单词,统计每个单词在文本中出现的频率,然后将这些计数表示为稀疏矩阵。计数矢量器函数实现了这一点。
下一步是对 CountVectoriser 产生的字数进行加权。应用这种加权的目的是按比例缩小文本中非常频繁出现的单词的影响,以便在模型训练期间,不太频繁出现并且可能更有信息的单词被认为是重要的。 TfidTransformer 可以执行此功能。
机器学习管道
让我们将所有这些预处理和模型拟合放在一个 scikit-learn 管道中,看看模型是如何执行的。对于第一次尝试,我使用线性支持向量机分类器(SGDClassifier ),因为这通常被认为是最好的文本分类算法之一。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(data_clean['text'],data_clean['target'],random_state = 0)from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifierpipeline_sgd = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('nb', SGDClassifier()),
])model = pipeline_sgd.fit(X_train, y_train)
让我们使用训练好的模型来预测我们保留的测试数据,看看模型的表现如何。
from sklearn.metrics import classification_reporty_predict = model.predict(X_test)
print(classification_report(y_test, y_predict))
对于第一次尝试,该模型表现相当好。
首次提交
现在让我们看看模型在竞争测试数据集上的表现以及我们在排行榜上的排名。
首先,我们需要清理测试文件中的文本,并使用模型进行预测。下面的代码获取测试数据的副本,并执行我们应用于训练数据的相同清理。输出显示在代码下方。
submission_test_clean = test_data.copy()
submission_test_clean = clean_text(submission_test_clean, "text")
submission_test_clean['text'] = submission_test_clean['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))
submission_test_clean = submission_test_clean['text']
submission_test_clean.head()
接下来,我们使用模型来创建预测。
submission_test_pred = model.predict(submission_test_clean)
为了创建一个提交,我们需要构建一个数据帧,只包含来自测试集的 id 和我们的预测。
id_col = test_data['id']
submission_df_1 = pd.DataFrame({
"id": id_col,
"target": submission_test_pred})
submission_df_1.head()
最后,我们将其保存为 CSV 文件。包含index=False
很重要,否则,索引将被保存在文件中的一列,您的提交将被拒绝。
submission_df_1.to_csv('submission_1.csv', index=False)
一旦我们有了 CSV 文件,我们可以返回到竞争页面,并选择提交预测按钮。这将打开一个表单,您可以在其中上传 CSV 文件。添加一些关于该方法的注释是一个好主意,这样您就有了以前提交的尝试的记录。
提交文件后,您将看到此屏幕。
现在我们已经成功提交了!
这个模型在排行榜上给我打了 0.78 分,排名 2371。显然有一些改进的空间,但现在我有一个未来提交的基准。
在这篇文章中,我概述了如何在 Kaggle 比赛中首次提交作品。在这一点上,你可以采取很多进一步的措施来改进。这包括更好地清理文本,不同的预处理方法,尝试其他机器学习算法,模型的超参数调整等等。
感谢阅读!
如何估算和降低机器学习产品的成本
一个简单的矩阵,用于确定您路线图上的下一个机器学习产品的成本。
深深困惑的产品经理。作者的插图。
动机
人工智能和机器学习产品出现在当今几乎任何公司的路线图上,并且趋势正在上升。但是很少有公司真正实现过十几个成功的产品。根据最近的一项研究, **65%投资于人工智能的公司**还没有看到任何商业回报。在同一项研究中,高成本被认为是一个主要障碍。因此,让我们看看如何通过一个简单的矩阵来降低人工智能产品的成本并加快开发速度。
让我们看看你的公司。想过为你的企业建立一个推荐引擎会有多贵吗?或者预测你的流量负荷?还是对你的客服话单进行分类系统?
今天那些种类的产品都涉及机器学习。它们都是由机器学习工程师或数据科学家构建的。它们都有很大的用处。然而,估计成本,尤其是如果您的公司只实施了不到一打这样的产品,可能会相当令人难以承受。
ML 产品矩阵
在 Ville Tuulos 的一次演讲中,我偶然发现了四个类别,这些类别描述了当今机器学习解决方案的四个主要成本类别。在我看来,要了解像推荐引擎这样的产品的成本,你只需回答两个问题:
- **问题 1(批处理或实时)😗*该产品是否需要处理接近实时的新数据,或者是否可以在批处理/少量时间流程中处理?
- **问题 2(延期成本)😗*如果这个产品坏了,不能用了怎么办?延迟可以吗?还是严重的钱丢了?
机器学习产品成本类别矩阵。
对于每个象限,您可能能够想到一个适合该象限的典型产品。如果没有,不要担心,让我们详细探索所有这些象限,以及每个象限的相关成本。这似乎是显而易见的,所以让我们探讨一下主要的成本驱动因素、商业价值、一些例子,然后看看如何降低要求更高的产品的成本。
象限一,“实时”&“严重金钱损失”
网飞推荐引擎,基于你刚才看到的。
这些产品无时无刻不在接受数据,无时无刻不在进行推断。如果它们发生故障,将会造成严重的经济损失,工作流程受阻,无法做出决策。典型的例子是网飞个性化引擎。正是它为你提供了上述观点,当然还有其他许多方面,使网飞如此令人愉快。
它每运行一秒钟,就将网飞最重要的指标每秒开始的新视频数量增加几个百分点。事实上,在网飞上观看的所有视频中,大约有 70%是由于某种形式的推荐。但结果是,这个系统每一秒钟都不是实时运行的,它实际上花费了大量的金钱。每一秒它都要摄取你刚刚看的东西,更新它的推理过程。
另一个例子是汽车购买者的价格预测&经销商,如德国的" wirkaufendeinauto.de "。
具有约束估计的价格估计使得实时推断和更新变得至关重要。
汽车市场的价格非常不稳定,每天都在变化。因此,如果他们的定价系统没有正确预测,他们确实会赔钱。
象限一,业务价值和成本
通常,这种机器学习产品的商业价值是通过通常的产品经理魔术来计算的:
“CTR x 转换 x 转换值”。
代价:实时推理&更新很难。这类产品通常有两个主要的成本驱动因素:
- 使得服务(一些 dockerized API)高度可用。这主要是软件工程方面的内容。
- 使推理过程以及基于数据的更新成为实时的。这是机器学习的一面。
**成本猜测:**这些解决方案需要小型到大型团队不断努力。
象限二,“批量”&“严重资金损失”
让我们考虑这样一种情况,当然,这种情况成本较低,也就是说,如果我们没有实时约束,但可以采用批处理模式。
典型例子:客户邮件分类&分拣系统。这种系统从发送到“info@wordpress.com”的 1000 封电子邮件中提取信息,并将其分类成“队列”,然后由更专业的客户人员根据主题进行处理。如果某样东西没有被正确分类,那么人类必须对它进行分类。此外,通常会产生上下文切换成本。
该象限中的其他产品是用于营销的客户分类,以及客户流失预测等。对于所有这些产品来说,以一个小时这样的固定时间间隔进行批处理、排序、分类和预测,每周或每月使用新数据进行一次更新通常都没问题。
象限二,业务价值和成本
同样,对于商业价值,你可以用一个公式来计算,比如“获得一个活跃客户的可能性 x 终身价值”或者“分类节省的时间 x 价值”等等。
费用:
- 推理的 SLA。
- 开发成本,通常被分摊到相对较少的迭代中。
**成本猜想:**一个团队的工作,几个星期到几个月。不需要持续的工作,调优过程将需要几次迭代,但不会更多。
象限三,“实时”,“成本低”
典型例子:这些产品通常是给决策者看的。它们不在关键流程中,但如果利用这些信息做出决策,它们会产生非常大的影响。因此,现金流预测、总体层面的“客户观点的主要驱动因素”分析或“客户流失预测”都是很好的例子。
象限三,业务价值和成本
商业价值通常体现在可以做出的决策中。这些决策通常很难定价,因此这里的目标是与高管密切沟通,让他经常可靠地使用这些决策。
成本动因:
- 开发时间,你将需要几次迭代来使它工作,这样它确实被经常使用。与其他象限相比,这实际上是流程的很大一部分,实际上是让一个原型出门。
- SLA 几乎没有成本,因为决策者是今天还是明天查看这些数字并不重要。
**费用猜想:**一人几周。
象限四,“批量”&“成本低”
典型例子:数据科学独角兽。这是一个 jupyter 笔记本的原型,一个经过训练和评估的分析。甚至可能是一个 excel 结果列表。这是数据科学家在处理大型产品之前通常会产生的东西。但是,即使是那些一次性的静态结果也可以部署到完整的产品中。
象限四,业务价值和成本
商业价值:要么是纯粹的原型制作,“这能行吗?”;或者是对我们认为未来不会改变的事情的一次性分析,比如“让我们猜测一下 2020 年客户流失的主要因素”。
费用猜想: 1-几周,一对多数据科学家。
所以我们的完整矩阵是这样的:
四象限,独角兽是最便宜的产品。
。成本链是这样的:
独角兽< real time & cost high < batch & serious money < real-time heavy load thing.
但这如何帮助我让我的机器学习产品更便宜?
神奇的是几乎任何你目前想到的产品,你都可以选择一个更便宜的,在第一次迭代中有大致相同的商业价值。当然不是在以后的迭代中,但这是要点。您总是可以使用第一次迭代来获得反馈和对业务价值的更好的估计。
**实时、高成本的产品:**比如前面提到的“ wirkaufendeinauto.de 的销售算法。这个想法是,当你把车开到一家“wirkaufendeinauto.de”店时,他们需要一个这辆车明天会卖多少钱的准确估计。那么,除了根据价格数据每分钟更新一次,他们还能做什么呢?
**让我们把它变成批量产品:**当然,他们可以每晚开始批量生产。这意味着不使用日内价格变化。但是,估计还是很不错的。为了减轻这些影响,并使解决方案更加稳健,他们可以简单地对所有价格应用 1–2%的折扣来说明这一事实。
**让我们进一步把它变成一批没有严重损失的产品:**所以这个解决方案仍然很贵,我们可以通过不同的方式把它变成一个更便宜的解决方案。这怎么可能呢?你可以雇佣真正的人来做价格估算(例如,通过浏览一些网站),让他们使用你的解决方案提供的“预计价格”,这个价格每天都会更新。这样,如果机器学习解决方案失败,人们仍然可以对汽车进行大致正确的定价,并且不会严重损失金钱。
**最后,让我们看看作为一只独角兽我们可以从什么开始:**当然,我们会先做一个非常粗略的猜测,然后交给做价格估算的人。他们可以使用“2020.01.01 的预计价格”,如果他们觉得有用,你将继续开发批处理过程。
使用同样的过程,你可以把几乎任何成熟的想法变成独角兽。
现在轮到你来打造你的机器学习产品了!
更多资源:
如何估算数据科学项目的数据收集成本
在在线市场的高进入壁垒和过时的 API 之间导航的技巧:在线租赁市场的案例研究
(注:所有观点均为本人)
介绍
数据收集是任何数据科学或分析项目的初始和基本步骤,从数据分析到模型部署,所有后续活动都依赖于数据收集。
随着 API 和云计算的普遍存在,我对最大化工作和个人项目数据收集活动的效率和自动化水平越来越感兴趣。
在后一个类别中,我一直对从英国市场的在线房屋租赁平台( Zoopla , RightMove , OnTheMarket 等)收集数据感兴趣,目的是提取图像和文本数据进行处理,以用于机器学习模型(例如预测房产价格、从图像数据中提取关键特征以推断房源的真实价值等用例)…)
在接下来的几行中,我将讨论如何着手:
- 最关键数据源的识别
- 如果您想将您的解决方案投入商业使用,数据收集成本的估算
我对这篇文章进行了更广泛的分析,它涉及到在围绕潜在商业目的的数据收集进行推理时要考虑的市场和监管问题,以及使用 API 的更多技术问题,因为我意识到在这个非常有趣的主题中有多个层面要讨论。
我希望以下要点将有助于您建立当前和未来数据科学项目的数据收集模块,无论您的行业重点是什么。
做你的市场调查,确定你的关键数据来源
在双边市场,如在线房屋租赁平台,由供需代理主导**(在供应方,房主希望直接或通过房地产代理出租;在需求方面,个人寻求租赁)**,你将在那些平台上找到数量和质量最多的数据,这些平台在给定的市场中驱动了大部分流量,来自供应和需求两方面。
从这个意义上来说,你需要确定哪些平台拥有最大的市场力量,因为它们吸引了最多的眼球。如果您希望在一段时间内获取大量数据,并且不希望集成来自较小市场参与者的多个数据流,那么了解市场整体流量/数据量的分布非常有用。
在英国的在线房屋租赁市场,大部分流量和房源分布在前 1-5 家公司之间,因此这些公司(下图中曲线的左侧)是您希望重点收集数据的公司。
帕累托原则。来源:Mode.com
这当然是一把双刃剑,因为在签订数据共享协议时,你将从中采购的大玩家拥有高杠杆,这允许他们:
1)充当特定市场的实际上的看门人,并制定自己的数据使用政策,尤其是在监管较少的市场情况下
2)签订数据共享协议时,每单位数据量多收费
3)有效监控初创公司对其核心业务的潜在竞争威胁,这些公司需要访问他们的数据,因此更加依赖他们的服务
与此同时,鉴于市场份额的不均衡分布以及缺乏反竞争监管,这是数据的真正价值所在,因此希望染指这些数据的有抱负的数据科学团队需要付出一定的代价来占领大部分市场并访问大量高质量的数据点。
注意:对于非商业或研究目的,您可能可以从这些网站上抓取数据(尽管这种活动在高频率和高容量的情况下并不总是受欢迎,这纯粹是出于实际考虑,我不鼓励在有政策禁止的网站上抓取网页,您最好遵守数据提供商的条款和条件)。
总是先寻找 API
一旦您确定了主要的数据源,您的第一个赌注就是浏览他们的开发人员资源并找出:
- 他们是否有一个活动的 API,您可以从中获取所需的数据
- 他们的总体数据共享条款和条件(T & Cs)是什么
例如,Zoopla 有一个 API 页面,可以用来返回一些特性和列表数据。Zoopla 的特定 API 已经有一段时间没有更新了,并且显然已经招致了之前在介质上记录的批评,但是这种类型的信息是你在比较不同数据源时想要寻找的。
当进入 RightMove 时,你会被引导到他们的官方网站上的数据服务页面。在撰写本文时,他们似乎没有或没有授权任何官方 API。OnTheMarket.com 似乎也没有任何空气污染指数。
检查主要参与者对于确定数据收集策略的下一步非常有用。如果您找到一个活动的 API 并决定:
- 数据量和质量是否足以满足您的应用
- 你是否违反了他们的 T & Cs
- 您是否想联系数据提供商(参见后续步骤)提交一份格式数据请求,以获得更多更丰富的数据集
- 是否转向市场中其他较小的参与者,这些参与者可能(通过他们自己的 API)给你足够的数据(其他聚合器,如 内斯特利亚 ,它们确实提供了一个)
无论如何,不要跳过这一步,因为它提供了非常有价值的信息,即使你没有立即得到你所需要的信息。
不要害怕与数据提供商联系,讨论潜在的数据共享协议
就我而言,我决定更深入一点,因此通过电子邮件和 LinkedIn,通过搜索分析职位和接触可行的潜在客户,初步接触了 RightMove & Zoopla。
我建议这样做,因为你总能在另一边找到对支持开发者感兴趣的人,并听到有趣的用例。你也可能发现以前在阅读各种文档时没有注意到的信息。
就我而言,我发现 RightMove 对他们的数据使用限制非常严格,因此我从他们那里真正得到的唯一东西就是冷淡。Zoopla 也是一样,它只是让我回到他们现有的 API,在用 Python 脚本简单测试后,我怀疑它的数据丰富性。
在这一点上,我决定在网上搜索,以确定已经利用了来自两个主要提供商之一的数据的应用程序和平台,并看看我是否可以提取更多信息,了解他们是如何做到这一点的,以及潜在的成本。
我本来也可以加倍下注 Zoopla & RightMove,决定提出一份数据共享协议,但作为一个个体,我在这样的对话中实际上能拥有多少筹码?
在您试图决定从哪里以及如何收集数据的类似情况下,我建议您:
- 花时间研究市场和各种数据提供商,给自己尽可能多的潜在数据源,这也将允许你比较他们的成本和你愿意分配给你的项目的预算
- 花时间与选择的几个供应商建立关系(如果他们不一定有明确的 API,比如在这种情况下),并从他们那里获取尽可能多的价格/其他信息,同时在计划使用他们的数据时也要非常透明(研究、商业、个人等)。)
利用在你之前收集数据的人的专业知识
在确定了您的主要数据源并检查了 API 及其使用潜力之后,您还需要接触其他正在利用这些数据源的市场参与者,看看您是否能发现更多的见解。
我发现这是一个不可思议的小步骤,可以获得一些关于数据收集成本的高质量上下文信息。
例如,我发现了一个很棒的网站, Property Data ,它引用了我正在寻找的相同的数据源,因此我立即使用他们的联系方式发送了一封电子邮件。
令我惊讶的是,这位创始人自己回复了,提到了一家提供商向 PropertyData 收取的费用,以获得他们需要的数据,并确认他们无法说服另一家提供商发送他们的数据,无论提出的价格是多少,从而证实了我之前通过电子邮件/LinkedIn 联系他们大多数人时的负面体验。
-(以下是我从 PropertyData 获得的电子邮件回复的摘录,出于保密原因,在可能的情况下进行了删节)-
“我们每月支付源 1 XX。那使我们得到了我们所需要的东西!
来源 2,再多的钱也不能让他们感兴趣!
属性数据"
这是很好的信息,因为:
- 在没有任何 API 或价格点的情况下,它为您提供了一个实际的估计金额,从中可以推断出类似提供商的数据收集成本。
- 利用他人的经验作为指南针,进一步指出哪些数据源更适合使用,哪些应该完全避免使用。
我总是建议花些时间去接触那些曾经做过的人,然后问一下,你可能会得到积极的、令人惊讶的、有益的回应!
运行您的估计并检查财务和技术可行性
至此,您应该已经收集了计算每月数据收集运行成本所需的所有信息,可以通过以下方式进行估算:
**(数据源数量平均值。***API/数据协议的月订阅费用
为此,您可能希望考虑任何 云计算资源,这将取决于您的数据收集脚本和处理资源量(时间、数据大小驱动),您将利用这些资源将您的数据放入您的数据湖/数据仓库,以供以后处理和分析。
除了单纯的数字之外,此时你还应该对给定项目设置的方法的整体技术可行性有所了解,以及继续进行或完全改变你的数据收集策略是否有意义。
概括起来
拥有一套完善的数据收集方法和途径确实可以让您的数据科学项目以最佳方式启动和运行,同时根据您的市场领域知识和可用的数据提供商,以尽可能好的价格获得尽可能好的数据。
如果可以:
- 进行扎实的市场调查,确定最优质的来源
- 彻底检查现有的 API 及其(通常)丰富的文档
- 此外,联系数据提供商,解决潜在的数据请求,以及他们是否愿意为您提供帮助
- 通过询问在你之前有权访问数据的人和公司,进一步扩大你的知识库
- 对你实际将要花费多少时间和金钱来获取你需要的所有数据进行一个合理的估计
您可以大大增加开发可靠的数据收集方法的机会,并以有效的方式最大化获得大量数据的机会。感谢阅读!
访问我的免费数据科学资源清单 这里
[## 通过我的推荐链接加入 Medium-Edoardo Romani
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
edo-romani1.medium.com](https://edo-romani1.medium.com/membership)
使用 Bootstrap 策略估计中位数的标准误差
弗兰基·查马基在 Unsplash 上拍摄的照片
通过替换抽样得到经验分布
在这篇文章中,我将讨论我们可以用来估计中位数的标准误差的方法。我将首先说明一些定义,并讨论我们如何估计均值的标准误差。然后我会讨论如何用 bootstrap 策略估计介质的标准差。
标准误差是多少?
根据维基百科,统计数据的标准误差是其抽样分布的标准偏差或该标准偏差的估计值。在继续之前,这句话中有几个概念需要澄清:
首先,统计是参数的抽样估计。例如,样本均值 x_bar 是一个统计量,而总体均值是一个参数。因为通常是未知的,我们需要一个统计来估计它。x_bar 被认为是的无偏估计。
第二,标准差是离差的度量,是方差的平方根。它通常代表你估计的置信度,用于置信区间、假设检验等。
最后,抽样分布是来自随机样本的统计的概率分布。我们举个例子。假设我们正在估算美国大学毕业生的平均收入。人口是所有大学毕业生的收入。收集所有毕业生的数据并估计他们的收入几乎是不可能的。这就是为什么我们从总体中抽取有代表性的样本,并计算样本均值来估计总体均值。
平均值的标准误差(SEM)是多少?
由于有了 中心极限理论 ,估算平均值的标准误差变得简单明了。该理论指出,无论总体的分布是什么,随着样本量的增加,样本均值的抽样分布接近正态分布。此外,正态分布的均值等于总体均值,标准差等于总体标准差除以样本大小 n 的平方根。因此,如果总体标准差未知,则均值的标准差等于样本标准差除以样本大小 n 的平方根。给定任何随机分布,我们将很容易估计 SEM。
如何估计中位数的标准差?
不幸的是,中心极限理论不适用于中位数,因此我们需要其他方法来估计中位数的标准误差,只给定一个样本。这就是自举策略派上用场的时候。
引导程序正在使用替换进行采样。如果有样本:
我们可以从这个样本中取 n 个项目 替换 。在这里,我们将生成一个新的样本,它可以是:
样本大小等于 n。使用 bootstrap 策略估计标准误差的步骤如下:
1、从给定样本中取 n 项作为新样本:
从这个样本中,我们可以很容易地计算出样本的中位数:
2,对 B 轮重复前面的过程,我们将获得 B 个新样本,具有 B 个样本中值:
3,现在我们已经得到了中位数的经验分布,因此我们可以从中估计中位数的标准误差:
(1)计算前一个中位数样本的平均值:
(2)计算变化量:
(2)计算标准差,即经验样本的标准差:
为什么 bootstrap 在工作?
bootstrap 有效的原因是 bootstrap 使用经验分布函数(EDF)来估计人口的 CDF。样本的统计量是从总体中随机抽取的样本的函数。因此,它的分布将取决于人口的 CDF 和样本大小。虽然总体的 CDF 通常是未知的,但是我们可以使用 EDF 来估计它,从而得到样本的统计分布。我们可以在这里找到详细的数学解释,以及其他一些限制。
希望这有所帮助!感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
我快乐的地方
zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
zzhu17.medium.com](https://zzhu17.medium.com/membership)
如何评价一个分类机器学习模型
准确度、精密度、ROC/AUC 和逻辑损失介绍
众所周知,机器学习模型的评估至关重要。它是衡量模型在准确度、精确度、召回率、性能等方面的有效性的过程。
在我以前的一篇文章中:
学术研究中的机器学习 v . s . Practical
https://towardsdatascience . com/machine-Learning-in-Academic-Research-v-s-Practical-5e7b 3642 fc 06
我提出以下阶段是典型的工业机器学习项目:
如上图所示,选择合适的评估指标是问题建模阶段的第一步,也是关键的一步。
由于我们需要选择合适的指标来评估机器学习模型,因此在为模型选择评估指标时,输出值类型是您需要考虑的最重要的因素。即,输出值是否
- 离散分类
- 连续值,或
- 等级
在本文中,我将介绍离散分类机器学习模型的三种最常用的评估指标。
精确度和召回率
布尔输出中通常使用精度和召回率。在我们能够很好地定义这两个概念之前,我们先来看看著名的“混淆矩阵”:
图片提供:https://towards data science . com/understanding-confusion-matrix-a9ad 42 dcfd 62
在上面的混淆矩阵中,
- TP(真阳性)表示实际结果和预测结果都是真的
- FP(假阳性)表示实际结果应该是假的,但是预测结果是真的,所以这是一个错误
- TN(真阴性)表示实际和预测结果都是假的
- FN(假阴性)表示实际结果应该为真,但预测结果为假
因此,很容易推导出:
精确度和召回率的定义
然后,我们可以将我们的精度§和召回率®定义如下:
理想情况下,这两个指标应尽可能高,以获得更好的性能。然而,大多数时候,这两者是相反的。也就是说,当你试图提高精度时,会导致更差的召回率,反之亦然。
这里举个极端的例子。假设你正在使用一个搜索引擎通过一些关键字搜索网页。如果搜索引擎只返回一个最相关的网页,我们认为准确率为 100%。然而,召回率将会非常低,因为将会有相当数量的网页是相关的(肯定的)但是被忽略了(假否定,FN)。让我们回到回忆的定义,TP 只有 1,但是 FN 非常大,所以分母非常大而提名者非常小。
另一方面,如果搜索引擎返回所有的网页(假设我们这里不做“检索”,简单地返回互联网上的所有网页),召回率将是 100%,但精度将接近 0%。这是因为假阳性(FP)非常大。
因此,大多数时候,我们需要平衡这两个指标。在不同的场景中,我们可能会尝试改进其中任何一个,并在另一个上进行一些权衡。
平均精确度分数
有时我们可能会使用“平均精度分数”(AP)来衡量一个模型。
图片提供:https://stats . stack exchange . com/questions/345204/iso-f1-curve-for-precision-recall-curve
如图所示,我们使用 x 轴表示召回率,y 轴表示精确度。曲线产生了一个以蓝色显示的区域。通常,我们可以为所有模型生成这样的 AP 得分曲线,模型产生的大小越大,表明模型的性能越好。
然而,AP 也有一些缺点。例如,这种方法使用起来不太方便,因为我们需要计算曲线下的面积。因此,我们通常使用下面将要介绍的其他指标。
从精确度和召回率得出的其他指标
其中最常用的可能是 F 值。F1 的定义如下,它认为精度和召回率对模型同样重要。
在实践中,我们可能希望为精确度和召回率增加不同的权重。例如,如果我们认为回忆比精确重要𝛼倍,我们可以使用下面的等式来计算 F-measure。
此外,我们还可以测量准确率和错误率:
在科学和工程方面,准确度和精确度通常是指不同的概念。在本文中,我不会在这里详细讨论这一点,因为这不是重点。基本上,最显著的区别是精度是指布尔输出(真或假),而精度可以应用于多个分类,例如:
在上面的公式中,
n
是样本空间中的分类数P
是计算具体分类精度的函数,可以独立定义
ROC 和 AUC
在实践中,有时我们可能不输出布尔值,而是输出一个概率。例如,患者有 99.3%的概率患有特定疾病。在这种情况下,如果我们坚持使用精度和召回,我们将不得不定义一个阈值。如果我们将 0.8 定义为阈值,那么每个大于 0.8 的预测都将被认为是正确的。那么,如果实际结果也是真的,这个预测就是真的正。
这有点不方便也不合适,因为门槛会
- 显著影响模型的评估
- 涉及另一个人为参数
- 降低模型在更一般问题中的性能
接收机工作特性
在这种情况下,ROC(接收器工作特性)曲线将更有效,因为它不需要这样的阈值。
在 ROC 曲线中,x 轴是假阳性率(FPR),y 轴是真阳性率(TPR),计算如下:
ROC 曲线如下所示:
图片提供:https://towardsdatascience . com/understanding-AUC-roc-curve-68b 2303 cc9 C5
如图所示,ROC 曲线越靠近左上角,该模型的性能越好。当左上角点的坐标为(0,1),即 TPR=1,FPR=0 时,我们可以根据它们的公式推导出 FN 和 FP 都等于 0。因此,理想的情况是所有的测试样本都被正确分类。
ROC 曲线下面积
上图中还显示了 AUC(ROC 曲线下面积),其仅用作在不同模型之间进行比较以评估其性能的单一值。
ROC 曲线下面积的计算方法如其定义:
因此,AUC 是一个用于衡量多个模型表现的数字。
物流损失
逻辑损失(logloss)是分类问题中常用的另一种评估方法。基本思想是试图测量预测值(概率)和实际值之间的相似性的可能性。logloss 的原始形式是:
在我们的例子中,我们希望使用 logloss 函数来“最大化”预测值的分布与测试数据集中的原始分布相同的概率。假设我们的模型预测一个布尔输出,logloss 将如下:
在哪里
N
是样本的数量y
∈{0,1}
,原始数据集中第 I 个值的真或假p
是预测输出等于 1 的第 I 个样本的概率
Logloss 也可用于多类别分类问题,如下所示:
在这个等式中,C
是类别的数量。
总结和提示
照片由 Aaron Burden 在 Unsplash 上拍摄
到目前为止,我们已经介绍了三种不同类型的评估指标,它们特别适用于分类机器学习模型:
- 精确度和召回率(平均精确度分数)
- ROC 和 AUC
- 逻辑损失函数
本文旨在介绍这些评估指标,而不是对它们进行比较,因为这可能会以期刊论文告终。但是,如果您希望知道如何在这三个指标中为您的分类模型选择一个合适的指标,我可以提供如下粗略的指导。
- 如果您正在处理类别极度不平衡的多分类问题,即某些类别的样本数量明显多于其他类别,您可以使用平均精度分数。
- 如果你认为你的预测等级或误差范围比预测产生多少误差更重要,你可能需要使用 ROC 和 AUC。
- 如果您确实关心预测的误差大小,而不是其分布,则应该使用逻辑损失来提高模型的误差敏感度。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
如何评估数据科学候选人
意见
我与许多环境中的大量数据科学家合作过。一些人参加黑客马拉松、数据马拉松、Kaggle 竞赛、“为了好玩”的项目,以及作为多家公司的数据科学顾问。我也不得不申请我应得的工作。我认为评估数据科学家的最佳方法是应对基本的 python 挑战,我将在下面讨论这个案例。
一系列问题/挑战
考虑你的问题中的能力水平,你希望为你的候选人提出问题/挑战,淘汰最差的候选人,而不要有一个占用你或候选人大量时间来管理或评估的问题。
这里有一个选择难度的问题。如果你挑的东西太容易,所有人都会通过。还有拒绝合格申请人的额外风险。考虑下面我收到的问题:
在公司愿意让我进入下一轮之前,我必须回答这个问题和其他 99 个类似难度的问题。作为一名申请人,这告诉我 1)我们认为你没有能力掌握小学水平的数学 2)我们不太珍惜你的时间 3)我们不研究有趣或有挑战性的问题。最终,这个过滤器的问题是,你可能没有去掉很多不合格的人,你可能已经失去了对你最好的人才的兴趣。
现在,如果你选的东西太难,要么没人通过,要么你就要冒风险去问一个只有少数人有经验的特定问题。作为一名数据科学家,有太多的东西需要学习,如果你问一个关于数据科学中某个较窄领域的问题,不要认为这意味着他们精通所有领域,而其他候选人不擅长。如果你希望这个职位必须经常处理特定的技能/工具,那么有合适的问题/挑战是可以的,但是我建议确保工作描述(甚至可能是头衔)反映了对该技能/工具的需求。最后,如果你正在挑选一个非常难的问题,你可能没有能力给予部分信任。对你的问题给予部分肯定是有好处的,因为如果你真正想要的人接受了另一份工作,你就能知道谁是你的下一个最佳候选人。有了一个更简单的挑战,你就不必担心找到一个独特的问题,提供部分信用,并可用于许多申请人。
那么,为什么选择 Python 呢?
数据科学家的工作非常广泛。在一家公司,这可能意味着你正在制作可视化/仪表板,在另一家公司,你可能是制作模型的机器学习专家,而在另一家公司,你可能是恰好擅长将 ML 投入生产的软件工程师。但是,我相信不管是什么工作,python 都将是你的面包和黄油。我在上面说过,数据科学有许多子领域需要学习,不要用任何一个领域来代表其他领域的技能。我建议你使用 python 作为衡量标准,这似乎违反了这个规则,但我觉得不管申请人过去的经验如何,python 都是一个必不可少的工具,因此是最好的晴雨表。
当我在大学三年级申请第二次实习时,我面临一个现场编码挑战,基本上是说“给定一个数字数组,返回数组中每个数字的频率。”下面的例子。
input_array = [3, 6, 8, 2, 4, 8, 3, 1, 8, 9, 7, 0, 5, 5, 1]expected_output = {"0": 1, "1": 2, "2": 1, "3": 2, "4": 1, "5": 2, "6": 1, "7": 1, "8": 3, "9": 1}
我在不到 2 分钟的时间内成功完成了挑战,离开时感到有些失望,因为这不是一点点困难,所以我没有机会区分自己和我的能力。我确实得到并接受了那份实习工作,所以几个月后我问面试官:“为什么我被选中了?我觉得每个人都一定答对了这个问题。”令我惊讶的是,我被告知,在大约 50 名接受挑战的人中,只有 5 人答对了,而且只有我反应很快。令我惊讶的是,其他一些实习生候选人是博士生或计算机科学专业的学生。但我认为这个例子的目的是消除那些不能完成基本数据科学任务的人,而不会给申请人或面试官带来麻烦。
现在,我可能有偏见,因为我通过了那次面试,但其他人失败了,但我发现在数据科学项目中成功的限制因素通常是基本的编程能力。如果有人说他们在深度学习方面有经验,但他们不能从 JSON 对象中正确解析他们需要的数据,我并不特别在意。在任何项目的生产化过程中,良好的编程技能都非常适合您。
Python 提问
更具体地说,我认为你应该问的问题类型是 leetcode 类型的问题。如果你正在雇佣一个数据科学家,我不认为你应该期望他们也是一个精英软件工程师,记住我们实际上是试图快速检查最低能力。所以我不建议去解决最难的问题,我认为过滤掉简单的问题可能是最好的。从那时起,我可能甚至不关心解决方案的效率或时间复杂性,也许让这成为候选人之间的平局决胜。
如何评价机器学习模型在 Python 中的性能
机器学习,数据科学
一种实用的方法来计算模型的性能,并在 Python 中实现,涵盖了所有的数学推理
雪莉·胡利在 Unsplash 上的照片
欢迎光临!您是否准备好了在数百万个数据点上训练的酷机器学习模型,现在您想测试它的性能,但不知道从哪里开始,也不知道有什么更好的方法可以做到这一点?
在本文中,我们将讨论测试模型性能所需的一切,无论是分类模型还是回归模型,在本文中,我们将深入了解机器学习模型的评估过程,这对于机器学习工程师或数据科学家来说确实是非常关键的一步。
所以让我们开始吧!
分类算法评估
让我们从理解如何评估一个分类算法开始。分类模型将输出预测为类别标签。假设有一个随机变量’ xᵢ ‘,那么 xᵢ 的预测值为’ yᵢ ',标注为:
yᵢ∈{一班,二班,三班,…}
下面是一些非常有用的方法来衡量分类模型的性能。在我们下面的研究中,为了便于理解这个概念,我们将主要处理二元分类,这可以很容易地扩展到多类分类。
准确(性)
准确度告诉我们正确分类的数据点相对于总数据点的数量。顾名思义,准确性是指预测值与目标值的接近程度。
准确度=正确分类点数/总点数
但是由于假设的简单性,准确性并不总是模型评估的好方法。让我们看看这两个例子,在这两个例子中,精确度不是一个好的衡量标准。
- 不平衡数据:在现实世界的大多数问题中,类数据并不是均匀分布的,我们有一些高频率的类和一些低频率的类。例如,以癌症患者为例,假设 90%的数据是没有患癌症的人,而 10%的人被诊断患有癌症。因此,在这种情况下,即使是未经训练的基于规则的模型也可以预测所有的点为负面,并且可以达到 90%的准确性,这在许多情况下是非常危险的。这个问题可以通过使用本文后面部分讨论的 ROC-AUC 来解决。
- 概率估计:与其他测量不同,准确性不理解来自模型的概率值,而是只考虑二进制值。因此,对概率值分别为 97%和 3%的正值和负值进行分类的模型与另一个概率值为 62%和 38%的模型具有相同的精度,但我们知道第一个模型比第二个模型好得多,这里精度无法评估这一点。使用本文后面部分讨论的日志损失可以很容易地识别出这一点。
混淆矩阵
混淆矩阵是机器学习中许多评价方法的核心基础方法之一。混淆矩阵是分类模型的一个“ n 维矩阵,它在 x 轴上标注实际值,在 y 轴上标注预测值。
通常对于二元分类器,混淆矩阵是一个 2x2 维矩阵,其中 0 为负类, 1 为正类。
对于一个好的模型,混淆矩阵的主对角线元素应该是高值,非对角线元素应该是低值。
混淆矩阵中的每个单元对于理解模型的性能都起着非常重要的作用。 TN 、 FN 、 FP 、 TP 是根据每个单元格在该单元格中的实际值和预测值给每个单元格起的名字。让我们一个一个地理解它们,然后我们会从它们身上发现一些惊人的联系。
图 1:二元分类器的混淆矩阵。
TN =真阴性(实际为阴性且被模型正确分类为阴性类别的数据)。
FN =假阴性(实际为阳性但被模型错误分类为阴性的数据)。
FP =假阳性(实际为阴性但被模型错误分类为阳性的数据)。
TP =真阳性(实际为阳性且被模型正确分类为阳性类别的数据)。
如何记住它们?
有一个简单的方法来记住它们,的第一个字母回答了问题“我们是正确的吗?和第二个字母讲述的是预测值。
这些符号之间有一些惊人的关系,对我们的评估非常有用。在此之前,让我们看看什么是实际正和实际负值。
图 2:混淆矩阵中的负值和正值
阳性§ :假阴性值和真阳性值之和就是数据中实际的一组正值。P = FN+TP
Negative (N) :真负值和假正值之和就是数据中实际的一组正值。 N = TN+FP
现在我们知道了单元符号和正负符号,有 4 个重要的测量值是使用这些符号计算的,它们对于模型性能估计非常有用。它们如下:
- 真阳性率(TPR) :真阳性/总阳性= TP/P
- 真阴性率(TNR) :真阴性/总阴性= TN/N
- 假阳性率(FPR) :假阳性/总阴性= FP/N
- 假阴性率:假阴性/总阳性= FN/P
它们听起来有点令人困惑,但当我们查看困惑矩阵,并形象地找到这些关系时,它们就开始给出某种意义了。
对于一个执行良好的车型***【TPR 和 TNR 应该是高值】***【FPR 和 FNR 应该是低值】 。
TPR⬆、TNR⬆、FPR⬇、FNR⬇
精确度和召回率
精确度和召回率主要用于信息检索的情况。对于二进制分类问题,这两个度量主要集中在正类上。对,正课。现在,让我们来看看关于图 3 中的混淆矩阵的精确度和召回率的公式。我们可以清楚地看到,精确度和召回率的全部焦点都在混淆矩阵的真阳性单元上,它们与真阴性无关。
图 3:使用混淆矩阵的精确和回忆理解
精度:在所有模型预测为正的点中,有多少是真的正。
精度= TP / (TP+FP)
回忆:在所有实际上积极的点中,有多少是模型预测为积极的。
回忆= TPR = TP / P = TP / (TP+FN)
Precision 和 Recall 两个值都在[0,1]的范围内,我们总是希望这两个值尽可能的高**。有时,将两个不同的值结合起来比单独分析它们更好,因此为了将它们结合起来,我们有一个名为 F1-score 的指标,即 “精确度和召回率的调和平均值”。**
f1-得分= 2 精度召回/(精度+召回)
在 Kaggle.com的一些比赛中,F1 分数有时被用作模型评估的指标,但用简单的英语理解有点困难,而精确度和召回率则更容易解释。
让我们在 Python 3.x 中实现它。下面是使用混淆矩阵的模型评估的手动实现。
下面是上述代码实现的示例输出。
使用混淆矩阵的评估输出示例
ROC 曲线和 AUC
接收机工作特性曲线 或 ROC 是 TPR 对 FPR 的曲线图,形成一条曲线,代表不同阈值的 TPR 和 FPR 值“ 𝜏 ”。AUC 是曲线下的面积。它们有时合在一起称为 AUROC(受试者工作特性下的面积)曲线。****
图 4:来源:接收机工作特性曲线维基百科
给定一个阈值参数 𝜏 ,如果 X > 𝜏 该实例被归类为 正类 ,如果 X < =𝜏 则归类为 负类 。如果实例实际上属于,则 x 遵循概率密度 f1(x) ,如果实例属于负类,则遵循概率密度 f0(x) 。因此,真实阳性率由下式给出:**
使用 ROC 的 TPR
假阳性率由下式给出:
FPR 使用 ROC
ROC 曲线参数化地绘制了 TPR(𝜏)对fpr(𝜏,阈值 𝜏 作为曲线上的变化参数,给出了类似于图 4 接收器工作特性曲线所示的形状。
**AUC 是曲线下的面积。 AUC 位于【0,1】范围内。0.5的值表示模型的性能是随机的。在[0.5,1]范围内的 AUC 值表明模型表现良好,而在[0,0.5]范围内的 AUC 值表明模型表现不佳。
“AUC 值越高,模型表现越好。”
AUC 值低于 0.5 怎么处理?
当 AUC 在[0,0.5]范围内时,有一个非常简单的技巧来处理模型性能。绝招::简单切换模型预测的类别标签。“是的,假设我们得到的 AUC 为 0.32,那么在将类别标签从 0 切换到 1 和从 1 切换到 0 之后,我们得到的 AUC 值为 1–0.32 =0.68,这使它成为一个好模型。就这么简单!
使用对数损失计算概率分数!
Log-Loss 用于发现二元分类算法的模型性能,该算法可以容易地扩展到多类分类。它考虑由机器学习模型预测的所有概率分数,并使用下面图 5 中的公式计算相对于’ yᵢ ‘的真实值和预测值’ p(yᵢ) '的损失。
图 5:测井损失计算公式
**理解这个公式很简单,对于每个 yᵢ=1 ,值**log(p(yᵢ)】被加到损失上,而对于每个 yᵢ=0 值log(1-p(yᵢ)】被加到损失上,然后通过将计算的总和除以 N (数据点的数量)来计算平均值。
简单地说,对数损失是平均负对数(正确分类标签的概率)
简而言之,我们可以说,当’【p(yᵢ】)‘较低时,这意味着模型预测’'的值更不确定,那么对它的惩罚就更多,对数损失也更多,反之亦然。
预测概率⬇对数损失⬆
预测概率⬆对数损失⬇
查看下图 6,了解预测概率和测井曲线损失之间的反比关系。
图 6:与预测概率相关的测井曲线的来源图像
- 因此,我们需要 Log-Loss 尽可能小才能说我们的模型表现良好。
- 对数损耗可以在【0,INF】的范围内,如图 6 所示。
也就是说,现在让我们看看如何实现日志丢失。下面是 Python3 中的代码实现。
但是 Scikit-learn 提供了一行输入来计算日志损失,
使用 Log-Loss 的一个缺点是有点难以解释,因为我们不能仅仅通过看到 Log-Loss 的一些值来说什么。这是因为对数损耗并不限定输出值的范围,而是从 0 到无穷大。例如,如果我们得到一个 Log-Loss = 12 的值,那么仅仅通过看到这个值,我们不能说什么。
回归算法评估
分类和回归算法的区别在于分类的输出属于一个类,而回归算法的输出属于实数,如 yᵢ ∈ ℝ 。
设 yᵢ 是输入 xᵢ 的实值输出,而 ŷᵢ (y-hat)是回归算法的预测实值输出。因此,误差 eᵢ 计算如下:
eᵢ=yᵢ—ŷᵢ
因此,让我们看看用于回归模型性能测量的各种类型的模型评估技术。
r 或决定系数
先来了解一下平方和 ( SS )是一个随机变量’ xᵢ ‘的’ yᵢ ‘的方差值之和。这里’ ȳ ‘(y-bar)是所有’ yᵢ '的值的的意思**。******
平方和ₜₒₜₐₗ=σ(yᵢ+ȳ)****
简单来说,平方和( SS- total )是其真实值相对于其平均值的误差平方和。
而且,
平方和ᵣₑₛ=σ(yᵢ+ŷᵢ)
平方和( SS- residue )是其真实值相对于其预测值的误差平方和。****
所以,R 被定义为,
R = 1 - (SSᵣₑₛ / SSₜₒₜₐₗ)
让我们考虑几个案例,基于这些案例,当我们看到 R 值时,我们可以获得关于模型性能的一些直觉。
- 如果误差 e =σ(yᵢ+ŷᵢ)为 0 那么,r 为 1 ( 为最佳值)。
- 如果 SSᵣₑₛ < SSₜₒₜₐₗ then R² lied between 0 和 1 (一般接受)。
- 如果 SSᵣₑₛ = SSₜₒₜₐₗ,那么 r 就变成了 0 (性能不好)。
- 如果 SSᵣₑₛ > SSₜₒₜₐₗ,那么 r 变成负的值(最差性能)。
让我们看看 Python3 中 R 的实现
https://gist . github . com/paras 009/b 46 ded 4 f1 ea 24 ab 48508623 f 6024294 b
Scikit-Learn 为 compute R 提供了一个单行导入。
https://gist . github . com/paras 009/229 ad 9 ba 3a 7595 b 26 ba 8 bfb 7 e 179 c 379
需要注意的重要一点是,R 在某些情况下表现不佳:
有异常值的数据 : 如果数据中有一些异常值,那么 R 不是计算回归模型性能的一个很好的方法,误差值会立即增加,并反过来严重影响 R 值。因此,在这种情况下,我们将使用下一节讨论的中值绝对偏差的概念。****
中位数绝对偏差
由于异常值对误差“ eᵢ ”有很大影响,因此 MAD 通过计算所有误差值的中值并计算它们与每个误差值的绝对偏差来解决这个问题,这有助于计算 MAD 值,从而消除异常值对误差值的影响。
MAD =中位数(|eᵢ—中位数( eᵢ )|)
中位数和 MAD 对异常值稳健。中值和 MAD 的较小值表明该模型表现非常好。请记住,我们可以使用均值或标准差,但它们不能处理异常值,而 MAD 对异常值没有显著影响。
注:绘制误差分布图有助于理解异常值以及误差值是如何传播的。分布“右偏越多,模型表现越好。这意味着大多数点的误差较低,只有极少数点的误差值较高,这些误差值并不显著,可以使用 MAD 进行归一化。****
概率与误差图
所以,就这样,我们到了这篇文章的结尾。现在,你可以放心大胆地评估你的模型了!
来源:https://media.giphy.com/media/5nkIn9AEfUQ6JtXL43/source.gif
参考
- https://en . Wikipedia . org/wiki/Evaluation _ of _ binary _ classifiers
- https://en.wikipedia.org/wiki/Confusion_matrix
- https://en . Wikipedia . org/wiki/Receiver _ operating _ character istic
- https://en . Wikipedia . org/wiki/Loss _ functions _ for _ class ification
- https://en.wikipedia.org/wiki/Coefficient_of_determination
- https://en.wikipedia.org/wiki/Median_absolute_deviation
更多关于机器学习的文章:
KNN 算法背后的科学解释!
towardsdatascience.com](/k-nearest-neighbour-explained-part-1-5e5e9192050) [## Q-Q 图解释
探索 Q-Q 图的力量。
medium.com](https://medium.com/@pv009/q-q-plots-explained-5aa8495426c0) [## “正态分布”的功效
理解钟形曲线背后的科学!
medium.com](https://medium.com/@pv009/the-powers-of-normal-distribution-4cbb06e4a955)
还有更多在 Paras Varshney 的。
如果你从这篇文章中学到了新的东西或者喜欢阅读它,那么就分享出来,让其他人也能感受到。欢迎给我留言。
谢谢!******
如何评价文本生成模型?自然语言处理模型自动评估的度量
实践教程
文本生成是一个棘手的领域。学术界和工业界仍在为评估生成模型质量的相关指标而努力。每一个生成任务都是不同的,都有自己的微妙之处和独特之处——对话系统有不同于总结的目标指标,机器翻译也是如此。
我将讨论 NLP 中用于比较生成性或提取性任务的度量,其中要比较两个文本。我将在此讨论的指标可应用于以下任务:
- 短格式或长格式文本生成
- 机器翻译
- 总结
- 聊天机器人和对话系统
- 问题回答
- 释义系统
- 多媒体系统,如语音 2 文本、图像字幕、自动视频配音
首先,让我们来谈谈这篇文章中的一些常用术语。在 NLG,为了检查评估,机器生成的文本通常根据目标文本(真值)进行评估。这个 目标文本 是期望模型理想生成的文本。 生成文本 指机器产生的文本(模型的输出),而 目标或参考文本 指原始真值文本。其他一些基本术语是 n-gram 和单词建模包,它们是基本的 NLP 概念/术语。如果你还不知道他们,你可以在网上了解更多。我还展示了用 python 计算这些指标的代码片段。
BLEU:双语评估替角分数
BLEU 和 Rouge 是最流行的评估指标,用于比较 NLG 领域的模型。每一份 NLG 的报纸肯定都会报道标准数据集上的这些指标,永远如此。BLEU 是一个专注于精度的指标,它计算参考文本和生成文本的 n 元语法重叠。这种 n 元语法重叠意味着除了 n 元语法的术语关联之外,评估方案是独立于单词位置的。在 BLEU 中需要注意的一点是——有一个简短的惩罚,即当生成的文本与目标文本相比太小时应用的惩罚。
下面是使用 python 的 ntlk 库计算 BLEU 的代码片段。
胭脂:回忆导向的吉斯丁评价替角
如前所述,Rouge 是另一个被广泛报道的指标。报告标准任务的 Rouge 和 BLEU 分数是一种非常常见的做法。它非常类似于 BLEU 的定义,不同之处在于 胭脂是回忆聚焦的,而 BLEU 是精确聚焦的 。有 3 种类型的胭脂:n-胭脂,最常见的胭脂类型,这意味着 n-gram 重叠。例如(2-胭脂,1-胭脂分别代表 2 克和 1 克)。第二个是 l-rouge,它检查最长的公共子序列,而不是 n-gram 重叠。第三个是以跳克为主的 s-rouge。这些的标准实现可以在大多数 ML 库中找到,n-rouge 是最常用的。下面是 n-rouge 的原始源代码。
困惑
困惑是一种常用于评估生成模型有效性的度量,它被用作由数据集上训练的模型产生句子的概率的度量。在信息论中,困惑是指概率分布对样本进行预测或分配概率的能力。困惑值越低,模型越好。困惑是根据句子的长度来标准化的。
这里 T 是句子中的总字数。
对于语言模型,我们最终想要检查测试集上的困惑值,并选择这个度量具有最低值的模型。这意味着—选择分配高概率的概率模型来建模/生成测试集语句。
如果模型是完全哑的(最坏的可能),困惑= |v|即词汇量的大小。
困惑是一个依赖于模型的分数。大多数创成式模型实现/库都会提供现成的。否则,你基本上需要根据特定的语言模型来计算句子中每个单词的概率,就像上面的公式所示。
LSA:潜在语义分析
LSA 用于根据两个文本中包含的单词计算两个文本的语义相似度。它使用预先计算的大型语料库中的单词共现计数。它使用单词包(BOW)方法来完成,这与单词位置无关。与其他指标不同,它不会过多地惩罚单词选择的变化,即该指标对“好”和“不错”比较宽容,而 rouge 和 bleu 则不会。
本质上,LSA 是一种使用单词包方法将句子/文档编码成向量的方法。使用这些向量,我们可以计算相似性度量(余弦)来检查生成的文本和目标文本的相似性。关于 LSA 度规的详细解释在这里给出。
METEOR:使用显式排序评估翻译的度量
METEOR 是一个不常见的度量标准,用于单词对齐。它计算生成文本和参考文本中单词的一对一映射。传统上,它使用 WordNet 或 porter stemmer。最后,它根据这些映射计算 F 分数。Meteor 在 NLG 是一个相对较少使用的指标,尤其是在深度学习模型起飞之后。
这里给出了计算 meteor 的代码,由 metric 的作者用 java 实现。
TER:翻译编辑率
TER 的工作原理是将生成的文本转换成目标文本。它通过计算将一个字符串转换为另一个字符串所需的操作次数来衡量字符串之间的绝对差异。它紧密基于编辑距离算法
这就是 NLG 常用指标的列表。为了计算所有提到的分数,下面是代码。
我希望这有助于呈现可能对您有用的可能指标的概述。如果你需要更全面的解释,你可以在网上了解更多。
如何评价无监督学习模型
数字音乐
韩国流行音乐和古典音乐到底有多大的不同?
一个音乐集群。视频:像素
所以到目前为止,在这个博客系列中,我们已经研究了如何通过聚集一组曲目来创建自动的歌曲播放列表,完全基于它们的音频特征。之前,我们制作了一个包含 32 首歌曲的玩具示例,并展示了分层凝聚聚类 (HAC)如何自动创建相似歌曲的子组。我们能够通过我们现有的歌曲知识来验证这一聚类练习的结果(我们的算法确认motrhead和黑色安息日在音乐上是相似的——请看图)。
但是如果我们没有这些先验知识呢?如果数据甚至没有被标记(许多现实生活中的聚类情况就是如此),那会怎么样呢?即使是,如果这些标签最初对我们来说毫无意义呢?有很多我从未听说过的艺术家,如果我们试图将数千首曲目分组,那么手动验证每一组显然是不切实际的。在这些情况下,我们需要某种数学方法来衡量我们的聚类有多“成功”。
为了探索我们可能如何去做这件事,我们再次求助于 Spotify 的 API。假设我们从四个非常不同的播放列表中选取歌曲:
如果我们将这些合并成一个数据集,一个无监督的机器学习算法应该能够将他们的歌曲分成四个集群,这四个集群有点类似于最初的四个播放列表。
在我们开始之前,我们可能确实想要检查我们的假设,即来自这些不同播放列表的歌曲确实是“不同的”。当然,在一张图表上同时显示两个以上的特征是具有挑战性的。然而,如果我们绘制一个所有特征的散点图,按播放列表进行颜色编码,我们可以看到有大量的度量组合来展示每个流派的独特特征。
我们在之前的博客中看到,在 Scikit-Learn 中运行聚类算法非常简单:
**#We scale the data to ensure that
#feature units don't impact distances
from** sklearn.preprocessing **import** StandardScaler
sclaer = StandardScaler()
X_scaled = scaler.fit_transform(X)***#This scaled data can then be fed into the HAC algorithm* from** sklearn.cluster **import** AgglomerativeClustering
***#We can tell it how many clusters we're aiming for***
agg_clust = AgglomerativeClustering(n_clusters=4)
assigned_clusters = agg_clust.fit_predict(X_scaled)
我们还看到 HAC 有三种不同的“链接标准”——算法通过这种方法将集群连接在一起:
- ward (默认):选择两个聚类进行合并,使所有聚类内的方差增加最小。一般来说,这导致集群的大小相当一致。
- 完全(或最大链接):合并两个点之间具有最小 最大 距离的簇。
- 平均:合并所有点之间 平均 距离最小的两个聚类。
让我们看看这三个链接标准是如何处理流派播放列表数据集的。我们用一个矩阵表示我们的结果,显示每个播放列表中的歌曲在每个集群中的百分比(集群被随意命名为“A”、“B”、“C”和“D”)。
当然,如果聚类是完美的,我们希望矩阵的每一行和每一列都包含一个 100%的条目(当然,它不必在对角线上,因为聚类名称的分配是任意的)。
默认的“ward”链接试图最小化集群内的差异,在所有四种类型中都做得很好,尽管有一些泄漏到集群 b 中。
“完全”联动显然效果不佳。它已将大量数据集放入聚类 a。聚类 C 由一首说唱歌曲组成。
“平均”关联与“完全”关联有相似的问题。许多数据点被放入一个集群中,两个集群由一首歌曲组成。
值得一提的是,还有另一种常见的聚类类型,K-Means,它的工作方式略有不同。HAC 通过将聚类合并在一起来迭代地减少聚类的数量,而 K-Means 聚类保持固定数量的聚类(名义上的 k ),但是迭代地改变每个聚类的成员。
每个聚类的“中心”由带有黑色“+”号的“大”标记表示。所有的点都被分配到离其中心最近的聚类中。在这个分配步骤之后,重新计算聚类中心以包括新成员,并且发生另一个重新分配步骤。如果在重新分配步骤中没有点改变聚类,则算法结束(动画:维基百科)。
K-Means 在 Python 中实现起来很简单:
**#We scale the data to ensure that
#feature units don't impact distances
from** sklearn.preprocessing **import** StandardScaler
sclaer = StandardScaler()
X_scaled = scaler.fit_transform(X)***#This scaled data can then be fed into the K-Means alorithm* from** sklearn.cluster **import** KMeans
***#We can tell it how many clusters we're aiming for***
km_clust = KMeans(n_clusters=4)
assigned_clusters = km_clust.fit_predict(X_scaled)
如果我们对播放列表数据集应用 K-Means 聚类,我们会得到以下结果:
与使用“ward”链接的 HAC 算法一样,K-Means 聚类在大多数算法中都做得很好,一些爵士乐和说唱歌曲被“误认为”K-Pop。
虽然这些矩阵有利于“目测”我们的结果,但它们远非数学上的严格。让我们考虑一些指标,以实际帮助我们为集群质量分配一个数字。
调整后的兰德指数
调整后的 Rand 指数是经典 Rand 指数的变体,并试图表达多少比例的聚类分配是“正确的”。它通过考虑所有样本对,计算两个不同聚类之间的相似性度量,并针对真实聚类对分配到相同或不同预测聚类中的样本对进行计数,针对随机机会进行调整。
这一点(以及我们将考虑的其他指标)可以使用 Scikit-Learn 进行评估。
**from** sklearn **import** metricsmetrics.adjusted_rand_score(predicted_labels, actual)
调整后的 Rand 指数介于-1 和 1 之间。越接近 1 越好,越接近-1 越不好。
我们看到 K-Means 和 Ward Linkage 得分很高。根据我们之前观察到的矩阵,我们预料到了这一点。
福克斯·马洛得分
Fowlkes Mallow 评分也是类似的,因为它告诉你聚类分配的“正确”程度。特别地,它计算精确度和召回率之间的几何平均值。它介于 0 和 1 之间,值越高越好。
metrics.fowlkes_mallows_score(predicted_labels, actual)
我们的排名类似于调整后的兰德指数——这是我们所期望的,因为它们是试图回答同一个问题的两种方法。
值得注意的是,为了计算这些指标,我们需要知道原始标签。考虑到处理未标记数据是无监督学习的主要用例之一,我们需要一些其他度量来评估聚类结果,而不需要参考“真实”标签。
假设我们从三个独立的聚类分析中得到以下结果。
显然,我们能使集群越“紧密”越好。有什么方法可以把这个“紧密”的概念归结为一个数字吗?
剪影分数
剪影分数试图描述一个数据点与其聚类中的其他数据点的相似程度,相对于其聚类中的数据点而非(这是对所有数据点的汇总,以获得整体聚类的分数)。换句话说,它考虑的是星团在空间中的“独特性”——事实上,人们可以使用任何“距离”来计算分数。
它介于-1 和 1 之间。更接近-1 表示聚类不正确,而更接近+1 表示每个聚类都非常密集。
metrics.silhouette_score(scaled_feature_data, cluster_labels)
我们看到没有一个集群有超高的轮廓分数。有趣的是,我们看到平均连锁群得分最高。但是,请记住,这种算法产生了两个集群,每个集群只包含一个数据点,这在现实世界中不太可能是一个理想的结果(这是一个教训,您通常不能依赖单个指标来决定算法的质量!)
卡林斯基哈拉巴兹指数
卡林斯基哈拉巴兹指数是一个数据点相对于其他聚类中的点的方差与相对于其聚类内的点的方差的比率。因为我们希望第一部分高,第二部分低,所以高 CH 指数是理想的。与我们看到的其他指标不同,这个分数是没有界限的。
metrics.calinski_harabasz_score(scaled_feature_data, cluster_labels)
这里我们看到我们的 K-Means 和 Ward 连锁算法得分很高。完整和平均连锁算法因具有一个或两个较大的聚类而受到惩罚,这将具有较高水平的内部方差。
这是我的“数字音乐”专栏中的最新博客,它使用数据讲述关于音乐的故事。我很乐意听到对上述分析的任何评论——欢迎在下面留言,或通过 LinkedIn 联系我!
如何评价来自 python 的 Vespa 排名函数
使用 pyvespa 评估 cord19 搜索应用当前生产中的排名功能。
这是一系列博客文章中的第二篇,将向您展示如何改进文本搜索应用程序,从下载数据到微调 BERT 模型。
前一篇文章展示了如何下载和解析 TREC-科维德数据。这一次将重点评估在 cord19 搜索应用中可用的两个查询模型。这些模型将作为未来改进的基准。
您也可以从 Google Colab 运行这里包含的步骤。
下载处理过的数据
我们可以从下载我们在之前已经处理过的数据开始。
import requests, json
from pandas import read_csv
topics = json.loads(requests.get(
"https://thigm85.github.io/data/cord19/topics.json").text
)
relevance_data = read_csv(
"https://thigm85.github.io/data/cord19/relevance_data.csv"
)
topics
包含 50 个可用主题的数据,包括query
、question
和narrative
。
topics["1"]{'query': 'coronavirus origin',
'question': 'what is the origin of COVID-19',
'narrative': "seeking range of information about the SARS-CoV-2 virus's origin, including its evolution, animal source, and first transmission into humans"}
relevance_data
包含 50 个主题中每个主题的相关性判断。
relevance_data.head(5)
安装 pyvespa
我们将使用 pyvespa 来评估 python 中的排名函数。
!pip install pyvespa
pyvespa
给 Vespa 提供一个 python API。它允许我们创建、修改、部署正在运行的 Vespa 实例,并与之进行交互。该库的主要目标是允许更快的原型开发,并促进 Vespa 应用程序的机器学习实验。
将带标签的数据格式化为预期的 pyvespa 格式
pyvespa
期望带标签的数据遵循如下所示的格式。这是一个字典列表,其中每个字典代表一个包含query_id
、query
和一个relevant_docs
列表的查询。每个相关文件包含一个必需的id
键和一个可选的score
键。
labeled_data = [
{
'query_id': 1,
'query': 'coronavirus origin',
'relevant_docs': [{'id': '005b2j4b', 'score': 2}, {'id': '00fmeepz', 'score': 1}]
},
{
'query_id': 2,
'query': 'coronavirus response to weather changes',
'relevant_docs': [{'id': '01goni72', 'score': 2}, {'id': '03h85lvy', 'score': 2}]
}
]
我们可以从之前下载的topics
和relevance_data
中创建labeled_data
。我们将只在最终列表中包含相关性分数为> 0 的文档。
labeled_data = [
{
"query_id": int(topic_id),
"query": topics[topic_id]["query"],
"relevant_docs": [
{
"id": row["cord_uid"],
"score": row["relevancy"]
} for idx, row in relevance_data[relevance_data.topic_id == int(topic_id)].iterrows() if row["relevancy"] > 0
]
} for topic_id in topics.keys()]
定义要评估的查询模型
我们将在这里定义两个要评估的查询模型。两者都将匹配与查询至少共享一个术语的所有文档。这通过设置match_phase = OR()
来定义。
查询模型之间的差异发生在排序阶段。or_default
模型将根据native ank对文档进行排序,而or_bm25
模型将根据 BM25 对文档进行排序。关于这两种排名的讨论超出了本教程的范围。知道他们按照两种不同的公式对文档进行排序就够了。
这些排名资料是由 cord19 应用程序背后的团队定义的,可以在这里找到。
from vespa.query import Query, RankProfile, OR
query_models = {
"or_default": Query(
match_phase = OR(),
rank_profile = RankProfile(name="default")
),
"or_bm25": Query(
match_phase = OR(),
rank_profile = RankProfile(name="bm25t5")
)
}
定义评估中使用的指标
我们希望计算以下指标:
- 查询匹配的文档的百分比
- 回忆@ 10
- 倒数排名@ 10
- NDCG @ 10
from vespa.evaluation import MatchRatio, Recall, ReciprocalRank, NormalizedDiscountedCumulativeGain
eval_metrics = [
MatchRatio(),
Recall(at=10),
ReciprocalRank(at=10),
NormalizedDiscountedCumulativeGain(at=10)
]
评价
连接到正在运行的 Vespa 实例:
from vespa.application import Vespa
app = Vespa(url = "https://api.cord19.vespa.ai")
为每个查询模型计算上面定义的指标,并将结果存储在一个字典中。
evaluations = {}
for query_model in query_models:
evaluations[query_model] = app.evaluate(
labeled_data = labeled_data,
eval_metrics = eval_metrics,
query_model = query_models[query_model],
id_field = "cord_uid",
hits = 10
)
分析结果
让我们首先将数据组合成一个 DataFrame,其格式便于在查询模型之间进行比较。
import pandas as pd
metric_values = []
for query_model in query_models:
for metric in eval_metrics:
metric_values.append(
pd.DataFrame(
data={
"query_model": query_model,
"metric": metric.name,
"value": evaluations[query_model][metric.name + "_value"].to_list()
}
)
)
metric_values = pd.concat(metric_values, ignore_index=True)
metric_values.head()
我们可以在下面看到,基于 BM25 的查询模型在这里考虑的所有指标中都是优越的。
metric_values.groupby(['query_model', 'metric']).mean()
我们还可以可视化指标在查询中的分布,以便更好地了解结果。
import plotly.express as px
fig = px.box(
metric_values[metric_values.metric == "ndcg_10"],
x="query_model",
y="value",
title="Ndgc @ 10",
points="all"
)
fig.show()
如何用 Python 代码评价你的机器学习模型!
使用这些方法来确保您已经创建了一个好的模型
你终于建立了你的机器学习模型来预测比特币的未来价格,这样你就可以最终成为一名亿万富翁。但是你怎么知道你创建的模型是好的呢?
在这篇文章中,我将谈论几种方法来评估你的机器学习模型**,并提供代码!**本文分为两部分:
a)评估回归模型
b)评估分类模型
更具体地说,我将涵盖以下指标:
- r 平方
- 调整后的 R 平方
- 绝对平均误差
- 均方误差
- 混淆矩阵和相关指标
- F1 分数
- AUC-ROC 曲线
a)评估回归模型
1.r 平方
r 平方是一种度量,它告诉你因变量的方差在多大程度上是由自变量的方差来解释的。更简单地说,当系数估计趋势时,R 平方表示最佳拟合线周围的散布。
例如,如果 R 是 0.80,那么 80%的变化可以用模型的输入来解释。
如果 R 为 1.0 或 100%,这意味着因变量的所有变动都可以完全由自变量的变动来解释。
举个直观的例子,尽管有相同的最佳拟合线,右边的 R 比左边的高很多。
低 R 模型与高 R 模型的比较
R 的公式如下:
解释的变差等于残差平方和,而总变差等于残差平方和。
现在您已经理解了 R 是什么,代码非常简单!
*from sklearn.metrics import r2_score
sklearn.metrics.**r2_score**(*y_true*, *y_pred)**
2.调整后的 R 平方
添加到模型中的每一个额外的独立变量总是增加 R 值——因此,一个有几个独立变量的模型可能看起来更适合,即使它不是。这就是调整后的 R 的用武之地。调整后的 R 补偿每个额外的独立变量,并且仅在每个给定变量将模型改进到超出概率可能的程度时才增加。
使用 Python 有几种方法可以找到调整后的 R:
选项 1:手动计算
*# n = number of sample size
# p = number of independent variablesAdj_r2 = 1-(1-R2)*(n-1)/(n-p-1)*
选项 2: statsmodel.api
*import statsmodels.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_stdmodel1=sm.OLS(y_train,x_train)
result=model1.fit()
print(result.summary())*
3.平均绝对误差
绝对误差是预测值和实际值之间的差值。因此,平均绝对误差是绝对误差的平均值。
通过从 sklearn.metrics 导入 mean_absolute_error,您可以轻松地计算模型的 MAE。
*from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true, y_pred)*
4.均方误差
均方差或 MSE 类似于 MAE,只是您取预测值和实际值之间的平方差的平均值。
因为差值是平方的,所以较大的误差被赋予更高的权重,所以当您想要最小化较大的误差时,这应该在 MAE 上使用。下面是 MSE 的等式和代码。
*from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred)*
b)评估分类模型
5.混淆矩阵和相关指标
混淆矩阵,也称为误差矩阵,是用于评估分类模型的性能度量。下面是一个两类混淆矩阵的例子。
在混淆矩阵中,您需要了解一些术语,这些术语可用于计算各种指标:
- 真阳性:模型正确预测阳性类别的结果。
- 真阴性:模型正确预测阴性类别的结果。
- 假阳性(1 型错误):模型错误预测阳性类别的结果。
- 假阴性(2 型错误):模型错误预测阴性类别的结果。
现在您已经了解了这些术语,下面是一些您可以计算的指标:
- ***准确性:*等于模型预测正确的比例。
- ***回忆:*尝试回答“正确识别实际阳性的比例是多少?”
- Precision: 试图回答“多大比例的肯定识别实际上是正确的?”
为了真正击中要害,下面的图表是记住精确和回忆之间的区别的一个很好的方法(它确实帮助了我)!
摘自维基百科
混淆矩阵和相关指标的代码如下:
*# Confusion Matrix
from sklearn.metrics import **confusion_matrix**
confusion_matrix(y_true, y_pred)# Accuracy
from sklearn.metrics import **accuracy_score**
accuracy_score(y_true, y_pred)# Recall
from sklearn.metrics import **recall_score**
recall_score(y_true, y_pred, average=None)# Precision
from sklearn.metrics import **precision_score**
precision_score(y_true, y_pred, average=None)*
6.F1 分数
F1 分数公式
F1 分数是对测试准确性的一种衡量——它是精确度和召回率的调和平均值。它的最高分是 1(完美的精确度和召回率),最低分是 0。总的来说,这是对你的模型的精确性和健壮性的一个度量。
在 Python 中有三种方法可以计算 F1 分数:
***# Method 1: sklearn**
from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average=None)**# Method 2: Manual Calculation**
F1 = 2 * (precision * recall) / (precision + recall)**# Method 3: BONUS - classification report**
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred, target_names=target_names))*
7.AUC-ROC 曲线
AUC-ROC 曲线是对分类问题的一种性能度量,它告诉我们一个模型在多大程度上能够区分不同的类别。更高的 AUC 意味着模型更准确。
要计算 AUC-ROC 得分,您可以复制以下代码:
**import numpy as np
**from sklearn.metrics import roc_auc_score**y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
**roc_auc_score(y_true, y_scores)**
0.75**
就是这样!现在你知道如何评估你的机器学习模型,以确定它们是否真的有用。接下来,我们将讨论改进机器学习模型的各种方法。
更多类似的文章,请查看https://blog.datatron.com/
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式就是在媒体** 这里关注我。**
- 在 Twitter 这里成为首批关注我的人之一。我会在这里发布很多更新和有趣的东西!
- 此外,成为第一批订阅我的新 YouTube 频道 这里!
- 在 LinkedIn 这里关注我。
- 在我的邮箱列表上报名这里。
- 查看我的网站,terenceshin.com。
如何评价自己的炒股模式
提示:不要使用传统的损失函数
在 Unsplash 上由 Austin Distel 拍摄的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
当我偶尔观察到“使用 LSTMs 预测股价”时,准确性和盈利性的衡量标准是亏损,通常是均方误差函数。对于以预测值的准确性为最终目标的数据集来说,这一切都很好。
在股票交易的情况下,盈利是最终目标。那么如何才能量化这个价值呢?
概念:
评估模型的最佳值应该与项目的最终目标——盈利能力直接相关。所以我们知道脚本应该能够评估估计的盈利能力。
此外,为了进行盈利能力评估,程序必须对以前从未见过的数据进行处理。这意味着我们必须对数据进行测试,以检查一个人能赚多少钱。
有了利润估算程序的两个最重要的特征,让我们开始创建这个程序。
代码:
我为不同类型的交易准备了三种不同的脚本:
- 固定时间交易
- 正常股票交易
- 二元期权交易
固定时间交易:
def trading_simulator(trade_time,trade_value,close_price,sma_one,sma_two):
intersections,insights = intersection(sma_1,sma_2)
profit = 0
logs = []
for i in range(len(insights)):
index = intersections[i]
if insights[i] == buy:
if index+trade_time < len(fx_data):
if fx_data[index][-1] < fx_data[index+trade_time][-1]:
profit += trade_value * 0.8
logs.append(trade_value*0.8)
elif fx_data[index][-1] > fx_data[index+trade_time][-1]:
profit -= trade_value
logs.append(-trade_value)
elif insights[i] == sell:
if index+trade_time <= len(fx_data):
if fx_data[index][-1] > fx_data[index+trade_time][-1]:
profit += trade_value * 0.8
logs.append(trade_value*0.8)
elif fx_data[index][-1] < fx_data[index+trade_time][-1]:
profit -= trade_value
logs.append(-trade_value)
profit = profit
return profit,logs
这个交易程序使用两个 SMA 值的交集来测试如果基于对两个定义的 SMA 值的交集的理解以及准确性(所有交易中盈利的交易数量)进行交易,将会赚多少钱。
这个程序基于固定时间交易的利润估计:一种交易策略,其中你预测在下一个时间框架内,如果价格将增加或减少。您可以修改程序,或者只是从这里复制整个脚本来测试利润估计:
import requests
import numpy as np
from matplotlib import pyplot as plt
import datetime
API_KEY = 'YOURAPIKEYHERE'
from_symbol = 'EUR'
to_symbol = 'USD'def sell():
pyautogui.click(1350,320)
def buy():
pyautogui.click(1350,250)
def SMA(prices,value):
means = [] count = 0
while value+count <= len(prices):
pre_val = prices[count:value+count]
count +=1
means.append(np.mean(pre_val))
return meansdef intersection(lst_1,lst_2):
intersections = []
insights = []
if len(lst_1) > len(lst_2):
settle = len(lst_2)
else:
settle = len(lst_1)
for i in range(settle-1):
if (lst_1[i+1] < lst_2[i+1]) != (lst_1[i] < lst_2[i]):
if ((lst_1[i+1] < lst_2[i+1]),(lst_1[i] < lst_2[i])) == (True,False):
insights.append(buy)
else:
insights.append(sell)
intersections.append(i)
return intersections,insightsdef trading_simulator(trade_time,trade_value,close_price,sma_one,sma_two):
intersections,insights = intersection(sma_1,sma_2)
profit = 0
logs = []
for i in range(len(insights)):
index = intersections[i]
if insights[i] == buy:
if index+trade_time < len(fx_data):
if fx_data[index][-1] < fx_data[index+trade_time][-1]:
profit += trade_value * 0.8
logs.append(trade_value*0.8)
elif fx_data[index][-1] > fx_data[index+trade_time][-1]:
profit -= trade_value
logs.append(-trade_value)
elif insights[i] == sell:
if index+trade_time <= len(fx_data):
if fx_data[index][-1] > fx_data[index+trade_time][-1]:
profit += trade_value * 0.8
logs.append(trade_value*0.8)
elif fx_data[index][-1] < fx_data[index+trade_time][-1]:
profit -= trade_value
logs.append(-trade_value)
profit = profit
return profit,logsclose_price = []
r = requests.get(
'[https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol='](https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=') +
from_symbol + '&to_symbol=' + to_symbol +
'&interval=1min&outputsize=full&apikey=' + API_KEY)
jsondata = json.loads(r.content)
pre_data = list(jsondata['Time Series FX (1min)'].values())
fx_data = []
for data in pre_data:
fx_data.append(list(data.values()))
fx_data.reverse()
for term in fx_data:
close_price.append(float(term[-1]))sma_1 = SMA(close_price,2)
sma_2 = SMA(close_price,1)
profit,logs = trading_simulator(1,10,close_price,sma_1,sma_2)
profit
为了让程序工作,你必须用你自己的 API 密匙替换 API 密匙参数。
正常交易:
正常的交易是买入或卖出一定数量的股票,所赚的利润是股票价格的差额。
def estimate_profits(standard_qty,model,data,close,open_,high,low):
close_prices = close
open_prices = open_
low_prices = low
high_prices = high
pred_close = list()
pred_open = list()
orders = list()
profits = list()
for i in range(len(data)):
pred = model.predict(data[i])[0]
open_price,close_price = pred
if open_price > close_price:
side = -1
elif open_price < close_price:
side = 1
qty = standard_qty
orders.append([side,qty])
pred_close.append(close_price)
pred_open.append(open_price)
for i in range(len(data)):
sign = 0
mult = 0
side,qty = orders[i][0],orders[i][1]
dif = close_prices[i] - open_prices[i]
if dif > 0:
sign = 1
else:
sign = -1
if sign == side:
mult = 1
else:
mult = -1
profit = dif*mult*qty
profits.append(profit)
return profits
该程序计算资产在制造时和下一次制造时之间的差异。它将这一差额乘以股票数量来计算利润。你可以调整时间步长,测试更长时间的交易策略。
二元期权交易:
def trading_simulator(open_prices):
profit = 0
insights = []
logs = []
for i in range(len(pred)):
if float(open_prices[i]) > pred[i][0]:
insights.append('sell')
elif float(open_prices[i]) < pred[i][0]:
insights.append('buy')
for i in range(len(insights)):
if insights[i] == 'sell':
if float(open_prices[i]) > y[i]:
profit += 8
logs.append(8)
else:
profit -= 10
logs.append(-10)
if insights[i] == 'buy':
if float(open_prices[i]) < y[i]:
profit += 8
logs.append(8)
else:
profit -= 10
logs.append(-10)
return profit,logs
该函数计算利润,考虑交易金额的固定 80%利润。它计算当前值和下一个时间步长值之间的差值。
结论:
我真的希望人们可以使用程序的盈利能力来评估他们的模型,以便真正了解交易算法是否有效。
我的链接:
如果你想看更多我的内容,点击这个 链接 。
如何评估你的网站在不确定时期的表现
nabler.com
了解分析您的分析实施的重要性
传统观点认为,不可预测的市场和整体混乱状态等同于糟糕的业务。尽管我们是从经验数据中得出结论的,而我们通常将这些数据作为现实的标准,但市场的不可预测性可以开辟新的途径。凭借聪明的营销策略,企业可以通过在新创造的市场空间中建立据点来创造前所未有的利润。
随着最近新冠肺炎制造的混乱,所有的企业都在前述的空间里。从生产者到消费者的传统交易方式正在以前所未有的方式发生变化。所有垂直行业的企业都见证了收入下降的趋势。在如此严重的危机期间,将有效的贸易扩张营销作为重中之重的建议,可能会让人感觉像是泰坦尼克号撞上冰山后打扫房间的建议。但这种类比与事实相去甚远。一个更准确的比喻是,有人提议修补船上的洞,防止它下沉。
随着 COVID 引发的经济动荡,追踪每一笔营销支出的可衡量结果势在必行。在不确定的时期,营销人员明白,需要关注细节和仔细调整流程,以跟踪和解释业务目标的快速变化。这就是数字营销领域中经过精心计算和精心策划的支出所能发挥的作用。
正如一个人需要有一个坚实的基础来建造摩天大楼一样,有效实施数字分析是任何数字营销企业的先决条件。
使用数字营销分析,营销人员可以确定他们的每项营销计划(例如,社交媒体与博客和电子邮件营销等)的相互对比情况,确定他们活动的真实投资回报,并了解他们实现业务目标的情况。
分析提供正确分类和划分用户行为的数据。相同的数据被用作营销策略的基础。最后,分析提供了对营销活动有效性的全面洞察。
用一个更简单的比喻来说,没有分析的营销就像没有建筑师的纪念碑的建造。
数字分析成功的关键是正确的测量策略。衡量策略是一个包罗万象的计划,它组织了您的业务目标以及如何衡量这些目标。该策略遵循从尽可能广泛的目标(通常是业务目标)开始的路径,并将其分解为可测量的指标和分割所述指标的特定方式。现在,最终目标是优化网站的性能,获取关于消费者行为的信息,并努力收集必要的维度和指标。
最后,如果没有持续和严格的数据治理,所有有效分析的努力都将失败。数据治理包括维护数据的责任以及对分析能力的定期审核。跟上每一次技术更新,并确保收到的数据是一致的、有意义的和简明的。数据治理是确保分析架构有效性的持续活动;催化每一次营销活动的产出。
如前所述;这个喧嚣的商业时代已经打开了各种各样的市场,这些市场到目前为止还不是主流需求。这篇文章现在将跟随三个案例研究,它们将说明拥有一个全面的架构来收集分析的重要性,以及做出正确的推断来促进对话和销售的重要性。
案例研究 1:
我们有成千上万的课程和证书,我们的一个客户是专业教育领域的先驱。然而,随着新冠肺炎的出现,就像教育部门的其他人一样,入学表格的讨论处于历史最低点。网站的总流量每天都在下降。访问者在浏览了所有可用课程的第一页后就离开了网站。
我们可以通过在页面视图上设置触发器、表单交互、跟踪每个访问者的退出链接以及热图来观察这一点,热图让我们了解用户交互最多的网页上的集群。
从这些数据中得出的结论是,人们不寻找传统的教育证书,因为没有去教室的机会。由于这个疫情以其不可预测性而闻名,学生们甚至对那些批量开始于未来的课堂课程不感兴趣。
通过测试工具和分析他们的参与率,在网页上出现了多种可能的变化后,我们在可用课程列表的顶部只显示了远程教育项目。我们改变了表单,减少了远程学习课程的 UI 路径。我们通过创建一个单独的远程学习课程列表,而不是将它们集中在所有认证课程的列表中,实现了这一点。
在任何正常情况下,远程学习项目是最不受欢迎的项目,因为教师之间的互动有限。但是这种不可预测的情况为我们的客户开辟了一条新的途径。分析和数字营销为得出这一结论提供了必要的信息。
案例研究 2:
我们的客户是一个电子商务平台,销售咖啡、营养和健康产品。我们客户的主要产品仍然是咖啡。每当有新访客访问平台,他看到的第一个产品将是咖啡。通常,这种做法会导致更高的转化率。这主要是因为新用户更愿意购买一家公司的主要产品,而不是他们第二条生产线上的产品。
为了跟踪平台上所有可用产品的点击量,我们实现了标记,这些标记是代码的小片段,具有跟踪每个访问者在平台上的交互的功能。根据收集的数据,我们观察到寻找健康产品的人数激增,而购买咖啡的人数却下降了。
在这些冲突时期,每个人都在寻找一种方法来提高他们的免疫力,并为逆境做好更好的准备。基于我们收集的数据,我们建议我们的客户改变他们的默认主页,更多地关注基于蛋白质和营养的产品。
两周之内,我们的客户看到了销售额的猛增。当每个企业都在努力实现收支平衡时,通过对分析和数字营销的精心投资,我们的客户增加了他们的收入。发生这种情况是因为他们能够抓住市场中的一个新缺口。
案例研究 3:
我们的客户是领先的家用、家庭办公和商用产品的主要供应商,如打印机、缝纫机、齿轮马达等。他们广泛关注他们的打印机业务。他们的主要收入来源于每个公司环境中所需的办公设备。最明显的是打印机。
然而,随着全球各地办公室的关闭以及数字化趋势的不断增强,对打印机的需求降到了历史最低点。这从我们在他们平台的所有网页上实现的热图中可以明显看出。我们观察到家用产品的最大滚动密度。尤其是针线包。
基于这些数据的收集,营销团队有了一个推论。根据他们的说法,由于全球对个人防护设备套件和口罩的需求巨大,而商业行业的产量又低于需求,人们开始为家人的福利缝制自己的口罩和个人防护设备套件。此外,进一步的研究表明,许多人将此作为一个机会,开始自己的口罩和个人防护设备套件生产业务。这项研究的触发点是观察到行业级缝纫机的销售增长。这些缝纫机很少售出,但通过仔细的反思,我们发现了市场中的另一个缺口,我们的客户可以利用它来增加他们的利润。
这三个简短的案例研究显示了优化网站性能的内在重要性。然而,潜台词中可能没有的一个主要推论是,这些公司在动荡时期取得成功,是因为它们投资了数字分析。他们只能在强大、平衡、预先计划的上述测量策略的帮助下才能做到这一点。
最后总结一下。
- 在市场不断变化的时代,数字营销和分析的重要性是至关重要的。
- 没有分析,数字营销将不会带来投资回报。
- 作为一家企业,有必要了解你的数据,并通过它了解你的消费者,以便与他们建立更私人的关系。了解他们的需求,改变你的平台来迎合那些观察到的需求。
- 既然数字营销和分析的重要性已经得到证明,那么开始数字营销之旅的第一步就是制定一个可持续的衡量策略。规划你的期望,你的远大目标和你的货币投资。每个企业都有自己的衡量策略,基于其资源和整合数字营销的必要条件。
最初发表于T5【https://www.nabler.com】。
如何进化人工智能生命:初学者指南
为人工智能爱好者提供介绍、进度更新和概念验证
智能人工生命是可以进化的。图片由com break在 Pixabay 拍摄。
*“进化中的人工智能生命”*听起来可能像是个人的夸大其词——甚至可能是科幻小说。我认为你的怀疑更多的是关于我们如何习惯于思考生活,而不是这个主张本身的价值。
普遍的共识会让你相信宇宙中的生命极其稀少,或者说极其难以创造。一个简单的思想实验,用来更好地理解费米悖论,可以揭示反对‘稀有生命假说的天文几率。
也就是说,在 0 到 100 摄氏度的狭窄温度范围内,形成生命的化学物质肯定不是唯一基于碳和水的。相反,它们可能出现在温度、辐射和压力光谱上下的任何地方,跨越几乎无限的物质范围(即甲烷在低温下是液体,铁在高温下是液体)。
在 0 到 100 摄氏度的狭窄温度范围内,形成生命的化学物质肯定不是唯一基于碳和水的。
这些化学物质需要的唯一共性是存储和传输数据的能力,使辐射(光)成为生命的潜在基质,甚至可能是重力。
也许生命唯一的基本先决条件是储存和传输数据的能力。
电脑有我们需要的一切。但是我跑题了…
我说的不是目前形态的 AI ( 人工智能)。神经网络是对我们所知的大脑工作方式的模仿。它们是智能设计的。
你不设计人工智能生命。这不是一种自然的(或优雅的)方式。相反,我要提供适合智慧生命进化的初始条件。大自然也为我们做了同样的事情。
你不要设计人工智能生命。这不是一种自然的(或优雅的)方式。
但是从哪里开始呢?
有几个重要的概念支撑着我的方法,所以让我们从这里开始。
试探法简介
试探法是解决极其复杂问题的自然方法。我不是说对我们来说是自然的,我是说自然,就像自然——宇宙一样。
启发式是一种比较过程,不能保证产生完美的结果。
我首先开始使用启发式算法来解决一个著名类型的 NP-Hard 数学问题,即所谓的旅行推销员问题。本质上,你需要找出最有效的方法去访问指定数量的地点。听起来很简单,对吧?
困难在于所涉及的排列数量之多。根据此路线优化概述:
一个只有一辆车和 50 个停靠站的简单路线优化问题的排列比太阳中的氢原子多 3000 万倍(10⁵⁷).
使用 bang ( )很容易确认这一点!科学计算器上的符号。排列的数量可以计算如下:
50 x 49 x 48 x 47 x … x 2 x 1 = 50!= 3 x 10⁶⁴
世界上最快的超级计算机需要数万亿年来检查每一种可能性,这使得这个简单的问题(每天都要面对快递公司和快递员)在没有启发的情况下变得难以处理。
相比之下,使用试探法的系统可以在几秒钟内为 50 个地点的游览提供以下最佳路线:
由 Optergon 提供的具有 50 个停靠点的单个车辆的最佳路线。
启发式算法经常在自然界中找到灵感。从蚁群收集食物到我们 DNA 的突变,启发式是生活中不可或缺的一部分。没有启发法,就不会有进化。
奇怪的是,但重要的是,在我们继续时要记住,自然发生的启发法可以出现全新的启发法。浮现这个词也很重要。我将很快更详细地介绍它。
自然发生的试探法可以产生全新的试探法。
我会解释的。
我们的大脑一直在使用启发式方法。没有它们我们抓不到球。
我们不是计算牛顿定律来预测球的飞行路径,而是将当前情况(即球朝我们飞来)与存储的记忆库进行比较,并基于此估计球将到达的位置和时间。我们练习得越多,我们用来做决定的记忆和经验就越多,我们就会变得越好。由于试探法不能保证完美的结果,即使是我们中最优秀的人也会偶尔失手。
在生命最初进化的时候,“T20”接球试探法并不存在。当生命首次爬上陆地时,它并不存在。一段时间后,它作为遗传启发式进化过程的结果出现了。
换句话说,一个启发式过程(进化)出现了另一个(接球)。
这很重要!
紧急情况介绍
涌现是一种美丽优雅的现象,似乎毫不费力地违反了热力学定律。宇宙中真正的宝石之一。
涌现是一种美丽优雅的现象,似乎毫不费力地违反了热力学定律。
当一个系统表现出任何组成部分最初都没有的特性时,我们就观察到了涌现。
有很多肉眼可见的宏伟的例子。向窗外看。在太阳系形成之初,没有地球。没有月亮。没有太阳。随着时间的推移,所有这些东西都是在重力作用下由尘埃和气体形成的。
即使一旦太阳的核火焰点燃,我们的星球清扫干净它的轨道,这里也没有生命。没有花。没有树。没有鸮鹦鹉(可悲的是,我们正在杀害许多大自然中已经出现的美好事物,而 鸮鹦鹉很可能很快就会成为其中之一 )。所有这些生物都是在适应生存的基因启发过程(即突变)中出现的。
简言之,
简单的启发式系统可以产生复杂的生命和智能。
这很重要!
“启发式涌现”是进化智能的好方法
*启发式涌现,我用来描述我进化人工智能的方法的术语,*是你从未听说过的最强大的自然现象。它负责宇宙中的所有生命。它对鸮鹦鹉负责。它对我们的智力负责。
进化是启发式涌现的一个具体例子。
使用启发式涌现来进化人工智能的好处在于,它不需要设计师或指导手。只需设置好虚拟生物 ( 沃斯)进化所需的初始条件。按播放。
迟早,就像我们的智慧来自自然选择一样,他们会开始展现出像常识、解决问题、直觉和创造力这样的特质。它们不会由人类来设计,也不会使用机器学习 ( ML )来训练。它们是它们自己的东西。独立,有自知之明。
和我们一样。
概念证明:使用启发式涌现的人工进化
最近,我有时间采取一些具体的步骤来建立一个启发式的紧急系统。我把它叫做草原。
grasses 是一个虚拟环境,它支持单一类型的 VO(本例中为*,grass* ),由编码大小的单一基因组成。我试图让这个系统的规则尽可能地接近我们本质上认为的自然草原环境,以便让这个演示更具关联性。
- 在环境的某些部分,水和降雨充足,而在其他部分,水很少。
- 草要生存就必须有足够的水。
- 草可以生长,达到性成熟,在合适的条件下繁殖(有小几率突变),最终死亡。
- 大草比小草需要更多的水才能生存,但如果条件合适,它们可以更快地繁殖。
这就是全部了。
该模拟在没有任何干扰的情况下运行一段时间,并每隔几年显示环境的快照。
下面的截图来自我的电脑,显示了使用的初始条件(显然它们是可配置的)以及 20 年后的环境。
草原启发式涌现环境初始条件。
从截图底部角落的沙色地图上,你或许可以看出一条河流从西北流向中心的模糊轮廓,然后流入内陆三角洲比如博茨瓦纳的奥卡万戈。西北地区较高的降雨量为河流和三角洲系统提供了水源(平均降雨量未在地图上标出)。
最初,有两个小草群落占据了主导地位——一个在地图的顶部中心,另一个在中心,靠近三角洲。根据起始条件,两个初始草菌落都具有基因表达大小 20。
绝大多数的地图没有足够的水来支持基因大小表达 20 的草。简而言之,为了在地图上更干燥的地区定居,种子殖民地将不得不进化。
经过 240 年的模拟,地图看起来是这样的(结果每次都不同,因为系统是不确定的,没有办法准确预测结果——除了一般趋势)。
草原启发式涌现模拟显示适应 VOs。
深绿色的区域表示大而茂盛的草已经在西北、沿河和内陆三角洲的潮湿区域定居。最大的草已经进化到 111 的基因大小表达。比种子群体大得多,繁殖速度也快得多。
最小的草已经进化到只有 7 的基因大小表达,这使它非常适合干旱地区。请注意,较小的草,在地图上被描绘为浅绿色的瓦片,已经占据了整个可用区域,尽管这对于种子草来说最初是不可能的。
这里突出的一点是,一般来说,这个系统是启发式涌现的概念证明,特别是人工进化。
一般来说,草原是启发性涌现的概念证明,尤其是人工进化。
没有任何代码,没有任何指令,没有任何程序,没有任何功能,或任何其他东西,来指导草适应更干燥的环境区域。它进化是因为随着时间的推移,其 DNA 中的随机突变导致了允许它在更干燥的环境中生存和繁殖的特征——将这些特征传递给后代。
和我们一样。
向进化革命前进
机器拥有许多方面的智能。它们是很好的计算器。他们有记忆。他们可以交流。人工智能可以学习特定的智能行为,例如识别人脸或物体。
他们做很多事情都比我们好。然而,我们并不认为他们比我们聪明。为什么?计算机目前缺乏启发性,比如常识、同理心和创造力。
计算机目前缺乏启发性,如常识、同理心和创造力。
然而试探法恰恰是那些使用…试探法最能展现智慧的方面。大自然已经通过进化我们向我们展示了如何做到这一点。我只是打算遵循已经制定的路线图。
下一步是进化出一个拥有启发性行为的虚拟有机体,比如创造力或常识。
现在有一些挑战(也就是找时间)。在技术方面,我需要找到一种方法,将新基因的出现与特定特征联系起来。这些特征协同工作,最终将形成新的启发。
请记住,我不能简单地为创造力创建一个基因表达式,就像我在草原中对大小基因所做的那样。大小是一个基本特征。创造力是一种复杂的行为。简单地说一个基因编码创造力并不会使它成为现实。
我有一些关于如何做到这一点的想法,我会让你知道我的进展(或者在可疑的情况下死亡——在这种情况下,真的需要有人销毁我的 PC 和云帐户)。与此同时,我想留给你以下令人费解的想法。
大自然使用启发式涌现来进化充满启发的生命,这允许它使用启发式涌现来涌现充满启发的生命。
似乎大自然有一种递归的诗意对称。
如何用 Scrapy 执行 JavaScript?
了解如何使用 Scrapy 和 Selenium、Splash 和 ScrapingBee 中间件为无头浏览器抓取动态网站
图片由 Pierre de Wulf [ 来源
大多数现代网站使用客户端 JavaScript 框架,如 React、Vue 或 Angular。在没有服务器端呈现的情况下,从动态网站抓取数据通常需要执行 JavaScript 代码。
我刮过几百个站点,一直用 Scrapy。Scrapy 是一个流行的 Python web 抓取框架。与其他 Python 抓取库(如 Beautiful Soup)相比,Scrapy 迫使你根据一些最佳实践来构建代码。作为交换,Scrapy 负责并发性、收集统计数据、缓存、处理重试逻辑以及许多其他工作。
如果你是 Scrapy 新手,你可能应该开始阅读这个伟大的教程,它将教你所有Scrapy的基础知识。
在这篇文章中,我比较了使用 Scrapy 执行 JavaScript 的最流行的解决方案,如何扩展无头浏览器,并介绍了使用 ScrapingBee API 实现 JavaScript 支持和代理轮换的开源集成。
用 Scrapy 抓取动态网站
用 Scrapy 抓取客户端渲染的网站曾经很痛苦。我经常发现自己在浏览器网络工具上检查 API 请求,并从 JavaScript 变量中提取数据。
虽然这些技巧可能在一些网站上有效,但我发现代码比传统的 XPATHs 更难理解和维护。但是要直接从 HTML 中抓取客户端数据,首先需要执行 JavaScript 代码。
无头浏览器的零碎中间件
无头浏览器是没有图形用户界面的 web 浏览器。我用三个库来用 Scrapy 执行 JavaScript:Scrapy-selenium、 scrapy-splash 和 scrapy-scrapingbee 。
所有三个库被集成为一个 Scrapy 下载器中间件。一旦在你的项目设置中进行了配置,你就可以产生一个 SeleniumRequest 、 SplashRequest 或scraping beer Request,而不是从你的蜘蛛那里产生一个普通的 Scrapy 请求。
用 Selenium 在 Scrapy 中执行 JavaScript
在本地,你可以通过 scrapy-selenium 中间件与 Scrapy 的无头浏览器进行交互。Selenium 是一个与浏览器交互的框架,通常用于测试应用程序、网页抓取和截屏。
Selenium 需要一个 web 驱动来与浏览器交互。比如 Firefox 要求你安装 geckodriver。然后,您可以在 Scrapy 项目设置中配置 Selenium。
在你的蜘蛛中,你可以产生一个硒元素请求。
Selenium 允许您用 Python 和 JavaScript 与浏览器进行交互。驱动程序对象可以从 Scrapy 响应中访问。有时在你点击一个按钮后检查 HTML 代码是很有用的。在本地,您可以用一个 ipdb 调试器设置一个断点来检查 HTML 响应。
否则,可以从响应对象访问杂乱的 XPATH 和 CSS 选择器,以便从 HTML 中选择数据。
SeleniumRequest 带有一些附加参数,例如在返回响应之前的 wait_time 到 wait ,等待 HTML 元素的 wait_until ,截屏的screen和执行定制 JavaScript 脚本的 script 。
在生产中,scrapy-selenium 的主要问题是没有简单的方法来建立一个 Selenium grid 来在远程机器上运行多个浏览器实例。接下来,我将比较用 Scrapy 大规模执行 JavaScript 的两种解决方案。
用 Splash 在 Scrapy 中执行 JavaScript
Splash 是一个带有 API 的网络浏览器即服务。它由 Scrapinghub 维护,Scrapy 的主要贡献者,并通过 scrapy-splash 中间件与 Scrapy 集成。也可以由 Scrapinghub 托管。
Splash 创建于 2013 年,在 2017 年无头 Chrome 和其他主要无头浏览器发布之前。从那时起,其他流行的项目如 PhantomJS 已经停止,转而支持 Firefox、Chrome 和 Safari 无头浏览器。
您可以使用 Docker 在本地运行 Splash 的实例。
配置 Splash 中间件需要添加多个中间件,并在您的项目设置中更改HttpCompressionMiddleware的默认优先级。
然后,您可以生成一个带有可选参数 wait 和 lua_source 的 SplashRequest 。
Splash 是一种流行的解决方案,因为它已经问世很长时间了,但它有两个主要问题:它使用自定义的无头浏览器,并需要用 Lua 编码来与网站交互。因为这两个问题,对于我的最后一个抓取项目,我决定为 ScrapingBee API 创建一个中间件。
使用 ScrapingBee 在 Scrapy 中执行 JavaScript
ScrapingBee 是一个 web 抓取 API,它为您处理无头浏览器和代理。ScrapingBee 使用最新的 headless Chrome 版本,支持 JavaScript 脚本。
像其他两个中间件一样,你可以简单地安装带有 pip 的 scrapy-scrapingbee 中间件。
首先,您需要创建一个 ScrapingBee 帐户来获取 API 密钥。然后,您可以添加下载器中间件,并在项目设置中根据您的 ScrapingBee 计划设置并发性。
然后你可以从 ScrapingBeeSpider 继承你的 Spider 并产生一个 ScrapingBeeRequest 。
ScrapingBeeRequest 采用一个可选的 params 参数来执行一个 js_snippet ,在返回响应之前设置一个自定义的 wait 或者用 wait_for 在 HTML 代码中等待一个 CSS 或者 XPATH 选择器。
在一些网站中,当你滚动页面时,HTML 是异步加载的。您可以使用下面的 JavaScript 代码片段滚动到页面的末尾。
ScrapingBee 在 ScrapingBee 文档上收集了其他常见的 JavaScript 片段来与网站进行交互。
在幕后,scrapy-scrapingbee 中间件将原始请求转换为转发给 ScrapingBee API 的请求,并对 URL 查询字符串中的每个参数进行编码。API 端点记录在你的垃圾日志中,api_key 被垃圾蜘蛛隐藏。
在您的蜘蛛解析方法中, response.url 被中间件解析为传递给 ScrapingBeeRequest 的原始 url。
使用 ScrapingBee 的另一个优点是,您可以访问不同国家的住宅代理,并通过以下参数进行代理轮换。
使用 Scrapy 缓存和并发来提高速度
Scrapy 使用了 Twisted under the hood,这是一个异步网络框架。Twisted 使 Scrapy 快速,能够同时刮多个页面。然而,要执行 JavaScript 代码,您需要使用真正的浏览器或无头浏览器来解析请求。无头浏览器有两个挑战:速度较慢,难以扩展。
在无头浏览器中执行 JavaScript 并等待所有网络调用,每页可能需要几秒钟。当刮多个页面时,它会使刮刀明显变慢。希望 Scrapy 提供缓存来加速开发和生产运行的并发请求。
在本地,当开发一个刮刀时,你可以使用 Scrapy 的内置缓存系统。这将使后续运行更快,因为响应存储在您计算机上的一个隐藏文件夹中。scrapy/httpcache 。您可以在您的项目设置中激活 HttpCacheMiddleware :
无头浏览器的另一个问题是它们为每个请求消耗内存。在生产中,您需要一个可以处理多种浏览器的环境。要同时发出多个请求,您可以修改项目设置:
使用 ScrapingBee 时,记得根据您的 ScrapingBee 计划设置并发性。
结论
我比较了三个 Scrapy 中间件,用 Scrapy 渲染和执行 JavaScript。Selenium 允许您在所有主流的无头浏览器中使用 Python 与 web 浏览器进行交互,但是很难扩展。Splash 可以使用 Docker 在本地运行,也可以部署到 Scrapinghub,但是它依赖于定制的浏览器实现,而且你必须用 Lua 编写脚本。ScrapingBee 使用最新的 Chrome headless 浏览器,允许您在 JavaScript 中执行自定义脚本,并为最难抓取的网站提供代理旋转。