标准误差
我最近正在读一本畅销书,讲述概率在日常生活中的应用,作者是列纳德·蒙洛迪诺。它雄辩地追溯了测量不确定性的历史,计算随机事件的概率。精选名言:
我们生命的轮廓,就像蜡烛的火焰,不断被各种随机事件引导向新的方向,这些事件以及我们对它们的反应,决定了我们的命运。
这些计算得出的见解令人惊讶,也说明了人类对随机性的直觉有多离谱。例如,如果你玩加州彩票,你死在去当地彩票供应商的路上的可能性和你中奖的可能性一样大。当你考虑到这个结果时,这个游戏就不那么吸引人了。
在这段关于数学家伯努利和以他名字命名的分布的文章中,我发现了一个错误:
假设巴塞尔 60%的选民支持市长。你要调查多少人才能有 99.9%的机会发现市长的支持率在 58%到 62%之间——也就是说,结果的精确度在正负 2%以内?(假设,为了与伯努利一致,被调查的人是随机选择的,但有替换。换句话说,你可能不止一次地调查一个人。答案是 25,550 人,在伯努利的时代,这大约是巴塞尔的全部人口。伯努利没有忘记这个数字是不切实际的。
根据我的计算,你只需要调查 6446 人,而不是 25550 人。我使用二项式的 CDF 来寻找最小的 n,它给出了至少 0.999 的概率,估计值在 0.58 和 0.62 之间。下面是 R 中的一行程序,p=0.6,n=6446:
pbinom(天花板(n*.62),n,p)-pbinom(地板(n*.58),n,p)
[1] 0.9990067
求解 n 的更直接的方法是使用二项式均值的标准误差公式。下面的公式依赖于二项式的正态近似。我们想找到 n,使得区间等于[0.58,0.62]。
z_{𝛼/2}是标准正态分布的 1- 𝛼/2 分位数,其中𝛼是误差率,在本例中为 1–0.999 = . 001。求解 n 得到 6496.5,与之前计算的值相似。
如果对作者的 25550 人进行民调,那么 99.9%的区间就是 p 0.01,而不是 0.02。换句话说,在 25,550 人的调查中,99.9%的人会显示估计在 59%和 61%之间,而不是声称的 58%和 62%。
一本令人愉快的书中的一个小错误。
使用 Python、pandas、seaborn 和 scikit-learn 进行探索性数据分析的入门包
我也是一个装满东西和小摆设的背包。你可能需要的任何东西我都在里面。—来自爱探险的朵拉的背包(来源)
探索性数据分析(EDA)是任何处理数据的人的谋生之道。随着信息每天增加 2.5 万亿字节( Forbes,2018 ),对高效 EDA 技术的需求空前高涨。
那么这场洪水来自哪里呢?有用信息的数量几乎肯定不会以这样的速度增长。当我们仔细观察时,我们会意识到这种增加的大部分是由噪声引起的**。有如此多的假设需要检验,如此多的数据集需要挖掘,但客观事实的数量相对恒定。对于大多数数据科学家来说,他们的主要目标是能够区分信号和噪声,EDA 是实现这一目标的主要过程。**
输入 EDA
在这篇文章中,我将介绍一个初学者包,使用流行的 Python 包:pandas、matplotlib、seaborn 和 scikit-learn 在 Titanic 数据集上执行 EDA。
代码参考可以参考我的 GitHub 库这里。
通信数据
一般来说,我们可视化数据有两个主要原因:
- 理解(EDA)
- 交流
在最后一部分,我将分享一些有用的仪表板指南,它们将帮助你清晰有效地传达你的分析结果。
大纲:
1.什么是数据
首先,一些理论。“数据”一词在 1946 年首次用于表示“可传输和可存储的计算机信息”(来源)。在最高级别,术语数据可以大致分为两类:结构化和非结构化。结构化数据是预定义的数据模型,通常驻留在具有固定模式的关系数据库或数据仓库中。常见的例子包括交易信息、客户信息和日期。另一方面,非结构化数据没有预定义的数据模型,只能在 NoSQL 数据库和数据湖中找到。示例包括图像、视频文件和音频文件。
在这篇文章中,我们将聚焦于结构化数据,在这里我将提出一个系统的方法来快速显示你的数据中潜在的统计数据。在结构化数据的保护伞下,我们可以进一步将它们分类为分类和定量。对于分类数据,算术规则不适用。在分类家族中,我们有名义和序数数据,而在数量家族中,我们有区间和比率。重要的是,我们需要一些时间来清楚地定义和理解每个术语之间微妙而重要的差异,因为这将影响我们以后的分析和预处理技术。
4 Different types of Data
标称数据
“名义上的”这个名字来自拉丁语, nomen ,意思是名字。名义数据是由简单命名系统区分的对象。需要注意的一件重要事情是,名义数据也可能分配有数字。这可能会出现序数(定义如下),但他们不是。编号的标称数据仅用于获取和参考。一些例子包括:
- 一组国家。
- 钉在马拉松运动员身上的号码。
有序资料
顺序数据是指那些其顺序很重要的项目。更正式的说法是,它们在有序尺度上的相对位置为我们提供了意义。这可能表示优势或时间位置等…默认情况下,序数数据的顺序是通过给它们分配数字来定义的。然而,也可以适当地使用字母或其他顺序符号。一些例子包括:
- 一场比赛的名次(第一、第二、第三)
- 组织中的工资等级(助理,AVP,副总裁,SVP)。
区间数据
与顺序数据类似,间隔数据是沿着一个标尺测量的,其中每个对象的位置彼此之间的距离是等距的。这个独特的属性允许算术应用于它们。一个例子是
- 华氏 78 度和 79 度之间的温度差与 45 度和 46 度相同。
比率数据
像区间数据一样,比率数据的差异是有意义的。比率数据有一个额外的特性,使对象的比率也有意义,那就是它们有一个真零点。零表示没有某个属性。所以当我们说某样东西没有重量时,我们的意思是那东西没有质量。一些例子包括:
- 体重秤上人的重量
区间 vs 比率
区间和比值的区别只是一个没有真正的零点,而另一个有。举个例子可以很好地说明这一点:当我们说某样东西的温度是 0 华氏度时,并不意味着那东西没有热量。这一独特的性质使得诸如“华氏 80 度是华氏 40 度的两倍”之类的说法不成立。
在我们深入研究其他部分之前,我想形式化一些概念,这样你就可以清楚地知道我们为什么要做下面显示的事情。
首先,我要说的是,快速显示数据摘要的最佳方式是通过 2D 图。尽管生活在 3D 空间世界中,人类发现很难感知第三维度,例如深度,更不用说 3D 图在 2D 屏幕上的投影。因此,在随后的章节中,您会看到我们仅使用条形图表示分类数据,使用箱线图表示定量数据,因为它们分别简洁地表达了数据分布。我们将只关注目标变量的单变量分析和双变量分析。有关仪表板技术的更多详细信息,请参考本文的第 6 节。
我们将主要使用海洋生物和熊猫来完成这个任务。众所周知,统计是任何数据科学家的工具箱中必不可少的一部分,seaborn 允许快速轻松地使用 matplotlib 来漂亮地可视化您的数据统计。matplotlib 功能强大,但有时会变得复杂。Seaborn 提供了 matplotlib 的高级抽象,允许我们轻松地绘制有吸引力的统计图。为了更好地利用 seaborn,我们还需要熊猫,因为 seaborn 与熊猫的数据帧配合得最好。
此外,如果您想跟随编码,一定要下载数据并正确设置您的环境。您可以在自述文件中找到说明。我的 GitHub repo 中的 MD 文件。
说到这里,让我们开始动手吧!
2.分类分析
我们可以使用pd.read_csv()
开始读取数据。通过对数据框执行.head()
,我们可以快速查看数据的前 5 行。对于那些不熟悉 pandas 或数据框概念的人,我强烈建议花半天时间浏览以下资源:
其他有用的方法有.desribe()
和.info()
,前者会显示:
Output of .describe() method on a data frame
后者会显示:
Output of .info() method on a data frame
我们现在看到,
分类数据:
- PassengerId,
- 幸存了下来,
- Pclass,
- 姓名,
- 性,
- 票,
- 小屋,
- 登上了
而定性数据:
- 年龄,
- SibSp,
- 炒熟,
- 和票价
现在,有了这些知识和我们在第 1 节中学到的知识,让我们编写一个定制的帮助器函数,它可以用来处理大多数种类的分类数据(或者至少尝试这样做),并给出它们的快速摘要。我们将借助一些熊猫方法和 seaborn 的.countplot()
方法来做这些。助手函数称为categorical_summarized
,如下所示。
Helper Function #1: Categorical Data Summarizer
categorical_summarized
所做的是接收一个数据帧,连同一些输入参数,并输出以下内容:
- 数字数据的计数、平均值、标准差、最小值、最大值和四分位数,或者非数字数据的计数、唯一性、顶级和顶级频率。
- 如果
verbose
设置为True
,感兴趣列的分类频率 - 感兴趣的列的每个类的计数的条形图
让我们来谈谈输入参数。x
和y
接受一个str
类型,它对应于我们想要调查的感兴趣的列。将列名设置为x
将创建一个条形图,x 轴显示不同的类,y 轴显示它们各自的计数。将感兴趣的列的名称设置为y
将会翻转前面的图的轴,其中不同的类将位于 y 轴上,而 x 轴显示计数。通过将hue
设置为目标变量,该函数将显示目标变量对相关列的依赖性。显示categorical_summarized
用法的示例代码如下所示:
使用“分类总结”的一些例子
单变量分析
Using categorical_summarized on Survival Variable
将给出以下内容:
Output of categorical_summarized on Survival Variable
双变量分析
Using categorical_summarized on Gender Variable with hue set to Survived
将给出以下内容:
Output of categorical_summarized on Gender Variable with hue set to Survived
更多例子请参考 GitHub repo 中的Titanic.ipynb
。
3.定量分析
现在,我们可以在技术上使用条形图来表示定量数据,但这通常会非常混乱(您可以尝试在Age
列上使用categorical_summarized
,您会看到一个由细箱组成的混乱图)。更简洁的方法是使用箱线图,它基于五个数字汇总显示分布:最小值、Q1、中值、第三季度和最大值。
下一个助手函数称为quantitative_summarized
,定义如下:
Helper Function #2: Quantitative Data Summarizer
与categorical_summarized
类似,quantitative_summarized
接收一个数据帧和一些输入参数,以输出潜在统计数据以及一个箱线图和群集图(如果swarm
设置为true
)。
quantitative_summarized
可以接受一个定量变量和最多两个分类变量,其中定量变量必须分配给y
,另外两个分类变量可以分别分配给x
和hue
。显示用法的一些示例代码如下所示:
一些使用“定量 _ 概括”的例子
单变量分析
Using quantitative_summarized on Age Variable
将给出以下内容:
Output of quantitative_summarized on Age Variable
双变量分析
Using quantitative_summarized on Age Variable with x set to Survived
将给出以下内容:
Output of quantitative_summarized on Age Variable with x set to Survived
多变量分析
Using quantitative_summarized on Age Variable with x set to Survived and hue set to Pclass
将给出以下内容:
Output of quantitative_summarized on Age Variable with x set to Survived and hue set to Pclass
相关性分析
我们可以使用的另一个流行的定量分析是找出变量之间的相关性。相关性是理解数据集中变量之间关系的一种方式。对于任何一对变量:
- 正相关:两个变量同向变化
- 中性相关:变量的变化没有关系
- 负相关:变量反向变化
皮尔逊相关系数通常用于总结两个样本变量之间线性关系的强度。这是两个变量之间的协方差的归一化,
Pearson’s Correlation Coefficient Formula
形象化的一个好方法是使用热图。我们首先丢弃分类变量,并用它们的模式填充剩余定量变量的缺失值。熊猫数据框架允许用.corr
方法简单计算皮尔逊的 CC。代码可以在下面找到
Heatmap of Pearson’s CC for Quantitative Variables
这种可视化的一个好处是,我们不仅可以看到变量之间的关系,例如,Fare 和 Pclass 之间存在负的 Pearson CC,我们可以避免多重共线性现象的发生。
多重共线性会对广义线性模型(如逻辑回归)产生不利影响。当变量之间存在高度相关性,导致回归系数的估计不稳定时,就会出现这种情况。然而,如果你计划使用决策树作为你的预测器,那么你不需要担心这个。
关于共线性的有趣阅读可以在这里找到。
相关性有助于数据插补,相关变量可用于填充彼此的缺失值。相关性也可以表示因果关系的存在。也就是说,需要注意的是相关性并不意味着因果关系。
更多例子请参考 GitHub repo 中的Titanic.ipynb
。
4.使聚集
k 均值聚类
k-means 聚类属于划分聚类家族。在分区集群中,我们必须指定我们想要的集群数量, k 。这可以通过挑选如下所示的惯性图的“肘”点来完成。一个好的选择是 k ,它不是太大并且具有低惯性值。惯性是一种衡量群集质量的指标,它为我们提供了群集紧密程度的指标。
Inertia plot using K Means Clustering to select a suitable k value
当 K Means 计算特征之间的距离以决定随后的观察是否属于某个质心时,我们必须通过编码分类变量和填充缺失值来预处理我们的数据。下面显示了一个简单的预处理函数。
Function to preprocess the data to prepare for Clustering
既然我们已经处理了数据,我们必须执行特征缩放,以便可以比较跨特征计算的距离。这可以通过sklearn.preprocessing
库轻松完成。代码实现请参考Titanic.ipynb
。运行 k-means 算法后,我们设置 k = 2 ,我们可以绘制如下所示的变量。
Cluster red and blue plotted on Age and Survived Axes
层次凝聚聚类
对于这一小节,我将介绍另一种通过集群执行 EDA 的快速方法。凝聚聚类使用自下而上的方法,根据各个观察值之间的距离将它们迭代地连接在一起。我们将使用scipy.cluster.hierarchy
包来执行链接,并使用树状图显示我们的结果。通过最近邻法计算两个聚类之间的距离。
Code to implement Hierarchical Agglomerative Clustering
Dendrogram of the Hierarchical Clustering of the Titanic Dataset
5.基于树的估计器的特征重要性
执行 EDA 的另一种快速方法是通过基于树的估计器。决策树学习如何在最终输出预测的叶节点之前“最佳地”将数据集分割成更小的子集。这种分裂通常由一个杂质标准来定义,如基尼或信息增益熵。因为这是一篇关于 EDA 而不是决策树的文章,所以我不会详细解释它们背后的数学原理,但是我会告诉你如何使用它们来更好地理解你的特性。更多细节你可以参考这篇写得很好的文章。
基于杂质标准,可以通过贪婪地挑选对最大信息增益有贡献的特征来构建树。为了说明这一点,我将使用scikit-learn
库。
构建随机森林分类器
我们首先构建一个随机森林分类器。默认情况下,杂质标准设置为基尼系数。使用下面的代码,我们可以看到我们的 Titanic 数据集的相应特征的重要性。
Code to generate a Random Forest Classifier, train, and also plot the Feature Importance
让我们试试 XGBoost
另一种创建决策树集合的方法是通过 XGBoost,它是梯度增强框架家族的一部分。使用下面的代码,我们可以看到哪个相应的特性对我们的 XGBoost 是重要的。同样,默认情况下,杂质标准设置为基尼系数。
Code to generate an XGBoost Classifier, train, and also plot the Feature Importance
6.仪表板技术
与信息图表不同,仪表板的创建是为了在单个屏幕上以干净、简洁的方式客观地显示重要信息,目的是通知而不是误导读者。通常,仪表板是利用我们的视觉感知能力来放大认知的数据表示。他们显示的信息是高质量的图形,所有人都能理解,不需要额外的信息来解释。
为了实现卓越的图形,必须遵守以下两个关键方面:
- 最大化数据:墨迹和最小化图表垃圾
- 具有高度的图形完整性
数据:墨水和图表垃圾
数据:墨水被定义为用于表示数据的墨水,而图表垃圾被定义为多余的、装饰性的或转移注意力的墨水。图表垃圾的例子有莫尔振动、网格和鸭子。为了实现这一点,我们利用我们的预先注意属性和格式塔原则来引出可视化的模式。
Image showing the side of a man’s face, at the same time, the front of his face. An example to illustrate Figure & Ground
实现图形完整性
改编自:爱德华·塔夫特。(2001).定量信息的可视化显示,第二版,图形,有六个原则保证图形的完整性:
- 使数字的表示与数量成比例
- 使用清晰、详细、彻底的标签
- 显示数据变化,而不是设计变化
- 使用标准化单位,而不是标称值
- 描述少于或等于“n”个可变维度的“n”个数据维度
- 引用完整上下文中的数据
因此,我们避免使用饼状图或 3D 图或区域尺寸。条形图和箱线图是实现图形完整性的很好的例子,因为它们简单(每个人都可以毫不含糊地理解)而且强大。不要遗漏上下文也很重要,比如让轴显示以零为参考的定量数据。
Examples of Misleading Graphics with Poor Graphical Integrity
迄今为止, Tableau 可能是仪表板方面的行业领导者。他们采用了最佳的仪表板实践,还通过拖放为您完成了绘制图表的繁重工作。我强烈推荐任何对这个领域感兴趣的人来看看 Tableau。另一个新兴的开源项目叫做 Apache Superset ,它做的事情与 Tableau 类似。
结论
总而言之,做 EDA 有无数种方法。EDA 是整个数据科学过程的一部分,这个过程是高度迭代的。我在这篇文章中分享的是我在参加了一些数据科学黑客马拉松后学到的东西,我在 AI Singapore 担任数据科学家的时间,以及我在 MTech 课程中的项目。我坚信首先要建立一个坚实的基础,然后我们优化速度和性能,这也是我写这篇文章的动机。有了这组帮助函数,我和我的团队能够理解我们给定数据集的潜在统计数据,然后制定一个合理的策略,在半天的黑客攻击内构建一个分类器。
这篇文章并不是 EDA 的完整指南,而是一个入门包,让有抱负的数据科学家使用 Python、pandas、seaborn 和 scikit-learn 等开源工具开始他们的第一个数据科学项目。如果您有任何基于 Python 包的很酷的自定义函数,并且在 EDA 过程中对您有所帮助,请随时在下面留下您代码的评论。您还可以提交一个 pull 请求并贡献给helper.py
文件。感谢阅读😄。我希望你带走了一些东西。
如果你对我参与的其他项目感兴趣,欢迎访问我的GitHub!**
想学习如何快速构建人体动作分类器?请查看我之前的帖子 这里 。
机器学习的故事:我们如何识别
A star named Fomalhaut and its surrounding belt dust (also known as the eye of Sauron)
考虑一个场景:当你环游世界一半的时候,你走在这个新城市的市中心,欣赏着新的风景。突然,你的注意力集中在向你走来的人身上。当你们彼此越来越接近时,你的大脑开始识别零碎的东西;首先是眼睛,然后是微笑,走路,脸型。突然,它击中了你。是你十年未见的朋友!
我们如何看到?
我们如何识别物体和人?我们如何区分椅子和桌子?朋友换了发型,胖了或者瘦了,长大了,我们怎么区分?这种能力与大脑不储存确切的图像而是储存抽象图像的事实有关。椅子的定义不是存储为一个四条腿的棕色木质物体,有一个背面,而是一个从地面升起的物体,有一些支撑,适合一个人放置。它可能有也可能没有轮子,可能有也可能没有扶手,等等。此外,随着我们看到越来越多的椅子,这种抽象会随着时间而演变。事实上,我们倾向于将这些抽象概念及时投射回去,并根据新的信息改变我们对过去的记忆。
电脑怎么看?
类似地,通过抽象来识别对象的计算机系统。一个简单的方法是使用主成分分析(PCA)。我将使用模式识别中机器学习的第一个真实世界应用之一来说明这一点,即识别邮政编码。在这个简单的例子中,我将说明如何构建一个非常简单的系统来将手写数字转换成数字。下图显示了将要分析的一些手写数字的示例。帖子最后给出了数据集链接。
% Open and read the file
fileID = fopen('optdigits-orig.tra','r');
formatSpec = '%s';
data = textscan(fileID,formatSpec); data = char(data{1});% Define important parameters
nx = 32; ny = 32; nxny = nx*ny;
nNumbers = size(data,1)/ (nx + 1);% Initialize the output
trainingMatrix = zeros(nxny, nNumbers);
output = zeros(nNumbers, 1);% Subdevide data into images
for i = 1:nNumbers
startingLocation = ((i-1)*(nx+1))+1;
endingLocation = startingLocation + ny - 1;
outputLocation = endingLocation +1;
trainingMatrix(:,i) = str2num(reshape(data (startingLocation:endingLocation, :), nxny, 1));
output(i) = str2double(data(outputLocation, :));
end% Visualize some the images
figure('Color', 'White');
for i = 1:6
subplot(2,3,i)
imagesc(reshape(trainingMatrix(:,i),32,32));
axis equal; axis tight;
set(gca,'xTickLabel', [], 'yTickLabel', []);
colormap gray;
end
Examples of handwritten numbers from the dataset used here
一般过程如下:1)首先,获得具有正确数字表示的手写数字的大训练集,2)系统将使用 PCA 识别每个数字的模式,3)最后,模式将用于对新的手写数字进行预测。
提取模式(构建系统)
主成分在给定的数据集中寻找独立的方向,使得第一方向解释数据集的最大信息量,第二方向解释第二大信息量,等等。下图显示了一个二维数据集以及相应的第一和第二主成分的示例。请注意,第一个分量在数据中具有最大的方差。我不会在这篇文章中详细介绍五氯苯甲醚的工作原理,因为互联网上有很多网站都在讨论这个问题。如果你有任何问题,请在评论中提问,我会用这些信息更新帖子。
How principle componenet analysis works. Note that the first principle component captures more variations (i.e. the data range is longer in that direction)
对图像应用类似的分析,可以获得图像的主成分。下图显示了包含 1934 个手写数字的数据集的前几个主要组成部分。请注意,每个组件都由一个模式组成,该模式可以被视为训练数据集的所有数字的线性组合。
[PC,score,latent,tsquare] = pca(trainingMatrix’);
varianceAccounted = latent./sum(latent);figure(‘Color’, ‘White’);
for i = 1:12
subplot(4,3,i)
imagesc(reshape(PC(:,i),32,32))
axis equal; axis tight;
set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
title([‘PC ‘ num2str(i) ‘ — Variance %: ‘ num2str(varianceAccounted(i)*100,’%10.1f’)]);
end
The first 12 (i.e., the most important 12) principle components (patterns) extracted from the handwritten number dataset
更重要的是,请注意,每个数字都可以被认为是这些主分量的线性分量。例如,数字 4(下图)可以认为是由第一个主成分的 0.3835 和第二个主成分的-5.9564 组成,以此类推。这些权重将用于识别新的手写数字。下图显示了使用前 30 个主成分重建的一个手写数字。
% Number index
numberIndex = 4;% Extract the number and its weights
realNumber = trainingMatrix(:,numberIndex);
scoreNumber = score(numberIndex,:);% Reconstruct the number with the first 30 PC
reconstructedNum = zeros(size(realNumber));
for i = 1:30
reconstructedNum = reconstructedNum + (PC(:,i) * scoreNumber(i));
end% Figure
figure(‘Color’, ‘White’);
subplot(1,2,1); imagesc(reshape(realNumber,32,32)); title(‘Original’);
axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
subplot(1,2,2); imagesc(reshape(reconstructedNum,32,32)); title(‘Reconstructed’);
axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
colormap gray;
An example of a handwritten number and its reconstruction using the first 30 principle components
预测新的手写数字(进行预测)
给定一个新的手写数字,可以使用 PCA 提取其中的模式。模式的权重可以与使用训练集构建的表进行比较。重量越接近某个数字,手写数字越有可能是那个数字。二次识别分析用于预测。事实上,我们可以使用权重来构建一个概率解。当然,在这个应用中,最可能的数字被认为是正确的解。但是,您可以考虑某些应用,在这些应用中,相对统一的概率解决方案将导致人工干预来决定最佳解决方案。
% Create Classifier
P = fitcdiscr(score(:,1:7),output’,’DiscrimType’,’pseudoQuadratic’);% Predict and Show
figure(‘Color’, ‘White’)
for i = 1:6
subplot(2,3,i)
randomImage = round(rand() * nNumbers);
label = predict(P,score(randomImage,1:7));
imagesc(reshape(trainingMatrix(:,randomImage),32,32))
title([‘This is a ‘ num2str(label)]); colormap gray;
axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
end
Example of predicted solution for some handwritten numbers
结束语
我没有概述或使用的一件事是训练数据集与测试数据集的使用。实际上,我应该将数据集的一部分用于训练,另一部分用于测试。此外,在计算量大的数据集中,一些不太重要的主成分可能会被丢弃。我将在其他帖子中讨论这些问题。
我希望你现在明白了让计算机识别物体和人的一种方法。如今普遍使用的更精确的分类器依赖于更复杂的卷积神经网络。有一天我可能会写一篇关于这些的文章。
使用的数据和软件说明
Mathworks Matlab 2016b 在这篇文章中使用。然而,可以使用其他软件来执行相同的分析,包括 Octave(免费)、R(免费)、Wolfram Mathematica 和机器学习库,如 Tensor Flow 或 Microsoft Cognitive Toolkit。数据集是从加州大学欧文分校的机器学习和智能系统中心获得的(链接)。
用逻辑回归研究分类问题及对招生问题的理解
摘要:
在我们的世界里,很多经常遇到的问题都是分类问题。我们经常在确定的价值观和对事物的僵化选择之间感到困惑。在本文中,我们将讨论一种使用机器学习有效解决简单分类问题的算法。此外,我们将分析一个假设的二元类问题,涉及基于入学考试成绩和本科成绩的研究生成绩。
简介:
监督学习是一种机器学习技术,其中我们将输入与给定数据集中的目标相关联。对于我们的最终产出,我们已经有了明确的直觉。我们大致有两种类型的监督学习问题,“回归”和“分类”。我们将在本文中讨论分类问题。分类问题是我们将输入数据分成不同类别的问题。所谓离散,我们指的是单独的类。
例如:想象一个基于研究生院招生的假设数据集,有三列。第一列是入学考试分数(输入 X1 ),第二列是 UG 考试(输入 X2 ),第三列是结果,录取/拒绝(目标 Y )。本文中使用的数据集片段如下所示。
Entrance Exam Score, UG Score, Outcome(Binary)
我们将目标类 Y 定义为二进制类。因此,我们将集合定义为, Y={0,1} 其中集合元素为:
0 表示拒绝(否定类),
1 表示接受(肯定类)
因此,这是一个分类问题。我们可以根据录取过程的结果将数据集分为两类。通常将数据集分解为离散类别的算法被定义为分类器。在这个例子中,因变量是二分的。在这种情况下,我们更喜欢逻辑回归。我们可以在 MATLAB/Octave 中绘制数据集的散点图,并观察下图:
Scatter plot of our dataset
涉及的激活功能和映射功能:
首先,考虑映射我们的输出和输入的函数,因此在计算平方误差函数时用于计算预测。让我们称那个函数为映射函数或假设函数, h(X) 。“假说”一词是出于各种历史原因而创造的。此外,术语“逻辑”是乙状结肠的同义词。因此,我们在该算法中使用具有“S 形曲线”的 Sigmoid 激活函数。通过我们的编程功能生成的曲线如下所示。
Sigmoid Activation Function
数学上,我们将函数定义为:
Sigmoid 函数还有其他几个数学特性。比如我们可以用函数本身来表示函数的导数。
这种 Sigmoid/Logistic 函数简化了优化过程中涉及的数学运算,是小规模分类问题的理想选择。使用 Sigmoid 函数,我们可以有效地限制我们的范围,以便它有效地表示概率。我们可以用数学方法将假设/映射函数表示为:
这本质上是一个非常基本的线性成本函数,只是它与一个 sigmoid 函数相结合。
我们的假设函数给出了任何给定事件发生概率的数值。我们可以将映射函数的范围定义为: 0≤h(X)≤1 。
成本函数直觉:
成本函数是一种数学函数,用于估计假设与输入集和目标集的匹配程度。从图形上看,我们知道一个更好的成本函数会更好地拟合我们给定的数据。它通常表示为参数的函数。在这种情况下,我们称之为 J(θ) 。
在这个算法中,我们使用了一个对数代价函数,它是从最大似然估计(M.S.E) 的原理中推导出来的,以确保我们得到的作为输出的函数是一个凸函数。
一个简单的直觉是认为代价函数中涉及的对数大致反作用于所涉及的 exp 。
正如克里斯托弗·毕晓普在他的著作中指出的那样,
“当我们假设我们的阳性和阴性训练样本来自两个不同的高斯聚类(不同的位置,但相同的协方差)时,我们可以开发一个完美的分类器。”
凸函数中的优化更容易,因为在曲线中更容易达到最小值并获得参数θ的最佳值。
然而,我们观察到,在我们对 J(θ)进行微分之后,我们得到了与线性回归方法相同的梯度函数。
然而,梯度值不是一回事,因为我们拥有不同的线性和逻辑回归映射函数。
Prototype code for a Cost Function
因此,使用参数向量θ和成本函数 J(θ),我们可以应用任何给定的优化算法来实现简单的决策边界。
优化参数:
现在,如果我们想要拟合参数(在本例中为θ),我们需要应用最小化(优化)算法。
我们可以采取简单的小步骤 ( )限制(θ)>0*)达到我们给定的最小值,通常称为梯度下降,或者采用高级优化算法,如**【BFGS】或 有限内存 BFGS 。 高级优化方法是 拟牛顿 方法的一部分,我们在其中计算黑森矩阵*的优化值。L-BFGS 非常类似于 BFGS,除了它有更好的内存优化和更可扩展的算法。此外,当与梯度下降并置时,高级算法不容易出现反复试验的情况,因为不需要选择任意值的*α(*学习率)来获得更优的结果。Hessian 矩阵的数学符号如下所示:
通常,我们通过库应用高级优化。C++中用于应用高级优化算法的一个特殊库是 Eigen C++库。
然而,不同的库可能有不同的时间复杂度。不明智地选择一个库可能会降低我们算法的整体性能,并对我们的整个程序产生严重的影响。
因此,在使用优化方法有效地最小化我们的参数之后,我们可以绘制决策边界。因此,我们使用 MATLAB 的通用*“fmin unc”*来应用高级优化。在应用以θ和梯度值为参数的函数后,我们可以如下绘制决策边界:
Decision Boundary separating the data. In this case, a linear boundary fits better.
过度拟合曲线的概念:
过度拟合基本上是一种情况,其中我们的学习假设设法拟合数据集中的所有点,并产生很少或没有错误,但有一个重大缺陷。我们的算法无法预测新测试实例的离散类。
这个问题的解决方法: 我们可以惩罚某些参数(θ)来修复这个。我们在优化算法中增加了一个调节参数(λ),可以优化曲线。这个技术叫做正则化。因此,我们修改我们的成本函数和优化算法来惩罚参数并获得最佳拟合。
适合度:
在拟合优度(G.O.F) 中,我们主要检查一个给定的模型是否被正确指定,以及它与统计观察值的拟合程度。通常有两种常用的方法来估计拟合优度。一个测试是著名的皮尔逊卡方测试,另一个测试是霍斯默和莱梅休测试。简单明了的皮尔逊卡方检验是一种更简单的技术,因此我们将讨论检验的直觉。
卡方(χ2)对于从给定数据集计算统计参数具有很高的数学准确性。此外,这个测试是渐近真实的。它的主要作用是计算数据集中每个观测值的频率。
因此,我们可以通过比较 p 值和分布值来计算统计 p 值。
我们还可以使用各种其他测试,如 Stukel 测试或信息矩阵测试来有效地测量逻辑回归的拟合度。
由于这是我关于机器学习的第一篇文章,我讨论了该领域的一个基本概念。在下一篇文章中,我将使用基于 U64 Bitboard 的国际象棋引擎来讨论 Alpha Beta 修剪。
参考资料:
- W.李少华,刘,“利用加权逻辑回归的正例与非正例学习”,大学,2003 年
- 刘,和 J .诺塞达尔,“关于大规模优化的有限记忆 BFGS 方法”-数学规划,1989-施普林格
- 马·巴比亚克,“所见不一定是所得:回归型模型中过度拟合的非技术性简要介绍”,《心身医学》,2004 年,《
- Andrew NG,“机器学习,斯坦福大学课程”。
- Paul D. Allison,“适合逻辑回归的度量”,-SAS 全球论坛,DC 华盛顿州,2014 年-statisticalhorizons.com
- Christopher M Bishop,“模式识别和机器学习”。
分析的成功/失败方法
A bulls-eye may not be the best shot in darts
当确定业务的关键绩效指标(KPI)时,选择正确的成功衡量标准是有意义的。过去,我曾写过如何选择合适的衡量成功的标准。因为我做的大部分工作都是在网络领域,所以我们操作和做报告的原则或多或少是一样的。
唯一改变的是转化率……或者说成功的衡量标准。换句话说,网站建立的原因,网站的目的。因此,衡量成功的方法是有效的。
为新范例而设计
然而,如果正在构建的产品不是为 web 设计的,或者不是基于相同的原则,会发生什么呢?我们将如何着手确定指标和可操作的报告。
为此,我们必须去寻找我们需要分析的原因。
分析的目的
如果让我来定义我们在任何产品中使用分析的原因,那就是
- 识别胜利,庆祝胜利,并努力找到让我们赢得更多胜利的规则
- 找出失败,并找出解决这些失败的方法,以便我们能够改进
这种观点主要帮助我们做两件事,一件是找出并衡量好的方面,另一件是找出并剔除我们产品中不好的方面。
要做到这一点,我们需要能够表明成功或失败的指标(或 KPI)。
成功的衡量标准
成功衡量指标有助于确定明显的胜利,并在团队中庆祝这些胜利。这些也有助于找出过去对你有效的方法,以及如何重新创造这些成功。需要做的一件明确的事情(我已经艰难地学会了这一点)是,需要在更广泛的受众中分享成功或成功衡量标准,以给整个团队一种他们正在工作的目的感。
衡量成功的一个很好的标准是任务完成率,或者转化率,或者盈利能力。
失败的衡量
失败度量标准有助于识别特定活动中失败。这些也是帮助识别改进机会的指标。失败度量的测量应该帮助我们在当前的设计/产品中根除问题。我说根除,因为一旦你发现了失败,你就必须采取行动,确保失败不再发生。
衡量失败的一个例子是跳出率。
与成功的度量不同,失败的度量不能与大型团队共享。相反,我觉得(我想听听您的意见),当与正确的本地化团队沟通时,他们会更加有效。
这篇文章最初发表在大胖极客
Udacity A/B 测试课程总结
最近我在 Udacity 上完成了 Google 的 A/B 测试课程。这个课程被强烈推荐给想学习 A/B 测试的人。我认为写一份关于我所学的总结会非常有帮助,因为我的笔记非常详细,我也听到我的朋友抱怨说很难跟上老师。希望这个总结可以帮助更多的人。
本课程着重强调 A/B 测试的商业应用,而不是统计方面。然而,如果你想学习更多关于统计推断的知识,为 A/B 测试打下基础,我建议你找一本统计书或看几个视频,作为本课程的补充。
首先,我们为什么要做 A/B 测试?
答案是测试消除了网站优化中的猜测,使基于数据的决策能够将商业对话从“我们认为”转变为“我们知道”通过测量变更对您的指标的影响,您可以确保每个变更都产生积极的结果。如今,公司对网页版本、个性化推荐和新功能进行 A/B 测试非常普遍。
我们能测试一切吗?
不。有些情况我们不能通过 A/B 测试来分析。例如,如果您正在添加一个新的体验,并希望测试它,老用户可能会抵制新版本(厌恶改变),或者老用户可能都喜欢新的体验,那么测试集就具备了一切(新奇效果)。当谈到新的体验时,需要考虑两个问题:(1)你比较的基础是什么?(2)你需要多少时间让你的用户适应新的体验,这样你才能真正说出什么是稳定的体验,并做出稳健的决策?除了新的经验,长期效果也很难测试。例如,一个房屋租赁网站测试它的推荐效果,但是一个客户可能甚至在六个月内都不会回来,这很难通过 A/B 测试来衡量。如果是这种情况,我们该怎么办?
当 A/B 测试没有用时,我们可以:
- 分析用户活动日志
- 进行回顾性分析
- 进行用户体验研究
- 焦点小组和调查
- 人类评估
那么,如何做 A/B 测试呢?
实际上,A/B 测试可以总结为以下 5 个步骤:
- 选择并描述评估你的实验的标准,例如,你关心什么,你想如何衡量效果
- 选择显著性水平(alpha)、统计功效(1-beta)和实际显著性水平。如果测试具有统计显著性,您确实希望启动变更
- 计算所需的样本量
- 为对照组/治疗组取样并进行测试
- 分析结果并得出有效的结论
在本 Udacity 课程中,这五个步骤将通过大量真实世界的示例进行详细解释:
步骤 1:为健全性检查和评估 选择和描述度量
我们为健全性检查选择的度量被称为不变度量。他们不应该受到实验的影响。它们不应该在对照组和治疗组之间发生变化。否则,实验设置是不正确的。
我们选择的评估指标用于衡量哪种变化更好。例如,我们可以使用每日活跃用户(DAU)来衡量用户参与度,使用点击率(CTR)来衡量网页上的按钮设计,等等。一般来说,你应该记住四类指标:
- 总和与计数
- 分布(平均值、中间值、百分位数)
- 概率和比率(例如,点击率、点击率)
- 比率:任何两个数字互相除
除了选择度量的类别,您还应该考虑灵敏度和健壮性。你想要选择一个具有高灵敏度的指标,这意味着该指标可以拾取你所关心的变化。您还希望度量对于您不关心的变更是健壮的。这意味着当您不感兴趣的事情发生时,度量不会改变很多。如果一个指标太敏感,那么它就不够健壮,因此这两者之间需要一个平衡,你需要研究数据来找出使用哪个指标。
如何衡量灵敏度和鲁棒性?
- 进行实验
- 使用 A/A 测试查看指标是否有差异(如果有,则该指标不可靠)
- 回顾性分析
第二步:选择显著性水平、统计功效和实际显著性水平
通常显著性水平为 0.05,功效设置为 0.8。实际显著性水平因每个单独的测试而异,它告诉你测试检测到多少变化,使你真的想发起变化。即使测试具有统计学意义,您也可能不想启动变更,因为您需要考虑变更的业务影响,考虑工程成本、客户支持或销售问题以及机会成本是否值得启动。
步骤 3:计算所需的样本量
概述:需要考虑度量标准的选择、转移单位的选择和人口的选择,因为它们都会影响度量标准的可变性。然后决定实验的规模。
- 科目:测试的科目(分流单位)是什么?也就是说,您将在哪些单元上运行测试并进行比较。转移的单位可以是基于事件的(例如页面视图)或匿名 id(例如 cookie id)或用户 ID。这些都是常用的分流单位。对于用户可见的更改,您希望使用 user_id 或 cookie 来度量更改。如果测量延迟变化,其他指标如事件级别转移可能就足够了。
- 人群:哪些受试者有资格参加测试?所有人?只有美国人?只有某些行业的人?
- ***如何缩小实验规模以更快完成实验?*您可以增加显著性水平α,或降低功率(1-β),这意味着增加β,或更改转移的单位(如果最初它与分析单位不同)(分析单位:您的评估指标的分母)。
步骤 4:为对照组/治疗组取样并进行测试
要记住几件事:
- 持续时间:什么时候跑最好?学生回大学?假期?周末对工作日?
- 暴露:您希望将实验暴露在多大比例的流量中?建议是取一小部分,同时运行多个测试(不同的日子:周末、工作日、假日)。
- 学习效应:当有新的变化时,开始时用户可能会反对变化或者大量使用变化。但是随着时间的推移,用户行为变得稳定,这就是所谓的平台期。衡量学习效果的关键是时间,但实际上你没有那么多时间来做决定。建议:在更小的用户群上运行,运行时间更长。
第五步:分析结果并得出结论
第一步,理智检查。
在分析结果之前,第一步是进行健全性检查——检查您的不变指标是否已经改变。如果您的健全性检查失败,请不要继续。相反,去分析为什么你的理智检查失败了。你可以选择:(1)回顾性分析,或者(2)研究是否有学习效应。
第二步,分析结果。
答:如果您有一个单独的评估指标,并且不重要:
第一轮:检查结果,看是否真的没有显著差异。例如,分解成不同的平台或一周中的某一天。这可能有助于你找出系统中的错误,也可能有助于你了解用户对你的实验的反应。
第二轮:用不同的方法交叉核对。例如,用参数假设检验与非参数符号检验进行比较。如果你的假设检验和符号检验不一致,你会怎么做?你应该以批判的眼光审视你的数据,因为你可能正遭受辛普森悖论(一个趋势出现在不同的数据组中,但当这些组被组合时就会消失或逆转)。辛普森悖论发生的原因可能是:(1)你的实验设置不正确;(2)变化对新用户和有经验用户的影响不同。
b .如果您同时测量多个指标
(1)一个潜在的问题是,你可能会偶然看到一个重要的结果。(看看这个 xkcd: significant
例如,您正在运行一个包含 20 个变量的测试,并分别测试每个假设:
P(一个显著结果)= 1p(无显著结果)
P(一个有效结果)= 1−(1−0.05)^20 = 0.64
很有可能你会偶然看到一个重要的结果!!幸运的是,有几种方法可以解决这个问题:
- Bootstrap 并一次又一次地运行实验,如果偶然发生,显著性度量应该会消失。
- Bonferroni 校正:将显著性水平 0.05 除以多重测试中的测试次数。假设您正在测量 20 个测试,那么您对该测试的显著性水平应该是 0.05/20 = 0.0025。Bonferroni 修正的问题是它太保守了。如果同时测试许多指标,可能没有一个是重要的。
- 控制家族误差率(FWER) :任何指标显示假阳性的概率。
- 控制错误发现率(FDR) : FDR = #假阳性/拒绝总数。
(2)另一个潜在的问题是,如果度量标准没有按照您想象的方向移动,该怎么办?例如,你预计 DAU 和用户使用你的应用的平均时间长度都会增加。然而,你观察到 DAU 减少,而平均时间长度增加。WTH??
你应该深入调查,找出原因。这也是为什么人们通常希望有一个 OEC(总体评价标准)。一个好的 OEC 给你一个短期和长期目标之间的平衡,或者不同指标之间的平衡。然而,你也需要记住,拥有 OEC 有助于你了解你的企业关心什么,以及你如何平衡停留时间和点击等指标,但它不会帮助你做出产品变更的决定。
最后一步,得出结论。
如果你从测试中获得了一个重要的结果,就会出现两个问题:你理解这个变化吗?您要启动变更吗?如果你的改变对一部分用户有正面影响,但对其他部分用户没有影响或有负面影响怎么办?你明白为什么吗??(例如,英文中的粗体字与中文中的粗体字具有不同的测试结果,因为粗体中文难以阅读)。
那么,我如何决定是否启动变更呢?
问自己几个问题:我是否有统计意义上和实践意义上的结果来证明这种改变?我是否了解这些变化对我们的用户体验产生了什么影响?最后一点,值得推出吗?
逮到你了
当你想在 A/B 测试后启动一个变更时,总是要做一个上升。因为您想知道对未受影响的用户是否有任何您在最初的实验中没有测试的附带影响。
当你加速变化时,你可能会看到效果变平。因此使得测试的效果不可重复。造成这种现象的原因有很多。
- 季节性效应:学生开始放暑假或返校时,社交网络平台用户行为发生很大变化。节假日对用户的购物行为影响很大。解决方案:使用保留方法,向除了一小组保留用户之外的所有人发起变更,并继续将他们的行为与控制组进行比较。
- 新奇效应或变化厌恶*:群组分析可能会有帮助。*
经验教训
- 两次检查,三次检查你的实验设置是否正确。
- 不仅要考虑统计上的显著性,还要考虑业务影响。考虑工程成本、客户支持或销售问题、机会成本等。
- 如果你正在运行你的第一个有重大影响的实验,你可能想运行几个实验,并检查结果,看看你是否愿意启动它。
其他需要考虑的事情:实验的政治和伦理
实验涉及到真实的人,重要的是保护使用者并遵守伦理。然而,过去有许多有问题的实验例子。例如,历史上的塔斯基吉梅毒实验、米尔格拉姆实验和最近的脸书情感实验。为了以道德的方式进行 A/B 测试,有四个原则需要牢记:
1。风险:参与者面临什么风险?
主要门槛是风险是否超过“最小风险”。最小风险被定义为参与者在日常生活中可能遇到的伤害的概率和程度。所考虑的伤害包括身体、心理和情感、社会和经济问题。如果风险超过最小风险,则需要知情同意。
2。益处:研究结果的潜在益处是什么?
能够陈述完成研究的益处是很重要的。
3。选择:参与者还有什么其他选择?
在在线实验中,要考虑的问题是用户可能拥有的其他服务,以及在时间、金钱、信息等方面的转换成本。
4。隐私:参与者有什么隐私?
对于正在收集和存储的新数据,这些数据的敏感程度如何?处理这些数据的内部保护措施是什么?那么,对于那些数据,它将如何被使用,参与者的数据将如何被保护?如何保证参与者收集的用于研究的数据不会用于其他目的?
这个总结只是对课程内容的简要概述,如果你对 A/B 测试或准备面试感兴趣,我强烈建议你参加这个课程,并做期末项目。掌握一件事情的最有效的方法总是在实践中学习。
两个卷积的故事:图形神经网络的不同设计范例
“图形”是自然语言中一个不如数学术语精确的术语:在日常用语中,图形通常可以用来表示绘图、图表或更普遍的数据可视化。然而,从严格的定量角度来看,“图”指的是一种非常特殊的数据结构,由(至少)一些 N 大小的节点集、一些边集以及可以附加到节点或边的属性组成。虽然某些类型的信息本质上类似于图表,但更多情况下,图表是一种有意选择的组织某种信息的方式,以便捕捉和强调数据元素之间的关系。
图形可以用来表示社会网络和家庭关系、网络流量和分子结构。但是当我们以图表的形式给出一个网络数据时,我们给了它一个归纳偏差来捕捉关系。机器学习中归纳偏差的思想是,即使一个模型可以访问相同的信息(来自统计内容,信息论 POV),优先考虑你的模型要学习的某些类型的模式可以帮助它更好地执行。这种情况的最简单形式见于老派模型正则化:下推系数的绝对值,产生更平滑的函数,并反映一种隐含的先验,即更平滑的函数更可能是真实的、可概括的函数,而尖锐、跳跃的函数更可能是过度拟合的。然而,如果这个先验是错误的,我们可能会把我们的模型引向错误的方向。
当我们设计一个专门处理图形的网络时,隐含地告诉它节点之间的关系是有意义的,前提是我们希望从图形中提取的信息包含在这些模式关系中,并且通过考虑它们可以最有效地提取。如果事实并非如此,那你就找错了地方。但如果是这样的话,你的先验关系作为模型的一个有用的概念,将大大缩小它的算法搜索空间。
卷积网络的目标是处理图像——一种复杂的结构化数据——并将它“消化”成一些压缩的特征集。一个图形网络有着相同的目标,除了它的目标是摄取和导出包含在一个图形中的有用的高级形式的信息。人们可能想问的关于图表的问题可能多种多样,如“这种分子结构是否可能作为治疗 X 疾病的药物”,或“这个社会图表中的 X 个人支持某个特定政党的可能性有多大”。在前一种情况下,我们想了解全图的一个性质。在后一种情况下,我们希望预测图中特定节点或边的属性。有些方法更适合这些目标中的一个或另一个。
这篇文章将给出两大类方法的高层次概述,这两大类方法用于赋予网络这种面向图形的归纳偏差。
根据数学定义,当构建操作员接收图表时,需要考虑一些属性:
- 图可以有任意数量的节点
- 每个节点可以有一个任意数量的邻居
- 图中没有固有的空间或方向的概念;考虑一个图形节点的“左”或“右”邻居是不明智的,就像图像像素排列在规则的网格中一样。
这最后两点结合起来使得朴素卷积方法不可行——当每个节点具有任意数量的邻居,而不是相对于中心像素存在于固定位置的离散数量时,您不能应用对上、下、左、对角线等方向的邻居具有固定权重的滤波器。此外,没有一种定义明确的方式来沿着图形滑动(或“平移”)过滤器。
当试图理解图形处理时,一个重要的概念区别是
- 一个问题,其中信息至少部分地包含在图本身的结构中,并且你希望提供给网络的每个例子可能具有不同的连接模式。这方面的一个例子是试图对不同的分子进行分类,每种分子都有不同的键结构。
When represented as a graph, atoms are seen as nodes with properties corresponding to element type, and edges with properties corresponding to bond type
- 一个问题是图的连接结构在所有的例子中是固定的,但是图的各个部分的属性是不同的,定义了一个函数,它具有一些我们可能想要学习或匹配的特征。这种“定义在图上的函数”的想法,也就是你可以在同一个图上定义不同的函数,对于这篇文章和阅读任何关于图形分析的文章来说,都是一个需要理解的重要概念。这方面的一个例子可能是关于通过道路网络连接的一些城市中每一个城市的感染人数的信息,其中您想要了解疾病传播的速度:城市之间的道路连接不会因场景而异,只是每个城市的属性值会发生变化。你也可以认为图像是在相同(非常无聊)的像素图上定义的不同像素值函数,例如,左上的节点在它的右边和底部相连。
A road connectivity map of the United States
当比较不同的方法可以应用于哪种类型的问题时,记住这种区别是特别有用的。
对非常规卷积的探索
现代神经网络设计中的一项重大创新是卷积,这是一种专门的设计,用于以更具参数效率的方式处理图像,相对于简单的模型,它似乎具有有价值的归纳偏差。围绕图形网络的思维是围绕这个关键问题建立的:我们能对图形做同样的事情吗?我们能不能设计一种结构,利用卷积网络最有价值的属性,但以图形可以使用的方式。
该领域的两种主要方法都试图回答这个问题,即如何将卷积推广到图中,这两种方法都称自己为“图卷积”,但它们采用了完全不同的方法。第一个试图复制卷积的字面数学运算,而第二个只是对图像特定的卷积所扮演的角色进行启发性的观察,并试图重新创建它。
检查光谱
首先,完美主义者:他们通过问“在深层次的数学层面上,卷积是什么?我们如何在图形中复制它?”找到了答案。这个解释会偏离图表一段时间,但我保证它会回来的。
为了简化,神经网络中使用的卷积是广义卷积算子的特殊情况。(更多细节,请阅读我之前关于这个主题的文章。当我们大多数人想到卷积时,我们可能会想象在图像上移动的方形滤波器片。这种在原始数据的许多不同偏移量处计算相同模式的点积匹配的操作,通常需要在一个大的“循环矩阵”中在不同偏移量处多次重复您的模式,如下图所示,并将其乘以包含您的数据的向量(或矩阵,在图像上下文中)。
This is a matrix calculating a simple convolution over a 1D vector — each row of the vector is a copy of the filter, shifted by some amount. When we multiply it by the vector on the right (analogously, the data we’re matching against our filter), we get different activations at each offset, depending on the alignment where the data most closely matches the filter (dot products are higher when vectors are more similar)
但是,可以转换数据和过滤器,使每个过滤器都由一个简单的对角化矩阵表示(除了对角线上的值,其他都是零),然后乘以数据的转换版本。当你对数据进行傅立叶变换时,这种简化就会发生。傅立叶变换通常被认为是在函数的上下文中,并且(在很高的层次上),它们将任何函数表示为更简单的“频率”函数的加权组合;从解释数据的宽笔画模式的低频开始,到填充较小细节的高频结束。
在任何变换发生之前,一个连续函数完全可以用一个无限长的向量来表示,只需简单地指定每一点的值。(题外话:在卷积和傅立叶变换讨论函数运算的许多上下文中,更容易想象它发生在固定长度的向量上,然后只是想象自己,“那,但是无限”)。当转换到傅立叶空间时,在最差的情况下,您的函数可能仍然需要无限长的向量来正确表示,但向量的条目将表示构成函数的每个频率的幅度,对于更简单的函数,您可能只需查看频率加权向量的前 10 个条目,就能够捕捉到函数的良好近似。要对这一事实给出直观或数学上的解释可能太过分散注意力,但这是一个关于卷积的数学上的事实,即可以通过将一个信号(对角化)投影到傅立叶域,并将其乘以傅立叶域中的数据来计算算子。
I apologize that this is tiny, but, if you squint, you can see that the top matrix is an effective duplicate of the one above — offset versions of your filter in each row, multiplied by a matrix. The bottom version takes your Phi matrix (consisting of your Fourier basis vectors_ and left-applies it to both your original f vector, and also to a compressed version of your filters that only has values along the diagonal
光谱卷积的支持者认为,他们应该从以下角度处理事情:如果他们能够为一组数据找到傅立叶基,那么他们可以将权重和数据都投影到该基中,并且,通过这种定义途径,他们已经为自己获得了卷积,即使没有沿着图形移动(或“转换”)过滤器的明确能力。这组矩阵乘法的结果是一个 N 维向量,
好吧。因此,我们走上了这条有些曲折的道路,回到了数学上有效的卷积的另一种推导形式。这和图表有什么关系?那么,我们可以通过获取图的拉普拉斯的特征值来定义图的傅立叶基,拉普拉斯是一个矩阵,通过获取度矩阵 D(由每个节点的度沿对角线构成)并减去权重或捕捉所有边上的权重的邻接矩阵来构建。
拉普拉斯算子用于计算“图形梯度”,即根据每个相邻节点的权重,测量每个节点处的函数值相对于附近节点处的函数值改变了多少。**当你计算拉普拉斯的特征向量时,你最终得到了图的傅立叶基,**以及一种将图上定义的函数名义上投影到 N 维欧氏空间中定义的函数上的方法。这些轴也称为图的“谱”,因此得名“谱聚类”。作为一维投影,它们在概念上对应于沿图形捕捉最大距离的方向。默认情况下,将有与图节点一样多的特征向量,并且每个节点由沿着所有这些向量定义的轴的值来表示。注意,特征向量是图的连通性的表示,并且对于在该图顶部定义的函数是不可知的。这就是为什么我们可以在图上把不同的函数表示为沿着特征向量基的不同模式的值。
The eigenvectors/eigenfunctions corresponding to the largest eigenvalues. You can see that (a) is a gradient roughly going on a diagonal from top left to bottom right, which would be the single-dimensional compression that would do the best job of capturing distances along the graph. (b) is an axis roughly going roughly radially from the central urban area outward, which is the next-best single-dimensional representation taking (a) into account, and so on.
要通过这种方法计算谱卷积,首先需要计算图的完整 NxN 拉普拉斯特征向量矩阵,然后将每个滤波器以及数据本身乘以该矩阵。对于大型图形来说,这是非常计算密集型的,因为对于每个过滤器,它按 N 缩放。除了计算复杂性之外,谱卷积方法的一个显著缺点是它们只对学习固定图上的模式有用,并且不能有效地学习或考虑每个观察图具有不同连接结构的情况。这是因为每组计算出的特征值只适用于计算它的特定图形。
此外,谱卷积不是本地的(即,在围绕中心节点的邻居的小支持集上定义),而是对照图的全局连接结构来匹配模式。默认情况下,会使它们更加僵化,导致它们需要学习更多的参数。这个问题可以通过学习滤波器来解决,这些滤波器是每个特征向量的简单多项式变换,如本文所示,因为这些滤波器需要更少的参数,并且匹配更小、更局部化的模式。然而,事实仍然是谱卷积本身并没有被很好地设计为局部模式匹配器。
把话传下去
因此,谱卷积的优点是允许我们对图形进行数学上正确的卷积,但它们也有明显的实际缺点。
对于某些问题,所有这些缺点让我们回到了绘图板:考虑图像卷积的优点,以及如何用图形作为输入来复制它们。广义的消息传递神经网络(MPNN)试图模仿普通卷积的许多优点,但具有数学上不同的过程。
(作为题外话:我在这里将使用术语消息传递神经网络,这是本文首创的**,因为我认为它更清晰,更具描述性。然而,对于不同网络结构的不同分类法和命名约定,在文献中有一点地盘之争。* 最近的一篇论文 ,有点令人沮丧地将他们对本质上是 MPNNs 的分类简单地称为“图网络”,考虑到前面提到的谱图方法的存在,这实在是太宽泛了。*
提醒一下,我们需要图形计算具有的基本属性是:A)它可以对称地应用于每个节点,作为该节点属性的函数;B)它可以聚合任意数量邻居的信息
许多论文提出了基本相似的方法。每一个都有自己的稍微不同的这些成分的组合:一些被省略或简化作为手边领域的功能。最一般的骨架,其中大多数其他版本是特例,看起来像这样:
A figure from the DeepMind Graph Networks paper, illustrating the iterative procedure of edges pulling information from nodes, nodes pulling it in from edges, and then the global network attribute getting updated from both together.
- 作为一个整体,节点、边和全球网络都具有向量值属性。你也可以潜在地有一个设置,其中所有这些都有属性向量和“隐藏”向量(a la RNNs ),给你自己一个更灵活地保存信息的方法,但目前,我们将坚持单属性向量模型。
- 边属性通过计算它们的发送节点、它们的接收节点、全局属性和它们自己的过去值的某种变换来更新它们自己。注意,对于“接收节点属性”和“发送节点属性”,可以有特定的权重矩阵,因为给定的边只有一个发送者和接收者。
- 节点属性基于其所有传入边邻居的聚合信息(以及全局属性值和其自身的过去值)进行自我更新。由于一个节点可以有任意多条边,这种聚合通常是通过最基本的输入大小不变的操作(求和)来完成的,但也可以使用类似基于内容的注意力加权来完成。
- 最后,“全局属性”被计算为某种节点值的聚合——同样,可以是总和,可以是注意力,只要它对不同大小的输入起作用。
- 现在,节点已经通过边从它们所有的相邻节点获取信息。如果这个过程重复很多次,那么信息将能够进行多次“跳跃”,并且每个节点将会拉入关于图的其余部分的更大范围的上下文信息。这与卷积堆栈中具有更宽感受域的后面的层相当。
- 最终,在这个更新过程的一些迭代之后,您现在有了节点、边和全局属性,这些属性从图的其余部分收集了一些上下文
这种结构很有趣,因为它同时具有卷积结构和递归结构。它在启发式上类似于普通卷积,因为它在网络上的任何地方都使用相同的共享变换集,并且还因为它假设图上感兴趣的结构将是连续的,因此优先从邻居的同心圆中提取信息。这种逐渐扩大的感受野功能更接近于感受野逐层加宽的图像卷积网络。这里一个有趣的注意事项是,正如前面所暗示的:像这样的图形操作从根本上来说不如图像卷积灵活,因为它们从每个邻居那里同等地提取信息。你可以把它想象成一个离散的径向卷积,你可以根据距离远近,使用离散的距离单位从不同的点提取信息。
如果你假设不仅在图中的所有点,而且在扩散过程的后续迭代中使用相同的变换,该结构也开始看起来非常像一个循环网络。在这种情况下,你几乎可以把它想象成一个放射状的循环网络,向四面八方进行处理。在这种节点到节点信息扩散的高级框架内,您可以沿着这个范围定义许多网络子类型——每个“层”具有不同变换的网络,看起来更卷积,或者迭代地重新计算看起来更递归的相同变换;预测节点值、边缘值或全局值的模型。但是它们都使用相同的基本构件。
这些方法比谱卷积灵活得多,因为这种操作堆栈可以在不同的连接结构上执行,并且仍然给出一致的结果,如果您试图将一个图的函数投影到另一个图的拉普拉斯傅里叶基中,情况就不会如此。它们本身也是本地的,因为每次转换只接受来自邻居的信息。然而,这个堆栈在真正的数学意义上不是卷积,只是一组模仿卷积的一些优点的启发式操作。
将这些点连接起来
与图像相比,图形网络的设计仍处于其狂野西部的早期阶段:它的用途更加小众,并且它缺乏像 ImageNet 那样的标准化数据集。现代模型设计倾向于从现有领域大量借用,然后将这些直觉输入神经网络;图网络方法的研究人员似乎仍处于调查其他领域(光谱分析和消息传递算法)的这个阶段,试图看看在哪里可以找到有价值的见解。
虽然这可能是纯粹的叙述性放纵,但我很难不看到这篇文章中所展示的谱卷积的数学正确性和 MPNNs 的计算实用性之间的紧张关系,作为更广泛地举例说明机器学习中的紧张关系。这两种方法都试图推广卷积的成功,但一种是用数学家的证明和精度,另一种是用工程师的实用试探法。这两个工具包都是深度学习的组成部分,并以不同的方式提供信息。
从外部角度来看,虽然我欣赏谱卷积背后的聪明之处,但我认为 MPNNs 具有相当大的优势,特别是在处理非固定图问题时。
然而,仍然有很多问题,我希望在这个领域有更好的答案(或者,可能有答案,但我还没有找到)。
- 与一些更简单的方法相比,这些方法在不同密度/稀疏度的图上表现如何?你可能会天真地认为,当你接近一个过于密集的图时,其中所有的东西都相互关联,特定于图的方法可能没有什么附加值。
- 当你有有意义的权重信息时,与只有二进制邻居或没有关系相比,它们的效果如何?在这两种情况下,它们是否比基线方法更有优势?
- 尝试这些或其他方法的最佳典型问题是什么?这里引用的许多论文更多地关注玩具问题,或者已经找到好的解决方案的问题(比如图像)。分子分析任务对我来说似乎是最有吸引力的,但我很想听听其他人的想法。
参考资料:
哲学与文本挖掘的交叉
运用 R 对著名哲学著作的深入分析
通过大数据课程学习 R 之后,我获得了提取有用信息并通过图表、聚类图或分层树创建有意义的可视化所需的基本工具和技术的实践培训。本课程的主要学习目标之一是对文本数据集样本进行文本挖掘。虽然我对深入了解这个主题充满希望,但概念的教授非常抽象,令人不安的是,导师只花了 14 节课中的两节来学习这个模块。情况不言自明。我们要完成这项繁重的任务,研究我们的项目要分析哪些文本。然而;对我个人来说,这种自由对我有利,因为我能够在课程结束时获得比预期更好的学习体验。
谈到这个过程,最初的第一周,我在谷歌上疯狂搜索,积累了大量有用的文本挖掘资源、现有的工作成果和“公开”的问题。一旦我对开始这个项目的材料感到满意,我不得不寻找一个文本数据集,它不仅激起了我的兴趣,而且是一个以前没有使用过的数据集。因此,作为我项目的一部分,我想评价我在某个时间点读过的文学作品,无论是作为我过去选择的课程的一部分,还是通过我在浏览互联网时对哲学的随机探索。这些书是描述性的,但涉及生活的不同方面。其他的涉及深奥的理论,意识形态和一系列的前提,我根本没有足够的时间去浏览它们。相反,为了让生活对我来说更容易,我主要关心的是理解每个哲学家试图在他们的著作中传达的要旨。因此,通过编写几行代码,我将能够借助一些引人注目的可视化效果来理解冗长的文字。
为了使这篇文章尽可能简洁易读,我只分析了 6 套不同的文本,这些文本是由著名的哲学家撰写的,他们的理论和思想具有历史意义,即:
- 《哲学原理》 —勒内·笛卡尔(译 Steve Harris ,查理·弗兰克,2003 年版出版)
- 《纯粹理性批判》 —伊曼纽尔·康德(J. M. D. Meiklejohn 译,2003 年版)
- 散文集:第一辑——拉尔夫·瓦尔多·爱默生(2001 年版)
- 《共产党宣言》 —卡尔·马克思、弗里德里希·恩格斯(由艾伦·路丁 & 吉姆·塔齐亚版 2005 年出版 )
- 《道德谱系学》 —弗里德里希·尼采(由霍勒斯·b·塞缪尔&j·m·肯尼迪译,奥斯卡·利维博士编辑,1913 年首次出版)
- 超越善恶——弗里德里希·尼采海伦·齐默恩译,版2009 年出版
【注意最后两本书是同一作者写的。这是有意为我的评估做的]
找到提到的书籍并不是一项艰巨的任务,这主要归功于开放源代码库,尤其是古腾堡计划。该网站收集了 56,000 本上传的电子书,可供下载。为了提取有用的术语和关键见解,需要执行不同的统计或自然语言处理(NLP)程序,只有这样,我们才能产生我们谈到的可视化。我根据所采用的方法订购了不同的部分,如下所示:
- 用于关键词分析的词云创建
- 文本样本之间的相似性
- 所选文本中包含的最常重复的二元模型的词频和 TF-IDF 图,以了解单词等级
- 情感分析,以理解数据的上下文,并在给定文本之间建立关联。
第 0 节:数据导入和内务处理
从我的 R 程序开始,我通常使用下面的命令清理所有的全局和局部变量:
*rm(list=ls())*
一旦执行,你的代码将有一个新的开始。因为我们正在使用古腾堡计划,必须阅读。txt 文件导入到我们的变量中,我们将导入以下库来利用某些重要的函数:
*require(readtext)
require(gutenbergr)
require(quanteda)*
Quanteda 库是我对文本文件进行定量分析的首选库。用更专业的术语来说,它允许我创建语料库或文本“集合”,其中包括文档级变量和该集合中每个包含文本的元数据。Quanteda 还允许我绘制一个文档特征矩阵(简称 DFM ),它将用于创建所有看起来很酷的图,如下所示。
最后,为了导入数据,我们执行以下代码行:
*url <- "[http://www.gutenberg.org/cache/epub/4391/pg4391.txt](http://www.gutenberg.org/cache/epub/4391/pg4391.txt)"
data <- texts(readtext(url))*
看起来很简单,对吧?让我们进入有趣的部分。
第一部分:文本中的关键词分析
在深入研究文本的关键字分析之前,我想在图 1a 中分享一段我的 Github 代码。这个代码块只允许我解析文本数据,并最终从中创建一个单词云*。因为我们正在处理的文本可能包含拉丁字符(比如, T20,T21),我们需要将它们转换成 ASCII 格式,这样我们就可以提取“可读”的结果。*
Fig 1a: R Code for the function that allows word cloud creation using a text’s document feature matrix
接下来,我们必须删除多余的单词或标记,如停用词、符号、数字和标点符号。根据定义,停用词是任何给定文本中常见的词,如“a”、“the”、“in”等。我们从语料库中过滤出这组单词,这样它们就不会降低我们关键字分析的质量。第 4–6 行执行过滤过程。
在对语料库进行预处理之后,接下来我们将它转换成一个文档特征矩阵 (DFM),它决定了每个单词在给定文档中的出现频率。我们不会深入 DFM 是如何计算的细节,但我们应该知道的是,这个矩阵将被传递到神奇的单词云函数中,该函数绘制了图 1(b)、©和(d)中的彩色结果。
就单词等级而言,位于中间的单词(灰色的)是最常见的单词,而橙色和青色的单词是最不常用的单词,但这并不意味着它们不重要。
**
Fig 1b: Word Clouds based on Descartes’ Principles of Philosophy (left) and Immanuel Kant’s Critique of Pure Reason (right)
首先,我们将比较笛卡尔的《哲学原理》和康德的《纯粹理性批判》。作为典型的 17 和 18 世纪的作品,它们写于现代西方哲学全盛时期。在左云中,我们观察到笛卡尔重视单词’心灵’、身体’、'自然*‘和’事物’,通过这些单词,他描述了所有具有心灵的生物都具有核心属性和能力来思考、策划想法和批判性地比较事物;因此,这句名言就存在了:*
我思故我在。(我觉得;故我在。)
康德;然而,强调“原因”一词在右云中可见。因为他的书名是关于“理性”的争论,所以它是被重复次数最多的术语,这是绝对有意义的。除此之外,康德还提到了诸如“概念”、“经验”、“直觉”等术语,这些都是理解他的信仰的关键。我们也在云中看到“先验”这个词,它与康德开创的哲学运动或趋势有关;后来被拉尔夫·瓦尔多采纳,他的理论认为,为了理解现实的“本质”(用诸如“空间”、“时间”、“世界”这样的词作为自然的派生物),人们必须首先检查和分析支配着“经验的本质的推理过程。
**
Fig 1c: Word Clouds based on Nietzsche’s works: Beyond Good and Evil (left) and Morals of Genealogy (right)
如果我们要比较一个作者的两部作品,我们可以识别两个云之间的词语相似性。单词“人”在大多数哲学著作中占主导地位,尤其是在亚里士多德和柏拉图哲学中。即使在尼采关于道德主题的作品中,我们也可以假设这本书的主要症结是如何围绕着一个理想主义的概念,即一个人应该如何过一个’苦行僧、善、真理和“爱”的生活。在这两本书里,尼采还批评了过去的哲学家,他们把邪恶的人和善良的人对立起来,这是作者试图反驳的。这是引号中提到的单词的基本上下文。
**
Fig 1d: Word Clouds based on Ralph Waldo’s “Essays-The First Series” (left) & Marx’s “The Communist Manifesto” (right)
遵循康德哲学的拉尔夫·瓦尔多;十九世纪的美国哲学家,是超验主义运动中反对灵性和理智主义的思想家之一。瓦尔多关于宇宙的信仰最好用“自然”和“灵魂”这两个词来代表,他认为这两个词是现实地认识真理的必要组成部分。
考虑到卡尔·马克思的著作,并将其与其他 5 部著作中的任何一部进行比较,就会发现明显的两极分化。术语是不同的,概念是革命性的,在这个意义上,很少有工作的迹象来自任何其他哲学文本。马克思的著作和其他著名思想家之间最有趣的区别是,前者有一种更集体的方法,而不是个人主义的方法。正如瓦尔多、尼采等人在谈论“人”一样,马克思更积极地关注整个社会,即“资产阶级”或“中产阶级”以及“无产阶级”或“工人阶级”,这些词构成了共产主义的基础。
第二部分:文本相似性
词云只是在定性分析时受到限制。我们需要利用某种数学模型,通过它我们可以在更深的层次上比较文本。r 使用各种统计模型计算文本相似性的方式非常简洁。在这个特定的场景中,我使用了扩展的 Jaccard 方法来计算下面的矩阵。
通过取每个集合中的属性(词)的有限集合来进行比较,在我们的情况下,该集合是哲学文本,然后将交集的总大小( ∩ )除以样本集合的并集的总大小(∩)。这是你现在需要知道的数学范围,但是我们将在以后的文章中触及计算文本相似矩阵的不同方法。
Fig 2a: Text Similarity Matrix based on the Extended Jaccard formula
直接观察,我们看到 1 以对角线方式出现,几乎像一个单位矩阵。这表明相似的命名文本彼此之间将具有 100%的相似性。此外,我们可以从这个图表中提取有趣的信息。查看图 2a 中的编号标签:
- 我们可以说,尼采关于道德的著作与笛卡尔的文本有大约 65%的相似性。通过这一点,我们可以假设尼采可能在他的章节中从法国哲学家那里获得了一些内容。
- 卡尔·马克思的作品是革命性的,因为它在所有其他作品中得分最低。盒子代表 6%的价值,认为马克思的著作与康德的《理性批判》最不相似。两部哲学著作之间基本上完全不相关的背景。
- 分别有大约 85%和大约 87%的显著指数分数,我们可以假设尼采的作品与拉尔夫·瓦尔多关于“人”的道德的哲学和思想有适度的共鸣。
- 比较尼采自己的作品,有巨大的相似性,部分原因是写作风格,章节间术语的共性。由于所讨论的术语不同,可能会出现 5%的微小差异。
第 3 部分:双图频率和 TF-IDF
关键词的频率可以提供关于特定哲学文本的一些重要信息。使用 R,我们可以估计给定文本中的总字数。考虑到整个文本中有多个多余的符号、标点符号和数字,估计总数更安全;因此,第一列中的波浪号(~)。
Fig 3a: Table that illustrates the total number of words and unique terms occurring in the texts
第二列表示每个文本中出现的唯一术语的总数。从这个专栏中,我们可以推测出英语的掌握程度和流利程度,Waldo 的作品以最高数量的独特单词名列榜首。这是有意义的,因为其他 5 本书最初是用德语或法语写的,后来被翻译了;同时,瓦尔多的作品已经是英文的了。
*此外,我们可以通过使用双字母组合频率**来进一步理解作品。*二元模型是在某个文本中一起出现的两个连续单词或术语的组合。在图 3b 中,x 轴上的‘n’表示二元模型的计数。y 轴显示了每个文本中的前 10 个二元模型的列表。
Fig 3b: Frequency Plots of Bi-grams present in selected philosophical books
在给定的图表中,笛卡尔使用“有形物质”作为重复最多的二元组,这是哲学家试图证明的主要话题之一。这两个词还与其他可见的词集相互关联,如“扩展的物质”、“外部对象”,在某种意义上,它们试图描绘“人类思维”如何试图断言对象是真实的。
毫不奇怪,康德的论文热情地谈论着“纯粹理性”,图表以 400+的重复次数直接证明了这一点。因为康德的文本总共有 21000 字。从瓦尔多的文章中不能确定太多,因为诸如“人性”、“常识”这样的一组词在大多数哲学著作中普遍出现。在这些文本中,马克思的共产主义思想最为突出。不仅二元模型与其他 5 个讲座不同,所有的词组在马克思的宣言中都有很高的频率分布。
有趣的是,当我们考虑尼采的作品时,我们看到“禁欲理想”和“现代观念”分别是“道德谱系”和“超越善恶”中的两个主要二元对立。至少可以说,尼采的作品之间的联系是很有趣的,因为他提供了一个新的视角,关于其他古代哲学家如何遵循禁欲主义,作为一种最大化他们权力感的手段。同时,我们可以观察“理查德·瓦格纳”这个名字;一位德国音乐作曲家,出现在两个图表中。
继续讨论*、,我还创建了现有二元模型的 TF-IDF 图,这将为我们提供正在使用的单词的“排名”视图。TF-IDF 是词频-逆文档频率**的缩写,这是另一种统计工具,旨在反映一个词对语料库中的文本文档有多重要。*
Fig 3c: TF-IDF bi-gram plots of selected philosophical texts
为了理解这个图表,我们需要看一组经常出现的单词和另一组很少出现的单词。请注意,这组图表由几个停用词组成,如“the”、“of”、“to”和“a”,它们在计算术语频率(TF)时非常重要。现在,这些停用词旁边的词是计算逆文档频率(IDF)的兴趣来源。最后,我将把对生成的二元图的分析留给读者。
第 4 部分:情感分析
进入情感分析的最后一部分。r 有一个非常抽象的方式来进行这种类型的分析,有好有坏。这很好,因为希望从文本数据中快速生成信息的分析师可以编写几行代码并获得结果。对于那些渴望学习算法并以更高级的方式应用它的人来说,这是不好的。
Fig 4a: Word-Emotion analysis table using the NRC lexicon
查看图 4a 中的表格,我们使用 NRC 单词词典,该词典包括与两种情绪相关联的单词列表:积极情绪和消极情绪;以及 8 种基本情绪:愤怒、恐惧、期待、信任、惊讶、悲伤、快乐和厌恶。我们当然必须假设一个词在本质上可以是积极的,但表达的情感可能是消极的。例如,像“不高兴”或“不兴奋”这样的二元模型应该被认为是负面情绪,但是应该意识到 R 根本不能在一次迭代中确定所有这些关联。这是机器学习可以应用的实例之一,我们将在未来对此进行更多的研究。
该表格在其他方面非常容易理解,因为它说明了与特定情绪或情感相关联的单词总数。红色方框代表各行中最主要的情绪。
情感分析通常使用以研究者命名的不同词汇。对于下面的图形结果,我使用了 Bing 词典,其中的单词只分为积极情绪和消极情绪。与 2007 年的积极词汇相比,有 4782 个消极词汇。这意味着,当我们汇编结果时,预计击中负轨迹的概率更高。
朝着图 4b 中的图表前进,笛卡尔以相对积极的态度开始,随后是偶尔的抑郁。总的来说,表达的总体情绪是积极的。另一方面,康德的做法恰恰相反。他以一种消极的语气开始,可能是消极地抨击当时流行的“理性”概念。然后在他的评论结束时,康德把他的语气转变成一种更热切的语气。
**
Fig 4b: Sentiment Analysis for (a) Principles of Philosophy and (b) Critique of Pure Reason
在《超越善恶》中,积极情绪和消极情绪平均分布,而《道德谱系学》则更偏向于 y 轴的相反光谱,原因可能是尼采非常关注对抗人类中存在的“恶”。
**
Fig 4c: Sentiment Analysis for Friedrich Nietzche’s (a) Beyond Good and Evil and (b) Geneology of Morals
在拉尔夫·瓦尔多的论文中(用绿色图表突出显示),他演讲的中间部分明显倾向于积极的一面。仔细观察,瓦尔多散文的中间部分谈到了“爱”,因此我们可以证明这种激增是有道理的。而在马克思的短篇综述中,我们看到了更多的负面偏见。这可能是因为他讲话中咄咄逼人或令人恐惧的语气。
**
Fig 4d: Sentiment Analysis for (a) Essays — The First Series and (b) The Communist Manifesto
结论
有了这篇全面的文章,我们可以看到分析文本数据的现有可能性。凭借我对文学作品的喜爱,并将其与技术知识相结合,我能够创造出有趣的视觉效果,可以用各种方式来感知。我打算学习网上可用的高级工具包,如 D3.js、Plotly,并尝试使用可用的“开放”数据。在下一篇文章中,我可能会谈到脸书的数据,以及如何使用他们的表情符号反应来进行情感分析。
注意:文章中提到的所有工具都需要一定程度的编码经验。幸运的是,所有这些库都是以这样一种方式编写的,即通过一些努力,了解统计分析工具(如 Microsoft Excel、SPSS 或 Stata)的分析师可以创建有趣(且美观)的图表。所以,如果你想提高你的数据分析技能,试试这些工具吧。
Python 爱好者可以看看 NLTK ,它有大量的模型,可以使用科学、数学甚至公式来分析文本内容,其中可能还涉及一些机器学习。
引用的作品
[1]https://docs.quanteda.io/
[2]https://uc-r.github.io/word_relationships
[3]http://legacy.earlham.edu/~nksmith06/DescExpli.html
传播和分享知识。如果这篇文章激起了你的兴趣,如果你是个善良的人,给这篇文章一些掌声。关注我的个人资料,获取更多技术相关的文章。—哈姆扎
外星人飞船的文字描述
根据国家不明飞行物报告中心在过去一个世纪收集的数据,我们可以从超过 80 万起报告的不明飞行物目击事件中拼凑出一些信息(颜色、形状、运动)——如果它们存在的话。
看起来如何
与通常描绘的银碟不同,记录指出了不同的颜色和形状组合:
color and shape
- 红色和橙色是最常见的颜色。它们经常以光球的形式出现或者发出这种颜色的光
- 其他频繁联想的还有:绿火球,银盘,黑三角
它如何移动
通过提取动词,我们可以观察不同的速度、方向和运动模式——悬停与射击、出现与清漆、漂浮与下降、发光与脉动等,还可以结合颜色来查看它们。
how movement is described
除了像改变方向这样的运动(“三角形之字形。另一束光照在我们身上。其他人喷射到地平线”),人们还报告了 UFO 在颜色和形状上的变化(“金橙色的明亮的星星从天而降;变成扁平的黑色松软物体,落在树上然后飞走”)。该信息是通过结合依存分析和搜索相邻单词来提取的。
到目前为止,我们既不能证明也不能反驳目击者是否受了酒精的影响。
这是我关于数据科学和视觉故事的# 100 日项目的第 50 天。我的 github 上的全部代码。感谢阅读。欢迎新主题的建议和反馈。
《迈向数据科学》的感谢信
数据科学并不容易,但多亏了许多像这样的关于数据科学的出版物现在更容易以一种简单的方式理解困难的概念。这篇文章是我感谢他们对这个领域和社会的贡献的方式。
数据科学,一种新的科学(或者是?)
数据科学是一个跨学科的领域,是一门与商业密切相关的新型科学。正如我在前所说,我认为数据科学使我们能够通过人工智能创造智能。
是的,我说这是一种“新”的科学,因为我认为这份出版物的名字就是我们正在做的事情,我们正走在一条让数据科学成为科学的道路上。我认为数据科学是一门科学是非常有用的,因为如果是这样的话,数据科学中的每个项目至少应该:
**可复制:**便于测试他人的工作和分析所必需的。
更多信息,请点击此处:
数据科学中的再现性是什么,我们为什么要关注它?
towardsdatascience.com](/data-sciences-reproducibility-crisis-b87792d88513) [## 走向再现性:平衡隐私和出版
在数据安全和研究公开之间的冲突中,会有金发姑娘的选择吗?
towardsdatascience.com](/toward-reproducibility-balancing-privacy-and-publication-77fee2366eee)
Falible: 数据科学和科学寻找的不是真理,他们寻找的是
知识,所以每个项目在未来都可以被替代或改进,没有
解是终极解。你可以在这里阅读和这里。
**协作:**数据科学家不是单独存在的,她/他需要一个团队,这个团队将使创造智能和解决方案成为可能。协作是科学的一大部分,数据科学也不应该例外。
从 2012 年到 2017 年,我有幸在 Coursera 从零开始建立数据和分析组织。在那之上…
towardsdatascience.com](/what-is-the-most-effective-way-to-structure-a-data-science-team-498041b88dae) [## 建立数据科学团队| Coursera
构建来自约翰霍普金斯大学的数据科学团队。数据科学是一项团队运动。作为一名数据科学高管…
www.coursera.org](https://www.coursera.org/learn/build-data-science-team)
**创造性:**数据科学家所做的大部分工作都是新的研究、新的方法或采用不同的解决方案,因此他们的环境应该非常有创造性,并且易于工作。创造力在科学中至关重要,是我们找到解决困难和复杂问题的唯一方法。
数据科学可能不会被视为最具创造性的追求。您将大量数据添加到存储库中,并且您…
www.kdnuggets.com](https://www.kdnuggets.com/2017/02/creativity-is-crucial-data-science.html) [## 创造力在数据科学中的作用是什么?
回答(3 之 1):从我在这个领域非常有限的知识来看,创造力起着极其重要的作用。我会…
www.quora.com](https://www.quora.com/What-is-the-role-of-creativity-in-data-science)
**遵从法规:**现在有很多关于科学的法规,关于数据科学的法规不多,但将来会有更多。重要的是,我们正在构建的项目能够意识到这些不同类型的法规,以便我们能够创建一个干净的、可接受的问题解决方案。
欧盟通用数据保护法规,即 GDPR,是数据隐私法规中最重要的变化…
www.kdnuggets.com](https://www.kdnuggets.com/2018/03/gdpr-machine-learning-illegal.html) [## ‘您的数据隐私已更新’-感谢您再次忽略它!
下雨了 GDPR 的电子邮件,为什么一个盲目的’我同意’是不行的
towardsdatascience.com](/your-data-privacy-was-updated-thanks-for-ignoring-it-yet-again-9f6d1d567997)
为什么数据科学这么难,同时又这么简单?
所以回到数据科学如何让我们通过人工智能创造智能这一点,我想说的是,数据科学既困难又简单。
我认为数据科学很难,因为你必须知道和理解所有的事情才能认为自己是一名数据科学家:阅读论文、书籍,知道如何编程,了解企业以及如何应用你的知识来解决他们的问题,等等。
与此同时,我认为这很容易,或者说有点容易,因为我们有一个充满活力的社区,人们试图互相帮助,分享思想和知识,分享经验和感受,他们成为数据科学家的过程,他们在工作中的表现如何,以及伟大的博客、出版物、网络研讨会、视频、信息、信息图和更多工具,这些工具使向数据科学的过渡变得更加容易。
因此,我要感谢编辑 TDS 团队、 Ludovic Benistant ,以及为这份令人惊叹的出版物做出贡献的作家和人们。我还要感谢媒体和媒体员工为我们创造了这个伟大的平台来分享想法、知识和经验。
我想以几个月前的一个想法来结束我的演讲,这个想法是最近由 T2 的克里斯蒂安·威利格提醒我的,对我来说,数据科学是我开始实现这个想法的主要方式之一:
你可以产生影响,你可以做你喜欢的事情来改变世界。
我们多次听说,改变事物或世界的运行方式是不可能的。你做什么都改变不了它,你只是这个巨大星球上的一只蚂蚁。
这不是真的。你可以改变世界。你可以让事情变得更好,你必须从改变你看待事物的方式开始。我为我自己、我的家人和我爱的人努力工作,如果有人生活得更好,我已经在做出改变。
然后你想得更大,我怎样才能让这个地方对我和其他人来说变得更好?我如何改进某个流程的完成方式?
找到你喜欢做的事情,对我来说是科学(物理)和数据科学。我喜欢这个领域。我希望分享我做的事情,我贡献的开源项目,我在雇佣我的公司的工作,以及我将在不久的将来做的事情,将使这个世界成为一个更好的生活场所。
相信你所做的,带着激情去做,倾听他人,努力工作,有时间陪伴家人,享受乐趣,相信你会改变世界。
以下是我在 TDS 上发表的文章,我希望你会喜欢,我希望在不久的将来能写更多的文章:
大家好。这篇博客文章来自我最近在 LinkedIn 发表的三篇文章。这是第一部分、第二部分和第三部分。
towardsdatascience.com](/how-to-get-a-job-as-a-data-scientist-f417078fe13e) [## 我的深度学习之旅
在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…
towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317) [## 深度学习的 Skejul 会议
厌倦了试图与某人见面,却找不到日期或时间?我也是。
towardsdatascience.com](/skejul-meetings-with-deep-learning-5efab285b111) [## 获得数据科学家工作的两个方面
你是找工作的数据科学家吗?你是在找数据科学家的招聘人员吗?如果你回答是或否…
towardsdatascience.com](/the-two-sides-of-getting-a-job-as-a-data-scientist-a4571acc58bc) [## 深度学习的“怪异”介绍
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0) [## 用数据科学创造智能
在这篇文章中,我将展示数据科学如何让我们通过人工智能创造智能。
towardsdatascience.com](/creating-intelligence-with-data-science-2fb9f697fc79) [## 使用 Apache Spark 进行深度学习—第 1 部分
第一部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。这一部分:什么是火花…
towardsdatascience.com](/deep-learning-with-apache-spark-part-1-6d397c16abd) [## 如何在你的电脑上使用 PySpark
我发现在您的本地上开始使用 Apache Spark(这里将重点介绍 PySpark)有点困难…
towardsdatascience.com](/how-to-use-pyspark-on-your-computer-9c7180075617) [## 超越敏捷数据科学
超越我的眼睛所看到的,是我应用于生活中每一个方面的东西。在本文中,我将展示如何…
towardsdatascience.com](/going-beyond-with-agile-data-science-fcff5aaa9f0c) [## 利用深度学习检测乳腺癌
乳腺癌是女性中最常见的侵袭性癌症,是女性癌症死亡的第二大原因,仅次于…
towardsdatascience.com](/detecting-breast-cancer-with-a-deep-learning-10a20ff229e7) [## 使用 Apache Spark 进行深度学习—第 2 部分
第二部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。我将完全专注于…
towardsdatascience.com](/deep-learning-with-apache-spark-part-2-2a2938a36d35) [## DIY 深度学习项目
受阿克谢·巴哈杜尔伟大工作的启发,在这篇文章中你将看到一些应用计算机视觉和…
towardsdatascience.com](/diy-deep-learning-projects-c2e0fac3274f)
感谢一切:)
感谢阅读。希望你在这里发现了一些有趣的东西:)
如果您有任何问题,请在 twitter 上添加我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/FavioVaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…
linkedin.com](http://linkedin.com/in/faviovazquez/)
那里见:)
预测理论
回顾 信号与噪音 作者:张瀚银
*《信号与噪音》*可能是有史以来关于预测艺术的信息量最大的非技术性书籍。它概述了什么是最好的描述为内特西尔弗的“预测理论”。数据新闻网站 fivethirtyeight 的创建者 Silver 带领读者经历了一次不同领域的信息之旅,包括气象学、棒球、扑克、金融和政治,记录了要么严重失败,要么非常成功的估计,以及做出这些估计的预测者所采用的策略。成功和失败的预测都有很多东西可以教给我们,西尔弗从这些例子中提炼出了一个有凝聚力的信息:我们天生就不擅长预测,但通过采纳一些原则,我们可以改善我们的估计,并在个人和国家层面上受益。在我看来,这些原则属于三个规则:
- 像狐狸一样思考
- 像贝叶斯一样思考
- 像(篮球)射手一样思考
很难从它们的名称中了解这些规则,所以让我们依次浏览每一个规则。
像狐狸一样思考
在这本书的开头,西尔弗讲述了哲学家伊塞亚·柏林提出的刺猬和狐狸的对立观点。刺猬有一个大主意,而狐狸有许多小主意。每个人都倾向于站在一边或另一边:我们要么相信一个界限分明的黑白世界,要么相信一个没有任何事情是完全确定的灰色世界。每个观点都有自己的优点,但是当谈到预测时,狐狸会明显更成功。一只狐狸可以利用各种不同的来源,并假设不同的观点,但刺猬却被锁定在一条思路上。
这最好通过一个简单的例子与预测联系起来。假设我们在一个只有两个政党的国家(多么可笑的概念!),熊和老虎。我们正在与一位预测对手竞争,他试图在对即将到来的选举的预测上胜过他。无论谁赢了,都将在接下来的四年里出现在主要新闻频道。我们的对手是一只经典的刺猬;他的一个大想法是猛虎组织将在下一次选举中横扫所有对手。另一方面,我们做出了更像狐狸的理性决定。我们相信总体趋势确实有利于老虎,但我们愿意看看故事线可能不直截了当的个别比赛。当到了做出预测的时候,我们依次检查每场比赛,查看所有相关新闻,并对多次投票进行平均,以选出获胜者。我们的对手自信地为每场比赛挑选老虎,支持他的选择,断言他的世界观是不会错的。最终,我们轻松获胜,并有幸在接下来的四年里每天晚上出现在新闻中,因为我们愿意看到细微的差别,而我们的对手却被一个想法蒙蔽了双眼。
这可能是一个人为的例子,但它表明了采用简单的对/错世界观的危险。当你是一只刺猬,只有一个信念,比如老虎队会赢得所有的选举,你听到的每一条新信息都会证实你的信念。你会很高兴地把你所有的信心都放在支持老虎的论文上,而忽略任何相互矛盾的证据。同时,作为狐狸,我们没有偏见,愿意客观地评估每一个数据来源。刺猬们遭受着确认偏差的困扰,在那里他们操纵任何证据来符合他们的观点。狐狸能做出更准确的预测,因为它们愿意以开放的心态处理任何问题。在现实中,很难摆脱我们所有的先入为主的信念,但我们可以通过收集尽可能多的信息来源来对抗它们,就像 fivethirtyeight 在构建选举预测时所做的那样。
不幸的是,正如西尔弗指出的那样,在现实世界中,刺猬经常会被人用扩音器广播它们的信息。随着电视新闻和互联网分裂成两个政治派别,中间是一片巨大的无人区,仍然处于中间的人们被极端的狂热分子所淹没。当人们收听一个新闻频道时,他们并不是在寻找客观的报道,他们想听到自己的观点是正确的。当谈到预测时,他们宁愿听刺猬告诉他们,他们的“团队”将横扫立法部门,而不是听狐狸根据客观数据详细描述每场比赛的明智预测。因此,出现在电视和新闻中的大多数预测者是做出大胆预测的刺猬,而不是做出合理但不那么令人兴奋的预测的狐狸。尽管有证据表明那些做出更极端预测的人是最糟糕的预测者,他们却占据了大部分屏幕时间。尽管如此,这并不妨碍我们在日常生活中成为狐狸。为了像狐狸一样思考,我们需要抛弃我们先入为主的信念,从不同的来源收集信息,倾听争论的双方,并做出反映世界灰色本质的合理预测。
像贝叶斯一样思考
在你被“贝叶斯”的奇怪声音吓走之前,让我来解释一下:托马斯·贝叶斯是 18 世纪的一位统计学家和部长,他以制定基于新证据更新我们对世界的信念的方法而闻名。当我们处理任何新的预测问题时,我们首先需要形成对情况的初始估计,称为先验。假设我们想预测我们是否会在下一季度开始时获得晋升。已经过去一个月了,因为我们最近工作效率更高,而且与我们的经理关系也很好,所以我们可以把最初的几率定为 50%。贝叶斯定理(他的思想的正式版本)背后的思想是,当我们收集与问题相关的信息时,我们根据数据更新我们的第一个估计。如果我们的经理给我们发了一封赞扬我们工作的电子邮件,我们可能会把升职的可能性提高到 75%。随着事件发生的日期越来越近,如果我们把所有相关的信息都考虑进去,我们的预测应该会收敛到真实的概率上。证据的权重取决于它能在多大程度上降低我们的不确定性。每一步都要考虑先验信息,但是随着新信息(观察值)数量的增加,先验信息在预测中的权重会降低。我们的最终预测是初始估计和观测数据的组合。
在我们的日常生活中,我们无时无刻不在使用贝叶斯推理。当观看体育赛事时,我们在一开始就有一个最终结果是什么的想法,随着比赛的进行,我们更新这个估计,直到最后,我们可以 100%确定结果。同样,股票市场会因新闻而上涨或下跌,因为投资者认为这些信息揭示了一家公司的价值。贝叶斯的观点与所谓的频率主义者世界观形成对比,后者认为某件事情发生的几率仅仅基于过去数据中观察到的事件频率。当预测两周内 2018 年 1 月 21 日下雪的可能性时,这位常客会预测当天下雪的平均可能性,并坚持这一估计,直到出现问题的那一天。然而,作为一个贝叶斯,我们会做一个初步的预测,也许使用历史事件作为一个起点,然后根据新的信息随着时间的推移修改我们的估计。比平均温度更高的天气可能会降低我们预测的降雪概率,而一场从西面逼近的暴风雪会增加降雪概率。贝叶斯在做出预测方面自然处于优势,因为她会根据证据不断改变自己的信念。
贝叶斯思维的另一个重要方面是,预测被表达为一种概率,而不是一个是/否。虽然大多数人倾向于想要一个直接的答案,但我们生活在一个不确定的世界里,是或否是不完全可能的。任何预测都有不确定性,当有人预测股市明天会上涨时,他们掩盖了股市实际上有一个可能的取值范围。最有可能的情况可能是增加,但总有减少的可能。同样,用一系列数值或概率来回答预测问题可能不会让我们上新闻,但这将意味着我们平均来说更接近事实。负责任的数据科学家和预测者必须传达带有不确定性的结果。用一系列价值观来回答不应该被解释为缺乏信心,而是反映了世界的变化。
像(篮球)射手一样思考
做好任何事情的最佳方式是失败多次,然后做出调整。世界上最好的篮球射手大约有一半的时间会失败,但是他们不会因此而停止投篮。每次他们投篮不中,都会做些小调整,然后再投一次。虽然在某些领域反复失败可能很难(我们发明了飞机模拟器,让飞行员可以奢侈地失败不止一次,这很好),但在风险较小的情况下,这很容易实现,我们可以收到即时反馈。预测,至少在个人层面上,完全符合这些条件。我们可以非常容易地(并且安全地)预测一周后我们的体重,我们最喜欢的球队下一场比赛的比分,或者烹饪爆米花的最佳时间长度,而不会遭受可怕的后果。如果每个人都被要求达到完美的预测标准,世界将会严重缺乏气象学家。相反,每当我们错过目标时,我们会检查失败的原因,并做出我们认为对下次有帮助的调整。
任何人都可能经常失败,但这是关于检查和利用错误来提高我们的表现。众所周知,西尔弗的团队未能预测 2016 年的选举,之后,他们花了很长时间审视他们做错了什么。 Fivethirtyeight 不进行民意调查,但汇总了各种各样的数据,并根据历史表现对每个数据进行加权。就 2016 年而言,很明显民调系统性地偏向希拉里·克林顿,西尔弗和他的团队无疑会在下一轮选举中考虑到这一点。Silver 还记录了一个棒球模型,该模型做出了绝对荒谬的预测,经检查,这是由一个错误的字母引起的。如果创建者在失败后抛弃了模型,他们的开发时间就会被浪费,但是他们有智慧不断做出新的预测和错误来隔离问题。像射手一样思考包括不断重复射击-失误-调整-射击循环,在每次迭代中提高性能。
在噪音中失去信号
正如西尔弗在整本书中指出的,任何预测模型都有局限性。人类有一种倾向于看到不存在的模式,特别是在偶然关联的情况下。超级碗指标,根据哪个联盟赢得超级碗来预测股票市场的表现,在过去 50 年中有 40 年是正确的。然而,NFL 冠军得主并没有影响市场的宏观经济效应,这只是一种令人惊讶的相关性。此外,一些系统,比如天气,对初始条件极其敏感(这些属于混沌理论的有趣领域)。天气模拟开始时的一个微小变化会导致截然不同的预测,这就是为什么预测天气和气候是众所周知的困难。尽管如此,由于过去的多次失败,天气预报在过去的几十年里已经有了显著的进步。天气服务创造了数千亿美元的价值,因为风暴预警减少了风暴造成的损失,气候预测带来了更好的收成。虽然我们通常倾向于简单的模型,但有时我们需要一个庞大复杂的模型来进行准确的预测。
另一种预测失败的问题是样本外的情况。这些情况在我们的数据中从未出现过,因此几乎不可能预见到。考虑一个飞行员,他在晴朗的天气里从休斯顿到纽约飞行了 800 次,没有发生任何事故。在他的下一次航班上,一场巨大的飓风正在影响东海岸,航空公司必须决定是否取消他的航班。飞行员争辩说他以前从未坠毁过,因此在这次飞行中他不可能遇到麻烦。然而,这是一个样本外的情况,因为他以前的每次飞行都是在完美的条件下进行的。在这种情况下,谨慎的措施是停飞,因为不确定性太大了。日本对珍珠港的袭击通常被认为是一个样本外的事件,因为外国势力的大规模袭击从未发生在美国本土。尽管有迹象表明日本正在准备一场大规模的军事行动,但美国未能预测到这一事件。信号是有的,但被忽略了,因为像珍珠港这样的袭击以前从未发生过。
在这个盲目相信大数据和复杂模型的时代,西尔弗对只依赖统计数据的预测持必要的批判态度。根据他过去在棒球模型方面的经验,Silver 解释了为什么计算机本身常常不能捕捉到许多人类活动中的所有错综复杂之处。他发现,他自己的基于数字的模型表现不如那些利用人类直觉和数据建立的模型。同样,在计算机第一次击败最好的国际象棋选手后,人们预测人类在游戏中已经失去了所有的相关性。然而,随后的公开世界锦标赛允许任何人和计算机的组合进行比赛,由使用程序和了解游戏知识的人的团队赢得了。在大多数领域,领域知识加上计算机模型很可能会超越单独依靠其中任何一个的预测。
建议
我判断一本书的方法是,我是否能在五分钟的总结中获得所有相关信息,或者是否值得为了额外的见解而阅读整本书。在信号和噪音的情况下,我推荐通读整部作品。在这篇文章中,我概述了这本书的基本内容,但跳过了 Silver 用来阐述他的每一个观点的几乎所有真实世界的例子。这本书以直观的风格涵盖了许多统计概念,对于像预测这样看似学术的主题,可读性很强。任何渴望成为数据科学家或想怀疑地检验预测的人都应该阅读这份关于准确预测方法的资料性著作。
如何不使用机器学习模型
在我的培训课程中,在讨论常见的机器学习模型之后/期间,我通常会提出一个话题,即从这些模型中获得的见解的使用或模型在业务/组织流程中的实施。
例如,我们可以获得最准确的模型,它非常擅长“预测”哪些客户会对营销活动做出反应,但如果使用了错误的营销渠道或营销信息,该模型仍然无法为企业带来足够的价值。这就是为什么在我之前的帖子中,我推荐数据科学家去理解战略思维和发展商业敏锐度。
我发现自己在培训期间多次重复这个例子,所以我想我把它作为一篇博客文章,希望更多的数据科学家也能意识到思考如何使用模型是非常重要的。
教育中的机器学习
在我之前的工作中,我遇到过许多由数据科学的新生提出的项目。他们选择进行数据科学研究的“最热门”行业之一是教育。现在,我对教育有着浓厚的兴趣,因为我相信它是一种伟大的社会流动工具,并一直在研究如何改善教育,以对人们的生活产生重大而持久的影响。因此,在教育中使用机器学习的项目演示总是激起我的兴趣。
因此,其中一个项目着眼于使用机器学习模型对“有失败风险”和“能够通过这一年”的学生进行分类。如果你问我,我不怀疑这是机器学习模型在教育中的现有用法。我对演示团队将如何使用这个模型非常感兴趣,所以我问了这个问题,“那么一旦模型建立起来,你打算用它做什么?”
得到的回答是,“我们将使用该模型来确定谁有失败的风险,谁没有,一旦我们做到了这一点,我们将把我们的资源更多地集中在那些不会失败的人身上,确保他们以非常好的结果通过了考试。”下巴下垂
这个团队由刚接触数据科学的学生组成,我认为这是给他们上一堂关于模型用法的课的好机会。所以我继续说,“所以如果这个学生被模型归类为处于危险中,这意味着他/她将被剥夺任何成功和取得好成绩的资源?”
“是的!”回答回来了。所以我继续说,“如果我在使用这个模型,而你被归类为有失败风险,会发生什么?你认为我剥夺你的任何教学/学习资源公平吗?”沉默…
“你必须知道,通过在这里使用机器学习模型,它只是为我们提供了一个结果的概率,而不是 100%的保证。如果有人被“预测”有风险,那只是因为模型中的当前特征告诉我们这一点。生活更加复杂,因为除了数据中包含的因素之外,还有其他因素会影响结果,比如考试失败。”
继续说,“你可以提出的是,在建立相同模型的情况下,我们可以首先调查哪些因素会表明学生处于风险中,为什么会这样?其次,我们应该致力于设计一个好的计划来帮助那些有失败风险的学生,因为我们现在可以更好地识别他们。这可能会改善整个社会,培养出更多有生产力的社会成员,帮助更多的学生摆脱贫困。”
机器学习模型的使用
你可能会注意到,对于同一个模型,根据它的使用方式,我们可以帮助更多的人,也可以区别对待。我坚信构建模型只是数据科学项目的一小部分,知道如何特别合乎道德地使用模型也很重要。这就是我控制评分标准的项目的原因,我会在战略和实施方面给予很大一部分分数,不是在 IT 基础设施方面,而是在业务流程方面。
我希望读完这篇文章的读者能真正投入更多的思考,如何使用你的模型,并理解它对人们或客户的影响。构建“最佳”机器学习模型只是从我们的数据中获取价值的大图景的一小部分。
我希望这个博客对你有用。我希望所有读者有一个有趣的数据科学学习之旅,并访问我的其他博客文章和 LinkedIn 个人资料。
机器学习中的公平性教程
摘要
这篇文章将是这个系列的第一篇文章。这个职位的目的是:
- 对 Fair ML 进行快速但相对全面的调查。
- 为对 Fair ML 感兴趣的各个层次的读者提供参考和资源。
内容基于:Solon Bacrocas 和 Moritz Hardt 在 NIPS2017 给出的关于公平的教程来自 CS 294:加州大学伯克利分校 Moritz Hardt 讲授的机器学习中的公平以及我自己对公平文献的理解。我强烈建议感兴趣的读者去看看链接的 NIPS 教程和课程网站。
目前的职位由六部分组成:
- 介绍
- 动机
- ML 中偏差的原因
- 公平的定义,包括公式,动机,例子和缺陷。
- 用于实现这些公平性定义的算法。
- 摘要
1.介绍
近年来,空气质量正在成为机器学习中最热门的话题之一。该领域的出版物激增(见图 1)。研究团体在这个领域投入了大量的努力。在 2018 年的 ICML 上,五篇最佳论文/亚军获奖论文中有两篇是关于公平性的。关于公平性也有新的会议/工作坊:FAT/ML2014 年开始,ACM FAT2018 年开始,fair ware2018 年开始。 arxiv 上每周都有几篇新上传的关于公平的论文。许多在理论和实践 ML 社区有声望的研究者已经参与了这个领域。
Fig1. The number of publications on fairness from 2011 to 2017
2.动机
第一个要问的问题是,我们为什么关心公平?主要动机是和我们自身利益高度相关。我们正处于这样一个时代,许多事情已经或正在被人工智能系统自动化。自动驾驶汽车已经指日可待,估计 5–10 年内会被广泛使用;雇主使用 ML 系统选择工作申请人;美国法院使用 COMPAS 算法进行累犯预测;Linked-in 使用 ML 对查询的求职者进行排名;亚马逊使用推荐系统来推荐商品,并决定商品在页面上出现的顺序。网飞使用推荐系统为每个用户呈现定制页面。机器学习系统已经成为我们日常生活中不可分割的一部分。随着越来越多的领域开始将人工智能集成到他们现有的实践/产品中,它们在不久的将来会变得更加广泛。
人工智能是好的,但它可能会被错误地使用。机器学习是应用最广泛的人工智能技术,它严重依赖数据。认为 AI 是绝对客观的,这是一种普遍的误解。人工智能只有在学习人类所教的东西的意义上才是客观的。人类提供的数据可能会有很大的偏差。2016 年发现,用于累犯预测的算法 COMPAS 对黑人产生的误报率远高于白人(见图 2, Larson et al. ProPublica,2016 )。
Fig2: The bias in COMPAS. (from Larson et al. ProPublica, 2016)
类似于 Linked-in 的求职平台 XING 被发现对不太合格的男性候选人的排名高于更合格的女性候选人(见图 3, Lahoti et al. 2018 )。
Fig3: The bias in the query for Brand Strategist from XING(from Lahoti et al. 2018).
分别由微软、Face++和 IBM 提供的公开可用的商业人脸识别在线服务被发现在肤色较暗的女性身上实现的准确率低得多(见图 4, Buolamwini 和 Gebru,2018 )。
Fig4: The bias in commercial face recognition services(Buolamwini and Gebru, 2018). DF, DM, LF, LM stand for: darker skin female, darker skin male, lighter skin female and lighter skim male. PPV, TPR, FPR stand for predictive positive value, true positive rate and false positive rate.
当应用程序涉及到人时,ML 中的偏见几乎无处不在,它已经损害了少数群体或历史上处于不利地位的群体的利益。不仅是少数群体的人,每个人都应该关心人工智能中的偏见。如果没人关心,下一个遭受偏见对待的人极有可能就是我们中的一员。
3.原因
有人会问:“是什么导致了 ML 系统中的偏差?”本质上,这种偏差来自于由于历史原因而存在于训练数据集中的人为偏差。以下是潜在原因的列表( Barocas 和 Selbst,2016 ):
偏斜样本:如果偶然发生一些初始偏差,这种偏差可能会随着时间的推移而加剧:未来的观察结果会证实预测,而做出与预测相矛盾的观察结果的机会会减少。一个例子是警方记录。犯罪记录只来自警察观察到的那些犯罪。警察局倾向于派遣更多的警察到最初发现犯罪率较高的地方,因此更有可能在这些地区记录犯罪。即使后来其他地区的人犯罪率更高,也有可能由于警方关注较少,警察部门仍然记录这些地区的犯罪率更低。使用以这种方式收集的数据训练的预测系统倾向于对警察较少的地区有积极的偏向。
污点例子:任何 ML 系统都保留着因人为偏差导致的旧数据中存在的偏差。例如,如果系统使用经理做出的雇用决定作为选择申请人的标签,而不是工作申请人的能力(大多数情况下,对于被拒绝的人来说,这种能力是观察不到的)。使用这些样本训练的系统将复制经理决策中存在的偏差(如果有的话)。另一个例子是,在谷歌新闻文章上训练的词嵌入“表现出令人不安的女性/男性性别刻板印象”,例如,“男人”和“计算机程序员”之间的关系与“女人”和“家庭主妇”之间的关系高度相似( Bolukbasi et al. 2016 )。
有限特征:为少数群体收集的特征信息可能较少或不可靠。如果来自少数群体的标签的可靠性比来自多数群体的标签的可靠性低得多,则由于这些噪声,系统对于少数群体的预测往往具有低得多的准确性。
样本大小差异:如果来自少数群体的训练数据比来自多数群体的数据少得多,那么就不太可能完美地模拟少数群体。
代理:即使敏感属性(被认为不应该用于任务的属性,例如种族/性别)不用于训练 ML 系统,也总是可以有其他特征作为敏感属性的代理(例如邻域)。如果包含这样的特征,偏差还是会发生。有时,很难确定相关功能是否与受保护的功能过于相关,以及我们是否应该将它包括在训练中。
它们可以归纳为以下三个问题:
- 发现未被观察到的绩效差异:偏斜样本,有污点的例子
- 应对观察到的绩效差异的样本:有限的特征、样本大小差异
- 理解预测结果差异的原因:代理
4.公平的定义
一个自然的问题是“如何定义公平?”,具体来说,“我们如何制定公平,以便它可以在 ML 系统中考虑”。第一个想法是寻找法律支持,并检查是否有任何定义可以用来量化公平。许多国家的反歧视法律禁止基于敏感属性(如性别或种族)的不公平待遇(民权法案。1964 年民权法案,第七章,平等就业机会,1964 年。).这些法律通常使用两个不同的概念来评估决策过程的公平性( Barocas 和 Selbst,2016 ): 不同的待遇和不同的影响。如果决策(部分)基于主体的敏感属性,则决策过程会受到完全不同的对待,如果其结果对具有某些敏感属性值的人(例如,女性、黑人)造成不相称的伤害(或好处),则会产生完全不同的影响。然而,这两个定义对于计算来说太抽象了。因此,在公平的数学公式上没有共识。
文献中已经提出了许多关于公平的定义(参见 Gajane 和 Pechenizkiy,2018 和维尔马和鲁宾,FairWare2018 )。然而,它们中的大部分是基于以下六点:
- 没认识到
- 人口均等
- 均等的赔率
- 预测汇率平价
- 个体公平
- 反事实公平
其中人口统计均等、均等优势和预测比率均等属于一个更大的类别,称为“群体公平”。
**注:**我选择使用的名字都是文献中比较流行的。这些定义没有统一的命名约定。
4.0 设置和符号
在本节中,为了简单起见,我们将只考虑具有单个敏感属性的二元分类问题。然而,该公式可以容易地扩展到具有多个敏感属性的其他任务(例如回归)。
想象一下预测是否雇佣一个申请人的问题:
- X ∈ Rᵈ:量化的申请人特征(如教育程度、工作经验、大学平均绩点等。).
- A ∈ {0,1}:二进制敏感属性(如多数/少数)。
- C :=c(X,A) ∈ {0,1}:二进制预测器(例如,雇用/拒绝),它根据分数 R:=r(x,a) ∈ [0,1]做出决策。
- Y ∈ {0,1}:目标变量(例如,候选人是否真正能够胜任该职位)。
- 我们假设 X,A,Y 是从一个基本分布 D 生成的,即(X,A,Y) ~ D。
我们也用 P₀ [c] := P [c | A= 0]来表示。
最初,当我们不施加任何公平性约束时,我们针对精度进行优化,并且当 C(X,S)=Y ∀ (X,s,Y) ~ D 时达到最佳精度
4.1 不知晓
这只是意味着我们不应该将敏感属性作为特征包含在训练数据中。这个概念与不同的处理是一致的,它要求不使用敏感属性。
提法:
C=c(x,A) = c(X)
动机:
直观、易于使用和法律支持(区别对待)。
瑕疵:
基本限制是可能有许多高度相关的要素(例如邻域)作为敏感属性(例如种族)的代理。因此,仅仅删除敏感属性是远远不够的。
4.2 人口均等
人口统计均等,也称为独立性、统计均等,是最著名的公平标准之一。
配方:
c 独立于 A: P₀ [C = c] = P₁ [C = c] ∀ c ∈ {0,1}
在我们的例子中,这意味着两组申请人的录取率必须相等。在实践中,有两种放松这种平等的近似形式(假设组 1 是优势组,即当不考虑公平问题时具有更高的被雇用概率):
- P₀ [C=1]/P₁ [C=1] ≥ 1-ϵ
当ϵ=p/100 ( Zafar 等人 AISTATS2017 )时,p%规则被定义为满足这个不等式。
- |P₀ [C=1]-P₁ [C=1]| ≤ ϵ其中ϵ ∈ [0,1]。
动机:
- 法律支持:"四五法则"规定任何弱势群体的入选率都低于入选率最高群体的五分之四。在我们的公式中,这相当于满足 80%法则。如果违反此规则,必须提供与工作相关或业务需要的理由。“业务必要性意味着使用该程序对于业务的安全和高效运营至关重要,并且没有实质上同样有效且负面影响较小的替代程序”(来源:负面影响分析/五分之四规则)。
- 有一些论文认为,在短期内实施这些标准有利于在长期内建立弱势少数群体在劳动力市场上的声誉(胡和陈,WWW2018 )。
瑕疵:
- 该定义忽略了 y 和 a 之间任何可能的相关性。特别是,当基本利率不同时,它排除了完美预测值 C=Y(即 P₀ [Y=1] ≠ P₁ [Y=1])
- 懒惰:如果我们从一个群体中雇佣合格的人,从另一个群体中随机选择一些人,我们仍然可以实现人口统计上的平等。
4.3 扳平赔率
均等赔率,也叫分离,正率平价,最早是在 [Hardt,Price and Srebro,2016](http://Equality of Opportunity in Supervised Learning) 和 Zafar 等人 WWW2017 中提出的。
配方:
c 独立于 Y 上的条件:
p₀=p₁∀
一个较弱的概念是:
p₀=p₁
这被称为精确度奇偶校验。这种较弱概念的局限性在于,我们可以用一组的假阳性率来交换另一组的假阴性率。这种交易有时是不可取的(例如,交易拒绝来自组 1 (A=0)的(C=0)合格申请人(Y=1),而接受来自组 2 (A=1)的(C=1)不合格申请人(Y=0))。
在许多应用中(例如,招聘),人们更关心真实的正比率而不是真实的负比率,因此许多工作集中在以下放松的版本上:
P₀ [C = 1| Y = 1] = P₁
这被称为机会均等。
在我们的例子中,这就是说我们应该从每个组的合格部分中雇佣相同比例的人。
动机:
- 最优性相容性:允许 C=Y。
- 惩罚懒惰:它提供了在所有团队中统一减少错误的激励。
瑕疵:
这可能无助于缩小两个群体之间的差距。例如,假设 A 组有 100 名申请人,其中 58 人合格,而 B 组也有 100 名申请人,但其中只有 2 人合格。如果公司决定接受 30 名申请人,并满足机会均等,A 组将获得 29 份工作机会,而 b 组仅获得 1 份工作机会。如果工作是高薪工作,A 组往往有更好的生活条件,为他们的孩子提供更好的教育,从而使他们长大后有资格获得这样的高薪工作。随着时间的推移,A 组和 B 组之间的差距会有扩大的趋势。
4.4 预测汇率平价
预测汇率平价,也称为充分性,出现在 Zafar et al. WWW2017 (我不确定第一个涉及它的文献)。
提法:
y 独立于 C 上的条件:
P₀ [Y = y| C= c] = P₁ [Y = y| C= c] ∀ y,c ∈ {0,1}
这相当于满足了两者
P₀ [Y = 1| C= 1] = P₁ [Y = 1| C= 1]和
P₀ [Y = 0| C= 0] = P₁ [Y = 0| C= 0],
分别称为正预测奇偶校验和负预测奇偶校验。
在我们的例子中,这就是说,如果从预测算法(用于确定候选人的工作资格)返回的分数应该反映候选人做这项工作的实际能力。这与雇主的利益是一致的。
动机:
- 最优性兼容性:C=Y 满足预测速率奇偶校验。
- 假设接受(C=1),成功的机会均等(Y=1)。
瑕疵:
- 这个缺陷类似于机会均等的缺陷:它可能无助于缩小两个群体之间的差距。推理和以前类似。
4.5 个人公平
个人公平是一个相对不同的概念。前面三个标准都是基于群体的,而个体公平,顾名思义,是基于个体的。这是由 Cynthia Dwork 等人于 2012 年在通过意识实现公平中首次提出的,是该领域最重要的基础性论文之一。个体公平的理念强调:相似的个体应该得到相似的对待。
配方:
表示 O 为可测空间,δ(O)为 O 上的分布空间。表示 M:X→δ(O)为将每个个体映射到结果分布的映射。则公式为:
D(M(X),M(X’)≤D(X,X’)
其中 x,X’ ∈ Rᵈ是两个输入特征向量,d 和 d 分别是输入空间和输出空间上的两个度量函数。参见图 5 的图解。
Fig5: illustration of individual fairness
动机:
作为个体,我们倾向于更关心个体,而不是关注群体。此外,个体公平比任何群体公平都更精细:它对每对个体的待遇施加了限制。
瑕疵:
很难确定什么是合适的度量函数来测量两个输入的相似性( Kim et al. FATML2018 )。在我们的案例中,很难量化两个求职者之间的差异。假设有三个求职者,A,B 和 c。A 有学士学位和 1 年相关工作经验。b 具有硕士学位,1 年相关工作经验。c 有硕士学位,但没有相关工作经验。A 比 C 更接近 B 吗?如果是,增加多少?这个问题很难回答,因为我们不能同时拥有 A、B 和 C 的表现(我们不能同时雇佣这三个人)。否则,我们可以在一个叫做度量学习的领域应用技术。当敏感属性出现时,情况会变得更糟。在我们的度量函数中,我们是否应该以及如何计算组成员的差异?
4.6 反事实公平
反事实公平是在 Russell et al .,NIPS2017 中提出的。它为解释偏见的原因提供了一种可能的方法。
配方:
P[C_{A← 0}=c|X,A=a]=P[C_{A← 1}=c|X,A=a]
反事实值替换敏感属性的原始值。反事实值通过一些结构方程向因果图(见图 6 的例子)的“下游”传播。不是敏感属性后代的所有其他内容保持不变。
Fig6: some possible causal graphs
**动机:**由于许多相关的特性,4.1 远远不够。4.2–4.4 都是观察公平标准。它们不能用来寻找不公平现象的原因。4.5 在寻找合适的度量标准方面存在根本性的限制。反事实公平解决了所有这些问题。
反事实公平提供了一种检查仅替换敏感属性的可能影响的方法。它提供了一种通过因果图解释偏见影响的方法。图 6 显示了申请大学的几个可能的图表。请注意,当我们替换敏感属性时,与之相关的所有其他特性也会受到影响。在图 6 中,如果敏感属性(种族)改变,教育分数和工作分数也会改变。
瑕疵:
这个想法非常理想。在实践中,很难就因果图应该是什么样子达成共识,甚至更难决定使用哪些特征,即使我们有这样的图(如果我们消除所有相关的特征,我们可能会在准确性上遭受巨大损失)。
4.7 公平的不可能定理
事实证明,4.2–4.4 中的三个准则中的任何两个是互斥的,除非在非退化的情况下。
人口平价与预测利率平价
如果 A 依赖于 Y,那么要么人口统计平价成立,要么预测汇率平价成立,但不能两者都成立。
证明:
人口均等 VS 均等几率
如果 A 依赖于 Y,而 C 依赖于 Y,那么要么人口统计均等,要么机会均等,但不能两者都有。
证明:
均衡赔率 VS 预测汇率平价
假设(A,C,Y)的联合分布中的所有事件都有正概率。如果 A 依赖于 Y,则均衡赔率或预测率平价成立,但不能同时成立。
证明:(乏色曼定理 17.2)
文献主要集中在第三种情况的证明上。证明可以在 Chouldechova,2016 和 Kleinberg et al. 2016 中找到,后者给出了一个假设较弱的证明。
下面是一个说明第三种互斥的例子(均衡的赔率与预测的比率奇偶校验)。假设在没有任何公平性约束的情况下优化我们的分类器后,我们有以下结果和预测(见图 7)。我们对 a 组的预测都是正确的,但是对 b 组却有一个假阳性的错误。
Fig7: illustration of impossibility theorem(original)
因为我们想保持均等的机会,我们决定在 a 上也犯两个假阳性错误。现在,真正的正比率和真正的负比率是相等的:两者都有 1/2 和 1(见图 8)。
Fig8: illustration of impossibility theorem(equalized odds is preserved)
然而,尽管正预测奇偶校验也得以保留,但此设置违反了负预测奇偶校验。不可能在不牺牲均等优势/正预测奇偶性的情况下保持负预测奇偶性(见图 9)。
Fig9: illustration of impossibility theorem(PPV is satisfied but NPV is not)
COMPAS 辩论的本质类似于这个玩具例子。ProPublica 的主要指控是黑人被告面临更高的假阳性率,即它违反了机会平等,因此均等了赔率。Northpointe 的主要辩护是分数满足预测率平价。
4.7 公平性和准确性之间的权衡
对精确度施加上述约束的影响确实取决于数据集、所使用的公平性定义以及所使用的算法。然而,总的来说,公平会损害准确性,因为它将目标从准确性转移到准确性和公平上。因此,在现实中,应该进行权衡(见图 10 的说明)。
Fig10: trade-off between accuracy and demographic parity on a linear classification problem (Zafar et al. AISTATS2017)
5.公平算法
这里有许多算法声称有助于提高公平性。其中大多数分为三类:预处理、训练时优化和后处理。
5.1 预处理
想法是我们要学习一个新的表示 Z 这样它就去除了与敏感属性 A 相关的信息并且尽可能的保留了 X 的信息(泽梅尔等人 ICML2013 ,路易佐斯等人 ICLR2016 ,卢姆和约翰卓尔 2016 ,阿德勒等人 2016 ,卡尔蒙等人尼普斯 2017 ,下游任务(例如分类、回归、排序)因此可以使用“干净的”数据表示,从而产生保持人口统计均等和个体公平的结果(如果给出了适当的度量)。参见图 11 的图解。
Fig11: Illustration of preprocessing
示例:
下面的算法是 Zemel 等人在 ICML2013 中提出的。
注释(与原论文略有不同):
X ∈ R^{d× N}:训练数据。
Y:代表个体分类决策的二元随机变量。
X⁺:= {x∈ X | A = 1}:正的训练数据。z:一个多项式随机变量,其中 K ∈ Z⁺值中的每一个代表一个“原型”。与每个原型相关联的是在与个体 x 相同的空间中的向量 v_k。
其思想是将每个数据点 x 表示为 K 个原型的加权线性组合,以满足人口统计学上的奇偶性,并尽可能保持原始信息和准确性。损失函数反映了这一思想。
定义元素成为特定原型的概率的 softmax 版本
其中 d 是距离测量函数(例如 l₂距离)。在本文中,它被定义为一个加权 l₂距离函数:
定义 y_n 的预测,基于每个原型对 Y 的预测边缘化为:
总损失为:
其中,L_z 用于调整人口统计奇偶校验,L_x 是重建误差,L_y 用于计算预测损失。相关的 A_z、A_x、A_y 是平衡这些损耗的超参数。
在训练阶段,通过 L-BFGS 联合优化 v,w,α以最小化目标 L,超参数通过网格搜索来选择。必须注意,目标是非凸的,因此不能保证最优。
优点:
- 预处理数据可用于任何下游任务。
- 不需要修改分类器。
- 测试时不需要访问敏感属性。
缺点:
- 一般来说,预处理只能用于优化统计奇偶性或个体公平性(如果度量给定),因为它没有标签 y 的信息。
- 在准确性和公平性度量的性能方面次于其他两种方法。
5.2 培训时的优化
最直观的想法是给现有的优化目标添加一个约束或正则项。大多数文学作品都属于这一类。此类方法可用于优化任何公平性定义( Calders 等人 2009 , Woodsworth 等人 2017 , Zafar 等人 AISTATS2017 , Zafar 等人 WWW2017 , Agarwal 等人 ICML2018 )。优化反事实公平性的方法也属于这一类( Russell et al .,NIPS2017 )。
示例:
下面的算法是在 Zafar 等人的 WWW2017 中提出的。
符号:
x ∈ Rᵈ:非敏感属性。
y ∈ {-1,1}:类标签。
\hat{y} ∈ {-1,1}:预测标签。
θ:要学习的参数。
L(θ):原凸损失。
d_θ (x):特征向量到决策边界的有符号距离。
f_θ (x):分类器函数。如果 dθ(x)≥0,fθ(x)= 1,否则为-1。
z ∈ {0,1}:敏感属性。
本文主要讨论以下三种公平性约束:
它们中的一个或全部三个可以作为约束添加到原始优化问题中。
应该注意的是,假阴性率的平等意味着真阳性率的平等,因此这意味着机会的平等。假阳性率相等意味着真阴性率相等。总的错误分类率的相等意味着分类率的相等,这是准确性的均等,均等优势的较弱的概念。这里我们以假阳性率(约束条件与机会均等相同)为例。它具有以下优化公式:
问题是约束使得优化变得难以处理。因此,该文件放宽了限制。它使用用户敏感属性之间的协方差以及用户特征向量和分类器决策边界之间的有符号距离作为代理来捕捉敏感属性和组级(条件)预测之间的关系:
放松后,公式现在变成:
其中协方差阈值 c ∈ R⁺控制遵守机会均等的程度。
这样的公式化仍然是非凸的,所以接下来我们将把这些约束转换成一个有纪律的凸凹规划(),它可以通过利用凸凹规划的最新进展来有效地解决(沈等 2016 )。
首先,我们可以将公平性约束重写为:
其中~表示“≥”或“≤”。为了简单起见,我们去掉常数 1/N。由于 z ∈ {0,1},我们可以将总和分成两项:
其中 D₀和 D₁分别是 d . s . t . z = 0 和 z=1 的子集。定义 N₀=|D₀|和 N₁=|D₁|,然后\overbar{z} = N_1/N。约束现在变成:
假设 g_θ在θ中是凸的(假设),这就产生了一个凸凹函数。因此,优化现在变成了:
这是一个针对任何凸损失 L(θ)的训练有素的凸-凹规划(DCCP),并且可以使用众所周知的试探法有效地求解,例如在沈等人 2016 中提出的试探法。
优点:
- 在准确性和公平性方面表现良好。
- 可以更灵活地选择准确性和公平性度量之间的权衡(这取决于具体的算法)。
- 测试时不需要访问敏感属性。
缺点:
- 此类别中的方法是特定于任务的。
- 需要修改分类器,这在许多情况下可能是不可能的。
5.3 后处理
这种方法试图以满足公平性约束的方式编辑后验概率。它可以用来优化大多数公平定义(反事实公平除外)。基本思想是使用每个组的原始得分函数 R 来找到合适的阈值。作为预处理,分类器不需要重新训练/改变(费尔德曼 2015 ,哈特等人 NIPS2016 )。
例子(统计均等/机会均等):
下面的算法是在 Hardt 等人的 NIPS2016 中提出的。
给定一个分类器,我们可以为两组绘制相应的 ROC 曲线。接下来,我们可以根据 ROC 曲线找到阈值(参见图 12 的图示)。
Fig12: Finding the optimal equalized odds predictor (left), and equal opportunity predictor (right) (Hardt et al. NIPS2016)
均衡优势(真阳性率和假阳性率相等)仅在两组的 ROC 曲线相交时满足,如左图所示;机会均等,作为一个较弱的概念,可以通过采用阈值来满足,使得两组的真实阳性率相等,如右图所示。
优点:
- 可应用于任何分类器之后。
- 相对较好的性能,尤其是公平措施。
- 不需要修改分类器。
缺点:
- 要求测试时访问受保护的属性
- 缺乏选择准确性-公平性权衡的灵活性。
5.4 实验
需要注意的是,本节实验结果来自 Agarwal et al. ICML2018 。他们的方法属于训练时优化的范畴。我没有介绍他们的方法,因为完全解释他们的方法和他们的方法提供的理论保证需要时间。我可能会在未来的一个单独的帖子中介绍他们的论文。
数据集:
以下四个数据集用于实验。除了 adult4 之外,所有数据集都有二进制保护属性,adult4 有两个敏感属性(性别、种族),因此有四个保护属性值(为简单起见,两个属性都被二进制化)。
成人收入数据集 ( Lichman,2013 )
- 尺寸:48842 个示例
- 任务:预测某人的年收入是否超过 5 万美元
- 敏感属性:性别(男/女)或性别(男/女)和种族(白人/非白人)
ProPublica 的 COMPAS 累犯数据 ( Larson 等人 ProPublica,2016 )
- 尺寸:7918 个示例
- 任务:从某人的犯罪历史、入狱时间、人口统计数据和 COMPAS 风险评分预测累犯率
- 敏感属性:种族(白/黑)
法学院招生委员会的全国纵向律师通道研究 ( 威格特曼,1998
- 尺寸:20,649 个示例
- 任务:预测某人最终通过律师考试
- 敏感属性:种族(白/黑)
荷兰人口普查数据集 ( 荷兰中央统计局,2001 年)
- 尺寸:60420 个示例
- 任务:预测某人是否有声望的职业
- 敏感属性:性别(男/女)
实验结果:
对几种方法的性能进行了比较,包括预处理( Kamiran 和 Calders,2012 提出的重新加权和重新标记方法)、训练时的优化( Agarwal 等人的 ICML2018 中的归约、网格和归约、后处理( Hardt 等人的 NIPS2016 )(见图 13)。
Fig13: Classification error versus constraint violation on test examples with respect to Demographic Parity(DP) and Equalized Odds(EO). The curves plot the Pareto frontiers of several methods. Markers correspond to the baselines. Vertical dashed lines are used to indicate the lowest constraint violations. (Agarwal et al. ICML2018)
结果表明,所有的方法都能够大大减少或消除差异,而对分类器精度没有太大影响(除了在荷兰人口普查数据集上)。对于人口统计均等,归约方法(属于训练时的优化)一致地实现最低的约束违反,优于或匹配基线。对于小的违规,后处理算法表现良好。重新加权和重新标记(属于预处理)是最差的。
5.5 讨论
实际上,毫无疑问,在准确性和公平性之间实现最佳平衡的方法是通过在训练时进行优化。然而,预处理和后处理方法能够在不修改分类器的情况下保持公平性。当我们没有能力修改分类器时,这样的特征是需要的。
必须指出的是,我们之前讨论的所有方法都需要在训练期间获得关于敏感组的信息。后处理方法甚至在测试时也需要它。当人们不公开他们的身份时,这可能是不可能的。最近在这方面开展了一项工作,在不知道敏感属性的情况下,使用稳健统计技术优化精确度奇偶校验( Hashimoto 等人,ICML2018 )。
6.摘要
- 近年来,公平成为 ML 社区中一个非常热门的话题。
- 公平很重要,因为它对每个人的利益都有影响。
- 最大似然系统中的不公平性主要是由于训练数据中存在的人为偏差。
- 对于(不)公平的“最佳”定义,目前还没有共识
- 观察标准有助于发现歧视,但本身是不够的。因果观点可以帮助阐明问题,组织假设。
- 除非在退化的情况下,否则三个组公平性定义中的任何两个不能同时实现人口统计均等、均等优势和预测率均等。
- 准确性和公平性之间的权衡通常存在。
- 有三种方法:预处理、训练时优化和后处理。各有利弊。
- 大多数公平算法使用敏感属性来实现某些公平概念。然而,这种信息在现实中可能无法获得。
接下来是什么
在以后的文章中:我会考虑谈论超越二元分类的公平 ML,公平 ML 的最新进展,使用因果推理的反事实公平 ML,或者更详细的理论结果。
确认
感谢您的阅读!这是我在 Medium 上的第一篇帖子。错误和遗漏是非常可能的,所以请让我知道,我会尽快纠正他们!我将非常感谢你的支持。请激励我以后多写一些,质量更高的帖子。
使用 Tensorflow 和 Pytorch 计算骰子值的两阶段方法
在之前的博客中,我讨论了如何在 Tensorflow 中使用大约 400 张带注释的图像作为训练数据来构建 12 类骰子检测器。该模型的目标是检测 6、8、10 或 12 面骰子的骰子面的存在,然后确定面值。一旦完成,我就可以在屏幕上得到骰子的总价值。
这个模型在这项任务中表现不错,但有一个问题,要么不能识别骰子的面孔,要么对它检测到的面值进行了错误分类。在上一篇文章的最后,我提到了解决这个问题的另一种方法,即构建第一级对象检测器,专门检测骰子的正面,然后构建第二级 CNN,利用第一个模型的输出来确定数字。虽然这增加了培训和实现管道的复杂性,但我认为它可以提高整体性能。
我对潜在性能改进的推理是基于使用一个适合所有人的通用模型的优势,而不是将问题分解成更小的部分并构建专门针对特定任务的模型。在这种情况下,第一级对象检测器可以学习一般地识别骰子面,而不是单独地识别每种类型的骰子。这意味着从不同的角度看到骰子会有更多的机会,因为根据方向的不同,识别 8 面和 10 面骰子的正面会产生类似的问题。然后,在第二阶段,我可以应用大量的旋转和翻转来增加数据,这比我在之前构建的通用对象检测模型中能够增加的数据要多得多,以帮助它更好地识别骰子值,而不管方向如何。
New object detection model has a single class “dice_top” the boxes get passed to a backend ResNet model for classification.
gif of the same video from the previous blog rerun here. Two stage pipeline also gets a value of 20
Y 你可以在这里 找到 github 上的代码。脚本需要用作 tensorflow 对象检测库的一部分,我在不同的点修改了检测脚本以进行数据准备。这些是我用来给图片和视频做最后标记的,就像在帖子里看到的那样。
训练新的物体检测器
对于这个项目,我使用了我在以前的博客中使用的相同的数据集。对于对象检测模型,我只使用了 200 张图像,其中我调整了所有的边界框,使其标签为“dice_top ”,而不是数字 1-12。我是通过用 Labelimg 快速浏览 XML 并手动调整标签来做到这一点的。最初,我试图在从 XML 生成的 csv 中自动调整标签,但是在训练时遇到了奇怪的模型行为,所以我恢复了手动方法。
对于单个类,模型只需要运行一个小时左右,我就可以在一个很好的阈值停止它,而不是以前的模型需要 6 个小时左右。
在这个阶段,我能够评估新的对象检测模型与其前身相比表现如何。很快出现的情况是,它正在检测第一个模型漏掉的骰子。下面左边的图像是第一个模型的输出,而右边的图像是由新的单类检测器处理的同一图像。左边的 6 在新型号中被检测到,但在第一个型号中被忽略。
以下图片对中的类似故事。靠近顶部的 d8 未被第一个模型检测到,但被第二个模型检测到。
此外,两种模型都显示了 10 面骰子的弱点。在这种情况下,两个模型在检测角落中的蓝色 10 面骰子方面表现不佳,并且在这种情况下,第一个模型更彻底地失败了。
因此,虽然第一个模型在未能识别蓝色 10 面骰子的顶部方面做得更好,但我认为值得注意的是,新的单类检测器在一半的数据上进行训练,但在检测骰子方面比其前身做得更好。
既然新的骰子检测器已经就位,我就可以开始构建价值分类的第二阶段模型了。
为后端模型准备数据
更有趣的数据准备工作是为后端 CNN 获取数据。我知道我需要训练一个模型来识别骰子表面的数字,而不管它们的方向如何,所以我认为以随机垂直和水平翻转以及随机旋转的形式增加大量数据的 CNN 会有所帮助。我决定使用 Pytorch 后端模型,因为它提供了一个很好的简单管道来训练和部署它的模型(我也运行了太多的 Keras 模型,喜欢这种变化)。使用 Pytorch 的另一个原因是我喜欢使用 Pytorch,并且在我的其他博客中有关于这类问题的很好的代码基础。
因此,要将骰子顶端的图像放入我想要的文件夹结构中,我有几个选项。
- 手工裁剪每一类的几百张图片:显然很慢,而且不是最佳的。对我来说太多体力劳动了。
- 使用新的骰子顶端模型裁剪出所有的骰子顶端,然后将它们分类到文件夹中。这也需要做一些整理工作。在这一点上,我想你们都知道我要说什么。
- 使用我之前训练的 12 个类别对象检测器,根据预测的类别将图像分类到 12 个文件夹中,然后查看数据集以找到错误分类。
我选择了第三种方法,因为它对我来说需要较少的机械工作,而且我发现这是解决过去其他问题的一个聪明的方法。
为此,我所要做的就是修改我用来将边界框输出到图像上的脚本,以提供框坐标,这样我就可以对图像数组进行切片,只裁剪出图像中的骰子顶部。然后使用从边界框中预测的类别,我将图像分类到不同的文件夹中。这让我可以在几分钟内生成 2500 张左右的裁剪图像,而不是手工裁剪 2500 张图像所需要的时间…
接下来是打扫卫生。下面是 6s 文件夹的截图,其中有一些 9 隐藏在组合中。对于这些骰子,9 和 6 通常在底部附近标有线或点,对于没有标记的骰子,这意味着它是 6。
另一个有趣的类别是观察 1s 和 7s。
这也让我对我的 12 类对象检测模型产生的分类错误有了一个很好的感觉。根据不同的角度,你会看到 5s 被标记为 2s 或 6s,11s 或 12s 被标记为 10s、2s 或 1s,因为该型号很少接触这些数字。
一旦数据集被分类到 12 个文件夹中,我就准备扔几个 CNN 进去看看有什么效果。
训练 Pytorch CNN
有了数据集并按类分解到文件夹中,使用标准数据集和数据加载器函数来利用 pytorch CNN 管道就非常简单了。这里需要注意的一点是,我制作了一个包含 120 张图片的验证集(每个类 10 张)。我做了一个平衡的验证集,尽管值 1-6 有很大的不平衡,因为它们出现在所有的骰子上,而值 11 和 12 只出现在 d12s 上,所以它们出现得最少。
我发现,使用预先训练的 ResNet 模型效果相当好,我只是允许在几个时期内对权重进行微调。大约 15 个时期后,我用 ResNet 50 获得了 95%的验证集准确度,并发现将其增加到 ResNet 101 会将其准确度增加到 97%。我最终坚持使用 ResNet 101,因为目前模型的占地面积不是我的一个大问题。
把它们放在一起
现在我有了这两部分,我所要做的就是把它们放在一个管道中。第一阶段模型将检测骰子面并将这些骰子面馈送给第二模型用于分类。然后,基于后端模型的分类,我能够在屏幕上添加骰子值并显示它们。
这相对简单,需要初始化 Pytorch 模型,并添加额外的函数来预处理图像,将结果映射到它们的标签,并将结果相加。唯一恼人的部分是,我目前没有多 gpu 机器可用,当其中一些模型基于 Tensorflow 时,与多个模型一起工作会变得很烦人。
对于其他项目,我在同一个 GPU 上使用了多个基于 Pytorch 的大型模型,就像我的 Fate Grand Order 机器人一样。然而,我发现 Tensorflow 倾向于将所有可用的 GPU 资源分配给自己。因此,为了运行多个模型,我基本上是在任意给定的点上处理哪个是活动的,但是对于这个用例,我只是分配 Pytorch CNN 在我的 CPU 上运行。这减慢了评估的速度,但暂时是一个快速的解决方法。下一个技术购买可能是建立一个 GPU 集群,使这样的事情不那么烦人。
It gets the correct 20, but It shows some fluttering to thinking the 6 is a 9 which is a problem I found with the backend classifier that I will discuss more below.
比较这两种方法
当考虑这两种方法时,我认为主要的权衡是速度和准确性之间的权衡。
我可以在单个 GPU 上运行的第一种单一模型方法的评估速度比我的 GPU + CPU 方法快得多。然而,在两个 GPU 上运行第二个管道可能会最小化这种差异。
现在有趣的是,看看两者之间的表现。为此,我从训练集和验证集中拿出了 25 个例子,我想你可以称之为测试集,并对它们运行两个模型。为此,我只是看他们是否得到了正确的骰子总值,如果没有,我会记录他们犯的错误类型。
第一个模型得到了 25 个完全正确中的 8 个(32%) ,而两级管道得到了 25 个完全正确中的 16 个(64%) 。所以我写这篇博客的总体假设似乎是正确的,尽管两者都还有改进的空间。
第一个模型产生的错误通常是没有检测到某些骰子,或者是我上面提到的对某些数字的错误分类。常见的有 6s vs 9s,1s vs 7s,以及若干个 8s vs 3s vs 6s。下图中有 3 个骰子未被检测到,3 被归类为 6。
Image from the first single object detection model
两阶段流水线通过识别丢失的 3 个骰子并正确地对值为 41 的所有骰子面进行分类而胜过第一模型。
然而,第二个模型仍然有问题,在我看到的 25 个案例中,它的问题是没有正确检测 10 面骰子上的面孔(这两个模型都做得很差),然后将 6 误分类为 9。要解决这个问题,我必须检查以确保我在数据集的 6 和 9 文件夹中没有任何问题,然后如果这不能解决问题,那么用更多的 9 和 6 的图像增加数据。在这两种机制之间,我认为这将有助于解决许多问题。对于错误识别 10 面骰子上的面,我认为为该特定骰子添加更多数据将是有用的。
True value should be 41, but is off by 3. I think it comes down to the 6 sided die that does not have a marking on it. The fact that this is an issue makes me think I have some of those dice examples in both the 6 and 9 folders which poisons the training data.
最后的想法
因此,在这篇文章中,我展示了我将如何建立两个阶段的管道,我以前在我的第一篇骰子计数文章中提到过。此外,我很高兴地报告说,两阶段管道确实优于我的第一个模型,在检测骰子面和分类方面做得更好。对我来说,这是另一个构建良好的专门化模型执行通用方法的例子。为了更直观地了解这种方法的工作原理,我想到了我的武术背景。这可以用李小龙的一句话来概括。
我的个人版本是当我的第一位剑术大师告诉我,我应该“练习一种技术 1000 次才能理解它,10000 次才能掌握它”。
神经网络是相似的,因为它们通常采用成千上万的例子,以便收敛到一个好的解决方案,并学习识别特定的类别。因此,精简他们必须优化的东西可以让他们更好地优化特定的问题,并了解其来龙去脉。从技术角度来说,对于我的 12 类检测器,它可能只看到一个特定的骰子/骰子面几十次,并且必须学会基于这几个例子来定位和分类它。然而,单一类别检测器看到它的单一类别 2500 次。然后,第二阶段模型可能只看到每个类几十到几百次,但是它显著地增加了数据,从而极大地增加了它所拥有的有效训练数据的量。这使得它在分类时比基本的对象检测模型获得更多的经验。
这种额外的专门化增加了训练更多模型并在流水线中实现它们的复杂性。在这种情况下,两级流水线需要 2 个 GPU 来平稳运行,而不是单个模型只需要 1 个 GPU。从技术上来说,我可以试着不使用 tensor flow……因为在使用 Pytorch 之前,我已经一次运行了 3-4 个大型 ResNets。这种速度与精度权衡的价值在于,对于一个特定的任务,你需要什么样的精度与速度。
I had an extra gif, so here is some more dice rolling!
Y 你可以在 github 这里找到代码
教育人类和机器的统一工具
这篇文章是关于让机器学习工具更容易使用。
但是,这并不是为了让外行观众看不懂,也不是为了给玩具问题创造玩具界面。
尽管人类和机器学习者之间存在许多差异,但每个人在机器学习的最关键方面都有丰富的经验——我们知道从经验中学习意味着什么。
事实上,我们如此沉浸在这个过程中,以至于在教别人的过程中,最大的挑战是记住我们自己是如何开始学习一些东西的。
这种元认知能力是一种珍贵且来之不易的技能,与教育工作者的工作尤其相关,但也是每个人日常与他人互动的关键组成部分。
当我们教我们的孩子骑自行车时,我们并不背诵精确的程序。我们演示,当他们接近动作时我们观察,然后我们将孩子的注意力引向任务中被忽略的方面。
机器学习工具应该帮助我们准确地为机器做这些事情,这样它们就可以反过来帮助我们执行太复杂而无法用传统代码表达的任务。
帮助我们提高这些元认知能力的工具不仅能帮助我们建造更有用的机器,还能帮助我们更好地了解自己,更有效地与世界打交道。
因此,当我说“可访问”时,我的意思是机器学习工具应该能够作为每个人通过经验学习和教学的先天能力的延伸。
机器学习是每个人的工具。
然而,就目前的形式而言,这一点显然并不明显。
目前,机器学习的探索需要编程技能、机器学习技术和基础数学的工作知识,甚至一些 DevOps 技能。综合来看,这些要求构成了很高的准入门槛。
第一代机器学习工具专注于帮助专业从业者在高粒度级别管理高性能管道。这些工具已经将机器学习的概念需求抽象到传统的编程结构中,尽管传统代码的演绎思维和机器学习系统的归纳思维之间存在固有的不一致。
这些工具没有强调课程设计的技巧,也没有强调通过提炼和提出最有意义的元素来管理学习者对复杂概念的体验的过程。
在我的教学工作中,我发现学生的编程和数学背景往往不是他们如何利用机器学习进行应用创造性工作的最佳预测因素。在许多情况下,最吸引人的项目来自最清晰的作者和最细心的设计师。
这是因为让机器学习项目成功的很多因素都与学生对学习问题的表达有关——如何通过特定的数据呈现来展示特定的概念。
http://bit.ly/2FSx72D and http://bit.ly/2jDpcya
随着用于自动化架构和超参数搜索的机器学习算法和机制变得更加健壮,当前机器学习工作所必需的一些技能将变得不那么重要,而清楚地阐明学习问题的技能将变得更加重要。
理想情况下,下一代机器学习工具不仅可以帮助新手熟悉这些解决问题的机制。它还将帮助专家通过专门围绕机器学习思维设计的工具更有效地探索机器学习概念。
传统上,编程语言被视为不同于交互式开发环境(ide)和在编写软件过程中起作用的其他工具。
这些描绘已经是计算中前图形时代的过时痕迹。
但是,在机器学习时代,它们将很快成为软件开发人员工作的严重障碍。
在 DeepMind、OpenAI、微软和其他公司为训练强化学习系统建立模拟环境的努力中,已经可以看到对更全面的编程环境的需求。
Jupyter notebooks、Matlab、Mathematica、Swift、Processing、Scratch 和 web 开发工具通过将编程从纯文本编辑器的局限转移到寻求适应软件开发的交互式和多媒体方面的更具凝聚力的环境中,帮助模糊了这些区别。
然而,还有很长的路要走。
明确地说,这不仅仅是让编程界面更容易被人类用户接受的问题,尽管这本身就是一个有价值的目标。
更广泛的必要性来自于这样一个事实,即机器学习正在迫使计算机程序走出黑暗的地下室,进入视觉、听觉和物理世界。
更深层次的通信机制不应该被附加到现有的接口上,也不应该被归入辅助库。它们必须被带到我们工具的中心。
更进一步,我们应该把机器学习带来的范式转变作为一个机会,重新思考软件开发过程的许多方面。
箔纸
我想给你们看一个我正在做的项目,作为如何将这些原则引入下一代机器学习工具的例子。
下面提到的一些元素已经实现,其他元素在路线图中。但是,出于本文的目的,我想讨论整个愿景。
Foil 是一个组合的机器学习和创造性编码平台、工具包和 IDE。
它试图在一个平台上关闭编程、机器学习和设计工具之间的环路,提供从新手到专家的无缝路径。
Foil 设想了一种多层次的方法,在这种方法中,专家可以直接使用较低级别的功能,但也可以将它们组合在一起,为经验较少的用户形成较高级别的功能。
随着用户获得专业知识,他们可以检查包含这些高级功能的组件,并开始使用低级组件,以及创建和共享他们自己的高级组合。
Foil 的专家模式大致相当于 Jupyter 笔记本等一些现有的机器学习开发环境,但努力在机器学习功能和一系列 GUI、scenegraph 和数据可视化功能之间提供更无缝的集成。
从工具制作的角度来看,这种模式是 Foil 自己的基于文本的编程语言提供的最细粒度功能与 Foil 在幕后利用的本机机器学习和创造性编码工具包之间的桥梁。它还创建了构建高级“中级”和“初级”模式工具的基础。
接下来,我想讨论如何通过构建机器学习模型和数据争论的构建块来实施这种多层方法。我还将介绍一个我称之为指令的概念,一种项目开发的对话式方法。最后,我将讨论这些组件如何与一组创造性的编码工具相关联。
机器学习构建模块
也许进入机器学习工作最令人生畏的事情是获得对某些数学运算在机械化归纳学习过程中所起作用的直觉的过程。
但是,我敢说,挑战不仅存在于数学门外汉。支持这种说法的一个证据是,从莱布尼茨第一次提到微积分中的链式法则到反向传播算法的出现,相隔了三百年。
也就是说,即使理解了底层的力学和数学工具,当应用于太复杂而不能心算的系统时,这些工具的特定应用并不总是显而易见地会产生有用的能力。
为了克服这一挑战,我们必须降低实验的门槛。
当然,没有引导的实验不太可能从零开始,研究出像现代神经架构这样复杂的结构。
相反,实验者可以从已知的机制出发,通过尝试将这些一般形式与最初激励实验者探索这一领域的项目想法联系起来,从而获得最大的成果。
当实验者试图学习的例子被专业实践者以模糊的方式编码时,这个过程就变得非常困难。
出于这个原因,我认为在呈现用于构建机器学习系统的架构组件时采用多层方法是很重要的。
为了帮助新手,该工具应该提供一组非常高级的构建模块,解决学习问题的基本类别。
在他或她的实验的早期阶段,用户不太可能需要更专门的构件。
因此,一个高级界面提供了对一系列可轻松定制的模板以及底层自动化的轻松访问,这将有助于用户理解该领域的问题解决方案,而不会妨碍他或她的早期探索。
该界面应提供构建模块及其组件属性的图形表示,以便在不需要外部参考资料的情况下促进实验,并使用户能够检查他们构建的系统的底层架构。
随着用户对机器学习的直觉和知识的增长,他们构思更新颖的架构和机制来处理现实世界问题的能力也将增长。
他们不应该被迫升级到一个完全不同的、更专业的工具。相反,该工具应该能够逐渐公开更高级的功能,并允许用户参与更细粒度的决策。
最终,高级用户会发现通过纯文本命令与工具交互是最方便的。在这里,用户也不应该被迫升级到一个完全不同的开发环境。
作为这些构件的扩展,该工具应该提供一个广泛的模型动物园和基础设施,使用户能够轻松地共享他们的模型。
Foil 设想了模型动物园中的三种模型。
指定和训练的模型可以从货架上取下,直接用于执行特定的机器学习任务,如图像识别。这些模型还应该附带简化迁移学习过程的挂钩。
其他模型将提供预先指定的架构,但未经培训,以便用户可以轻松地将它们与自己的数据集相结合。
最后,一组未指定和未训练的模型将提供一组通用的机器学习架构,可以在对他们的自定义数据集进行训练之前,根据用户自己的需求进行定制。
为了促进这一过程,该工具应该为本地或云中的培训模型提供无缝的工作流,而不需要丰富的 DevOps 知识。
数据操作构建模块
鉴于数据在构建机器学习系统中的首要地位,开发工具应该提供一组健壮的构建块,以促进数据的加载和操作。
虽然数组操作是计算机科学家执行的最常见的任务之一,但它往往是新手程序员最大的挫折之一。
即使对于经验丰富的开发人员来说,理解用于对复杂数据进行切片的特定代码也是耗时且乏味的。
取决于用户想要从数据中学习什么,或者她想要通过数据执行什么任务,如何分割数据和使用什么神经架构的问题是相互关联的考虑因素。
因此,数据操作组件与工具的架构构建块紧密结合是非常重要的。
在最高级别,该工具应该提供从一组文件或媒体流中选择示例的交互机制。
它应该为构建块提供图形界面,直观地展示传入数据将如何切片。
在稍低的层次上,该工具应该为一系列媒体格式以及常见的开源数据集提供数据加载器和常见的切片器类型。
在最低级别,该工具还应该为有经验的开发人员提供传统的机制,以编程方式访问文件系统和操作数值数组。
与架构组件非常相似,该工具应该为与其他用户共享定制数据集、切片器和加载器提供基础设施。
为了支持数据集维护,该工具应该提供一组可定制的监视器,自动检查文件目录或远程存储库的更新,并在更新发生时执行模型的自动重新训练。
最后,该工具应该在开发环境中提供流线型的机制,用于请求众包数据获取和清理。
指令
在传统的编程环境中,开发人员从几乎空白的状态开始,并且必须构想一组相互关联的抽象,以解决期望的编程行为的各种组件。
这种媒介的开放性是一件奇妙的事情。但是它要求开发人员自己决定每个组件之间的关系以及整体关系。
指令提供了一种机制,可以帮助开发人员在不强加任何特定抽象的情况下构建他们的思维。
从最基本的意义上来说,指令由一组小部件组成,这些小部件用于请求多媒体输入并向用户呈现多媒体输出。
指令的作者使用这些小部件组成一种决策树或引导过程,通过该过程,用户可以以最适合手头任务的方式对每个决策点做出响应。视觉信息可以视觉传达,文本信息可以文本传达。
当用户需要特定的数值时,可以呈现滑块,使得用户可以在特定的范围内进行实验,并看到其效果立即应用于上下文中。
Directives Zoo 不是提供一个预先确定的心智模型,而是为开发人员提供一系列针对各种组件问题的可能抽象。
或者,开发人员可以编写自己的指令。这个创建多模态决策树的过程推动用户通过一组决策点清晰地、有目的地进行思考。一旦定义了这些决策点,解决方案就在路上了,就像制定一个问题通常是回答它的一半工作。
作为一种众包设计模式,指令可以用来促进软件开发过程。但是它们也可以在面向用户的应用程序中使用,以便于与经过训练的机器学习模型或应用程序的其他功能进行交互。
从这个意义上说,指令模糊了编写和使用软件行为之间的区别。在编写软件的上下文中,它们通过将过程分解成更小的任务,帮助开发人员创建更易于管理的对话式体验。在面向用户的上下文中,它们为我们将与智能应用程序进行的多模态交互提供了一种更自然的格式。
指令可以显式地写成代码,也可以使用提出诸如“用户下一步应该做什么?”之类问题的指令生成指令来创建多么 meta!
还可以配置一个指令来提供用户响应的底层数据收集,以便输入学习决策树,非常类似于游戏 20 问题的数字版本。
这个特性为开源软件的共享带来了新的价值。如果一个开发人员选择共享一个指令,那么每当其他人使用它时,她的软件就会得到改进。
创造性编码
机器学习最大的好处之一是,它使我们能够超越键盘和鼠标的限制,通过机器越来越强的理解图像、音频流、视频等内容的能力,以越来越自然和直观的方式与机器交流。
这些媒体形式对于机器学习模型的训练以及我们随后与训练好的模型的交互都至关重要。
然而,当代编程工具提供的帮助很少。
组织大型多媒体数据集的艰巨任务留给了外部工具——需要开发人员通过操作系统、传统设计工具和特定代码来导航这一过程。
开发人员通常还必须拼凑大量第三方库,以便可视化培训指标,并生成用户界面和应用程序前端体验的其他方面。
为了提供集成的开发和部署工作流,并促进现代机器学习增强应用程序的生产,该工具必须直接在 development studio 中提供完整的创造性编码框架,包括 GUI、scenegraph 和数据可视化组件。
这些创造性的编码工具旨在以三种不同的方式帮助开发人员。
首先,通过提供用于操作和组织多媒体资产的图形界面、指令和编程挂钩,Foil 作为一种灵活的设计工具,用于在用于开发机器学习模型本身的相同环境中创建培训课程。
这一功能构成了 Foil 在促进“多媒体数据作为输入”方面的作用
http://bitly.com/2FIeFcG and http://bit.ly/2Isf1pJ
同样重要的是给予箔的作用,创造“多媒体输出”
创造性的编码框架使开发人员能够创建广泛的交互式、面向用户的应用程序,这些应用程序利用自定义或开源机器学习模型的智能行为。
对于一些机器学习应用程序来说,RESTful 服务和消息协议在独立系统之间搭建桥梁已经足够好了。
但是对于越来越多的高带宽应用,这种方法会产生技术瓶颈,阻碍创造性的探索。
http://bit.ly/2pevHbr and http://bit.ly/2FCYHAx
通过将一整套机器学习和前端开发工具集成到一个环境中,个人开发人员可以将目光投向广泛的高性能、支持机器学习的项目。
例如,姿势估计模型可用于提供对用户创建的游戏中的角色的类似 Kinect 的骨架控制,或者图像分割模型可用于用户创建的图像编辑工具中。
Photoshop and http://bit.ly/2paTN7O
最后,为了完成循环,开发人员可以通过建立 scenegraph 侦听器和其他在运行时捕获用户或实体行为的实时观察器,使用多媒体输出来生成新的输入训练数据。
例如,可以从用户行为历史中挖掘常见的使用模式,以便软件可以建议可能的后续步骤。
在包括 3D 物理模拟的应用中,场景图节点的行为可以用作强化学习模型或机器人项目的训练数据。
在箔环境中构建的应用程序应该可以轻松部署到桌面和移动系统、基于 web 或云的服务以及嵌入式物联网设备。
结论
当工具达到一定的成熟水平,使各种类型的用户能够开始通过计算机解决自己的需求时,最初的个人计算革命就开始了。
基于这个原因,我认为得出机器学习革命还没有真正开始的结论是合理的。
机器学习的真正前景在于工具,这些工具将使经验丰富的软件开发人员、小企业主和普通消费者能够看到机器学习可以帮助他们满足特定需求并帮助他们自己开发解决方案的方式。
就像之前的个人和移动电脑市场一样,这个市场将会非常巨大。
然而,这个市场还不存在,因为这些工具还没有进化到不言而喻的程度。
在不太遥远的未来,机器学习将帮助我们解决无数的问题,这些问题对于我们自己的生活来说太具体了,无法通过预先构建的服务的现成功能来解决。
它将帮助我们建立一个我们还无法想象的世界。
但是我们可以从想象这样的工具会是什么样子开始,以及我们如何使它们既有表现力又易于使用。
没有一种机制,没有一种方法或界面对每个用户或每个用例都是完美的。
也许唯一通用的解决方案是提供灵活性。在机器学习的时代,工具制造者的角色是一个翻译角色。该工具必须与人类和学习机器的经验性质相一致。
提供一些起点。鼓励实验。帮助人们构建他们的思维,让他们探索和遇到一些复杂的因素。当他们这样做时,提供一系列可能的解决方案。但最重要的是,要为他们提供基础设施,让他们能够开发自己的解决方案,并与他人分享。
让用户能够适应工具并被工具所适应——与工具一起成长。
如果你喜欢这篇文章,你可能也会喜欢我之前的相关文章,“在机器学习时代重新思考设计工具”
这篇文章基于我最近在 Google PAIR UX 研讨会上的一次演讲。
如果你想关注我在机器学习、人工智能、设计工具和编程语言方面的工作,请在 Medium @ Patrick 希伯伦或 Twitter @Patrick 希伯伦上关注我。我的主页还包括其他几种联系方式。
置信区间的(非常)友好的介绍
今天我想谈谈统计学中的一个基本术语——置信区间,我想以一种非常友好的方式进行讨论,只讨论一般概念,没有太多花哨的统计学术语,并且使用 python!
虽然这个术语非常基础,但有时很难完全理解(对我来说)到底发生了什么,为什么我们需要它,什么时候我们应该使用它。
那我们开始吧。
假设你想知道美国有百分之多少的人喜欢足球。为了得到这个问题 100%正确的答案,你唯一能做的事情就是问每一个美国公民他们是否热爱足球。根据维基百科,美国有超过 3.25 亿人。与 3.25 亿人交谈并不实际,所以我们不得不考虑其他事情,我们必须通过问(少得多)的人来得到答案。
我们可以通过在美国随机抽样(与更少的人交谈)来做到这一点,并获得样本中热爱足球的人的百分比,但我们不会 100%相信这个数字是正确的,或者这个数字与真实答案有多远,所以,我们将试图实现的是获得一个区间,例如,对这个问题的一个可能的答案可能是:“我 95%相信美国热爱足球的人的百分比在 58%和 62%之间”。这就是置信区间这个名字的由来,我们有一个区间,我们对它有一些信心。
旁注:我们的样本将是随机的,这一点非常重要,我们不能只从我们居住的城市中选择 1000 人,因为那样就不能很好地代表整个美国人口。另一个糟糕的例子是,我们不能向 1000 个随机的人发送脸书消息,因为这样我们会得到一个美国脸书用户的代表,当然不是所有的美国公民都使用脸书。
假设我们有一个来自美国的 1000 人的随机样本,我们看到在这 1000 人中 63%的人热爱足球,我们可以对整个美国人口做出什么样的假设(推断)?
为了回答这个问题,我想让我们换个角度来看。假设我们知道(理论上)美国人的确切比例,假设是 65%,随机选择 1000 人,只有 63%的人会喜欢足球,这种可能性有多大?让我们使用 python 来探索这一点!
love_soccer_prop = 0.65 # Real percentage of people who love soccer
total_population = 325*10**6 # Total population in the U.S. (325M)num_people_love_soccer = int(total_population * love_soccer_prop)num_people_dont_love_soccer = int(total_population * (1 - love_soccer_prop))people_love_soccer = np.ones(num_of_people_who_love_soccer)people_dont_love_soccer = np.zeros(num_
people_dont_love_soccer)all_people = np.hstack([people_love_soccer, people_dont_love_soccer])print np.mean(all_people)# Output = 0.65000000000000002
在这段代码中,我创建了一个包含 3.25 亿人的 numpy 数组,如果他们中的每个人热爱足球,我就为他们存储一个数组,否则就存储零个数组。我们可以通过计算平均值来得到数组中 1 的百分比,实际上是 65%。
现在,让我们取几个样本,看看我们得到的百分比是多少:
for i in range(10):
sample = np.random.choice(all_people, size=1000)
print 'Sample', i, ':', np.mean(sample)# Output:
Sample 0 : 0.641
Sample 1 : 0.647
Sample 2 : 0.661
Sample 3 : 0.642
Sample 4 : 0.652
Sample 5 : 0.647
Sample 6 : 0.671
Sample 7 : 0.629
Sample 8 : 0.648
Sample 9 : 0.627
你可以看到我们得到了每个样本的不同值,但是直觉(和统计理论)表明大量样本的平均值应该非常接近真实的百分比。就这么办吧!让我们取许多样本,看看会发生什么:
values = []
for i in range(10000):
sample = np.random.choice(all_people, size=1000)
mean = np.mean(sample)
values.append(mean)print np.mean(values)# Output = 0.64982259999999992
我们创建了 10K 样本,检查了每个样本中热爱足球的人的百分比,然后对他们进行平均,我们得到了 64.98%,这非常接近实际值 65%。让我们画出我们得到的所有值:
你在这里看到的是我们在所有样本中得到的所有值的直方图,这个直方图的一个非常好的特性是它非常类似于正态分布。正如我所说的,我不想在这里使用太多的统计术语,但我们可以说,如果我们多次(无限次)进行这个过程,我们将得到一个非常接近正态分布的直方图,我们可以知道这个分布的参数。更简单地说,我们将知道这个直方图的形状,所以我们将能够准确地说出有多少样本可以得到任何范围的值。
这里有一个例子,我们将运行这个模拟更多次(试图达到无穷大):
首先,我们可以看到直方图的中心(平均值)接近 65%,正如我们预期的那样,但我们可以通过查看直方图了解更多信息,例如,我们可以说一半的样本大于 65%,或者,我们可以说大约 25%大于 67%,甚至,我们可以说(大约)只有 2.5%的样本大于 68%。
在这一点上,许多人可能会问两个重要的问题,“我如何获取无限数量的样本?”以及“这对我有什么帮助?”。
让我们回到我们的例子,我们采取了 1000 人的样本,得到了 63%,我们想知道,1000 人的随机样本将有 63%的足球爱好者的机会是什么。使用这个直方图,我们可以说有(大约)25%的机会得到小于或等于 63%的值。理论告诉我们,我们实际上不需要做无限的样本,如果我们随机选择 1000 个人,其中只有 63%的人会喜欢足球。
边注#2:实际上,为了所有这些(找到值范围的机会),我们需要知道,或者至少估计,总体的标准偏差。因为我想让事情变得简单,所以我现在就离开它。
让我们回到现实和真正的问题,我不知道美国足球爱好者的实际比例。我只是拿了一个样本,得到了 63%,这对我有什么帮助?
所以我们不知道美国热爱足球的人的实际比例。我们所知道的是,如果我们取无限数量的样本,它会是这样的:
这里 μ 是总体均值(我们例子中足球爱好者的真实百分比),σ是总体的标准差。
如果我们知道这一点(并且我们知道标准偏差),我们就可以说,大约 64%的样本将落在红色区域,或者,在该图中,超过 95%的样本将落在绿色区域之外:
如果我们使用之前假设实际百分比为 65%的图,那么 95%的样本将落在 62%和 68%之间(±3)
当然,距离是对称的,所以如果样本百分比在实际百分比-3 和实际百分比+3 之间的 95%的时间内下降,那么实际百分比将是样本百分比-3 和样本百分比+3 之间的 95%的时间。
如果我们取一个样本,得到 63%,我们可以说我们 95%有信心,真实的百分比在 60% (63 -3)到 66% (63+3)之间。
这是置信区间,区间是 63±3,置信度是 95%。
我希望置信区间现在更有意义,就像我之前说的,这个介绍遗漏了一些技术上但很重要的部分。有很多文章确实包含这些部分,我希望现在遵循它们会容易得多。