用于乳腺癌分类和生物标记识别的机器学习模型比较
以 Python 中的配对图和相关矩阵构造为特色。
这个数据集可供公众研究。鸣谢:帕特里西奥,m .,佩雷拉,j .,克里斯索斯托莫,j .,马塔福梅,p .,戈梅斯,m .,塞萨,r .,&卡拉梅洛,F. (2018)。使用抵抗素、葡萄糖、年龄和身体质量指数预测乳腺癌的存在。BMC 癌症,18(1)。
2019 年,美国估计有 268,600 名女性被诊断患有乳腺癌。尽管女性乳腺癌发病率(在 50 岁及以上的女性中)逐渐下降,存活率也有所上升,但仍需要进行研究以解决乳腺癌问题(https://www . national breast cancer . org/breast-cancer-facts)。存活率增加的主要原因之一是更好的筛查和早期检测做法;这可以包括评估生物标记。生物标记是生物体中可测量的物质,如个体的血糖水平,可以作为疾病或感染存在的指标。
这个项目和这篇文章的目标是尝试使用相对少量的数据开发一个强大的预测模型。我的目的是展示机器学习应用中存在的小样本问题,同时探索预测分析在医疗决策中的实际应用。通过利用探索性分析和机器学习模型,我的目标是识别可以指示患者乳腺癌的具有统计意义的生物标记。这个数据集包含 116 行,每行有 9 个属性,一列表示分类。在分类方面,有 64 名乳腺癌患者和 52 名健康对照。116 行对于执行机器学习技术来说相对较低,但尝试各种预测模型是值得的。小样本量在机器学习任务中提出了相当大的挑战,因为过拟合可能导致对一个类别的高偏差。通过合并交叉验证程序,我将尝试最小化隐含的分类偏差。基于给定的变量(或者甚至是所提供的生物标记的小子集)的强预测模型可以用于测试容易收集的生物标记并指示乳腺癌。以下生物标记是该数据集中的属性:
年龄,身体质量指数,葡萄糖,胰岛素,稳态模型评估(量化胰岛素抵抗和β细胞功能)瘦素(小肠中脂肪细胞产生的一种激素,有助于调节能量平衡)脂联素(参与调节葡萄糖水平和脂肪酸分解的蛋白质激素)抵抗素(脂肪储存细胞、免疫细胞和上皮细胞分泌的肽
我采取的第一步是查看特征的描述性统计数据,然后生成一个相关矩阵。在取平均值和查看分布之前,我将数据集除以目标值,以分别查看健康对照组和乳腺癌患者的描述性统计数据。
健康对照组的描述性统计数据:
Those in the healthy control group show what would be considered ‘normal’ levels for these 8 bio-markers.
乳腺癌患者的描述性统计:
Glucose, Insulin, HOMA, Resistin, and MCP-1 levels in breast cancer patients tend to be higher, based on averages, than those in the control group.
这两个阶层的平均年龄相对接近,身体质量指数、瘦素和脂联素值也是如此。值得注意的是,健康对照人群中的最低年龄是 24 岁,而最年轻的乳腺癌患者是 34 岁,尽管他们的平均年龄相似。在健康对照样品(平均 88.23 mg/dL)和乳腺癌患者(平均 105.56 mg/dL)之间的血糖水平有相当大的差异。在基于决策树的模型中,葡萄糖可以作为良好的预测因子或分裂点来对乳腺癌患者进行分类。胰岛素、抵抗素和 MCP-1 遵循相似的趋势,平均而言,乳腺癌患者显示出比健康对照组更高的值。这些生物标志物可能被证明是比身体质量指数、瘦素和脂联素更好的预测因子,但现在下这样的结论还为时过早。
下面,我使用“seaborn”可视化软件包来制作一个配对图。配对图显示了数据集中所有特征之间的关系,包括每个特征的分布。我对数据进行了过滤,橙色的点是乳腺癌数据,蓝色的点是健康的对照患者。因此,我们不仅可以看到所有的变量关系,还可以在类中寻找模式。
年龄、身体质量指数、MCP-1 似乎呈正态分布。葡萄糖、胰岛素、HOMA、瘦素、脂联素和抵抗素具有右偏分布。如果你观察 HOMA 和胰岛素,你会发现散点图中有很强的正线性关系。也就是说,这两个变量之间的关系可以使用直线回归模型精确建模。胰岛素和 HOMA 也是如此。身体质量指数和葡萄糖似乎有一个坚实的集群分离,我们可以看到这两个类存在于各自的领域。如果用在 KNN 模型中,这两个变量以后会成为强有力的特征。
让我们看看这些生物标记中是否有任何一个与另一个高度相关。如果我们试图使用没有相关性或相关性很小的变量来训练机器学习模型,我们的模型将返回不准确的结果。为了制作相关矩阵热图,我引入了 Python 包“seaborn”它将计算两个变量之间关系的正或负线性强度的相关系数可视化。
Values close to 1.0, like 0.93 and 0.7, show a strong positive linear relationship between the two variables while values close to -1.0 show the inverse, strong but negatively correlated.
- 身体质量指数和瘦素的正相关值为 0.57
- 葡萄糖和 HOMA 具有中等强度的正相关值 0.7
- 葡萄糖和胰岛素具有 0.5 的正相关值
- 胰岛素和 HOMA 具有非常强的正相关值 0.93
- 葡萄糖、胰岛素、HOMA 和抵抗素都在高于 0.2 的水平上与分类变量正相关
- 在某种程度上,所有的变量都是相互关联的
接下来,我将测试 sklearn 包提供的各种分类模型,在确定最佳模型后,我将研究它的架构。我使用 sklearn 包中的 train_test_split 函数来创建训练和测试数据集,并应用缩放。需要注意的是,数值的标度并不完全相同,有些数值以 mg/dL、pg/dL 和 kg/m 为单位,因此在将数据输入 ML 模型之前,应用标度函数是一个关键的预处理步骤。
我根据数据训练的第一个模型是逻辑回归,一种简单的分类方法。最初,它在测试数据上返回 62%的准确率,有 8 个假阴性(错过了 8 个癌症样本)和 3 个假阳性(3 个健康样本被分类为癌症)。该模型为预测健康类返回了 57%的精度值和 33%的召回值。由于样本量小,结果初步偏低。对于分类问题中的低样本量,一个很好的补救方法是改变损失函数。分类问题使用交叉熵损失来训练和优化模型,在样本量较低的情况下,模型在尝试优化其损失值时会偏向一个类别。为了补救,我将权重值添加到与不同类别相对应的损失中,以消除偏差。这很容易通过添加参数 class_weight = 'balanced '来实现,该参数查找类权重并平衡数据比率以消除偏差。我使用平衡类权重参数运行另一个逻辑回归模型。
这在测试集上返回了 69%的准确率,提高了 7%,并且我们还消除了 3 个假阴性。
接下来,我使用平衡和非平衡类权重参数训练了一个线性判别分析模型、一个决策树模型和一个 k-最近邻模型。最好的模型是 KNN,准确率为 79%,只有 3 个假阴性和 3 个假阳性。
我试图通过找到 k 的最佳值来调整 k-nn。虽然我能达到的最大精度是 79%,但没有任何改进。
This visualizes the attempt to find the best value for k based on accuracy. We see that 1, 5, 7 are the best values for k when optimizing for accuracy.
对我来说,这个项目的一个重要部分是识别生物标记。我选择训练一个随机森林分类器,这样我们就可以接收一个可变的重要性输出,并查看哪些生物标记被认为是“最重要的”,从统计角度来说,在确定样本是否患有癌症方面。
一个随机森林是许多单个决策树的集合。它将决策树的多数结果作为最终值。最初的随机森林模型表现糟糕,准确率为 58.6%。我使用交叉验证实现了一个随机搜索,以确定随机森林模型的最佳超参数,希望实现更好的准确性和更透明的机器模型。
这段代码构建了一个随机搜索来识别随机森林进行分类的最佳参数。以下代码使用上面定义的随机网格搜索,运行 100 种不同的模型组合,并确定最佳组合。
这些是最佳参数:
{‘n_estimators’: 266,’ min_samples_split’: 5,’ min_samples_leaf’: 1,’ max_features’: ‘sqrt ‘,’ max_depth’: 30,’ bootstrap’: True}
使用可能的最佳随机森林模型,我们实现了 68.97% 的准确度。这个分数与逻辑回归的结果相当,但比 KNN 差。在我看来,随机森林最有用的输出是特征重要性**。它显示了哪些变量,从统计学上来说,在进行分类时最重要。这个输出使得随机森林模型不那么像一个抽象的“黑盒”,并且允许我们看一看它是如何做出某些决定的。**
基于上面的可变重要性结果,我选择了两个最重要的特征,并将它们可视化,然后应用目前为止表现最好的模型,KNN。
在上面的代码块中,我将 K 的值设置为我之前确定的获得最佳精度的值之一,在本例中是 K = 5。然后,我将 k-最近邻模型仅适用于两个特征:葡萄糖和身体质量指数。
Red = Healthy Controls. Green = Breast Cancer Patients
这种可视化有助于对我们的预测模型进行推断。在大约 90 (mg/dL)葡萄糖水平处,存在垂直截止,其中来自任一类别的一些样品混合。在 120 (mg/dL)之后,所有样品都是乳腺癌患者。
结论
葡萄糖和身体质量指数一起可能是检测乳腺癌的两个强有力的生物标记。对这两个生物标记进行建模,并添加 HOMA 和抵抗素水平(接下来的两个重要特征),我用 k 最近邻法对乳腺癌样本进行分类时达到了几乎 80%的准确率。因此,这个项目表明,结合这四个重要的生物标志物,乳腺癌可以很容易地分类。如果数据集可以扩展,其他方法可能会更准确,比如随机森林。再增加一百个左右的样本有可能返回比 KNN 分类器 80%的准确率更好的结果。这些模型的运行速度也非常快,因此,如果我们能够否定假阳性/假阴性预测(最有可能是由于低样本量导致的偏差),这些模型对于医疗应用来说是实用的。本文旨在展示小样本量对强大的机器学习方法的影响,以及如何轻松地将这些方法用于医疗诊断。
用于内容审核的机器学习—挑战
使用机器学习系统进行内容审核的挑战
概观
有关内容审核的机器学习主题的介绍,请阅读本系列的简介:
用于在线内容审核的机器学习系统综述
towardsdatascience.com](/machine-learning-for-content-moderation-introduction-4e9353c47ae5)
现在,我们已经对用于自动内容审核的机器学习系统进行了概述,我们可以解决这些系统面临的主要挑战。这些潜在的问题可能导致在评估模型、确定接近的分类器阈值以及公平地使用它而没有无意的偏差方面的困难。由于内容审核系统作用于复杂的社会现象,因此它们面临着在其他机器学习环境中不一定会遇到的问题。
不同的定义
对于内容调节的许多应用,很难提供感兴趣现象的明确定义。这些话题往往是非常复杂的社会现象,其定义是学术界不断争论的话题。例如,网络欺凌在学术文本中有各种各样的定义,因此很难创造一个所有人都同意的包罗万象的定义。由于这个原因,提供给手动内容贴标机的说明可能不够清楚,不能产生非常可靠的标签。
https://indigenousx.com.au/is-the-definition-of-racism-racist/
这就导致了两个问题。
首先,如果用户认为违反规则的一些内容被删除而另一些没有被删除,那么对用户来说,内容审核系统似乎是不一致的。这可能会导致用户不信任内容审核机制,或者认为它不公平地针对某些用户。从用户的角度来看,这些系统是模糊的黑匣子,很难解释为什么会出现这种不一致。
另一个问题是,标记的训练数据可能有矛盾的数据点。如果标注不一致导致两个非常相似的数据点具有相反的标注,那么模型的性能可能会受到影响,因为它要努力学习数据中的正确属性和模式。
数据标签可用性
获取标记数据通常是一个成本高昂的过程。对于许多内容审核任务来说,标记任务相对复杂,并且需要训练标记员。他们必须理解特定社会现象的某种定义。这与简单得多的标记任务形成对比,例如确定图像是否包含特定对象。
此外,与图像分类等任务相比,这些任务的公共数据集非常少,因为它们通常被视为收集数据的公司的财产。公司不太可能想要分享这些数据,因为他们认为这是他们竞争优势的一部分。
由于成本很高,可能很难获得足够大的数据集来轻松训练有监督的机器学习模型。为了解决这个问题,机器学习实践者必须经常求助于半监督或弱监督方法来扩充他们的数据集。通常,他们利用一小组手动标记的数据(“黄金标准”数据)来获取其他未标记的提交内容的标签。通过这种方法,他们能够从最初较小的手动标记的数据点池中创建大型数据集。
虽然这些方法很强大,但它们也有自己的问题。“黄金标准”数据中存在的偏差或误差很可能会传播到整个数据集。
算法偏差
当创建作用于社交内容的机器学习模型时,总是存在引入算法偏差的风险。算法偏差指的是一种算法(机器学习模型)创造了一种与某种种族或社会经济因素相关的不公平情况,例如通过不公平地惩罚某些人群,或者通过将人群从平台的其余部分中分割出来。
创建内容审核模型时,尽最大努力避免算法偏差是很重要的。如果您的模型考虑了用户配置文件特征,如位置或人口统计特征,则必须非常小心,以确保模型不会根据这些特征进行辨别。
例如,在网络欺凌检测模型中,如果模型的输入是性别,则它可以学习在涉及某个性别的情况下增加网络欺凌的概率。然而,由于网络欺凌通常更多地发生在该性别的人群中,该模型只是继承了社会的整体偏见。
在这种情况下,机器学习从业者必须小心谨慎,要么不使用某些人口统计特征,要么验证有用,非歧视性模式正在用它们学习。否则,这种模式可能成为歧视性的,并加剧先前存在的社会不平等。
对抗性
自然,对于那些内容被认为违反规则的人来说,这些系统被认为扼杀了他们在平台上的表达自由。因此,这些人通常会尽最大努力继续发布相同类型的内容,同时规避机器学习系统的标记机制。
这与其他机器学习环境非常不同,在其他机器学习环境中,输入数据通常只是原始的传感器数据或金融数据。一旦你将对手引入其中,学习的任务就会变得更加困难和微妙,因为这些对手会不断改变他们的方法以逃避检测。
一个常见的例子是垃圾邮件和诈骗/网络钓鱼检测**。**为了避免被发现,犯罪分子会尝试许多技术,例如改变文本的大小写和间距,用同义词替换单词,用数字或类似的非标准字符替换字符,以及将其实际内容嵌入到更大的非犯罪内容中。
这些对手愿意不断研究新方法来逃避检测,这意味着机器学习从业者必须不断重新评估他们的模型,以确保它们仍然有效。有时,这可能需要训练新的模型来处理新类别的规避方法。
用于内容审核的机器学习—简介
用于在线内容审核的机器学习系统综述
https://digital.wf.com/treasuryinsights/portfolio-items/tm13050/
概观
随着互联网的社交平台,如脸书和推特,越来越受欢迎,访问量越来越大,提交给它们的内容也越来越多。虽然这些平台的发展带来了许多好处,使人们能够保持相互联系,并在世界各地集体组织起来,但它也带来了一些问题,如假新闻的传播,以及网络欺凌等在线滥用。随着围绕这些互动空间的法律和社会环境的成熟,这些公司监管其平台的负担越来越重。他们对平台的维护和质量越来越负责。
然而,这些平台上有数十亿用户和数百万条消息和照片,这些公司不可能人工检查每一个。相反,他们通常利用机器学习系统来自动解析上传到他们网站的内容。被标记为违反规则的提交内容随后被提交给人工审查人员,他们将对该内容是否应该被允许出现在网站上做出最终判断。
什么内容得到审核?
首先,了解一些内容审核系统通常针对的内容示例非常重要。内容通常通过以下两种方法中的一种来处理,要么在提交可疑的滥用内容之前先发制人地发出警告,要么在事后删除和/或惩罚。
滥用内容
第一类涉及旨在在线骚扰或虐待某人或一群人的内容。这包括各种类型的行为,如:网络攻击、网络欺凌、仇恨言论和 doxxing。虽然这些社会现象中一些有点难以定义,但是公司仍然努力自动检测它们。在发生了几起不幸导致自残和自杀的网络欺凌事件后,脸书和 Instagram 等公司面临着越来越大的压力,要求它们增加报告选项,并加强监管。大多数滥用内容检测方法混合使用自然语言处理、图像处理和社交网络分析。
虚假/误导性内容
下一类涉及虚假或误导的内容,旨在利用社交网络加速虚假信息的传播,通常以新闻文章的形式出现。最常见的是,我们在带有政治色彩的短语“假新闻”下听到这些内容。检测假新闻是一个开放的研究领域,存在许多挑战,因为不可能手动检查每篇文章。当前的方法使用各种方法,例如结合大的一般/常识知识库、自然语言处理,以及通过社交网络分析和内容的风格元素结合各种基于声誉的因素。
裸露/露骨的内容
下一类涉及裸体和露骨的性内容。这通常通过图像处理方法来检测。不同的平台对此有不同的立场——例如,Instagram 根本不允许,而 Reddit 允许所有(合法)情况下的这种行为。最值得注意的是,Tumblr 最近决定改变他们对露骨内容的政策,并禁止色情和大多数裸体案例。
诈骗/网络钓鱼/黑客攻击
最后,我们有针对平台上用户的诈骗、网络钓鱼或黑客内容。这种类型的内容通常会试图让用户离开平台,使用另一个网站。在这个外部网站上,用户通常会被诱骗提交个人信息,或者向非预期方汇款。这通常是通过模仿原始网站上的 URL(通常通过同形异义攻击)或者通过使用外部网站向用户承诺更好的购买交易来实现的。这种内容通常通过自然语言处理、已知网络钓鱼链接的集合以及通过社交网络分析和账户因素的基于声誉的因素来检测。
https://www.pcmag.com/article/364947/how-to-avoid-phishing-scams
适度是如何发生的?
现在,我们已经了解了常见的审核内容类型,我们可以了解一下大多数自动内容审核系统是如何工作的。这通常发生在两个主要阶段。
自动标记
首先,当然,内容是由用户创建和提交的。
如果基于一些基本检查,该用户被认为是违规者或者内容非常明显地违反了规则,则该用户可能会被屏蔽,并且内容可能会自动隐藏,而他们并不知道。
否则,计算特征以输入到内容审核机器学习模型中。如果这些特征不是内容本身的函数(例如用户特征),则这些特征中的一些可能已经通过预定的批处理系统进行了计算,而如果这些特征是从提交的内容中直接导出的(例如涉及文本或图像的特征),则这些特征中的另一些可能是即时计算的。此外,提交后,如果内容被其他用户手动标记,它可能会被重新处理。
基于这些特征,机器学习模型输出可以被解释为概率的分数。如果这个分数高于某个阈值,该内容就会被标记为人工审查,因为它被怀疑违反了平台的规则。自然,由于这些企业的目标是优化其支出,因此通常会严格选择该阈值,以便优化某种衡量标准,平衡违规成本和人工标记成本。
人类评论
一旦内容被标记,它就会被传递给人工审阅者进行人工检查。他们通常会接受少量培训,以识别违规内容。这些人工审阅者操作非常快,可能只花几秒钟来审阅每一条内容。由于他们每天必须查看的内容类型,这些员工的工作条件被认为是有问题的。
在审查内容之后,审查者然后对内容是否违反任何规则做出最终判断。通常,每份提交的材料将被分配给几个评审员(~5 个),以便有希望消除由标签错误或不同解释引起的不一致的结果。
一旦有了最终的标签,如果内容违反了任何规则,就会被处理。这通常意味着内容被删除。用户的账户也可能被处罚或删除。
最后,这段内容随后被存储在其给定的标签旁边。内容标记机器学习模型的未来迭代将最有可能在其训练集中使用这一新数据。通过这一过程,没有数据被浪费,模型能够不断地被重新训练,并能够适应用户提交的变化模式。
用于客户分析的机器学习— 1
使用逻辑回归预测顾客反应
Photo by Ibrahim Rifath on Unsplash
语境
个人贷款是银行的主要收入来源,所有银行都主动接触潜在客户,为他们的贷款产品进行宣传。这些营销活动大多针对随机的客户数据库,因此最终会变成烦人的电话营销,而不是有效的线索转化手段。
在这篇文章中,我们将看到如何利用机器学习的力量将活动瞄准正确的客户群,从而增加转化倾向。我们将使用已响应和未响应个人贷款活动的客户的人口统计、银行详细信息和交易模式的过去可用数据,作为预测客户是否会响应活动的概率的训练数据。
在机器学习术语中,这是一个分类问题,有几种分类算法可用于构建预测模型,我们将使用逻辑回归。
关于逻辑回归
逻辑回归是一种流行且强大的监督机器学习技术,用于建立将独立预测因子(x 变量)与本质上是分类的响应变量(y)相关联的模型。在已知类的情况下,根据数据集中的预测变量,它可以帮助找到区分不同类中记录的因素。
当结果变量只有两类时(例如:通过/失败;欺诈/非欺诈;默认/无默认)如果我们有两个以上的类别(例如:买入/卖出/持有),则应用二项式逻辑回归和多项式逻辑回归。
逻辑回归是一种统计技术,它根据预测变量的统计显著性以及每个预测变量如何影响 Y 变量类别的概率来提供详细的统计摘要。这些独特的品质使该算法与银行和金融领域高度相关,以提供预测变量的详细和数字解释。
资料组
我们有一个数据集,它提供了一家银行执行的“个人贷款”活动的详细信息。向 20,000 名客户提供 14%利率的个人贷款,其中 2512 名客户积极响应。数据集和数据字典可以从这里下载。
高级方法
下面的流程图描述了我们使用逻辑回归寻找分类问题解决方案的高级方法,从定义问题陈述开始,到计算新客户分类模型的准确性。
High Level Approach
问题定义
我们将使用逻辑回归建立一个模型,预测客户对个人贷款活动的反应倾向(概率)。模型中的概率将用于对结果进行分类,并确定影响反应的变量。目标是建立一个模型,确定在未来的个人贷款活动中最有可能接受贷款的客户。
数据清理和准备
作为第一步,我们设置工作目录并将 csv 格式的数据集读入 R:
## Setting working directory and reading the csv file**setwd("F:/DataScience/BLOG/LogRegproject1")****loanorg <- read.csv("PLXSELL.csv")**
接下来,我们使用 R 中的基本命令查看数据集,以了解列及其数据类型,以及存在的记录数量。
## View the dataset using View, str, names in R**View(loanorg)** *(output not shown here)***dim(loanorg)** [1] 20000 40**names(loanorg)** ## [1] "CUST_ID" "TARGET"
## [3] "AGE" "GENDER"
## [5] "BALANCE" "OCCUPATION"
## [7] "AGE_BKT" "SCR"
## [9] "HOLDING_PERIOD" "ACC_TYPE"
## [11] "ACC_OP_DATE" "LEN_OF_RLTN_IN_MNTH"
## [13] "NO_OF_L_CR_TXNS" "NO_OF_L_DR_TXNS"
## [15] "TOT_NO_OF_L_TXNS" "NO_OF_BR_CSH_WDL_DR_TXNS"
## [17] "NO_OF_ATM_DR_TXNS" "NO_OF_NET_DR_TXNS"
## [19] "NO_OF_MOB_DR_TXNS" "NO_OF_CHQ_DR_TXNS"
## [21] "FLG_HAS_CC" "AMT_ATM_DR"
## [23] "AMT_BR_CSH_WDL_DR" "AMT_CHQ_DR"
## [25] "AMT_NET_DR" "AMT_MOB_DR"
## [27] "AMT_L_DR" "FLG_HAS_ANY_CHGS"
## [29] "AMT_OTH_BK_ATM_USG_CHGS" "AMT_MIN_BAL_NMC_CHGS"
## [31] "NO_OF_IW_CHQ_BNC_TXNS" "NO_OF_OW_CHQ_BNC_TXNS"
## [33] "AVG_AMT_PER_ATM_TXN" "AVG_AMT_PER_CSH_WDL_TXN"
## [35] "AVG_AMT_PER_CHQ_TXN" "AVG_AMT_PER_NET_TXN"
## [37] "AVG_AMT_PER_MOB_TXN" "FLG_HAS_NOMINEE"
## [39] "FLG_HAS_OLD_LOAN" "random"
在查看和研究数据集后,我们推断:
- 有 20,000 个观察值和 40 个变量。
- 我们混合了整数、数字和因子变量。
- 分类响应变量表示客户是否对活动做出响应,该变量称为“目标”。[0 -未回应/ 1 -已回应]
根据数据探索,我们还注意到需要以下操作来准备数据集以供进一步分析:
- 列 CUST_ID 和“随机”不是必需的,因为这些列是用于用一些 ID 表示调查参与者的(它们既不是 x 变量也不是 y 变量)。
##remove unwanted columns CUST_ID and random**loancamp <- loanorg[,-c(1,40)]**
- 有些变量的相同数据由数据集中的其他变量表示。分别是 AGE_BKT(用 AGE 表示)和 ACC_OP_DATE(用’ LEN_OF_RLTN_IN_MNTH '表示)。因此,年龄 _BKT 和 ACC_OP_DATE 可以从数据集中删除。
## remove columns AGE_BKT and ACC_OP_DATE**loancamp$AGE_BKT <- NULL
loancamp$ACC_OP_DATE <- NULL**
- 分类变量 TARGET,OLD _ 哈斯 _CC,OLD _ 哈斯 _ANY_CHGS,OLD _ 哈斯 _NOMINEE,OLD _ 哈斯 _OLD_LOAN 表示为整数数据类型。这些在 r 中被转换成范畴类型。
## Convert variables into correct datatypes (FLG_HAS_CC, FLG_HAS_ANY_CHGS, FLG_HAS_NOMINEE, FLG_HAS_OLD_LOAN, TARGET should be categorical)**loancamp$TARGET <- as.factor(loancamp$TARGET)
loancamp$FLG_HAS_CC <- as.factor(loancamp$FLG_HAS_CC)
loancamp$FLG_HAS_ANY_CHGS <- as.factor(loancamp$FLG_HAS_ANY_CHGS)
loancamp$FLG_HAS_NOMINEE <- as.factor(loancamp$FLG_HAS_NOMINEE)
loancamp$FLG_HAS_OLD_LOAN <- as.factor(loancamp$FLG_HAS_OLD_LOAN)****str(loancamp)**
四个不需要的列已被删除,上面列出的五个变量的数据类型已被更正。
让我们检查数据集中是否有缺失的值:
## Check for missing values in any of the columns**colSums(is.na(loancamp))**
数据集中没有缺失值。
既然数据集已准备好进行建模,让我们检查数据集中观察结果的基准客户响应率:
##Calculate baseline conversion rate**respons_rate <- round(prop.table(table(loancamp$TARGET)),2)
respons_rate**0 1
0.87 0.13
我们可以看到数据集明显不平衡—只有 13%的客户记录有响应(类别 1),而其余 87%的记录没有响应(类别 0)。这将对模型性能度量产生影响,我们将在本分析的后面部分详细了解这一点。
探索性数据分析
在本节中,我将使用 r 中的 ggplot2 以数据可视化的形式进一步探索数据集。这将有助于初步了解数值变量的分布以及影响响应变量的重要特征。
单变量分析
重要独立数值变量的直方图
## EDA - histogram plot for important numeric variables**library(ggplot2)
library(cowplot)****ggp1 = ggplot(data = loancamp, aes(x = AGE))+
geom_histogram(fill = "lightblue", binwidth = 5, colour = "black")+
geom_vline(aes(xintercept = median(AGE)), linetype = "dashed")**
Histogram of Numeric Variables
从直方图中我们可以看出
- 年龄的频率分布显示,26-30 岁年龄组的目标客户最多。
- 持有期(在账户中持有资金的能力)和与银行的关系长度或多或少是平均分布的。
- 这些客户的大部分信用交易在 0-15 英镑之间,而借贷交易少于 10 英镑。
重要独立数值变量的箱线图
Box plot of Numeric Variables
从箱线图中,我们可以直观地推断出:
- 箱线图显示了数字变量的以下中值:年龄约为 38 岁,持有期即在账户中持有资金的能力为 15 个月,与银行的关系长度为 125 个月,信贷交易次数为 10,借贷交易次数为 5。
- 对于变量信贷交易数量和借贷交易数量,存在许多异常值。
重要分类变量的柱状图
Bar plot of Categorical Variables
我们可以从柱状图中推断出
- 在贷款活动中,近四分之三的目标客户是男性。
- 工薪阶层和专业阶层构成了大部分目标客户。
- 四分之一的顾客有信用卡
- 数据集中有相同比例的客户有旧贷款或没有贷款。
双变量分析
**数值变量与目标( y 变量)**的箱线图
#bivariate analysis of AGE, LEN_OF_RLTN_IN_MNTH,HOLDING_PERIOD against TARGET**ggbi1 = ggplot(data = loancamp, aes(x = TARGET, y = AGE, fill = TARGET))+geom_boxplot()
ggbi2 = ggplot(data = loancamp, aes(x = TARGET, y = LEN_OF_RLTN_IN_MNTH, fill = TARGET))+geom_boxplot()
ggbi3 = ggplot(data = loancamp, aes(x = TARGET, y = HOLDING_PERIOD, fill = TARGET))+geom_boxplot()
plot_grid(ggbi1, ggbi2, ggbi3, labels = "AUTO")**
Box plot for numeric variables vs TARGET
当我们根据分类目标变量查看数值变量的双变量分析的数据可视化时,我们获得了以下见解:
年龄与目标(目标:响应贷款活动= 1;未响应贷款活动= 0)
对活动做出回应的客户的年龄中位数略高于未做出回应的客户。尽管这两个阶层在年龄上没有太大区别,我们也从与银行关系的月数与目标阶层的时间长度中得出这一推论。
对个人贷款活动做出响应的客户中,平均持有期**(在账户中持有资金的能力)较短,约为 10 个月。**
**分类 x 变量与目标( y 变量)**的堆积条形图
Stacked Bar plot for Categorical x variables vs TARGET
使用堆积条形图对分类 x 变量和目标 y 变量进行双变量分析有助于我们直观地了解以下情况:
- 我们发现,与女性客户相比,更多的男性客户(约 25%)对该活动做出了回应(相比之下,“其他”类别下的客户总数非常少)。
- 与工薪阶层的顾客相比,个体经营的顾客对利用个人贷款更感兴趣。
- 17%在银行有往来账户并被联系贷款的客户表示有兴趣,相比之下,有储蓄账户的客户有 11%表示有兴趣。
- 客户有未决的费用要支付给银行或没有未决的费用,似乎对响应或不响应活动没有任何影响。我们看到在银行有旧贷款的客户也有类似的模式。
- 与没有信用卡的顾客相比,持有信用卡的顾客对贷款更感兴趣。
将数据集分为开发(定型)集和维持(验证或测试)集
接下来,我们将把数据集分成训练数据集和测试数据集。我们将基于训练数据集构建模型,并使用测试数据集测试模型性能。
## split the dataset into training and test samples at 70:30 ratio**library(caTools)****set.seed(123)****split = sample.split(loancamp$TARGET, SplitRatio = 0.7)
devdata = subset(loancamp, split == TRUE)
holddata = subset(loancamp, split == FALSE)**## Check if distribution of partition data is correct for the development dataset**prop.table(table(devdata$TARGET))
prop.table(table(holddata$TARGET))**
上面的 prop.table 输出证实了我们在原始数据集中看到的不平衡数据集特征在开发和保留样本中保持相同的比例。
现在,训练数据集已准备好构建模型。
建立基于逻辑回归的预测模型
逻辑回归的步骤
步骤 1:对训练数据运行逻辑回归
在 R 中使用广义线性模型命令 glm 来使用逻辑回归建立模型。
**library(glmnet)
logreg = glm(TARGET ~., data=devdata, family="binomial")**
步骤 1a:可变膨胀系数检查
让我们根据生成的模型,通过可变通货膨胀系数(VIF)检查来检查 x 变量之间的多重共线性。
**library(car)****vif(logreg)**
VIF 值大于 4 的要素(x)变量表示高度多重共线性。
从下表中,我们注意到以下变量具有大于 4 的 VIF 值:远程登录数量、远程登录数量、远程登录数量、远程登录数量、远程登录数量、远程登录数量、远程登录数量、AVG 远程登录数量、远程登录数量、远程登录数量。
VIF output showing variables with VIF value above 4
我们从训练和测试数据集中删除这些具有高度多重共线性的 x 变量,并重新运行模型。这将有助于确定明显影响响应变量(TARGET-y 变量)的变量,并建立一个可以更准确地对记录进行分类的模型。
重复这个过程,直到我们得到值低于 4 的干净的 VIF 输出。
步骤 2:模型的总体意义
**library(lmtest**) **lrtest(logreg1)**
我们可以看到,低 p 值表明模型非常重要,即客户对活动(目标)做出反应的可能性取决于数据集中的独立 x 变量。
第三步:麦克法登或伪 R 解读
**library(pscl)****pR2(logreg1)**
基于麦克法登 R 的值,我们可以得出结论,仅截距模型的 8.7%的不确定性是由完整模型(当前 x 变量)解释的。该值表示拟合优度低。这可能表明需要添加更多的 x 变量来解释响应(y)变量的变化。
第四步:个别系数的意义和解释
**summary(logreg1)**
从生成的模型的总结中,我们推断有一些 x 变量基于它们的 p 值是显著的。这些是影响客户对活动做出回应的 x 变量,如下表所示。
每个 x 变量的比值比和概率是基于公式计算的,
优势比= exp(系数估计值)
概率=优势比/ (1 +优势比)
Summary of Logistic Regression Model with Odds Ratio and Probability
逻辑回归总结的推论:
- 如果客户是个体户,他回应的几率是不回应的 1.88 倍。换句话说,他响应竞选的概率是 65%。
- 如果他有一张信用卡,那么响应竞选的几率是 1.84。
- 如果客户有旧贷款或属于工薪阶层,那么他们响应活动的概率会下降到 50%以下,即他们不太可能响应。
预测验证数据
使用我们刚刚构建的模型,让我们尝试预测验证样本中记录的倾向和类别。请注意,我们已经知道了这些记录的类,并将使用该输入来比较和发现新模型在分类新记录时有多好。
**holddata1.predict.score=predict(logreg1,newdata = holddata1, type="response")**
该模型具有验证集中各个记录的输出倾向。
为了确定基于概率对记录进行分类的临界值,我们查看预测概率的分布。
如果我们看一下分布,大多数记录的概率值都在 10%以下。因此,我们使用临界值 0.1 来预测记录的类别。
## Assgining 0 / 1 class based on cutoff value of 0.1
**holddata1$Class = ifelse(holddata1.predict.score>0.1,1,0)**
模型已经预测了每条记录的类别(目标值 0 或 1)。让我们创建混淆矩阵,看看模型根据验证集中这些记录的已知目标值对记录进行分类的效果如何。
模型性能—混淆矩阵
混淆矩阵提供了模型准确性的清晰快照。
## Creating the confusion matrix
**tabtest=with(holddata1, table(TARGET,Class))****tabtest**
Confusion Matrix of Test Data
在这里,敏感性比准确性更重要,因为我们更感兴趣的是了解客户会对新活动做出反应的所有记录,而不是客户可能根本不会做出反应的记录。由于模型分类(敏感性)不正确,联系潜在客户(该客户将获得贷款并因此向银行支付利息)的机会成本损失比由于分类不正确(特异性)而收到邮件或电话的潜在无响应客户更为严重。
当我们比较训练数据和测试数据之间的模型性能度量时(见下表),模型对测试数据保持良好,而性能度量没有显著下降。这表明模型中没有过度拟合。
为了使用该模型预测类别,我们有意识地在准确性上做出妥协,以获得更好的敏感性,即不会失去对贷款活动做出反应的潜在客户。
可行的见解
基于上述模型,我们可以向银行提出以下建议:
- 不要给随机的一组客户打电话,而是瞄准具有以下一种或多种特征的客户——男性客户、个体户、持有信用卡、在银行有过或曾经有过一些费用。
- 避免联系已经贷款和/或工薪阶层的客户。
结论
在这里,我们使用了二项式逻辑回归技术,不仅预测了响应贷款活动的客户类别,还获得了影响客户对活动响应的统计显著性独立变量列表。我们还能够根据模型摘要预测客户响应或不响应的概率。这些提供了强有力的见解,将有助于提高客户的回应率,从而转化为银行贷款。
资源
面向数据分析师的机器学习— BigQuery ML
BigQuery 中使用 SQL 的机器学习介绍
数据分析包括分析原始数据,以提取有价值的见解。这些见解经常被用作未来决策的辅助手段。
被分析的数据通常以一种或多种格式存储。这些可以是平面文件或文本文件(逗号分隔,制表符分隔),电子表格(Excel,Google Sheets),数据库和其他格式。
我第一次使用结构化查询语言(SQL)是在 2000 年左右的 MySql 早期版本。当时,我不得不访问该网站下载安装程序(我使用的是 Windows)和文档。正是从那里,我了解了 DML 和 DDL。那时,我必须下载并安装软件,并决定我想要运行什么引擎,如果我想要复制,我必须自己设置它。我不得不关注性能调优,当我的负载增加时进行扩展,并想出如果我的存储空间用完了该怎么办。
多年来,我一直在使用其他数据库,包括来自微软、甲骨文和 IBM 的产品。
虽然许多数据库供应商已经转而提供托管服务,但有一家供应商让我印象深刻。这是谷歌的 BigQuery。Google 云平台是一个很棒的产品,但是现在让我们只关注 BigQuery。
BigQuery 是谷歌提供的无服务器服务。这意味着,您不需要调配或管理它。您不需要指定打算使用多少存储空间,也不需要指定希望将哪种处理器连接到数据库服务器。相反,它会扩展以适应您的工作需求。
它能够存储大量的数据。然而,它是为数据分析工作负载而设计的,这意味着它不希望您存储的数据频繁更改。如果你来自旧数据库的世界,它是为 OLAP 设计的,而不是 OLTP。
BigQuery 将在没有任何准备的情况下存储数千万亿字节的数据。您可以通过实现分区策略来帮助您的情况,这将大大加快您的数据检索。我还需要提一下,数据检索已经很快了,你不用做任何事情。
您可以通过查看它们托管的公开可用的数据集来开始使用 BigQuery。你可以在这里找到那些。
将您自己的数据导入 BigQuery 非常容易。从 BigQuery 控制台,您可以单击项目名称并创建数据集。一旦有了数据集,就可以继续创建表或将数据导入表中。
BigQuery Console
查询要求您指定项目、数据集以及表名。下面是一个查询示例。
#standardSQL
SELECT
weight_pounds,
state,
year,
gestation_weeks
FROM
`bigquery-public-data.samples.natality`
ORDER BY
weight_pounds
DESC
LIMIT 10;
Query Result
按住 Command(或 Windows 中的 CTRL)并单击查询中的表名,将显示表的详细信息。您还可以访问表模式。
在查询编辑器下面的栏中,有一个验证器,它告诉您查询是否有效,以及如果您要执行它,该查询将处理多少数据。
Query Validator
将数据导入 BigQuery 的一种流行方式是将文本文件上传到 Google 云存储桶中。从那里,您可以将 BigQuery 指向该文件,并将其导入到一个表中。
Table Creation
Specifying Details during Table Creation
一旦将数据导入 BigQuery,就可以继续运行查询了。
查询很有趣。它们告诉你已经发生了什么,让你清楚地了解过去。你可以称之为描述性分析。我卖出了多少件商品,订单多长时间来一次,特定商品在一周的哪几天卖得最多?
查询能告诉你未来会发生什么吗?你能根据一天中的时间预测销售额,同时考虑季节性吗?
我们正在进入预测分析的领域,更正式的名称是机器学习。我们需要从我们的数据中提取洞察力,这将让我们对以前看不见的数据做出预测,但首先,我们试图解决的问题需要被框住。机器学习本身分为三类:监督学习、非监督学习和强化学习。本文将关注前两者。
监督学习处理的情况是,你想要预测的内容包含在你已经收集的数据中。考虑这样一种情况,您希望根据一天中的时间和日期来预测供应商可能售出的水瓶数量。这叫做回归。您试图预测的值称为标签或目标,您用来进行预测的信息称为特征。
考虑另一个场景,你试图预测的是电子商务网站的访问者是否会购买。这叫做分类。这仍然是监督学习,因为你需要历史数据来显示你网站的访问者是否进行了购买。
无监督学习处理的是有历史数据但没有标签的情况。例如,您有关于客户交易的数据,并且您希望将这些交易放入聚类中,以便进行营销或新产品开发。
一种训练机器学习模型的方法涉及最小化损失。你可以在这里快速入门。所有这些都涉及到大量的数学和统计,以及行业专用术语,如优化器、梯度下降、学习率、过拟合和欠拟合、偏差-方差权衡、超参数调整,以及许多普通数据分析师可能不想涉及的词汇。还有一个事实是,处理编程语言是强制性的。
谷歌的 BigQuery 团队认为,如果数据分析师可以训练机器学习模型,而不必在只使用 SQL 的情况下处理大部分数学和术语,那就太好了。这就产生了 BigQuery ML 。
BigQuery ML(也称为 BQML)支持线性回归、二元逻辑回归(两个类之间)、多类逻辑回归(属于多个类中的一个)和 k-means 聚类(用于数据分段的无监督学习)。
BigQuery ML 出奇的简单。您需要了解的第一个对象是model
。与表和视图类似,模型存储在数据集中。
创建模型由两部分组成。第一部分指定模型参数,包括数据集和模型的名称以及模型的类型。第二部分指定用于训练的数据,并包括标签。不是标签的每一列都被认为是特征。
考虑下面的查询。
第一行通过指定数据集和名称来定义模型。第二行将模型类型指定为逻辑回归。随后的几行通过从 BigQuery 公共数据集中获取一些数据来提供训练数据,该公共数据集中托管了一些来自电子商务站点的数据。注意,选择有一个名为标签的列,这就是我们试图预测的。另外,请注意,它被设置为 0 或 1,因为计算机喜欢处理数字。查询中的两个新内容是表名如何使用通配符和表后缀范围。以上是 BigQuery 的一些特性,很容易学习。
逻辑回归模型给出了数据归入我们表示为 1 的一类的概率。如果概率低于 50%,则数据属于表示为 0 的替代类。50%是一个阈值,您可以根据自己的需要进行更改。你可以在这里了解更多。
创建模型时要记住的一点是,标签列不能是NULL
。
create model
的语法如下:
{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
[model_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create#model_name)
[OPTIONS([model_option_list](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create#model_option_list))]
[AS [query_statement](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create#query_statement)]
model_type
可以是logistic_reg
、linear_reg
或kmeans
。
如果你对机器学习有所了解的话,不妨具体说明一下:l1_reg
、l2_reg
、max_iteration
、learn_rate_strategy
、learn_rate
、early_stop
、data_split_method
、data_split_col
、ls_init_learning_rate
、warm_start
。这些参数都在这里描述。
当模型完成训练时,您将得到确认,并且该模型将出现在您的数据集中。
Result of model training
您可能对培训选项感兴趣,当您向下滚动描述页面时会看到这些选项。
Model Training Options
您可以单击“培训”按钮打开选项卡,看到类似以下内容:
Training Report
该信息也以表格形式提供。在每次迭代中,您可以看到训练数据和评估数据的损失是如何减少的。您还可以看到用于该训练迭代的学习率。
Training Report
还提供了评估指标。你可以在找到更多关于精确和回忆的信息。你可以在这里找到更多关于 ROC 的信息。混淆矩阵告诉你模型的准确性,即预测正确的百分比。
Evaluation Metrics
模型需要用一种叫做评估数据集的东西来评估。本质上,您并没有使用所有的数据来训练模型。相反,您应该留出 20%到 30%的数据来评估模型的质量。模型评估的语法如下:
ML.EVALUATE(MODEL [model_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-evaluate#eval_model_name)
[, {TABLE [table_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-evaluate#eval_table_name) | ([query_statement](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-evaluate#eval_query_statement))}]
[, STRUCT(<T> AS [threshold](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-evaluate#eval_threshold))])
为了评估模型,您调用ML.EVALUATE()
函数。型号名称是必需的。如果不想使用 50%,可以选择传入一个评估数据集和一个阈值。下面是我们如何评估上面创建的模型。
模型评估的结果如下所示:
The output from model evaluation
在处理二元分类模型时,您可能会对称为接收器操作特性曲线的东西感兴趣。其语法如下:
ML.ROC_CURVE(MODEL [model_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-roc#roc_model_name)
[, {TABLE [table_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-roc#roc_table_name) | ([query_statement](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-roc#roc_query_statement))}]
[, GENERATE_ARRAY([thresholds](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-roc#roc_thresholds))])
这就是我们如何为我们的模型生成 ROC 曲线。
运行上述查询的结果类似于以下内容:
ROC Curve
最后,在处理分类模型时,您可能会对混淆矩阵感兴趣。这是一个交叉列表,列出了哪些是正确分类的,哪些不是。例如,使用二进制分类,我们得到四个单元:真阳性、真阴性、假阳性和假阴性。其语法如下:
ML.CONFUSION_MATRIX(MODEL [model_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-confusion#eval_model_name)
[, {TABLE [table_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-confusion#eval_table_name) | ([query_statement](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-confusion#eval_query_statement))}]
[, STRUCT(<T> AS [threshold](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-confusion#eval_threshold))])
当生成混淆矩阵时,我们的模型的查询看起来是这样的:
混淆矩阵看起来如下所示:
Confusion Matrix
我们终于准备好利用我们的模型通过ML.PREDICT()
进行预测了。你可以在这里找到更多关于这个函数的行为。语法如下:
ML.PREDICT(MODEL [model_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-predict#predict_model_name),
{TABLE [table_name](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-predict#predict_table_name) | ([query_statement](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-predict#predict_query_statement))}
[, STRUCT<threshold FLOAT64> settings)])
以下查询显示了我们将如何使用我们的模型进行预测。没有标签的查询被用作预测的输入。
输出将包含一个predicted_label
列,这是模型做出的预测。使用分类模型,您还会得到一个概率列。
Model Prediction
总之,BQML 使得为回归、分类和聚类创建机器学习模型成为可能。虽然这篇文章将带您走上构建模型的道路,但它不会让您擅长于此。你至少需要很好地理解机器学习理论。
你需要知道什么是学习率,梯度下降是如何工作的,偏差-方差权衡,正则化,提前停止,以及其他机制。了解这些东西的一个好地方是谷歌的机器学习速成班,可以在这里找到。
最需要学习的是特征工程。您需要理解数据,以及特征之间的相关性意味着什么。正是特征工程最终导致了好的模型。
通过机器学习清理和统一您的数据
Photo by Mike Kononov on Unsplash
数据科学家今天面临的最大问题是脏数据。当涉及到真实世界的数据时,不准确和不完整的数据是常态而不是例外。问题的根源在于记录的数据不符合标准模式或违反完整性约束的来源。结果是脏数据被传送到下游的系统,如数据集市,在那里很难清理和统一,从而使其不可靠地用于分析。
如今,数据科学家在应用任何分析或机器学习之前,往往会花费 60%的时间清理和统一脏数据。数据清洗本质上是删除错误和异常,或者用数据中的真实值替换观察值,以在分析中获得更多价值的任务。有传统类型的数据清理,如输入缺失数据和数据转换,也有更复杂的数据统一问题,如重复数据删除和修复完整性约束违规。所有这些都是相互关联的,理解它们是什么很重要。
数据清理和统一问题
模式映射查看多个结构化数据,并判断它们是否以相同的方式谈论同一件事情。在下面的例子中,“建筑#”和“建筑代码”都代表建筑编号吗?
Schema Mapping
记录关联是指在数据中多次提到同一个现实世界的实体。每个源的不同格式样式导致记录看起来不同,但实际上都指向同一个实体。在下面的例子中,所有四个表记录都指向同一个医学实验室。
Record Linkage & Deduplication
缺失数据是指数据集中缺失的值。缺失值插补是用替代值替换缺失数据的过程。实际上,问题更复杂,因为丢失的数据不是由空值表示,而是由垃圾表示,如下例所示。
Missing Data
完整性约束确保数据遵循功能依赖性和业务规则,这些规则规定了哪些值可以合法地共存。从数据中推导出约束可能非常困难,尤其是因为大多数数据关系并不明显。在下面的例子中,简·史密斯是医学实验室和管理大楼的大楼经理,这违反了业务规则。根据这条规则,要么简·史密斯不是这两栋楼的管理人员,要么医学实验室实际上是一栋管理大楼,要么管理大楼是一个医学实验室。
Integrity Constraint
上面我们已经看到了一些数据质量挑战。问题是,大多数数据科学家都在使用基于规则的工具和 ETL 脚本,它们孤立地处理每一个数据质量问题。然而事实是,大多数数据(如下图所示)通常都存在数据质量问题,并且它们以复杂的方式相互作用。问题不仅仅是工具不能处理数据质量问题之间的交互。由于高水平的计算,这些解决方案甚至不能在大型数据集上很好地扩展,并且在进行足够的校正之前需要多次通过。
Most datasets contain several data quality issues (source)
用于数据清理和统一的机器学习
考虑到当前解决方案的问题,科学界正在倡导用于数据清理的机器学习解决方案,这些解决方案以整体方式考虑所有类型的数据质量问题,并可扩展到大型数据集。
实体解析是数据统一任务的一个很好的例子,其中机器学习是有用的。实体解析中涉及的三个主要任务是重复数据删除、记录链接和规范化。重复数据消除的核心是消除重复数据的重复拷贝。通过记录链接,我们的目标是识别引用不同来源的相同实体的记录。规范化是指我们将具有多种表示形式的数据转换成标准形式。这些任务可以被描述为“分类”和“聚类”练习,通过足够的训练,我们可以开发模型来将记录对分类为匹配或不匹配,并将记录对聚类成组以选择最佳记录。
下图直观地展示了这一过程。
The deduplication process (source)
python 重复数据删除库是可扩展 ML 解决方案的一个示例,用于跨不同的结构化数据集执行重复数据删除和记录链接。为了有效地工作,重复数据删除依靠领域专家将记录标记为匹配或不匹配。领域专家很重要,因为他们擅长识别哪些字段最有可能唯一地标识记录,并且他们可以判断记录的规范版本应该是什么样子。
记录修复是 ML 在数据清理中的另一个应用,也是统一项目的一个重要组成部分。修复记录主要是预测源数据记录中错误或缺失属性的正确值。关键是建立一个模型,结合完整性约束、外部知识和定量统计等信号,对缺失或错误值进行概率推断。
HoloClean 系统是 ML 解决方案的一个这样的例子,其中用户提供要被清理的数据集和一些高级域特定信息,例如参考数据集、可用的规则和约束以及数据库内类似条目的例子。然后,系统修复从冲突和拼写错误的值到离群值和空条目的错误。在下面的例子中,用户可以指定拒绝约束(捕获领域专业知识的一阶逻辑规则),如城市、州、地址- >邮政编码,以确定行 1 与行 2 和行 3 中的信息冲突。
Repairing Integrity Constrain Violations (source)
提供可扩展的 ML 解决方案
使用传统方法进行数据清理和统一的组织已经构建了许多遗留操作,包括带有业务规则和领域知识文档的 ETL 脚本。忽略所有这些工作是许多新解决方案在改进遗留操作方面不起作用的主要原因。一个大的 ML 挑战是如何从遗留操作中获取信息来指导 ML 解决方案的学习过程。一种选择是使用传统操作来构建训练数据,但是数据有可能是有偏差的和有噪声的。
由于数据清洗和统一通常在数据源执行,ML 解决方案需要能够在大规模数据集上进行推理和预测。采用前面提到的重复数据删除解决方案;分类本质上发生在发现记录对之间的相似性上,并且这是一个计算量大且慢的 n 平方问题。因此,设计使用采样和哈希等技术来降低复杂性的解决方案变得非常重要。
对于任何 ML 解决方案来说,让人们成为流程的一部分是非常重要的。像领域专家和 IT 专家这样的角色在将遗留操作转换为有用的特征和标签以生成用于 ML 解决方案的训练数据、验证 ML 预测对数据质量的结果以及评估 ML 清理和统一对下游分析的影响方面是必不可少的。
总之,在源头进行数据清理和统一对于为下游组织创建值得信赖的分析至关重要。重要的是要认识到,数据质量问题不能孤立地得到妥善解决,提供清理和统一数据的整体方法的机器学习解决方案可能是最佳解决方案。与此同时,我们必须明白,为了开发在组织层面上工作的可扩展的 ML 管道,我们必须确保这些解决方案建立在遗留操作的基础上,并将人带入循环中。
如果你需要帮助或者有更多关于基于 ML 的数据清理解决方案的问题,请通过 LinkedIn 联系我。
日内交易的机器学习
A scene from ‘Pi’
在这篇文章中,我将探索用于时间序列分析的机器学习算法,并解释为什么它们不适用于日内交易。如果你是这个领域的新手,你可能会被作者用惊人的结果愚弄,在这些结果中,测试数据与预测几乎完全匹配。一个常见的技巧是显示一个带有长时间数据预测值的图,这造成了一种滞后不明显或者根本看不到的错觉。滞后是让预测变得无用的原因,稍后我会给你一个例子。还有其他方法让预测看起来合理,其中一些我确信是错误的。但是不要气馁,记住模型可以和你的数据一样好,缺乏模型是你获得可靠结果的主要绊脚石。
日内交易的真相
日内交易是在一天内买卖股票的过程。它可以简单到在早上买入一家公司的股票,然后在一天结束时(准确地说是下午 4 点)卖出。虽然这一行为本身很简单,但它需要大量的经验和手头的信息来购买可能上涨的股票。日内交易风险很大,因为市场的短期行为反映了数十亿快速波动的价值,这些价值是对接近随机游走的不断变化的条件的反应。超过 95%的交易者亏损。
机器能打败人类吗?
Small Trading Setup
交易需要大量的注意力和对市场的敏感性。有经验的交易者依赖多种信息来源,如新闻、历史数据、收益报告和公司内部人士。风险很高,需要考虑许多变量。出于这个原因,一些金融机构完全依赖机器进行交易。这意味着一台高速互联网连接的电脑可以在一天内执行数千次交易,从微小的价格差异中获利。这叫高频交易。没有人能和这些算法竞争,它们非常快而且更准确。
这种方法的缺点是,普通人可能无法获得这种工具,或者它们太贵了。然而,通过 Robinhood 或 TD Ameritrade 等交易平台,任何个人都可以通过电脑或智能手机参与股市交易。而且你甚至不用付经纪费,这对新手来说很有吸引力。
作为一名数据科学学生,我非常热情地尝试了不同的机器学习算法,并回答了这样一个问题:机器学习可以用来预测股市运动吗?
我们开始吧
我最喜欢的获取市场和上市公司信息的地方之一是 finance.yahoo.com。你可以用技术指标查看历史数据,阅读公司财务报表,新闻等。
我从纳斯达克市场挑选了我个人感兴趣的科技公司。对于这个项目,我构建了几个技术指标,方式与你在雅虎财经上看到的类似。让我们看看特斯拉的历史数据,感受一下我们在处理什么。
价格几乎没有离开布林线的空间。这告诉我们价格在两个标准差之间上下波动。我们可以用这个指标作为买卖股票的信号。
移动平均收敛发散(MACD)是一个动量指标,显示了证券价格的两条移动平均线之间的关系。通常,当 MACD(紫色线)超过信号(橙色线)时,意味着股票正在上涨,并将持续上涨一段时间。
相对强度指数(RSI)是另一个动量指标,可以判断股票是超买还是超卖。它的范围从 0 到 100,但一般来说,当指数接近 20 时,我们会注意,这将是买入的信号。如果接近 80,最好快点卖掉。
可视化有助于理解技术指标是如何工作的,以及它们的优缺点。让我们转到机器学习部分,所有的神奇都发生在这里。
为什么 ARIMA 不起作用?
自回归综合移动平均(ARIMA)模型用于预测时间序列数据,它基于数据点彼此相关的假设。如果数据不相关,模型将无法做出预测。自相关函数(ACF)将显示数据点是否有这种关系。我们来看看剧情:
ACF
数据点确实不相关,因此使用 ARIMA 来预测未来值是不合理的。不显示著名的滞后预测将是一种犯罪,所以这里是:
这就是我们在这里需要知道的一切,让我们转向更有前途的神经网络。
深度神经网络
当交易者使用历史数据和技术指标来预测股票走势时,他们会寻找熟悉的模式。一些类型的神经网络在寻找模式方面表现出色,并在图像识别或文本处理方面有多种应用。
首先,我尝试用卷积网络来识别历史数据中的模式。它可以接受任意数量的特征,并同时从中学习。在这个例子中,网络必须从 21 天的序列中学习并预测第二天的股票回报。我说的回报是指一天开始和结束时的价格差异。如果价格上涨,收益为正,下跌,收益为负。
那么它表现如何呢?网络容易过度拟合,这意味着它很好地学习了训练数据中的模式,但未能对测试数据做出任何有意义的预测。准确性和随机猜测一样好。
Overfitting (Accuracy: 80%)
递归网络(LSTM)也擅长从序列数据(即时间序列)中学习。在相同的序列长度和特征数量下,网络无法从数据中学习到任何东西。
让我们来看看预测。该网络采取了一条简单的路线,并决定每天的回报将是负的。它有 50%的正确率。
我已经尝试了数百种网络架构、功能数量、序列长度、超参数调整、预测第二天/周/月的组合。结果和随机猜测一样好。
显然,神经网络在这里也不起作用。
模式匹配
这种技术背后的想法是在测试集中取一个 9 天的序列,在训练集中找到相似的序列,并比较它们的第 10 天的回报。如果某个算法找到了多个序列,它会简单地对结果进行平均。让我们来看看这个过程:
粉色线是来自训练集的 9 天序列。该算法找到了 5 个匹配,其中三个在第 10 天有正回报,两个是负回报。取平均值,我们得到了一个正的预期回报。与测试集的实际回报相同。它工作了。
但是通过整个测试集匹配模式给了我大约 50%的准确率。魔法也没有在这里发生。
有希望
Photo by Kristopher Roller
我的技术都不起作用,但是如果你还想在股票市场上赚钱,有一个替代日交易的方法。使用技术指标的经典方法可以为短期投资提供良好的回报——从几天到大约一个月不等。它是这样工作的:我只用两个指标模拟了一个交易策略:布林线和 MACD。大多数指标都讲述了同样的故事,因为它们使用了同样的历史数据:价格或交易量。因为这个原因,我没有把它们组合在一起,而是分开使用。
我做了一个模拟,假设你在价格接近较低区间时买入股票,反之亦然。2018 年初,该算法有 15000 美元投资特斯拉。到年底,它仅通过 19 笔交易就获得了超过 100%的利润。
布林线对特斯拉很有效,但对其他股票就不那么有效了。例如,亚马逊的回报率为负。因此,它并不完美,但它对我尝试过的大多数股票都有效(总共 19 只)。
另一方面,MACD 的表现要差得多。这让我觉得它可能是布林线或其他指标的一个很好的补充,但它本身不是。
结论
这个项目的一大收获是,股票市场是一个非常复杂的系统,仅用历史数据来解释其行为是不够的。机器学习算法将其视为随机行走或白噪声。基本面分析、twitter 分析、新闻分析、本地/全球经济分析——诸如此类的东西有可能提高预测。
项目仓库住在这里。
感谢您的阅读,
阿瑟尼。
Picture made by Microsoft stock data
营销人员的机器学习
简介
随着电子商务、数字和移动技术的进步,以及消费者人口统计数据的变化,营销职能正在快速发展。Forrester 最近的一项研究【1】表明,到 2022 年,电子商务将占零售总额的 17.0%,高于 2017 年预计的 12.9%。这一趋势表明,越来越多的人开始在网上购物,或者在店内购物时受到数字活动的严重影响。
随着拉美裔和千禧一代等消费群体的增长,美国的人口统计数据正在快速变化,因此充分了解这些客户群体以向受众提供个性化和有针对性的信息至关重要。最近的一项研究【2】表明,将近一半(49%)的西班牙裔和拉丁裔消费者在购物过程中使用社交媒体,相比之下,所有种族的这一比例为 32%。因此,深入了解消费者并拥抱快速发展的技术进步以提供以客户为中心的全渠道体验至关重要。
营销人员的任务是成为首席执行官中客户的代言人,并在为消费者提供深入的个性化体验方面发挥关键作用。营销组织的成长与三件事密切相关
1.数据 2)营销技术栈和 3)人工智能/机器学习(AI-ML)
在本文中,我们将概述人工智能和机器学习(尤其是与客户分析相关的)将如何推动组织的增长。数据和人工智能/人工智能是推动营销人员推动组织创新的关键驱动力。做出高速数据驱动决策的组织将成为强大的营销先锋。
实现愿景的挑战
在我们深入研究 AI-ML 之前,以集成的方式获得高质量的数据以执行分析是至关重要的。许多组织仍在处理 excel 数据湖、孤岛式数据集和陈旧数据(旧数据和非实时数据)。这阻碍了营销团队得出一致且准确的报告指标,因为每个营销分析师使用不同的业务规则并得出不同的数字。因此,无论是在 CRM、CDP(客户数据平台)【3】还是在数据仓库/数据湖中,拥有一个整合的数据平台对任何组织来说都是至关重要的。重要的是不要迷失在这些系统中,而是理解营销用例,以确保正确的技术和基础设施到位。
在本文中,我们假设营销职能已经达到这一成熟水平,因此组织可以超越数据整合,寻求从高级分析中提取价值。整合的实时数据的基础是能够 360 度了解客户。
营销组织的 ML
一旦高质量的数据以可消费的方式可用,下一步就是为组织识别 AI-ML 用例。这里是营销人员可以考虑的最常见的使用案例,以便为客户提供个性化的体验。
1.细分和定位
2.客户流失
3.客户生命周期价值
4.推荐引擎
5.营销组合建模
6.客户归属
Common Machine Learning Use Cases for Marketers
总结
整合分析战略是首席营销官(CMO)刺激创新和增长的关键。大多数组织都会经历这一过程,最终实施高级分析,为客户实现超个性化。
Typical Analytics Journey of Organizations
这一切都从 CRM 数据库中的运营报告开始,然后发展到创建基于指标的报告,最终实现高级数据可视化。Tableau、Power BI 或 QlikView 等可视化工具是可视化类别【4】的领导者。
随着组织转向预测分析和其他高级分析,可以使用各种工具,从开源工具到付费工具。最流行的开源工具是 Python【5】和 R,并且有一个繁荣的社区【6】为这个知识库做出了贡献。
底层数据基础需要支持这些用例,许多组织正在向数据湖【7】转移。最流行的数据湖是由 AWS 提供的,使用了 AWS S3 和亚马逊红移【8】。云数据湖为集成和整合的数据提供了基础架构,使分析和机器学习开发人员能够生成可用于为客户提供个性化体验的见解。
一旦数据基础到位,分析用例得到实施,一个伟大的营销组织应该建立实验来不断测试、迭代和学习,以尽可能避免猜测。从长远来看,拥有复杂的客户分析并与客户进行更多双向互动的公司最有可能胜出。
注意:完整的白皮书和相关的用例可以从这个链接下载——https://www . element solutions . com/machine-learning-for-retail-markets-white-paper
关于作者
Yasim Kolathayil 是 Element Solutions 的数据科学总监。Yasim 对客户分析特别感兴趣,并且长期以来一直是客户分析的热心学生。
[1]https://www . Forrester . com/report/Forrester+数据+线上+零售+预测+2017+至+2022+US/-/E-RES139271
[2]https://www . prnewswire . com/news-releases/Deloitte-digital-study-digital-infected-sales-in-retail-brick-and-mortar-stores-to-reach-22 万亿-by-year-end-300082524.html
[3]https://www . element solutions . com/services/customer-data-platform
[4]https://power bi . Microsoft . com/en-us/blog/Gartner-positions-微软连续十年成为商务智能和分析平台的领导者/
[5]https://www . ka ggle . com/amberthomas/ka ggle-2017-调查-结果
[6]https://stackoverflow.blog/2017/10/10/impressive-growth-r/
[7]https://AWS . Amazon . com/big-data/data lakes-and-analytics/what-a-data-lake/
[8]https://aws.amazon.com/redshift/
当你不是物理学家时,对粒子数据的机器学习
Photo credit: Pixabay
如何通过 Python 使用 H2O 深度学习模型进行监督分类
本文介绍了深度学习与 H2O 、 H2O.ai 的开源机器学习包,并展示了如何使用一个 H2O 深度学习模型来解决监督分类问题,即使用 ATLAS 实验来识别希格斯玻色子。
我们没有粒子物理学的知识,但我们仍然希望应用先进的机器学习方法来看看我们是否可以准确地预测粒子碰撞事件是希格斯玻色子信号还是背景噪声。
请注意,将机器学习方法应用到你不熟悉的领域,并不是说,没有领域专业知识也能成为一名称职的数据科学家。它们是不同的东西。记住这一点,让我们开始吧。
安装 H2O
用 Python 安装 H2O 相当简单。我按照 H2O 官方文件上的说明:下载&安装 H2O 。它就像一个魔咒!
初始化 H2O 并加载数据
数据集可以在这里找到。我们加载 H2O Python 模块。
- 在我的本地机器上启动一个单节点 H2O 云。
- 允许它使用所有 CPU 核心和高达 2GB 的内存。
- 在集群已经运行的情况下进行清理。
- 在 H2OFrame 上使用 CPU 构建深度神经网络模型。
import h2o
h2o.init(max_mem_size = 2)
h2o.remove_all()
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from h2o.estimators.deeplearning import H2ODeepLearningEstimator
初始化完成后,我们可以将数据集上传到 H2O 集群。数据被导入 H2O 框架,其功能与熊猫数据框架类似。在我们的例子中,集群运行在我们的笔记本电脑上。
higgs = h2o.import_file('higgs_boston_train.csv')
我们可以快速浏览一下数据集。
higgs.describe()
describe()给出了很多信息。
- 数据集中的行数和列数。
- 数据集的汇总统计信息,如数据类型、最小值、平均值、最大值、标准偏差、列中零的数量、列中缺失值的数量以及数据集的前 10 行。
Figure 1
数据预处理
我们将数据分为以下几种方式:
- 60%用于培训
- 20%用于验证(超参数调整)
- 20%用于最终测试,将保留到最后
- 预测值是除“事件 Id”和“标签”之外的所有列。
- 响应列是最后一列“标签”。
train, valid, test = higgs.split_frame([0.6, 0.2], seed = 2019)
higgs_X = higgs.col_names[1: -1]
higgs_y = higgs.col_names[-1]
深度学习模型
模型 1
- 在希格斯玻色子数据集上运行我们的第一个深度学习模型。
- 我们需要预测“标签”列,这是一个具有两个级别的分类特征。
- 深度学习模型的任务将是执行二元分类。
- 深度学习模型使用了数据集除“EventId”之外的所有预测器,而且都是数值型的。
- 第一个深度学习模型将只是一个时代来感受模型的构建。
higgs_model_v1 = H2ODeepLearningEstimator(model_id = 'higgs_v1', epochs = 1, variable_importances = True)
higgs_model_v1.train(higgs_X, higgs_y, training_frame = train, validation_frame = valid)
print(higgs_model_v1)
我们打印出模型以进行更多研究:
Figure 2
有相当多的信息,但我们在过去已经看到了所有这些信息。
- 训练集的误差度量,如对数损失、平均每类误差、AUC、基尼系数、均方误差、RMSE
- 最大 F1 阈值的混淆矩阵
- 不同指标的阈值
- 增益/提升表
验证集也打印出来了:
Figure 3
训练集和验证集的结果非常接近。
因此,使用我们最简单的深度学习模型,我们在验证集上获得了大约 0.994 auc,在训练集上获得了 0.995 auc。并且 log loss 在验证集上是 0.09,在训练集上是 0.085。
变量重要性
在 H2O 构建分类模型时,我们将能够在 Python 中以重要性降序查看变量重要性表,如下所示:
var_df = pd.DataFrame(higgs_model_v1.varimp(), columns = ['Variable', 'Relative Importance', 'Scaled Importance', 'Percentage'])
var_df.head(10)
Figure 4
进球历史
要查看评分历史,我们可以使用 score_history 方法检索作为 pandas 数据框的数据,然后绘制分类错误。
higgs_v1_df = higgs_model_v1.score_history()
plt.plot(higgs_v1_df['training_classification_error'], label="training_classification_error")
plt.plot(higgs_v1_df['validation_classification_error'], label="validation_classification_error")
plt.title("Higgs Deep Learner")
plt.legend();
Figure 5
pred = higgs_model_v1.predict(test[1:-1]).as_data_frame(use_pandas=True)
test_actual = test.as_data_frame(use_pandas=True)['Label']
(test_actual == pred['predict']).mean()
Figure 6
这个简单的深度学习模型我们达到的准确率已经是 0.967 了。
模型 2
来提高成绩。现在,我们运行另一个更小的网络,一旦错误分类率收敛,我们让它自动停止(特别是如果长度为 2 的移动平均值在连续 2 次得分事件中没有提高至少 1%)。我们还将验证集采样为 10,000 行,以加快评分。
higgs_model_v2 = H2ODeepLearningEstimator(model_id = 'higgs_v2', hidden = [32, 32, 32], epochs = 1000000, score_validation_samples = 10000, stopping_rounds = 2, stopping_metric = 'misclassification',
stopping_tolerance = 0.01)
higgs_model_v2.train(higgs_X, higgs_y, training_frame = train, validation_frame = valid)
进球历史
为了查看评分历史,我们绘制了第二个模型的分类误差。
higgs_v2_df = higgs_model_v2.score_history()
plt.plot(higgs_v2_df['training_classification_error'], label="training_classification_error")
plt.plot(higgs_v2_df['validation_classification_error'], label="validation_classification_error")
plt.title("Higgs Deep Learner (Early Stop)")
plt.legend();
Figure 7
好多了。
精度也有所提高。
pred = higgs_model_v2.predict(test[1:-1]).as_data_frame(use_pandas=True)
test_actual = test.as_data_frame(use_pandas=True)['Label']
(test_actual == pred['predict']).mean()
Figure 8
我们将从第二个模型中得到变量重要性图。
higgs_model_v2.varimp_plot();
Figure 9
AutoML:自动机器学习
最后但同样重要的是,让我们试试 H2O 的 AutoM L. H2O 的 AutoML 可以用于自动化机器学习工作流,其中包括自动训练和调整许多模型,然后我们打印出来看看哪些模型将成为 AutoML 排行榜上表现最好的模型。
from h2o.automl import H2OAutoMLaml = H2OAutoML(max_models = 10, max_runtime_secs=100, seed = 1)
aml.train(higgs_X, higgs_y, training_frame = train, validation_frame = valid)
aml.leaderboard
Figure 10
AutoML 已经建立了 5 个模型,包括 GLM(广义线性模型)、DRF(分布式随机森林)和 XRT(极度随机化树)以及两个堆叠集合模型(第二和第三),最好的模型是 XRT。
事实证明,我引以为傲的深度学习模型甚至不在排行榜上。
Jupyter 笔记本可以在 Github 上找到。享受这周剩下的时光。
参考: H2O 深度学习 Doc
面向产品经理的机器学习简介
理解机器学习如何在引擎盖下工作,而不要过于技术化。
想象一个石头剪子布游戏…
而且,你想写代码,这样当你用石头、布或剪刀移动你的手时,计算机会识别它并与你对弈。
想想写代码实现这样一个游戏。你必须从相机中提取图像,查看这些图像的内容,等等。
这对你来说会有很多代码要写。不出所料,给游戏编程最终会变得极其复杂和不可行。
传统编程
在传统编程中——多年来这一直是我们的谋生之道——我们考虑用编程语言来表达规则。
传统编程中,程序员定义的规则一般作用于数据,给我们答案。
例如,在石头剪子布中,数据将是一幅图像,规则将是所有查看该图像中的像素以尝试确定对象的if-then
语句。
传统编程的问题是,它将涵盖所有可预测的基础。但是,如果我们不知道某个规则的存在呢?
机器学习
机器学习扭转了传统编程的局面。它通过设置某些参数来产生期望的输出,从而得出预测。
这是一种复杂的说法,模型从错误中学习,就像我们一样。
参数是函数中的那些值,当模型试图学习如何将这些输入与这些输出相匹配时,这些值将被设置和更改。
把这些函数想象成你生活中的时刻,把这些参数想象成你从这些时刻中学到的东西。你希望永远不要重蹈覆辙,就像你希望你的模特那样。
在机器学习中,我们不是用代码编写和表达规则,而是向提供大量答案,标记这些答案,然后让机器推断出将一个答案映射到另一个答案的规则。
例如,在我们的石头剪刀布游戏中,我们可以说明石头的像素是多少。也就是说,我们告诉电脑,“嘿,这就是石头的样子。”我们可以这样做几千次,以获得不同的手,肤色等。
如果机器能够找出这些之间的模式,我们现在就有了机器学习;我们有一台为我们决定这些事情的计算机!
我如何运行一个看起来像这样的应用程序?
在上面显示的培训阶段,我们已经培训了这方面的模型;这个模型本质上是一个神经网络。
在运行时,我们会传入我们的数据,我们的模型会给出一个叫做预测的东西。
例如,假设您已经在许多石头、纸和剪刀上训练了您的模型。
当你对着摄像头举起拳头时,你的模型会抓取你拳头的数据,并给出我们所说的预测。
我们的预测是,有 80%的可能性这是石头,有 10%的可能性这是剪刀或布。
机器学习中的许多术语与传统编程中的术语略有不同。我们称之为训练,而不是编码和编译;我们称之为推理,从推理中得到预测。
您可以使用 TensorFlow 轻松实现这个模型。下面是创建这种神经网络的一段非常简单的代码:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(150, 150, 3)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')
])model.compile(loss='categorical_crossentropy', optimizer='rmsprop')model.fit(..., epochs=100)
潜得更深
以下是我在过去几个月里收集的一些很棒的资源。我希望他们能帮你找到正确的方向。
MOOCs
- 经典:吴恩达的 Coursera 机器学习
- Udacity 机器学习简介
- 谷歌的 Udacity 深度学习
- EdX 对 AI 的介绍
- Fast.ai 的 7 周实用深度学习,老师杰瑞米·霍华德(Kaggle 前任总裁,Enlitic 和 fast.ai 创始人)
教程
- 韦尔奇实验室神经网络简介,几个 4-5 分钟的精彩视频
- 谷歌的 Tensorflow 教程
- 谷歌 3 小时课程学习 TensorFlow 和深度学习,没有博士
- 斯坦福的深度学习教程
讲座和播客
- AI 与深度学习。从机器智能的类型到算法之旅,16z 交易和研究团队负责人 Frank Chen 在这张幻灯片演示中向我们介绍了人工智能和深度学习的基础知识(及其他)。
- a16z 播客:机器学习初创公司中的产品优势。很多机器学习初创公司最初在与大公司竞争时会感到有点“冒名顶替综合症”,因为(论点是这样的),那些公司拥有所有的数据;当然我们不能打败它!然而,初创公司有很多方法可以、也确实成功地与大公司竞争。本播客的嘉宾认为,如果你在此基础上构建了正确的产品,即使只有相对较小的数据集,你也可以在许多领域取得巨大的成果。
- 当人类遇上 AI 。安德森·霍洛维茨杰出的计算机科学客座教授费-李非(以的名义发表文章)是斯坦福大学的副教授,他认为我们需要注入更强的人文主义思维元素来设计和开发能够与人和在社交(包括拥挤的)空间中共处的算法和人工智能。
- “面向智能计算机系统的大规模深度学习”,2016 年 3 月,谷歌科技与杰夫·迪恩在首尔校园的对话。
放射学的机器学习—从哪里开始
磨刀霍霍:了解机器学习工具链,这样你就可以开始学习了。
Image by Eric M. Baumel, MD
您有兴趣开始学习放射学的机器学习吗?新术语的星座可能会让人不知所措:深度学习、TensorFlow、Scikit-Learn、Keras、Pandas、Python 和 Anaconda。在你开始之前,有一大堆令人头晕的新信息需要你掌握。
就我个人而言,我希望能够在我的一些使用苹果 CoreML 框架的 iOS 应用程序中使用机器学习(ML)功能。这意味着在你真正开始工作之前,还有一系列复杂的问题要处理。一旦我们正确配置了工具,工作将会更容易。
机器学习的主导语言是 Python。在你开始学习很多优秀的教程之前,你需要熟悉整个生态系统。
网上有无数的资源和书籍可以帮助你开始(另一篇文章的工作)。让我们看看迈出第一步需要做些什么。
“给我六个小时砍树,我会用前四个小时磨利斧头。”
——亚伯拉罕·林肯(可能从来没说过这话)
我们来谈谈
最常见的 ML 开发语言是 Python。如果你不了解 Python,许多 ML 初学者的参考资料都是从快速的 Python 介绍开始的。
这篇文章不是为了教 Python,而是为了展示一个开发人员如何开始使用庞大的 ML 工具链。
你要做的第一件事就是下载 Python 和机器学习所必需的 Python 工具。
你好,Unix
我们需要使用命令行界面来安装和管理我们的 Python 工具。
足够的狂欢是危险的:
在 Linux 或 Mac 中,我们使用终端。您可以在 Finder >应用程序>实用工具>终端中找到该程序。
在 Windows 中,我们使用命令提示符。你点击 Windows 图标> Windows 系统>命令提示符或者点击 Windows 图标并输入cmd
。
在光标前,您会看到一个文本字符串,它指向:
机器名:目录用户名$
你在美元符号后面打字。
以下是一些常用命令:
列出当前目录中的文件:ls
同时显示隐藏文件:ls -a
导航到新目录:cd <directory_path>
转到主目录:cd ~
或直接键入:cd
向上导航一级:cd ..
转到您所在的上一个文件夹:cd -
显示当前工作目录:pwd
向上箭头重新输入最后一个命令。再次按下向上箭头可以回到之前的命令。
清除窗口:clear
在文本编辑器中打开一个文件,例如:atom <filename>
取消申请(例如 ping) Ctrl-C
巨蟒
Python 是一种解释型语言,所以它是逐行阅读的,而不是编译型语言,在编译型语言中,你必须在使用它之前烤好蛋糕。
目前有两个独立的 Python 版本,Python 2.7 和 Python 3。Python 2.7 将于 2020 年 1 月 1 日寿终正寝,而 Python 3.x 不是向后兼容的。那么,为什么要使用旧版本呢?不幸的是,一些框架只支持 2.7 版本,许多书籍和在线教程都是专门为该版本编写的。我们该如何应对?
幸运的是,您可以在计算机上安装两种版本的 Python,并在硬盘上的不同文件夹中运行不同的虚拟环境,因此您可以在 Python 3.7 中完成大部分 ML 工作,如果您的项目需要一个只能在 2.7 上运行的库,则可以在不同的文件夹中安装 2.7 版本。
使用 virtualenv、Python Environment Wrapper (pew)、venv、pyvenv,有几种方法可以管理不同的 Python 虚拟环境。最简单的是使用 Conda,使用 Anaconda 时随 Python 一起安装。
https://imgs.xkcd.com/comics/python_environment.png
蟒蛇
Anaconda 是一个开源平台,可能是在 Linux、Mac OS X 和 Windows 上开始 Python 机器学习的最简单的方法。它帮助您管理编程环境,并包括数据科学中使用的常见 Python 包。您可以在https://www.anaconda.com/distribution/下载您平台的发行版。
一旦为您的系统安装了合适的 Python 版本,您将需要设置一些环境。
康达
Conda 是 Anaconda 使用的 Python 包管理器和环境管理系统。Conda 会安装您需要的大部分软件包,但不是全部。其余的可以使用pip
通过命令行安装——稍后会详细介绍。
要查看当前环境中的包:
conda list env
您运行的是哪个版本的 Conda:
conda -version
(如果低于 4.1.0,那么您可以用conda update conda
更新 Conda)
您可以使用 Anaconda Navigator 创建一个环境,方法是从左侧菜单中选择 Environments,然后单击 create 按钮。
Creating a new environment “new_env” using Anaconda Navigator
您也可以从命令行创建环境。例如,我们使用 Python 2.7 创建了一个名为“py27”的环境:
conda create -n py27 python=2.7
要激活环境:
conda activate <your_env_name>
要停用当前环境,请执行以下操作:
conda deactivate
要删除环境,请执行以下操作:
conda remove -name <your_env_name> -all
要列出您的所有 Conda 环境:
conda info --envs
List of Conda managed Python environments
带有星号的环境是当前的活动环境。
要查看当前环境中的包:
conda list env
您运行的是哪个版本的 Conda:
conda -version
(如果低于 4.1.0,那么您可以用conda update conda
更新 Conda)
两个主要的机器学习包 TensorFlow 和 Keras 应该使用pip
安装。对于苹果的机器学习框架,你也可以安装 Turi Create 。
科学堆栈
有一组被称为科学堆栈的 Python 包,可用于多个学科。其中包括:
NumPy
Scikit-learnhttps://scikit-learn.org/stable/—机器学习算法库
Jupyterhttps://jupyter.org/—基于网络的笔记本中的交互式 Python shell
Seabornhttps://seaborn.pydata.org/index.html—统计数据可视化
Bokehhttps://bokeh.pydata.org/en/latest/—交互式数据可视化
PyTables
您可以使用 Anaconda 安装这些包及其依赖项。在新创建的环境中,搜索您想要的包。
Search Anaconda Navigator for the packages you want to install
然后,通过选中复选框并单击“应用”,从列表中选择它们。
Adding new packages and dependencies via Anacona Navigator
如前所述,你使用pip
来安装 TensorFlow 和 Keras (以及 Turi Create 用于苹果的 CoreML)。
pip
pip 是 python 的标准包管理器https://pypi.org/project/pip/
pip install — upgrade pip
要使用 pip 安装软件包:
pip install <package_name>
编辑 Python 文件
您可以在 Mac 的终端或 Windows 的控制台中与 python 进行交互。为了编写代码,大多数人使用代码编辑器,比如 Atomhttps://atom.io/或者 Sublime Texthttps://www.sublimetext.com/。有关于代码编辑器的宗教战争,但是生命太短暂了。
我最喜欢的(也是免费的)文本编辑器是 GitHub 的 Atomhttps://atom.io/。Atom 的一个很酷的功能是,你可以用集成终端窗口等功能来扩展应用程序。
安装后,您可以通过进入设置/安装包并搜索platformio-ide-terminal
来添加此功能
运行 Python 文件
在命令提示符处($或>)键入python <filename.py>
要退出 python,使用exit()
或 Ctrl-D(Windows 中的 Ctrl-Z)
要查看您当前使用的 python 版本,请输入:
python --version **or** python -V
要查看您正在使用的 Python 安装的位置,请输入:
which python
环境文件
环境文件是项目根目录中的一个文件,它列出了所有包含的包及其特定于项目环境的版本号。这允许您与其他人共享项目,并在其他项目中重用。
您可以使用以下方式创建文件:
conda env export -file environment.yaml
您可以使用以下命令重新创建 Conda 环境及其包:
conda env create -n <conda-env> -f environment.yaml
在一些项目或教程中,你会看到 requirements.txt ,它被 pip 用作包管理器,而不是 Conda 使用的 environment.yaml。
这些是由冻结环境造成的:
pip freeze > requirements.txt
要重建,请使用:
pip install -r requirements.txt
Jupyter 笔记本
jupyter Notebookhttps://jupyter.org/是一款基于开源网络浏览器的应用。这允许您在一个更加用户友好的环境中直接运行 python 代码,并逐步查看结果。它非常适合教学,因为您可以在标记单元格中的代码单元格之间添加文本和图像。该应用程序是可扩展的,因此您可以添加许多其他有用的功能。
你也可以用 Anaconda Navigator 安装 Jupyter 笔记本:
Install Jupyter Notebook with Anaconda Navigator
在提示符下键入以下内容,在浏览器中创建新的 Jupyter 笔记本应用程序:
jupyter notebook
Create a new notebook with Python 3
要启动特定的笔记本:
jupyter notebook <notebook-name>
顺便说一下,不建议同时运行 Jupyter 笔记本应用程序的多个实例。
Jupyter Notebook helps keep you organized!
要运行单元格,请单击 Jupyter 工具栏中的“运行”按钮或按 Shift + Enter。
关闭笔记本,关闭终端窗口或键入:
jupyter notebook stop
或 按 Ctrl+C
好吧,现在该怎么办?
现在我们的斧子已经磨快了,你如何开始真正的放射信息学呢?
这里有几个链接可以让你注意到:
医学成像的机器学习【https://pubs.rsna.org/doi/10.1148/rg.2017160130T2
深度学习:放射科医生入门https://pubs.rsna.org/doi/10.1148/rg.2017170077
为了更深入的了解,这里有两期专门讨论这个主题的期刊:
March 2018 年 3 月第 15 卷第 3PB 期特刊数据科学:大数据、机器学习和人工智能
June 2018 年 6 月第 31 卷第 3 期特别关注开源软件
如果您现在仍然清醒,这里有一些有用的 GitHub 参考资料:
https://github.com/ImagingInformatics/machine-learning
https://github.com/slowvak/MachineLearningForMedicalImages
我们开始吧!
上面提到的 2018 年 6 月的《数字成像杂志》中有一篇非常精彩的介绍:
Hello World Deep Learning in Medical ImagingJDI(2018)31:283–289 Lakhani、Paras、Gray、Daniel L .、Pett、Carl R .、Nagy、Paul、Shih、George
不是创建一个典型的猫对狗的分类器,而是创建一个胸部对腹部的 x 射线分类器(CXR 对 KUB)!这是开始你的人工智能之旅的好地方。
以上所有内容都很难解释,但我希望这篇介绍能帮助您开始。我不是专家,写这篇文章最初是为了帮助自己记忆。对流程有基本理解的从业者越多越好。
祝你好运!
体育博彩的机器学习:这不是一个基本的分类问题。
我们提出了一种使用自定义损失函数将 bets 损益包含到神经网络分类器中的方法。
Photo by Christin Noelle on Unsplash
体育博彩是机器学习算法,特别是分类神经网络的完美问题之一。大量可用的数据和明确的目标,挑选赢家!尽管如此,经典的分类模型并不太适合赌博策略,人们需要在他的神经网络中使用一个定制损失函数来实现更好的盈利能力。我们在下面解释原因。
英格兰超级联赛的简单赌博策略。
让我们根据博彩交易所的赔率来实施基本的博彩策略。小数赔率是全额支付与赌注的比率。例如,赔率为 2,意味着 1 美元的赌注可以赢得 2 美元(包括你的赌注)。请注意,赔率倒数给出了正确的隐含概率。赔率为 2 意味着有 50%的胜算(1/赔率)。因此,您希望押注于赔率最低的团队,即获胜概率最高的团队。
为了便于说明,我们设计了两个基本策略:
- " 赢 ":赌赔率最低的一方,赢的概率最高。
- " 赢或平 ":赌赔率值最低的队伍,赌平局。
假设伯恩茅斯对切尔西的赔率为 5.5-1.61。切尔西的赔率为 1.61。因此我们赌切尔西的胜利为“ 赢 ”策略,而一场胜利和平局为“ 赢或平局 ”策略。
预测准确性与总体利润。他们不相似。
现在我们来比较一下两种投注策略,“赢vs .”赢或平。
对于数据,我们使用了必发 API 。Betfair 是最大的博彩交易所之一,其 API 包含交易所市场导航、赔率检索和下注操作。
上面的条形图显示了两种下注系统的准确性和利润。准确性是指我们下注正确的次数除以下注总数(在这种情况下是 200)。利润代表每次下注投资 1 英镑可以获得的金额。左边的第一个图表显示“赢”策略的准确率为 61%,而“赢或平”策略的准确率为 80%在这种情况下,“赢或平”似乎更好。然而,第二张图表显示,它产生的利润远低于“赢”策略。1 对 12。
因此,我们不应该以更准确地预测比赛结果为目标,相反,我们应该专注于最大化我们的整体利润。
用于博彩预测的神经网络。
在决定把钱投给哪支球队时,会涉及到很多数据。出于这个原因,赌博是应用最流行的机器学习技术之一的理想主题,神经网络。
特别是,我们可以使用分类神经网络。当应用于有离散结果的问题时,分类神经网络是理想的,或者换句话说,当识别特定观察属于哪个类别时。作为例子,想想有趣的“ 热狗,而不是热狗 ”或情感分析,它们试图将文本分为积极或消极的情感。
应用于体育博彩,我们可以设计一个具有三个简单类别的神经网络。下面是这样一个网络的架构。
然而,从我们之前的两个简单下注策略的例子来看,很明显我们不是在试图预测游戏的结果,而是哪种下注最有利可图。应用于分类神经网络,这将导致以下架构。注意,在这种情况下,我们甚至允许“无赌注”类别。
我们最终会遇到一个多标签分类问题(不要与多类别分类混淆),因为游戏的结果可能会导致一两个预测是正确的。例如,主队获胜将导致两个获胜赌注:“赢得主场”和“赢得主场或平局”。
我们需要整合赌注的潜在利润。
并非所有的赌注都提供相同的回报。赔率为 2 的赌注可以产生 1 的利润,而赔率为 1.1 的赌注可以产生更低的 0.1 的利润。然而,如果不成功,这两个赌注都要承担 1 英镑的损失。因此它们是不平等的;拿 1 去冒险赚 1 和拿 1 去冒险赚 0.1 是不一样的。
为了在我们的神经网络中考虑到这一点,我们需要使用一个定制的损失函数。损失函数(或目标函数)是在给定训练样本和预期输出的情况下,神经网络“有多好”的度量。在标准分类神经网络中,我们使用损失函数,例如分类交叉熵。然而,这种函数会给所有赌注相似的权重,忽略盈利能力的差异。
在我们的例子中,我们希望模型能够最大化策略的整体收益。因此,我们的自定义损失函数的输入必须包含每次下注的潜在利润。
自定义损失功能
我们在 TensorFlow 之上用 Keras 建立了我们的自定义损失函数。
在 Keras 中,损失函数有两个参数:
- y_true :真标签向量(赢主场,赢主场或平局,平局,赢客场,赢客场或平局,不下注)。基于我们的神经网络架构,这采取 1 和 0 的向量的形式。例如,导致主队获胜的游戏具有以下 y_true 向量(1,1,0,0,0,0)。
- y_pred :预测向量。它是我们的神经网络分类器的输出。
由于 Keras 的限制,我们不能在损失函数中传递游戏的赔率,所以我们必须将它们作为 y_true 向量的附加项来传递。
一点点 python 代码
下面是我们用 Python 和 Keras 写的自定义损失函数。
简而言之,它衡量单位股份投入的平均利润/损失。每个观察(每个游戏)的步骤如下:
- 从 y_true 输入中获取赔率
- 使用赔率计算每笔赌注的潜在利润。
- 把赢的赌注和输的赌注连在一起。
- 我们以这个观察的预期 P&L 结束。我们将这个乘以-1,得到一个最小化的“损失”(而不是一个最大化的增益)。
def odds_loss(y_true, y_pred):
"""
The function implements the custom loss function
Inputs
true : a vector of dimension batch_size, 7\. A label encoded version of the output and the backp1_a and backp1_b
pred : a vector of probabilities of dimension batch_size , 5.
Returns
the loss value
"""
win_home_team = y_true[:, 0:1]
win_home_or_draw = y_true[:, 1:2]
win_away = y_true[:, 2:3]
win_away_or_draw = y_true[:, 3:4]
draw = y_true[:, 4:5]
no_bet = y_true[:, 5:6]
odds_a = y_true[:, 6:7]
odds_b = y_true[:, 7:8]
gain_loss_vector = K.concatenate([win_home_team * (odds_a - 1) + (1 - win_home_team) * -1,
win_home_or_draw * (1/(1 -1/odds_b) - 1) + (1 - win_home_or_draw) * -1,
win_away * (odds_b - 1) + (1 - win_away) * -1,
win_away_or_draw * (1/(1 -1/odds_a) - 1) + (1 - win_away_or_draw) * -1,
draw * (1/(1 - 1/odds_a - 1/odds_b) - 1) + (1 - draw) * -1,
K.zeros_like(odds_a)], axis=1)
return -1 * K.mean(K.sum(gain_loss_vector * y_pred, axis=1))
数据。
对于我们的数据,我们从 2018 年 8 月至 12 月的 2018-2019 赛季英超联赛中选取了 200 场比赛。它包含描述性的游戏数据,如球队名称、Betfair 的赔率和情绪得分(表示正面推文占正面和负面推文的百分比)。我的 github 页面上有数据和 Jupyter 笔记本。
从文件中加载数据,并在训练和测试数据中拆分。
我们的数据以 1,2 或 3 的形式包含每场比赛的结果:
- 1:主场获胜
- 2:客场胜利
- 3:画
这需要被转换成代表我们的神经网络的输出层的独热编码向量。另外,我们把每个队的赔率加起来作为这个向量的元素。这正是我们下面要做的。
def get_data():
data = pd.read_csv('extract-betsentiment-com.csv')
X = data.values[:, 5:-5]
y = data.values[:, -1]
y_full = np.zeros((X.shape[0], 8))
for i, y_i in enumerate(y):
if y_i == 1:
y_full[i, 0] = 1.0
y_full[i, 1] = 1.0
if y_i == 2:
y_full[i, 2] = 1.0
y_full[i, 3] = 1.0
if y_i == 3:
y_full[i, 1] = 1.0
y_full[i, 3] = 1.0
y_full[i, 4] = 1.0
y_full[i, 6] = X[i, 1] # ADD ODDS OF HOME TEAM
y_full[i, 7] = X[i, 2] # ADD ODDS OF AWAY TEAM
return X, y_full, yX, y, outcome = get_data()# SPLIT THE DATA IN TRAIN AND TEST DATASET.
train_x, test_x, train_y, test_y, = train_test_split(X, y)
模型的训练
在训练模型之前,我们首先需要定义它。我们使用一个全连接神经网络,有两个隐藏层。我们使用 BatchNormalization 来归一化权重并消除消失梯度问题。
然后,我们使用一组任意参数来训练该模型。
def get_model(input_dim, output_dim, base=1000, multiplier=0.25, p=0.2):
inputs = Input(shape=(input_dim,))
l = BatchNormalization()(inputs)
l = Dropout(p)(l)
n = base
l = Dense(n, activation='relu')(l)
l = BatchNormalization()(l)
l = Dropout(p)(l)
n = int(n * multiplier)
l = Dense(n, activation='relu')(l)
l = BatchNormalization()(l)
l = Dropout(p)(l)
n = int(n * multiplier)
l = Dense(n, activation='relu')(l)
outputs = Dense(output_dim, activation='softmax')(l)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='Nadam', loss=odds_loss)
return modelmodel = get_model(21, 6, 1000, 0.9, 0.7)
history = model.fit(train_x, train_y, validation_data=(test_x, test_y),
epochs=200, batch_size=5, callbacks=[EarlyStopping(patience=25),ModelCheckpoint('odds_loss.hdf5',save_best_only=True)])
训练完成后,我们使用以下 print 命令查看模型的性能:
print('Training Loss : {}\nValidation Loss : {}'.format(model.evaluate(train_x, train_y), model.evaluate(test_x, test_y)))150/150 [==============================] - 0s 271us/
step 50/50 [==============================] - 0s 318us/
step Training Loss : -0.05027060141166051
Validation Loss : -0.08301501810550689
如我们所见,我们最终的训练损失为-0.05。请记住,我们正在尝试最小化我们的损失函数,这与我们的损益相反。这个数字告诉我们,平均来说,每一次下注将为每 1 英镑的股份产生 0.05 英镑的利润。我们的验证数据集显示,每磅的平均利润为 0.08 英镑。考虑到我们刚刚向神经网络提供了基本数据,这还不错。在 200 多场比赛中,假设我们每场比赛下注 1,我们理论上的 NN 下注策略将产生 10 到 16.6。
结论。
我们提出了一种使用自定义损失函数将赌注 p&l包含到神经网络分类器中的方法。它超越了在设计投注系统时可能误导的准确率。我们相信这对任何希望在体育运动中使用机器学习的人都是有用的。
如需更多信息或问题,请随时与我联系**。另外,请注意,如果您对我们的数据感兴趣,我们将很乐意与您分享。**
成为中等会员,在平台上支持我!
https://medium.com/@charlesmalafosse/membership
参考和代码。
基于 K-Means 算法的股票聚类机器学习
了解如何使用聚类通过无监督的股票聚类使投资组合更加多样化。
多元化是构建投资组合的关键步骤,但真正的多元化是不可能的,因为投资每家公司都需要大量资本。除此之外,并不是所有的公司都值得投资,这可能是因为它们的流动性非常差。
所以现在你要做的是想出一个有效的策略,只选择那些表现不同的股票。这将有助于降低风险,一种方法是从不同的行业挑选股票,但一种更数据驱动的解决方案是对股票数据应用 K 均值聚类算法,以识别不同的股票聚类。
[参考:https://www . python forfinance . net/2018/02/08/stock-clusters-using-k-means-algorithm-in-python/]
在下面的帖子中,我将给出一个使用 Python 应用 K-Means 算法的例子。
首先,我们需要有组织结构的数据。对于这个任务,我将使用一个符合 Shariah 的股票列表,如这里的所列。名单已经更新,所以我选择的公司可能会有点不同。
下面的代码块从计算机中加载数据,并根据我们的需要构造数据
import pandas as pd
from sklearn.cluster import KMeans
from math import sqrt
import pylab as pl
import numpy as np#Loading the data
data = pd.read_csv("SC Close Prices.csv", index_col = "date")
data.index = pd.to_datetime(data.index)start = "2010-01-01"data = data.loc[start:]#Calculating annual mean returns and variances
returns = data.pct_change().mean() * 252
variance = data.pct_change().std() * sqrt(252)returns.columns = ["Returns"]
variance.columns = ["Variance"]#Concatenating the returns and variances into a single data-frame
ret_var = pd.concat([returns, variance], axis = 1).dropna()
ret_var.columns = ["Returns","Variance"]
ret_var variable after running the code block above
现在,在将模型拟合到我们的数据之前,我们需要决定我们希望将数据分成多少个簇。决定这个数字可能很棘手,因此我们将使用“肘方法”来计算一系列不同集群的 SSE(误差平方和)。然后,我们将在 x 轴上绘制簇的数量,在 y 轴上绘制 SSE。
X = ret_var.values #Converting ret_var into nummpy arraysse = []for k in range(2,15):
kmeans = KMeans(n_clusters = k)
kmeans.fit(X)
sse.append(kmeans.inertia_) #SSE for each n_clusterspl.plot(range(2,15), sse)
pl.title("Elbow Curve")
pl.show()
下图显示了 5 个簇是一个很好的数字,因为我们不希望 n_clusters 太大,并且在 5 个簇之后错误率下降速度变慢,因此,我认为这是一个合理的选择。
因此,现在我们要将 K-Means 模型再次拟合到我们的数据集,n_clusters = 5,并绘制结果。
kmeans = KMeans(n_clusters = 5).fit(X)centroids = kmeans.cluster_centers_pl.scatter(X[:,0],X[:,1], c = kmeans.labels_, cmap ="rainbow")
pl.show()
就像任何其他数据科学问题一样,我们的数据中有一个离群值,我们需要通过确定它是哪家公司来消除它。下面的代码做了同样的事情。
print(returns.idxmax())ret_var.drop("HADC", inplace =True)
移除后,我们现在重新进行拟合模型和绘图的过程。
X = ret_var.values
kmeans =KMeans(n_clusters = 5).fit(X)centroids = kmeans.cluster_centers_pl.scatter(X[:,0],X[:,1], c = kmeans.labels_, cmap ="rainbow")
pl.show()
我们现在要做的就是获取数据集中每家公司的聚类数,这样我们就可以在构建多元化投资组合的同时区分不同的公司。
Company = pd.DataFrame(ret_var.index)
cluster_labels = pd.DataFrame(kmeans.labels_)df = pd.concat([Company, cluster_labels],axis = 1)
我更多关注的是算法在 python 中的实现,而不是解释理论。我希望这篇文章对你有用。如果你有任何问题或发现任何技术错误,请在下面的评论区告诉我。
供应链预测的机器学习
你如何使用机器学习来预测供应链中的需求?
Source: https://www.vpnsrus.com/
下面这篇文章摘自我的《供应链预测的数据科学》一书,这里有。你可以在这里* 找到我的其他出版物 。我也活跃在LinkedIn*。
什么是机器学习?
供应链从业者通常使用老派的统计方法来预测需求。但随着最近机器学习算法的兴起,我们有了新的工具,可以轻松实现典型工业需求数据集预测准确性方面的出色表现。这些模型将能够学习许多关系,这些关系超出了传统统计模型的能力。例如,如何将外部信息(如天气)添加到预测模型。
传统的统计模型使用预定义的模型来根据历史需求进行预测。问题是这些模型不能适应历史需求。如果使用双指数平滑模型来预测季节性产品,它将无法解释季节性模式。另一方面,如果对非季节性需求使用三重指数平滑模型,它可能会过度拟合需求的噪声,并将其解释为季节性。
机器学习是不同的:在这里,算法(即机器)将从训练数据集(即我们的历史需求)中学习关系,然后能够将这些关系应用于新数据。传统的统计模型将使用预定义的关系(模型)来预测需求,而机器学习算法不会假定先验特定的关系(如季节性或线性趋势);它将直接从历史需求中学习这些模式。
对于学习如何进行预测的机器学习算法,我们必须向它显示输入和期望的相应输出。然后它会自动理解这些输入和输出之间的关系。
使用机器学习和指数平滑模型预测我们的需求之间的另一个关键区别是,机器学习算法将从我们所有的数据集学习模式。指数平滑模型将单独处理每个项目,与其他项目无关。机器学习算法将从所有数据集中学习模式,并将最有效的方法应用于每种产品。人们可以通过增加每个时间序列的长度(即,为每个产品提供更多的历史周期)来提高指数平滑模型的准确性。有了机器学习,我们将能够通过提供更多产品来提高我们模型的准确性。
欢迎来到机器学习的世界。
用于需求预测的机器学习
*为了进行预测,我们将向机器学习算法提出以下问题:
基于上 n 个需求周期,下一个周期的需求会是多少?
我们将通过为模型提供特定布局的数据来训练模型:
- n 个连续的需求周期作为输入。
-作为输出的下一个周期的需求。
让我们看一个例子(用季度预测来简化表格)😗
对于我们的预测问题,我们将基本上向我们的机器学习算法显示我们的历史需求数据集的不同提取作为输入,并且每次显示下一次需求观察是什么。在我们上面的例子中,算法将学习上四个季度的需求和下一个季度的需求之间的关系。算法会学习如果我们有 5,15,10 & 7 作为最后四个需求观测值,那么下一个需求观测值就是 6,所以它的预测应该是 6。
*大多数人对这个想法会有两种截然不同的想法。要么人们会认为“*计算机根本不可能观察需求并做出预测”要么认为“到目前为止,人类无事可做。”两者都不对。
后面我们会看到,机器学习可以产生非常准确的预测。作为控制机器的人,我们仍然必须问自己许多问题:
——向算法提供哪些数据,让它理解正确的关系。
-用哪个机器学习算法(有很多不同的!).
-在我们的模型中使用哪些参数。正如你将看到的,每个机器学习算法都有一些设置,我们可以调整这些设置来提高其准确性。
和往常一样,没有确定的放之四海而皆准的答案。实验将帮助您找到最适合您的数据集的方法。
数据准备
任何机器学习算法项目的第一步都是对数据进行正确的清理和格式化。在我们的例子中,我们需要格式化历史需求数据集,以获得一个类似于上表所示的数据集。
命名约定在我们的数据清理过程中,我们将使用标准的数据科学符号,并将输入称为 X ,将输出称为 Y 。具体来说,数据集X _ train*&Y _ train将包含我们将用来训练我们的算法的所有历史需求( X_train 作为输入, Y_train 作为输出)。数据集X _ test&Y _ test将用于测试我们的模型。*
您可以在下表中看到一个典型的历史需求数据集示例,您应该在预测项目开始时拥有该数据集。
我们现在必须将这个数据集格式化为类似于第一个表的格式。现在让我们假设,我们希望根据某个产品在前四个季度的需求观察来预测该产品在一个季度的需求。我们将通过遍历我们拥有的不同产品来填充数据集X _ train&Y _ train,每次创建一个数据样本,其中连续四个季度为 X_train ,下一个季度为 Y_train 。这样,机器学习算法将学习四分之一的需求和之前四分之一的需求之间的关系。
您可以在下表中看到第一次迭代的图示。为了验证我们的模型,我们将把 Y3Q4 放在一边作为测试集。
这意味着我们的训练集不会持续到 Y3Q4,因为它是为测试集保留的:最后一个循环将被用作最终测试。
我们的 X_train 和 Y_train 数据集将如下表所示:
请记住,我们的算法将学习 X_train 中的关系,以预测 Y_train。所以我们可以写成 X_train -> Y_train。
最终测试将通过这些 X_test 和 Y_test 数据集提供给我们的工具:
这些是我们在 Y3Q4 之前(即 Y2Q4 到 Y3Q3)知道的每种产品的四个最新需求季度。这意味着我们的算法在训练阶段不会看到这些关系,因为它将测试它在这些特定预测练习中达到的准确性。我们将在这个测试集上测量它的准确性,并假设它在预测未来需求时的准确性是相似的。
数据集长度
对于任何机器学习练习来说,关注有多少数据被输入到算法中是很重要的。越多越好。另一方面,我们用来做预测的周期越多(我们称之为 x_len ,我们就越不能遍历数据集。此外,如果我们想要一次预测更多的周期( y_len ),这将花费我们一部分数据集,因为我们需要更多的数据(Y_train 更长)来在我们的数据集中执行一次循环。
通常,如果我们有一个有 n 个周期的数据集,我们将能够使 1+n-x_len-y_len 贯穿它。
loops = 1 + n- x_len- y_len
最佳实践是至少保持足够的运行来循环两年,以便 23 + x_len + y_len ≤ n 。这意味着该算法将有两个完整的季节周期来学习任何可能的关系。如果它只有一个,你将面临过度拟合的高风险。
自己动手
数据收集
数据集的创建和清理是任何数据科学项目必不可少的一部分。为了说明我们将在接下来的章节中创建的所有模型,我们将使用 2007 年 1 月至 2017 年 1 月挪威的历史汽车销售数据作为示例数据集。你可以在这里下载这个数据集:【www.supchains.com/download】T21你会得到一个 csv 文件,名为Norway _ new _ car _ sales _ by _ make . CSV*。该数据集包含 65 家汽车制造商在 121 个月内的销售额。平均而言,挪威每年销售 140,000 多辆新车,因此,如果我们假设一辆新车在挪威的平均价格约为 30,000 美元,则市场价值可粗略估计为 40 亿美元。就规模而言,这个数据集是适度的,但它足够大,足以与新模型和想法的实验相关。然而,机器学习模型可能会在其他更大的数据集上显示出更好的结果。*
自带数据集在文章的第二部分,我们将讨论如何将机器学习模型应用于这个示例数据集。但是我们真正感兴趣的是你自己的数据集*。不要浪费任何时间,已经开始收集一些历史需求数据,以便您可以在我们讨论不同主题时,根据您自己的历史需求数据来测试以下模型。建议您从拥有至少三年数据(5 年更好)和一百多种不同产品的数据集开始。越大越好。
训练和测试集创建
我们将编写第一个代码,从这个 csv 中提取数据,并将其格式化,以日期为列,以产品为行。*
*# Load the CSV file (should be in the same directory)
data = pd.read_csv(“norway_new_car_sales_by_make.csv”)
# Create a column “Period” with both the Year and the Month
data[“Period”] = data[“Year”].astype(str) + “-” + data[“Month”].astype(str)
# We use the datetime formatting to make sure format is consistent
data[“Period”] = pd.to_datetime(data[“Period”]).dt.strftime(“%Y-%m”)
# Create a pivot of the data to show the periods on columns and the car makers on rows
df = pd.pivot_table(data=data, values=”Quantity”, index=”Make”, columns=”Period”, aggfunc=’sum’, fill_value=0)
# Print data to Excel for reference
df.to_excel(“Clean Demand.xlsx”)*
请注意,我们将结果打印在一个 excel 文件中,供以后参考。直观地检查数据集的外观,以确保代码按预期运行,这始终是一种好的做法。
您还可以定义一个函数来存储这些步骤以备后用。
*def import_data():
data = pd.read_csv(“norway_new_car_sales_by_make.csv”)
data[“Period”] = data[“Year”].astype(str) + “-” + data[“Month”].astype(str)
data[“Period”] = pd.to_datetime(data[“Period”]).dt.strftime(“%Y-%m”)
df = pd.pivot_table(data=data,values=”Quantity”,index=”Make”,columns=”Period”,aggfunc=’sum’,fill_value=0)
return df*
既然我们已经有了格式正确的数据集,我们就可以创建训练集和测试集了。为此,我们将创建一个函数数据集,它接受以下输入:
df 我们最初的历史需求;
x_len 我们将用来进行预测的月数;
y_len 我们要预测的月数;
y_test_len 我们离开的月数作为最终测试;
并返回 X_train,Y_train,X_test & Y_test。
*def datasets(df, x_len=12, y_len=1, y_test_len=12):D = df.values
periods = D.shape[1]
# Training set creation: run through all the possible time windows
loops = periods + 1 — x_len — y_len — y_test_len
train = []
for col in range(loops):
train.append(D[:,col:col+x_len+y_len])
train = np.vstack(train)
X_train, Y_train = np.split(train,[x_len],axis=1)
# Test set creation: unseen “future” data with the demand just before
max_col_test = periods — x_len — y_len + 1
test = []
for col in range(loops,max_col_test):
test.append(D[:,col:col+x_len+y_len])
test = np.vstack(test)
X_test, Y_test = np.split(test,[x_len],axis=1)
# this data formatting is needed if we only predict a single period
if y_len == 1:
Y_train = Y_train.ravel()
Y_test = Y_test.ravel()
return X_train, Y_train, X_test, Y_test*
在我们的函数中,我们必须使用*。在 Y_train 和 Y_test 上的 ravel()** 如果我们只想一次预测一个周期。
array.ravel() 将 NumPy 数组的维数减少到 1D。我们的函数总是将 Y_train 和 Y_test 创建为 2D 数组(即包含行和列的数组)。如果我们只想一次预测一个周期,那么这些数组将只有一列(和多行)。不幸的是,如果我们只想预测一个周期,我们稍后将使用的函数将需要 1D 数组。*
我们现在可以轻松地调用我们的新函数 datasets(df) 以及 import_data() 。
*import numpy as np
import pandas as pd
df = import_data()
X_train, Y_train, X_test, Y_test = datasets(df)*
我们现在获得了为我们的机器学习算法(X_train & Y_train)提供数据所需的数据集,以及测试它所需的数据集(X_test & Y_test)。
注意我们取 y_test_len 为 12 期。这意味着我们将在 12 个不同的预测上测试我们的算法(因为我们一次只预测一个时期)。
一次预测多个期间如果想一次预测多个期间,可以更改 y_len。你需要注意保持y _ test _ len≥y _ len;否则*,你就无法检验你算法的所有预测。*
回归树
作为第一个机器学习算法,我们将使用一个决策树。决策树是一类机器学习算法,它将创建一个问题地图(实际上是一棵树)来进行预测。如果我们想让这些树预测一个数字,我们称它们为回归树,如果我们想让它们预测一个类别或标签,我们称它们为分类树。
为了做出预测,该树将从其基础开始,首先提出是/否问题;基于这个答案,它将继续问新的是/否问题,直到它得到一个最终的预测。不知何故,你可以看到这些树就像一个大游戏猜猜是谁?(著名的 80 年代游戏):模型会连续问多个问题,直到得到正确答案。
*在决策树中,每个问题被称为一个节点。例如,在上图中,'*这个人的鼻子大吗?'是一个节点。每个可能的最终答案被称为叶。在上面的例子中,每片叶子只包含一个人。但是这不是强制性的。你可以想象很多人都有一张大嘴和一个大鼻子。在这种情况下,叶将包含多个值。
一棵树用来分割一个节点的不同信息被称为特征。例如,上图中的树可以在三个特征嘴*、鼻子、和眼镜上分割一个节点。*
它是如何工作的?
为了说明我们的树将如何增长,让我们拿回我们的季度虚拟数据集。
基于这个训练数据集,问自己一个聪明的问题来做一个预测:第一个需求观察>是 7 吗?
这是一个聪明的问题,因为您知道答案(是/否)将提供下一季度需求行为的有趣指示。如果答案是是*,我们试图预测的需求很可能相当高(> 8),如果答案是否,那么我们试图预测的需求很可能很低(≤7)。*
下面是一个不好的问题的例子。
这没有帮助,因为这个问题没有将我们的数据集分成两个不同的子集(即,每个子集内仍然有很多变化)。如果问题的答案是第三需求观察< 6?是是*,我们仍然有从 1 到 11 的需求范围,如果答案是*否,范围从 4 到 13。这个问题对预测未来需求毫无帮助。
不必过多地探究树的数学内部工作的细节,生长我们的树的算法将在每个节点选择一个关于可用的特征(即先前的季度)之一的问题(即分裂),这将最小化两个新数据子集的预测误差。
1963 年,Morgan 和 Sonquist 在他们的论文“调查数据分析中的问题和建议”中,首次提出了创建决策树的算法关于如何生长决策树,有许多不同的算法(许多是从 60 年代开始开发的)。它们都遵循这样的目标,即询问关于数据集不同特征的最有意义的问题,以便将数据集分成不同的子集,直到达到某种标准。
参数这是一个可怕的想法,因为即使你在训练集上有完美的准确性,你也不能在新数据上复制这些结果。我们将基于一些标准来限制我们的树的增长。让我们看看最重要的(我们已经在使用 scikit-learn 命名约定)。
最大深度树可以询问的连续问题(节点)的最大数量。
最小样本分割节点中触发新分割所需的最小样本量。如果将此值设置为 6,则只剩下 5 个观测值的节点将不会被进一步分割。
Min samples leaf 一片叶子中需要的最小观察量。这是一个非常重要的参数。这越接近 0,过度拟合的风险就越高,因为你的树实际上会增长,直到它提出足够多的问题来分别处理每个观察。
标准这是算法将最小化的 KPI(MSE 或 MAE)。
当然,根据您的数据集,您可能希望为这些参数赋予不同的值。我们将在下一章讨论如何选择最佳参数。
自己动手
我们将使用 scikit-learn Python 库(www.scikit-learn.org)来种植我们的第一棵树。这是一个著名的开源库,世界各地的数据科学家都在使用它。它构建在 NumPy 的基础上,因此它可以很容易地与我们代码的其余部分进行交互。
第一步是调用 scikit-learn 并创建一个回归树的实例。一旦完成,我们必须根据 X_train 和 Y_train 数组来训练它。
*from sklearn.tree import DecisionTreeRegressor
# — Instantiate a Decision Tree Regressor
tree = DecisionTreeRegressor(max_depth=5,min_samples_leaf=5)
# — Fit the tree to the training data
tree.fit(X_train,Y_train)*
请注意,我们创建了一个最大深度为 5 的树(即,最多需要五个连续的是/否问题来对一个点进行分类),其中每个树叶至少有 5 个样本。
现在,我们有了一个针对我们特定需求历史的树。我们已经可以在训练数据集上测量它的准确性。
*# Create a prediction based on our model
Y_train_pred = tree.predict(X_train)
# Compute the Mean Absolute Error of the model
import numpy as np
MAE_tree = np.mean(abs(Y_train — Y_train_pred))/np.mean(Y_train)
# Print the results
print(“Tree on train set MAE%:”,round(MAE_tree*100,1))*
你应该获得 15.1%的平均收益率。现在,让我们根据测试集来衡量准确度:
*Y_test_pred = tree.predict(X_test)
MAE_test = np.mean(abs(Y_test — Y_test_pred))/np.mean(Y_test)
print(“Tree on test set MAE%:”,round(MAE_test*100,1))*
我们现在获得大约 21.1%。这意味着我们的回归树过度适应历史需求:与历史数据集相比,我们在测试集中损失了 6 个点的 MAE。
更进一步
有很多方法可以进一步改善这个结果:
-优化树参数。
-使用更高级的模型(如森林、ETR、极端梯度推进)。
-优化输入数据。
-使用外部数据。
所有这些都在供应链预测数据科学一书中有解释(亚马逊上有售)
关于作者
* [## Nicolas vande put——顾问,创始人——供应链| LinkedIn
查看 Nicolas Vandeput 在世界上最大的职业社区 LinkedIn 上的个人资料。尼古拉斯有 7 份工作列在…
www.linkedin.com](https://www.linkedin.com/in/vandeputnicolas/)
icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了他的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两个科目。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟 。
*
城市规划的机器学习:估算停车容量
哈佛数据科学顶点项目,2019 年秋季
Figure 1. Map of predicted proportion of driveways in Somerville by block
注:本文由 Josh Feldman、Lipika Ramaswamy 和 Anthony Rentsch 共同撰写。
如果一切按计划进行,马萨诸塞州的萨默维尔——波士顿外围的一个城市——将在 2021 年获得一条新的地铁线。虽然这条新线路令人兴奋,但它可能会给现有的全市居民路边停车计划带来问题。如果居民开车到这些新车站,把车停在附近的街道上,住在这些街道上的人会失去停车位吗?还是可以停在他们的车道上?
为了解决像这样的交通规划问题,萨默维尔正在对他们的停车供应进行审计。他们对路内停车容量有很好的估计,但是他们关于路外停车的数据要少得多。他们的问题看似简单:萨默维尔有多少住宅单元有路外停车场?
对于我们哈佛大学数据科学硕士项目的顶点项目,我们与萨默维尔市合作回答了这个问题。我们的第一步是弄清楚计算车道数的确切含义。虽然我们可以为全市范围内的车道数量提供一个具有置信区间的单点估计,但萨默维尔的规划者可能需要在不同的粒度级别上合计车道数。我们希望为他们提供包裹级别的精确概率估计以及这些概率的不确定性。
首先,我们需要标签。萨默维尔市为我们提供了整个城市的光栅格式的航空卫星照片,我们使用 GIS 软件将这些照片分成每个地块的图像。接下来,我们编写了一个脚本来下载每个地块的 Google 街景图像。我们随机抽样了 600 多个地址,并根据我们在卫星和街景照片中看到的内容,手动标记它们是否有车道。我们在评估数据中注意到,还有数百个地块被标记为有车库,因此我们将这些地块添加到标记为有车道的地块中。
Figure 2. Examples of aerial and street view imagery
特色工程
为了预测一个住宅单元是否有车道,我们从各种来源收集和设计特征,以输入到监督学习模型中。我们使用了萨默维尔的税收评估数据库来获取大量关于房屋的信息,从建造年份到屋顶风格。
两个非常有价值的信息来源是包裹和建筑足迹。我们使用这些多边形来测量房屋和地块边缘之间的空间以及房屋在地块上的中心位置。据推测,有车道的房子坐在一边,一侧有足够的空间来容纳一辆汽车。
除了这些几何和空间特征之外,我们还汇总了地块的街道停车许可,假设更多的停车许可将表明一个单元不能在车道或车库中停车。
Figure 3. Visualization of our feature engineering process with building and parcel footprints
建模
生成特征后,我们尝试将各种二元分类器与我们的数据相匹配,结果变量是房子是否有车道。
最初,我们尝试使用卷积神经网络从我们的图像数据中提取特征并进行预测,但我们标记的照片非常少,而且它们的质量太低,无法使用,尽管我们进行了大量尝试来执行数据增强,合并迁移学习,并调整我们的网络架构。
相反,税务评估数据和手工设计的功能与传统的机器学习相结合,被证明比深度学习更有效。
我们将几个分类器用于该数据,包括逻辑回归(有和没有交互)、随机森林、AdaBoost、XGBoost 和前馈神经网络。我们还试验了这些模型的堆叠组合。
我们的问题也有很大的阶级不平衡。在我们手工标记的包裹中,代表了一个随机样本,82%有车道。为了弥补这一点,我们天真地在没有车道的情况下对宗地进行过采样,我们发现这种技术比合成少数过采样技术(SMOTE)和自适应合成采样(ADASYN)等更先进的技术更能提高性能。
逻辑回归和随机森林获得了可比的性能。我们选择随机森林,因为它能更好地捕捉特征和标签之间关系的非线性。这种基于树的模型还通过特征重要性提供了可解释性。
Figure 4. Feature importances from random forest model
后期造型
由于我们的模型将被萨默维尔市用于交通规划,我们希望在宗地级别上进行概率估计。为此,我们需要精确校准的概率,即反映事件真实可能性的概率。
不幸的是,许多机器学习模型,如随机森林,默认情况下不会产生校准良好的概率。此外,我们对少数民族类的上采样将许多原始随机森林得分推向 0.5,尽管我们预计大多数地块都有车道。
为了解决这个问题,我们执行了一个校准步骤来调整我们的模型产生的概率。对于我们预测有 70%机会拥有车道的单元,我们希望这 70%是真的。
我们使用了一种叫做 Platt scaling 的技术,它涉及到对我们未校准的预测概率和标签进行逻辑回归拟合。需要注意的是,我们希望用于校准模型的数据分布反映出我们对萨默维尔市车道总体分布的预期。在拟合这个模型之前,我们重新平衡了我们的校准集,使得车道在这个集中的比例大约为 82%。
这种校准技术使许多概率更接近于 1,反映了我们有根据的信念,即萨默维尔的大多数地块都有车道。
Figure 5. Calibration curves for uncalibrated and calibrated predictions on labelled data
估算
最后,由于我们希望萨默维尔市的分析师能够估算任何聚合级别(如街区或社区)的车道数,因此我们正式提出了一种方法来进行估算。
我们将每个地块中车道的存在 Y 建模为伯努利随机变量,其相应的概率 p 由两步分类器和校准模型估计。我们假设,根据我们的模型 X 中使用的特征,车道的存在以及车道在任何地块上存在的相关概率独立于其他地块。这一假设很重要,因为当我们考虑车道预期数量的变化时,它允许我们忽略任何空间相关性。
Figure 6. Variance derivation
要获得车道的预期数量,我们可以合计所有感兴趣宗地的概率。为了获得方差,我们首先创建了许多训练数据的自举样本,并为每个样本拟合了一个新的随机森林模型。然后,我们为每个地块计算了一组概率,每个自举样本一个。为了获得宗地级别估计的方差,我们计算了每个宗地的 p⋅ (1- p )的均值和 p 的方差,并将它们相加。最后,为了获得感兴趣的聚集级别的方差,我们可以对所有这些宗地级别的方差求和。
使用这种方法模拟车道的存在允许在任何地理水平上的统计上合理的聚集。如果我们添加任何一组地块的预测和方差,我们可以恢复有效的点估计和置信区间。
总体而言,我们估计在该市的 12,069 个住宅区中存在 10,288 条机动车道+/- 74 (2 个标准误差),尽管不同的街区有不同的机动车道比例,这可以在街区级别预测的地图中看到。
最终想法
我们进入这个项目的目的是使用最先进的计算机视觉和深度学习技术从卫星和街道视图图像中提取信息,以确定它们是否有车道。我们发现这个策略对于问题和手头的数据既不合适也不有效。
相反,采取更传统的机器学习方法结合由领域知识和现实不确定性估计启发的智能特征工程是有效的。我们希望我们的工作为萨默维尔市的分析师提供价值,因为他们计划新的地铁站和更多。
有关哈佛数据科学峰会的更多信息,请访问:capstone.iacs.seas.harvard.edu。
机器学习:从炒作到现实应用
如何利用新兴技术推动商业价值?
炒作是真实的。人工智能(AI)机器学习(ML) 遍布媒体,每个人都想参与到技术竞赛中。过去几年的进步绝对是巨大的,你可能听说过诸如“人工智能是新的电力”和“人工智能将彻底改变我们的社会”之类的说法。我不会对这些言论发表评论,但我们都可以有把握地同意的是,肯定有很多人对这些技术感兴趣。然而,所有这些关注回避了一个重要的问题:它真的能不负众望吗?
在某些领域,技术已经赶上,甚至超过了宣传。例如,在图像识别中,识别物体并从图像中提取信息的任务,人工智能现在正在超越人类水平的表现(即,机器在识别物体和图像方面实际上越来越好于人类)。
当在正确的用例中正确应用时,人工智能解决方案可以为您的业务提供巨大的价值。然而,随着围绕 AI 和 ML 的所有关注和炒作,清楚如何和何时应该使用这些技术变得非常重要。
参考上图中的“Gartner 新兴技术炒作周期”,我们看到“AI/深度学习”一直位于炒作周期的顶端。关于这一点的好处是,有很多关于这些技术提供的可能性的关注。但是,与此同时,人们需要意识到,在某些情况下,期望和现实之间可能存在不匹配。这使得超越宣传并展示如何正确应用 AI/ML 和数据分析以解决业务相关案例并提供真正价值变得更加重要。
人工智能革命:为什么是现在?
为什么我们突然有了这种围绕 AI 的炒作?人工智能和人工智能已经存在很长时间了,但有一些关键因素可以解释为什么这些技术在最近几年才真正开始起步。
一个至关重要的因素当然是可用数据的数量。访问大量数据是 ML 如此强大的关键因素之一。无论是记录数据的设备数量,还是它们之间通过物联网(IOT) 的连接性,可用数据量都在呈指数级增长。
当然,访问大量数据是一回事。另一个是能够处理这些数据,以便提取有用的信息。获取廉价而强大的计算资源对于推动人工智能和人工智能的发展至关重要。作为计算能力巨大发展的直观例子,让我们看看上图。在左边,我们有一张大约 15 年前世界上最快的超级计算机 NEC 地球模拟器的(部分)图像。而今天,你可以买一台普通的游戏电脑,并且基本上拥有相同的计算能力。
访问大数据和大规模计算能力的互补因素使得大规模处理数据成为可能,而这在几年前还是不可行的。随着谷歌和脸书等科技巨头开放大部分研究的额外好处,我们现在有了一个很好的起点来解决新的有趣的问题。
跨职能协作打造优质产品
超越宣传,真正构建为您的业务提供真正价值的解决方案,有几个重要因素需要考虑。涉及算法、计算机和数据的技术方面是一回事,但为了构建好的解决方案,你需要跨职能的合作。
领域知识:一方面,你需要对你要解决的问题有领域知识的人。在一个系统中有哪些可能性和局限性,如何在实践中应用该解决方案?
**数据科学:**你还需要数据科学内部的能力,这涉及到与分析、统计、信号处理、机器学习、人工智能和深度学习相关的一切。本质上,提取和利用数据中的模式和信息的方法和技术
**软件工程:**软件工程技能对于构建良好的数据驱动解决方案至关重要。这包括建立基础设施,通过适当的管道收集和处理数据,管理对数据的访问,并最终为最终用户建立实用和用户友好的软件工具。
最重要的是,你需要成功地将所有这些因素结合起来,才能制造出好的产品。
什么是机器学习?
机器学习是人工智能的主要分支之一,也是目前在开发新的更好的解决方案方面取得很多进展的领域。不涉及技术细节,ML 本质上就是从数据中提取有价值的信息。在这个上下文中,数据可以是来自文本、视频、图像、声音、传感器数据等的任何东西。典型的人工智能解决方案包括对图像和视频进行分析和分类的模型,通过传感器数据监控复杂工业设备的“健康状态”或者预测您企业的未来销售预测。(我们将在文章末尾回到一些具体的用例示例)
深度学习:从炒作到应用
重要的是要记住,深度学习不是魔法,而是基于处理图像等信息的数学模型(毕竟,图像只是计算机看到的数字集合)。
术语“人工神经网络”来自大脑处理信息的方式。人工神经网络模型并不试图复制人脑,但它们大致受到“神经元”数学模型的启发,神经元是神经信息处理的构建模块之一(因此得名神经网络)。
这些人工神经网络的分层结构(如上图所示)是我们将这种类型的建模称为“深度学习”的原因。模型的较深层(图的左边部分)通常提取关于尖锐边缘和基本形状的信息,而上层(图的右边部分)检测更精细和更详细的结构。
学习这些模型如何正确分类图像是一个耗时且计算量大的过程。我们本质上用正确分类的图像的例子来呈现该模型,然后该模型尝试自己对新图像进行分类。最初,预测只是随机猜测,但通过向模型显示足够多的图像,并在每次做出错误猜测时进行纠正,它最终学会提取相关信息,以便正确分类。
令人惊讶的是,我们不必告诉模型要寻找什么——它通过经验自己学习这些特征(我们称之为“机器学习”的原因)。
近年来,这一领域的进展令人惊讶,这主要是由于可以访问大量数据和廉价的计算能力。许多任务的性能现在已经超过了人类的水平(即,在识别和分类物体和图像方面,机器实际上正在变得比人更好)。当然,这有许多非常有趣和有用的应用,我们很快就会谈到。
人工智能和创造力
我们通常认为“智能”是执行任务的能力,我们通常将它与人类智能联系在一起。一个这样的任务例如可以是产生艺术或音乐的创造性能力。足够有趣的是,即使对于这些类型的创造性“人类”任务,我们现在也看到人工智能表现得惊人地好。
为了说明这一点,我展示了上面的一个例子,其中一个人工智能模型被训练成以挪威著名画家爱德华·蒙克的风格生成图像。给定一个训练有素的模型,我们就可以使用新风景的图片作为“人工智能艺术家”的“灵感”,并以人类艺术家的绘画风格复制它。效果出奇的好,你不觉得吗?
上面的例子也许不是很有用(虽然很有趣)。然而,它很好地说明了底层技术从图像中提取有意义信息的能力,这反过来对其他应用程序也非常有用。
机器学习的现实应用
为了展示我们工作的主题的大跨度,我挑选了几个 ML 如何在现实世界中使用的例子。这些例子从使用数据分析和 ML 进行重型工业设备的状态监控,到使用计算机视觉进行质量保证以及各种图像识别和物体检测任务。你也可以在这里阅读我们其他令人兴奋的项目。
利用传感器数据的质量保证
上述案例是一个典型的生产公司,例如,可能涉及复杂设备的制造或控制加工厂。一般来说,任何最终产品是某种生产单位的东西。
上图所示的简化视图旨在通过传感器数据利用所有可用信息,并揭示测量变量和生产质量之间的关系。变量 x 影响生产质量吗?在当前的操作条件下,我的产品出现缺陷的风险有多大?为了提高产品质量,生产的哪一部分最需要优化?这些是我们可以通过适当利用现有数据来回答的一些问题。
状态监控
作为一个具体的例子,我们可以例如考虑将传感器数据用于压缩机的状态监控。在这种情况下,我们监控传感器数据(温度、压力、振动、++),ML 模型根据积累的经验学习什么是“正常的”。该模型持续寻找记录数据中的异常和即将发生的故障/故障的迹象。如果根据测量的变量,行为看起来可疑,该模型可以生成警报或启动预防措施。
即将发生的故障的早期预警对于基于状态的维护和维修计划等具有重要价值。利用这种解决方案有助于避免由于早期预警导致的突然故障,从而允许采取预防措施并控制关键设备的关闭。如果您有兴趣了解更多关于如何使用 ML 进行状态监控的信息,您可以阅读下面的文章
用于质量保证的图像识别
上图展示了这种技术在质量保证中应用的例子。在这种情况下,模型分析图像,寻找某些确定的特征,如腐蚀、损坏、裂纹、焊接不良等。也许不如创作艺术有趣,但对许多工业应用来说肯定非常有用。
水产养殖中的图像识别
另一个例子是在渔场中应用对象检测来监控鱼的健康。这在今天是一项非常具有挑战性的任务,因为鱼在水下基本上无法直接目视检查。一个新的创新解决方案是利用水下摄像机和人工智能解决方案进行自动图像和视频分析。这允许实时提取关于鱼类健康和幸福的重要信息。这是一个好消息,无论是从动物福利的角度,还是从健康的鱼对养鱼场主来说更有利可图的事实来看。在这里了解更多关于这个项目的信息
从技术到商业价值:主要收获
主要的信息是,一个人应该始终专注于带来商业价值的东西。新兴技术肯定可以成为实现这一目标的推动者,但专注于业务方面对于新计划和项目的成功至关重要。
要打造优秀的产品和创新的解决方案,不同专业领域之间的合作是关键。当领域专家和软件/分析专业知识合作,充分发挥新兴技术的优势时,最佳解决方案就会出现。
如果您对如何超越宣传进入现实生活的应用程序感到好奇,请随时与我们聊聊技术和软件解决方案如何帮助解决您的业务需求。
这篇文章最初出现在axbit.com/blog
你觉得这篇文章有趣吗?如果是这样的话,你可能也会喜欢我的其他一些关于人工智能、机器学习、物理等主题的文章。,你可以在下面的链接和我的中型作者简介中找到:
2018 年夏天我发表第一篇关于“走向数据科学”的文章时,数字背后的统计数据…
medium.com](https://medium.com/@vflovik)
而且,如果你想成为一个媒体会员,免费访问平台上的所有资料,你也可以使用下面我的推荐链接。(注意:如果您使用此链接注册,我也会收到一部分会员费)
[## 通过我的推荐链接加入 Medium—Vegard flo vik
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@vflovik/membership)
更多来自 Vegard Flovik 媒体:
- 蒙特卡洛方法简介
- 从物理学到数据科学的转变
- 什么是图论,为什么要关心?
- 用于图像分类的深度迁移学习
- 建造一个能读懂你思想的人工智能
- 人工智能和大数据隐藏的风险
- 如何使用机器学习进行异常检测和状态监控
- 如何(不)使用机器学习进行时间序列预测:避免陷阱
- 如何利用机器学习进行生产优化:利用数据提高绩效
- 你是怎么把物理教给 AI 系统的?
- 我们能使用纳米级磁铁构建人工大脑网络吗?
- 供应链管理中的人工智能:利用数据推动运营绩效