如何用 Python 从头开始构建 KNN
…嗯,至少没有 sklearn 的 KNeighborsClassifier。
在 Unsplash 上由 Breno Assis 拍照
k-最近邻
k-最近邻(KNN)是一种受监督的机器学习算法,可用于回归或分类任务。KNN 是非参数的,这意味着该算法不对数据的基本分布做出假设。这与线性回归等技术形成对比,线性回归是参数化的,需要我们找到一个描述因变量和自变量之间关系的函数。
KNN 的优点是非常直观易懂。当用于分类时,查询点(或测试点)基于最接近该查询点的 k 标记的训练点被分类。
有关简化的示例,请参见下图。左侧面板显示了一个包含 16 个数据点的二维图,其中 8 个数据点标为绿色,8 个数据点标为紫色。现在,右边的面板显示了当 k =3 时,我们如何使用 KNN 对一个新点(黑色十字)进行分类。我们找到三个最接近的点,并计算出在这三个点内每种颜色有多少张“选票”。在这种情况下,三个点中的两个是紫色的,因此,黑色十字将被标记为紫色。
当 k=3 时使用 KNN 的二维分类
计算距离
通过使用闵可夫斯基距离方程的几个版本之一来确定点之间的距离。闵可夫斯基距离的通用公式可表示如下:
其中 X 和 Y 为数据点, n 为维数, p 为闵可夫斯基幂参数。当 p =1 时,距离已知为曼哈顿(或出租车)距离,当 p =2 时,距离已知为欧几里德距离。在二维空间中,两点之间的曼哈顿距离和欧几里德距离很容易可视化(见下图),但是在更高阶的 p 处,闵可夫斯基距离变得更加抽象。
二维中的曼哈顿距离和欧几里德距离
蟒蛇皮 KNN
为了用 Python 实现我自己版本的 KNN 分类器,我首先想导入几个公共库来帮忙。
加载数据
为了测试 KNN 分类器,我将使用 sklearn.datasets 中的鸢尾数据集。该数据集包含 150 种鸢尾植物的测量值(萼片长度、萼片宽度、花瓣长度、花瓣宽度),平均分为三个物种(0 = setosa,1 = versicolor,2 = virginica)。下面,我加载数据并将其存储在一个数据帧中。
我还会将数据分为要素(X)和目标变量(y),后者是每种植物的物种标签。
建立 KNN 框架
创建一个有效的 KNN 分类器可以分为几个步骤。虽然《KNN》包含了更多的细微差别,但我还是列出了最基本的任务清单:
- 定义一个函数来计算两点之间的距离
- 使用距离函数获得测试点和所有已知数据点之间的距离
- 对距离测量值进行排序,以找到离测试点最近的点(即,找到最近的邻居)
- 使用那些最接近点的多数类标签来预测测试点的标签
- 重复步骤 1 到 4,直到所有测试数据点都被分类
1.定义一个函数来计算两点之间的距离
首先,我定义了一个名为 minkowski_distance 的函数,它接受两个数据点( a & b )和一个 minkowski 幂参数 **p,**的输入,并返回两点之间的距离。请注意,这个函数计算距离的方式与我之前提到的 Minkowski 公式完全一样。通过使 p 成为一个可调参数,我可以决定是要计算曼哈顿距离(p=1)、欧几里德距离(p=2)还是闵可夫斯基距离的更高阶。
0.6999999999999993
2.使用距离函数获得测试点和所有已知数据点之间的距离
对于第 2 步,我简单地重复 X 中所有标记点的 minkowski_distance 计算,并将它们存储在数据帧中。
3。对距离测量值进行排序,以找到最接近测试点的点
在第三步,我使用熊猫**。sort_values()** 方法按距离排序,只返回前 5 个结果。
4.使用那些最接近点的多数类标签来预测测试点的标签
对于这一步,我使用集合。计数器跟踪与最近邻点重合的标签。然后我使用**。most_common()** 方法返回最常出现的标签。注意:如果“最常见”标签的标题在两个或多个标签之间有关联,那么返回的将是 Counter() 对象首先遇到的那个标签。
1
5.重复步骤 1 到 4,直到所有测试数据点都被分类
在这一步中,我将已经编写的代码投入使用,并编写一个使用 KNN 对数据进行分类的函数。首先,我对数据执行train _ test _ split(75%训练,25%测试),然后使用 StandardScaler() 缩放数据。由于 KNN 是基于距离的,因此在将要素输入算法之前,确保对其进行适当的缩放非常重要。
此外,为了避免数据泄露,在执行完 train_test_split 之后,缩放特征是一个好的做法。首先,只缩放来自训练集的数据(scaler . fit _ transform(X _ train)),然后使用该信息缩放测试集(scaler . transform(X _ test))。这样,我可以确保不使用训练数据之外的信息来创建模型。**
接下来,我定义一个名为 knn_predict 的函数,它接受所有的训练和测试数据、 k 和 p ,并返回我的 knn 分类器对测试集做出的预测( y_hat_test )。这个函数实际上并没有包含任何新的东西——它只是简单地应用了我在上面已经研究过的东西。该函数应该返回一个只包含 0、1 和 2 的标签预测列表。
*[0, 1, 1, 0, 2, 1, 2, 0, 0, 2, 1, 0, 2, 1, 1, 0, 1, 1, 0, 0, 1, 1, 2, 0, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 2, 0, 1, 0]*
他们在那里!这些是这个自制的 KNN 分类器在测试集上做出的预测。让我们看看效果如何:
*0.9736842105263158*
看起来分类器在测试集上达到了 97%的准确率。一点也不差!但是我怎么知道它实际上是否工作正常呢?让我们检查 sklearn 的 KNeighborsClassifier 在相同数据上的结果:
*Sklearn KNN Accuracy: 0.9736842105263158*
不错!sklearn 的 KNN 分类器的实现给了我们完全相同的准确度分数。
探索不同 k 值的影响
我的 KNN 分类器在选择值为 k = 5 的情况下表现相当好。KNN 没有像决策树或随机森林等其他算法那样多的可调参数,但 k 恰好是其中之一。让我们看看当我改变 k 时,分类精度是如何变化的:
在这种情况下,使用几乎任何小于 20 的 k 值都会在测试集上产生很高的(> 95%)分类精度。然而,当 k 变得大于大约 60 时,精确度确实开始下降。这是有意义的,因为数据集只有 150 个观察值——当 k 那么高时,分类器可能会考虑离测试点太远的标记训练数据点。
每个邻居都有投票权——或者他们有吗?
在编写我自己的 KNN 分类器时,我选择忽略一个明显的超参数调整机会:每个最近的点在分类一个点时的权重。在 sklearn 的 KNeighborsClassifier 中,这是权重参数,可以设置为*‘均匀’、‘距离’**,或者其他自定义函数。*
当设置为*‘uniform’时,k 个最近邻点中的每一个在标记新点时获得相同的投票。当设置为‘distance’时,距离新点最近的邻居的权重大于距离较远的邻居。当然,在某些情况下,通过“距离”*进行加权会产生更好的结果,而找出答案的唯一方法就是通过超参数调整。
最后的想法
毫无疑问,sklearn 的实现无疑比我在这里拼凑的更加高效和用户友好。然而,我发现从头开始研究 KNN 是一个很有价值的练习,它只是巩固了我对算法的理解。我希望它对你也一样!
如何建立我们都可以信任的机器学习算法?
内部人工智能
在几分钟内解释任何机器学习模型-充满信心和信任。
当哈姆雷特在莎士比亚著名的悲剧中说出这句话时,“生存还是毁灭”成了哲学领域中思想和自我反省的口头禅。在今天的商业世界中,在人工智能所做决策的驱动下,这句口头禅已经变成了“要么信任,要么不信任”。
https://imgs.xkcd.com/comics/machine_learning.png(消息来源 1)
随着最近人工智能的崩溃成为新闻,人工智能模型中缺乏透明度和越来越多的偏见的问题已经暴露出来。在最近的例子中,人工智能系统声称高度污染的空气可以安全呼吸,而在现实中,这是非常危险的;或者人工智能系统声称某个病人没有癌症,但事实上该病人确实患有癌症并已死亡;或者人工智能系统将某项交易识别为欺诈,而这是一项完全合法的交易,给客户带来了不必要的麻烦,这显然是有问题的。随着人工智能的广泛使用,这些崩溃每天都在增加,这是由我们盲目信任这些人工智能系统造成的,但现在是采取行动的时候了!
https://imgflip.com/i/2yc1nf
当谈到实施和信任这些人工智能系统时,当前的商业前景仍然非常怀疑。许多公司已经启动了这一过程,但尚未意识到其价值。这主要是由于数据科学团队和业务利益相关者之间的理解差距。在过去的几个月里,我们与许多商业利益相关者进行了交谈,他们是这些预测的接受者,我们发现数据科学家无法解释人工智能系统预测背后的原因和方式,这是对数据科学计划不信任和怀疑的最大因素。数据科学团队中的人技术含量很高,他们擅长用复杂性来表示他们的技能范围。然而,业务涉众有时是完全相反的:他们不关心使用的技术,而是模型生成的结果如何与他们的业务目标和 KPI 联系起来。
除非数据科学家能够回答这些基本问题,否则这是不可能实现的:
1.我为什么要相信模型生成的结果?
2.模型产生结果的基本原理是什么?
3.在生产中使用该模型的好处和坏处是什么?
4.结果是否符合业务逻辑?
只有回答了这些问题,数据科学家才能向业务用户提出建议,并期望取得一些进展。
为了解决这个问题,数据科学家有两个选择:
1.通过在黑盒模型之上构建一个可解释的模型来解释黑盒模型。这是莱姆 SHAP 公司背后的逻辑。SHAP 得到了更广泛的应用,因为它保证了每个变量的公平分配,并有大量的图表。遗憾的是,这种方法需要大量迭代,缺乏交互性,并且不可扩展,尤其是在处理敏感数据集和决策时。更重要的是,可视化没有吸引力和互动性。它们的静态性质在数据科学家和业务利益相关者之间造成了更大的分歧。缺乏动态和互动的图表使得从 SHAP 或莱姆产生价值变得极其困难,因此需要一种更好的方法来使用这些技术。
2.使用可解释的模型:数据科学家可以尝试优化逻辑回归或决策树等更简单的模型来进行预测,而不是使用深度神经网络等黑盒模型。在准确性和可解释性之间会有一个权衡,但是数据科学家需要决定什么是产生价值的重要因素,并且需要关注两种模型之间的边际收益。如果精确度之间的边际增加不显著,那么更理想的是实现更简单的模型,并将预测直接与业务 KPI 联系起来。可悲的是,随着我们今天收集的数据越来越复杂,简单的模型表现不佳。
所以问题来了:在我们的机器学习模型中,有没有更好的建立信任的方法?
mltrons 的 xAI 实验室正在研究一个 xAI 模块,旨在通过交互创新为 ML/DL 黑盒模型带来可解释性和透明性。目的是理解为什么决策是由人工智能系统做出的,并确保人工智能预测是公正的,准确的,没有任何逻辑矛盾。
该模块充当即插即用系统,适合任何 Jupyter 笔记本电脑——凭借自动化可视化和高度交互性,数据科学家将能够与业务利益相关者坐在一起,建立对人工智能系统的信任,并做出完全知情的决策。
图 1.1—m trons 模块示例工作流程。
这意味着数据科学家现在可以将他们的 Jupiter 笔记本、数据源(亚马逊、MySQL、HDFS 和使用 XGBoost、CatBoost、PyTorch、Tensorflow、SageMaker 的定制模型)引入 m trons 引擎,mltrons xAI 模块将接收输入,并将作为一个附加层,提供关于这些算法如何工作、思考和输出结果的可解释性。然后,数据科学家将能够通过交互式可视化、报告和可共享的仪表板,用简单的业务友好语言解释结果,任何人都可以很好地理解。
如果您对该技术有任何疑问,请通过以下表格联系我们:
https://raheelahmad453253.typeform.com/to/qa8QRB
关于作者: Raheel Ahmad 是 NYU·坦登可视化成像和数据分析(VIDA)中心的客座研究员,专注于 ML 模型的可解释性。他也是 mltrons 的联合创始人。
如何从零开始构建神经网络
安妮·斯普拉特的照片
如何从头开始建立一个简单的神经网络的分步教程
介绍
在这篇文章中,我们将用一个隐藏层和一个 sigmoid 激活函数从头开始构建我们自己的神经网络。我们将仔细研究导数和链式法则,以便对反向传播的实现有一个清晰的了解。我们的网络将能够以与 Keras 模拟相同的精度解决线性回归任务。
你可以在这个 GitHub 库中找到这个项目的代码。
什么是神经网络?
我们曾经将神经网络视为神经元的互连层,左侧是输入层,中间是隐藏层,右侧是输出层。视觉上更容易消化,但最终,神经网络只是一个将其他函数作为输入的大函数;并且取决于网络的深度,这些内部函数也可以将其他函数作为输入,等等。那些内部功能实际上是“层”。让我们看一下我们将要构建的网络图:
神经网络体系结构
它有一个具有两个特征的输入层,一个具有三个神经元的隐藏层和一个输出层。隐藏层中的每个神经元是一个 sigmoid 激活函数,它将输入值(x1,x2)、权重(w1,…,w6)和偏差(b1,b2,b3)作为输入,并产生范围从 0 到 1 的值作为输出。
开始时,我们给权重和偏差分配从 0 到 1 的随机值。
隐藏层中的第一个神经元
输出层仅包含一个神经元,其工作与隐藏层的神经元相似。你可能已经猜到 ŷ 实际上是我之前提到的那个大函数。
我们上面描述的网络类型被称为 Dence Network ,因为神经元与来自前一层的元素完全连接,在我们的情况下是输入。
我们如何训练一个神经网络?
需要理解的最关键部分是,神经网络仅通过调整权重和偏差来训练以最小化输出误差。训练过程由前馈和反向传播组成。前馈预测输出,反向传播调整权重和偏差以最小化输出误差,即预测值和真实值之间的差异。
前馈
当我们想预测产量时,我们使用前馈函数。该函数采用输入 x1 和 x2,这些输入值与权重和偏差一起进入隐藏层中的神经元,每个神经元返回值[0–1];然后输出层获取这些值并产生输出。
让我们仔细看看隐藏层中的第一个神经元,了解它实际上在做什么。
前馈过程
正如我前面提到的,每个神经元只是一个 sigmoid 函数:
类似于线性回归,我们有斜率和截距等参数来进行预测,在神经网络中,我们有权重和偏差。
隐藏层中的第一个神经元
每个神经元将产生一个值[0-1],我们将用它作为输出层的输入。在一些神经网络中,没有必要将输出层作为 sigmoid 或任何其他激活函数,它可以只是来自前一层的值的总和。
输出层中的神经元
该函数的代码如下所示:
def sigmoid(x): return 1 / (1 + np.e**-x)def feedforward(x1, x2): n1 = sigmoid(x1 * w1 + x2 * w2 + b1)
n2 = sigmoid(x1 * w3 + x2 * w4 + b2)
n3 = sigmoid(x1 * w5 + x2 * w6 + b3)
y_hat = sigmoid(n1 * w7 + n2 * w8 + n3 * w9 + b4) return y_hat
预测完值后,我们可以使用均方差(MSE)将其与真实值进行比较。
为什么使用偏见?
偏置的作用是为神经元提供一个不受前几层影响的额外参数,因为它与前几层没有任何联系。
反向传播
起初,我们的网络在预测方面做得很糟糕,因为权重和偏差只是随机数。现在反向传播开始帮助我们训练这些参数。
每次网络做出预测时,我们用 MSE 来与真实值进行比较,然后我们回过头来调整每个权重和偏差,以稍微减少误差。
均方误差(mean square error)
为了理解反向传播,我们应该知道几个要素:
- 导数——改变每个权重和偏差的方向
- 链式法则——如何获取每个重量
- 梯度下降——调整权重和偏差的迭代过程
派生物
感谢导数,我们总是知道我们在哪个方向改变每个参数(使它稍微变大或变小)。假设我们想要调整一个权重 (w = 0.75) ,以便使 MSE 稍微小一点。为了做到这一点,我们应该对这个重量取一个函数的偏导数。然后我们把数字代入导出函数,得到一个数字( 0.05 ),正数或者负数。然后我们从我们的重量中减去这个数字( w -= 0.05 )。调整就是这么做的。这应该发生在网络中的每个权重上。
因为网络最终是非常复杂的函数,很难找到隐藏在无数其他函数中的参数的导数。幸运的是,衍生品有一个链式法则,它简化了我们的这一过程。
链式法则
如果我们需要找到一个函数包含另一个函数的导数,我们使用链式法则。
这条规则说,我们对外部函数求导,保持内部函数不变,然后我们用内部函数的导数乘以所有的东西。
梯度下降
一旦我们知道了所有的导数,我们就可以在每次反向传播时逐渐调整每个权重和偏差。这里需要知道的重要一点是,梯度下降有一个学习率参数,它通常是一个很小的数字,我们将其添加到导数的结果中,以减慢或加快训练。
训练重量 1 的示例
让我们来练习一下如何对 w1 求偏导数。一旦我们理解了它对一种重量的工作原理,对其他重量的实现就很容易了,因为在大多数情况下,这几乎是完全相同的过程。
反向传播
现在,对 w1 求偏导数,我们应该从 MSE 函数开始。它是包含网络中所有其他函数的根函数。
举重训练
众所周知,MSE 是真实值和预测值的平方差 (y-ŷ) 。如果我们展开整个网络,看看 w1 在里面的位置,它看起来像这样:
神经网络的 Matryoshka
我们现在应该记住,网络是一个包含其他函数的函数,为了调整该函数中的每个参数,我们需要使用链式法则:
链式规则表示
剩下的就是对每个函数求导。对于 w1 它有四个导数,但是对于 w8 它只有三个,因为它位于 ŷ 并且我们不需要去那么深的地方。
关于 x1 的导数
最后,我们得到了这个看起来可怕的方程,它解释了 w1 如何影响 MSE。让我们详细说明每一步发生了什么。
首先,我们对 MSE (y-ŷ)求导,也就是 2(y-ŷ,因为 x 的导数是 2x,同样的规则也适用于这里。我们没有像链式法则要求的那样,接触平方函数内部的内容。
然后我们对(y-ŷ)对ŷ求偏导数,得到(0-sigmoid’(…))。记住ŷ是一个 sigmoid 函数。因为它是通向重量 w1 的主要路径。接下来,我们取另一个 sigmoid 函数关于 n1 的偏导数,最后是 x1*w1 的最后一个导数,也就是 x1 ,因为 w1 的导数是 1,系数 x1 保持不变。然后我们乘以每个导数,我们就可以开始了。
综上所述,我们得到:
权重 1 的反向传播
其中学习率是一个小数字,通常范围从 0.01 到 0.05,但也可以更大。同样的逻辑,我们适用于寻找所有其他的重量和偏见。
你可以想象,如果我们有数百个神经元,我们将有数千个权重和偏差,因此为了说明的目的,我们将神经元的数量保持得非常少。其余代码请看 GitHub 。
在真实数据上测试网络
我们的网络在根据两个参数预测房价方面做得非常好:收入中位数和平均房间数。数据取自 sklearn 图书馆的“california_housing”数据集。该网络收敛相当快,仅超过 6 个历元,结果 MSE = 0.028,与我从 Keras analog 得到的结果完全相同。
学习过程
结论
我们的网络非常适合教育目的,但它有局限性:我们不能改变隐藏层中神经元的数量,也不能向网络中添加另一层。我们只有一个激活函数,我们的网络只能解决简单的任务,如线性回归。如果我们想用它来解决分类问题,我们需要找到交叉熵或 Softmax 损失函数的导数。所有这些变化都可以在当前的设置中完成。
如果你有任何问题或难以理解的地方,请在评论中告诉我。
感谢您的阅读。
如何在 60 分钟内从源代码构建 Spark 并将其部署到 Kubernetes 集群
通过这篇 Spark 教程,登上 Kubernetes 的大数据宣传列车
天作之合?来源: Spark Logo , k8s Logo , Emoji
动机/前奏
在我的上一篇文章中,我解释了 Hadoop 生态系统的大致情况,你可以在这里阅读。那篇文章最重要的是结尾,我将公然抄袭我的另一篇文章,因为它也是这篇文章的开头:
现在,如果你在过去几年中一直在收听 Hadoop 的生态系统,你会看到市场上最大的两家公司——cloud era 和 Hortonworks — 在大约一年前Hadoop 大数据市场放缓时合并了。事实上,人们似乎对 Kubernetes 比对更老的 Hadoop 特定技术更感兴趣,如用于资源管理和编排的 YARN,对 PyTorch 等 DL 框架的快速采用,以及对老化的 Hadoop 堆栈的完美风暴的形成。尽管如此,像 Apache Spark 这样的项目仍在稳步前进,例如引入 Kubernetes 作为纱线的替代品。生态系统激动人心的时刻!
简介
本文的目标是向您展示 2020 年大数据生态系统中的一些酷孩子在做什么;它试图把东西塞进 Kubernetes(这是一件好事!).更具体地说,使用 Spark 的本地 Spark 驱动程序和执行器的实验性实现,其中 Kubernetes 是资源管理器(而不是 YARN)
…让我们在 60 分钟内完成这项工作:
- 从 GitHub 克隆 Spark 项目
- 用 Maven 构建火花分布
- 在本地构建 Docker 映像
- 使用多个执行器副本运行 Spark Pi 作业
- 使用端口转发在浏览器中显示 Spark UI,并检查 Spark 作业
如果这么简单,我们为什么需要这篇文章?!请继续阅读,看看我第一次是如何花了天才弄明白的。
免责声明:您在 60 分钟内的里程数可能会有所不同,但在假设您通常知道如何在计算机上完成工作(包括设置本地 k8s 集群和运行 bash 脚本等)的情况下,这确实是可行的。此外,如果你有一台运行缓慢的计算机,构建 Spark 可能需要一段时间;)
既然大家都在船上,让我们在 Kubernetes 上部署 Spark。为此,您可以使用您的笔记本电脑运行的 mill minikube 设置,而不是在公共云中租用一台服务器来进行此练习。除非你想全押,在这种情况下,你刚刚被敬礼。
步骤 1–3(克隆回购、构建 Spark、构建 Docker 映像):
这实际上是乐趣的开始——在“最简单”的步骤上。好吧,系上安全带,看看这个(双关语):
如果你在这里克隆了官方的 Spark 库,在 k8s 这里天真的按照官方的 Spark 运行指南运行 Spark,你就会碰到我前几天在 Spark 的吉拉积压里开的这一期。
也就是说,在 docker 文件中有多个错误的引用,因此简单地运行 docker 文件注释中描述的 docker 构建命令是行不通的。
更新:好吧,事实证明,你实际上可以运行文档中描述的东西,但前提是你必须非常注意。
而不是逃跑
./build/mvn -Pkubernetes -DskipTests clean package
你需要跑
dev/make-distribution.sh -Pkubernetes
这创造了一个火花发行版而不仅仅是普通的组装零件,但我想我跳过了他们教程中的细则,所以我相应地更新了这篇文章。
TL;灾难恢复要完成步骤 1-3,只需执行以下操作:
git clone [git@github.com](mailto:git@github.com):apache/spark.gitcd sparkdev/make-distribution.sh -Pkubernetescd distdocker build -t spark:latest -f kubernetes/dockerfiles/spark/Dockerfile .
此时,您应该在本地 Docker 注册表中有一个 Spark 的图像!
步骤 4:在 Kubernetes 中使用多个执行器副本运行 Spark Pi 作业:
我在上面链接的 Spark 文章中提到但没有解释清楚的事实是,由于 Kubernetes 的 RBAC(基于角色的访问控制),您不能简单地将 Spark 部署到您的集群中,因为 Spark 需要对您的 Kubernetes 集群拥有一些额外的权限来管理 pods。这是由于 Spark 的架构——您部署一个 Spark 驱动程序,然后它可以在 pod 中创建 Spark 执行器,然后在工作完成后清理它们:
Spark 在 Kubernetes 上的架构来自他们的文档
TL;dr 我们需要为 Spark 创建一个 kubectl 服务帐户:
kubectl create serviceaccount sparkkubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
接下来是使用我们本地构建的 Docker 映像运行 Spark Pi:
bin/spark-submit \
--master k8s://https://kubernetes.docker.internal:6443 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=2 \
--conf spark.kubernetes.container.image=spark:latest \
--conf spark.kubernetes.container.image.pullPolicy=Never \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
local:///opt/spark/examples/jars/spark-examples_2.12-3.1.0-SNAPSHOT.jar 10000000
好吧,但是这里实际发生的事情。这就是如何将 Spark 驱动程序部署到 Kubernetes 集群中的方法!让我们来看看这些参数,这样你就可以自己动手了:
- 定义 Kubernetes 集群(使用 kubectl cluster-info 查找)。是的,需要有点怪异的 k8s://前缀。
- 定义部署模式(集群,duh)
- 定义 Spark Driver 的名称(这也是您的 pod 名称的开头)
- 定义火花 Pi 示例
- 在 Kubernetes 上运行 Spark Executor,其中有 2 个副本将由 Spark 驱动程序生成
- 使用我们的本地火花:最新图像
- 将 Kubernetes 映像提取策略定义为 Never,这样就可以使用具有该名称的本地映像。如果你不太熟悉 k8s 的内部工作原理,这肯定需要一分钟才能弄明白…
- 定义服务客户(还记得 RBAC 吗?)
- 指向带有参数 10000000 的本地 jar 路径(它与 other 文件中的所有其他示例一起被复制到指定的路径中)(如果您不知道这个数字的用途,请查看 Spark Pi 源代码和文档)。是的,local:///是正确的,而且不是错别字。
kubectl get pods
现在应该会返回一个正在运行的 pod 列表!不要担心它们最终被终止——这是这个实现的默认设置。
第五步:使用端口转发显示 Spark UI
kubectl port-forward <insert spark driver pod name> 4040:4040
然后,您应该能够在浏览器中通过上面的第一个命令使用 localhost:4040 访问 Spark UI,如下所示:
这是我的 localhost:4040 带端口转发的截图
您也可以像这样查看您的日志:
kubectl -n=default logs -f <insert spark driver pod name>
结论
如果您非常了解 Spark 和 Kubernetes,那么使用配置文件和 docker 文件进行这种精确的设置可能会非常简单,如果您不了解,那么这可能会是一场噩梦。我希望这将有助于你在几分钟内做到这一点!
你从这里去哪里?任何你想去的地方。本文的目标是让您快速使用一个新的 Spark 资源管理器。我建议你下一步用其他 Spark 应用程序来试验这个设置——我可能会在将来写一篇关于一些更复杂的例子的文章(如果我应该的话,请告诉我)。
和 Kubernetes 玩得开心!
替代品
这是 2020 年 4 月 20 日的更新,您也可以使用 Google 的原生 Kubernetes 操作器,它似乎很有前途,可以将手动部署步骤删除到您的集群中:
[## Google cloud platform/spark-on-k8s-运营商
这不是官方支持的谷歌产品。如果您目前正在使用 v1beta1 版本的 API,请…
github.com](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator)
它目前正被 Salesforce 和微软等公司用于生产,并且正在被优步和 Lyft 用于生产评估。未来要注意的事情!
如何在预算范围内构建终极数据科学电脑
让您的硬件更上一层楼
照片由来自 Pexels 的 Josh Sorenson 拍摄
当开始进入数据科学领域时,您最终会发现您需要升级您的硬件。
你应该如何通过 Chromebook 运行数百万个数据点来训练你的深度学习模型?
你不能。你可以。但这可能需要几天,几周,甚至几个月。
这不是你生活的方式:等待你的过程完成。立即升级您的硬件!
然而,我必须警告你:如果你不负责,这些强大的计算机器可以很快在你的口袋里烧一个洞。
你很幸运,我已经对此负责,并活着讲述了这个故事!
经过大量的研究和购买,我组装了一台我认为是在数据科学领域起步的完美计算机。
目标
在预算有限(约 1000 美元)的情况下,为数据科学家打造完美的计算机。
我的零件
GPU:GTX 1660s(245 美元)
选择显卡可能是最艰难的决定。这是拥有有效的数据科学机器的最重要的部分之一。
我最终选择了更高层次的显卡,因为我不想受到这个组件的任何限制。
我用的是英伟达 GTX 1660。根据我的研究,我确定 1660 超级是一个相当不错的交易 245 美元。
通过获得“超级”版本,它提供了可比的性能到下一个水平(GTX 1660 Ti)。感觉我用这个得到了最大的回报,到目前为止,它没有让我失望。
一些关键规格:流处理器:1408
- 提升时钟速度:1.83MHz
- TDP:125 瓦
- 内存:6GB
CPU: AMD 锐龙 7 2700X,带幽灵棱镜 LED 冷却器(130 美元)
我想要一个强大的处理器。
但是对于我的用途来说,我不需要过分的东西。没有超频是必要的(至少在我职业生涯的这个阶段);虽然,可以超频到 4.4GHz。
我选择了 AMD 处理器,而不是英特尔。为什么?似乎我可以用更低的价格获得类似的处理能力。此外,我什么时候才能有机会再次使用英特尔处理器以外的产品?
我很高兴看到我是否注意到了我的电脑上的 AMD 和我使用的其他电脑上的 Intel 之间的差异。到目前为止,我还没有。
此外,我在微中心以非常合理的价格(230 美元)获得了 CPU 和主板的捆绑包。同样的 CPU 单独在亚马逊上是 190 美元(写这篇文章的时候)。
一些关键规格:
- 内核/线程数:8/16
- 速度:3.2GHz — 4.1GHz(turbo)
- TDP: 65W
- 包括 HSF 股票:是
主板:微星 B450 游戏专业版(100 美元)
这个主板是处理器捆绑包的一部分,所以在了解到它与 AMD 处理器和我正在查看的所有其他部分兼容后,这似乎是一个显而易见的事情。此外,它有 WiFi 功能,这是我的必需品。
微星作为一个值得信赖的品牌也享有良好的声誉。这很有帮助。
一些关键规格:
- 芯片组:AMD B450
- 尺寸:ATX
- 内存:4 个插槽,DDR4
- PCIe: x16,PCIe 3.0
- 端口:M.2(通过 PCIe)、USB 3.1、SATA 6Gb/秒
内存:技能 16GB DDR 4 3200(60 美元)
我读到 8 GB 应该足够了,但是 RAM 太便宜了,没有额外的内存看起来很傻。善待自己。
固态硬盘:IPSG 512GB 高级版(60 美元)
选择硬盘还是固态硬盘的决定最终并不困难。Micro Center 正在销售他们的一款 512GB 固态硬盘,读取速度比同类机型快 10 倍左右。所以这是一笔很好的交易。
512GB 的存储量并不算大,但如果我需要更多,我可以以相当便宜的价格购买。
一些关键规格:
- 容量:512GB
- 读取速度:3,100 MBps
- 写入速度:1,900 MBps
电源:IPSG 650 w Semi ATX(85 美元)
IPSG 是微中心品牌。一个名牌的类似瓦数的电源单元要接近 130 美元。购买廉价品牌所牺牲的唯一东西就是效率。更贵型号的效率等级应该是 80 白金(这是 80 金)。
也许从长远来看,我最终会通过电费来偿还差额?我们会看到的。
一些关键规格:
- 650 瓦
- 冷却风扇:135 毫米风扇
- 效率等级:80 金
案例:Corsair 275 r air flow(85 美元)
这个案例更多的是关于整体外观,而不是规格。一旦你找到一个有足够数量的风扇,足够的空间,合理的电缆管理,这归结为个人喜好。
我花了 85 美元,但我可以很容易地看到自己花了更多,因为一些案件实在是太酷了。
不管怎样,我对我选择的案例很满意。我喜欢钢化玻璃,这样我可以看到里面。
一些关键规格:
- 端口:两个 USB 3.0 端口、3.5 毫米耳机/麦克风、电源/复位
- 存储空间:可容纳两块 3.5 英寸硬盘和四块 2.5 英寸固态硬盘
- 风扇:3 个包括 120 毫米风扇
操作系统:Windows 10(97 美元)
我喜欢 Windows 10,所以这不是一个很大的决定。我在微中心得到了一个好价格,因为我在亚马逊上做了价格匹配。
鼠标+键盘:惠普 C2500 有线(17 美元)
我选择了我能找到的最便宜的可信品牌(惠普)的鼠标+键盘。他们完成了工作,我喜欢两者的感觉。
显示器:两台宏碁 sb 220 q(~180 美元)
我已经有这些监视器了。只有两台相当便宜的 23 英寸显示器。
让我的显卡输出到两个显示器不是一件容易的事情,因为我总是买错显示器电缆。我终于让它与 HDMI 到 HDMI 和 DVI 到 DVI 一起工作。
专业提示:
我在这一过程中学到的一些东西可能对第一次使用 PC 的人有用。
我建议用他们商店里的东西和亚马逊上的东西做一个价格对比。通过这样做,我在 Windows 10 上节省了大约 25 美元,但如果我对所有部件都这样做,可能会节省大约 60 美元。
组装电脑时,确保你有足够的空间,并有一个漂亮、开放的工作空间。很容易丢失碎片。此外,我建议良好的照明,因为当你把那些细小的电缆插到你的主板上时,你需要所有你能得到的帮助。
打开你案子的所有房间。我差一点就能在亚马逊上买到新螺丝了,因为我没有这么做。制造商喜欢让你在寻宝游戏中找到所有的碎片。
当你在努力组装电脑时,请务必阅读手册。我一直试图寻找在线指南或视频,但手册最终是最有帮助的(我知道我很千禧一代)。
为每个硬件组件安装驱动程序。我发现,要充分利用这些软件,你必须安装各自的驱动程序。我会在下面解释,因为这是我不知道的事情。
什么是司机?一个设备驱动是一个允许你的硬件与你的操作系统通信的软件。这就是我们如何确保从我们的显卡、主板或任何硬件发送到 Windows 10 的信息是正确的。
每当您遇到硬件问题时,您首先应该检查控制面板中的设备管理器,以确保您不仅有设备驱动程序,而且它是最新的。
没有合适的设备驱动程序对于 PC 构建新手来说无疑是不明显的。我在双显示器上显示时遇到了问题,但当我安装了 NVIDIA 驱动程序后,它就工作了。
我的主板也是这样。我的 WiFi 连接非常不稳定,我知道这不是威瑞森的错,因为我所有的其他设备都连接得很好。有一次我下载了 Intel Wireless-AC 9260 驱动程序,嘣。成功了。
有用的资源
我找到了很多很棒的资源来帮助我完成这个项目。我将它们列举如下:
https://www.logicalincrements.com/——帮我弄清楚该选择什么零件。一开始可能会让人不知所措,因为太多了。这个网站可以帮助你根据你想花多少钱和你想让你的机器有多强大来缩小你想要的零件的范围。你在这个网站上找到的价格为你应该花多少钱提供了一个很好的基准。
https://pcpartpicker.com/——我看了几个其他人的版本,看看他们是如何选择角色的。大部分是为了游戏,我不是很喜欢,但仍然有助于确保组件之间的兼容性。
https://www.microcenter.com/——这是我去买作品的地方。我在黑色星期五大减价的时候去了,所以我买到了一些好东西。我只打算最初买我的 CPU 和主板那天,但最终买了一整套。微中心的员工知识渊博,乐于助人,我觉得他们引领我走上了正确的道路(他们的大多数建议与我之前所做的研究一致)。
https://www.youtube.com/watch?v=IhX0fOUYd8Q——这是我在组装电脑时跟随的视频。这家伙知道自己在做什么,对我这个不知道自己在做什么的人来说,这就足够了。
如果你读这篇文章是因为你想为你的电脑设计获得一些灵感,我祝你好运!如果您有任何问题、意见或担忧,请留下您的评论。
如何建立对人工智能解决方案的信任
来源: Adobe 股票
心理学家对人工智能中建立信任的观点,以及公司需要了解哪些机制来满足其客户和用户的需求。
我采访了玛丽莎·斯乔普,她是一名组织心理学家,从人文角度进行人工智能研究,重点关注心理和伦理问题。她还是位于苏黎士的科技和网络安全公司 scip AG 的企业研究员。她是驻瑞士大使。
请用两到三句话描述你是谁。
目前,我专注于对人工智能、自主武器系统和我们的 AIQ 项目的信任,这是一种测量数字助理(对话式人工智能)技能的心理测量方法,如 Siri 或 Alexa。
所以,很明显,我是一名研究人员,但我也是两个蹒跚学步的孩子的母亲,一个妻子,一个女儿,一个姐姐,一个排球运动员,希望是一个有趣的朋友,一个活动家,一个理想主义者,一个合作者,一个半职业的夏尔巴人(我喜欢在瑞士阿尔卑斯山徒步旅行,因此必须背着我的孩子!).
让我们从更好地理解信任开始。信任是什么,为什么它很重要,尤其是在人工智能的背景下?
在人工智能的背景下,有一个关键的潜在假设:“没有信任,就没有使用”。由于人工智能有很大的前景(也有危险),科技公司和人工智能爱好者特别关注如何建立对人工智能的信任,以促进采用或使用。
信任似乎是一种持久的、神秘的竞争优势。
没有信任,就没有家庭、房屋、市场、宗教、政治和火箭科学。
根据信托研究员雷切尔·博茨曼的说法,
信任是一种社会粘合剂,使人类能够通过相互之间以及与包括技术在内的环境的互动而进步。
信任可以被视为一种应对不确定性的心理机制,位于已知和未知之间。
图片:瑞秋·博茨曼
信任在我们的个性中根深蒂固。我们基本上生来就有信任或不信任人(或动物或任何其他事物)的倾向。
以一个女人的随机照片为例:你信任她吗?请在下面评分。
来源:聂难多斯
我们人类有独特的能力在一瞬间判断出我们是否信任这个人。我们看面部表情、身体姿势或环境(背景、周围环境等)。).我们在分秒之间将其与记忆或过去的经历进行比较,比如“她让我想起了我的祖母。”
总的来说,我们知道的是,我们更倾向于相信那些和我们更相似的人。一个原因是,我们更容易预测相似人的未来行为或反应,这降低了我们受到伤害的情感风险。
我们不知道的是,我们的直觉有多准确。你相信上面这个女人吗?也许是的,因为她在微笑,放松。也许不是,因为你已经在这里期待某种诡计,因为我是一个心理学家。
这个女人不太值得信任。她几年前死于狱中,是最著名的女性连环杀手之一。
**在人工智能的背景下,如果你问我们能否信任人工智能作为一种技术的问题,**那么与其他技术相比,理解人工智能(例如机器学习,比如图像分类)经常不完全按照预期的方式行事,犯错误,或者表现得不道德是决定性的。比如当黑人被归类为大猩猩或者鸟类被归类为导弹的时候。
过程和结果很难解释,有时根本不知道,因此,不太好预测。信任这项技术会带来更高的风险。
到目前为止,研究已经就建立信任需要回答的三个主要支柱达成一致,
**1。)性能:**表现好吗?安全吗?建的对吗?
**2。)流程:**它是否按照我们预期的方式执行?我们能预测结果吗?
**3。)目的:**我对程序和提供者的意图有好感吗?它是否符合道德标准?值得信赖吗?
人们常说,人工智能积极地改变了从医学到城市规划的几乎每个领域,但非常重要的是,它也带来了令人质疑甚至危险的影响。从数据平台的超精确黑客攻击到监控状态和没有机会获得公众同意的隐私损失。因此,除了缺乏可预测性和可解释性等技术问题之外,负面结果的概念、炒作、复杂性以及定义和应用中的分歧都会导致怀疑和不信任。
非专家和企业主等应该如何。走近这个话题?
人工智能已经成为我们日常生活的一部分,它已经越来越多地用于教育、警察、司法、招聘或卫生等决策。
我也没有技术背景,我是一名心理学家,所以我从不同的角度看问题,对我来说,可能更容易与大多数人产生共鸣,他们不知道如何编码或什么是算法。
最让我着迷并推动我研究的是一个问题,信任首先是如何建立的。你并不真正了解这个人或这个产品,它的价值或能力。第一次瞥见说“好的,我要去”。
这种信任最初是如何发展的,仍然有点神秘。
我们怎样才能最好地应对它?我认为这一切都与教育、沟通和批判性思维有关。但有一些东西限制了这些技能或我们参与人工智能讨论的意愿。
从心理学角度来看,这是一个大问题:我们缺乏选择的认知自由。我担心的是,我们正走向与人工智能的生死攸关的关系。摆脱人工智能几乎是不可能的,就像我们无法摆脱气候变化一样。
事实上,我们被迫或受到威胁,就像威胁性的终结者图像或不断输给机器新闻的人,会导致抵抗、否认、愤世嫉俗和淡化。这叫逆反,一种心理现象。当反抗发生时——我们选择这些行为——即使它们是完全不理性的——简单地恢复我们选择的认知自由,夺回我们的控制感。
这可能是一个很大的挑战,尤其是在消费者心理方面当你的目标是说服客户购买你的产品时,无论是汽车还是机器人吸尘器。
像所有人一样,消费者想要选择的自由,我们需要找到方法,让人们想要自己探索人工智能,而不是因为他们被迫这样做。
这就是为什么管理层经常在公司内部采用自下而上的方法,而不是自上而下的决策。
通过这种参与式的决策方式,你的目标是让所有人都参与进来,分享你的愿景和目标。
目前,关键问题之一是改变我们谈论人工智能的方式。我认为我们必须大幅改变关于人工智能的对话基调。我们必须远离炒作、威胁和恐惧,走向清晰的事实、愿景和原因,以创造我们自己与人工智能的关系,从而达到新的信任水平。
这也是我作为人工智能中的女性网络大使的愿景,这是一个致力于性别包容的人工智能,造福全球社会的非营利组织。
假设一家公司正在开发一款基于机器学习的产品,并且刚刚开始原型制作。从建立信任的角度来看,你有什么建议?
我从一个哲学家那里学到的是总是问为什么,从开始到结束,在项目的所有里程碑持续不断。
预期的后果是什么,并推测所有可能的意外后果?
从设计的角度来看,这一切都是为了让你的设计至少符合最低的道德标准,以确保你正在建造一个值得信赖的产品。但是,请记住,技术性能(质量)、安全性和安全性都是不可或缺的先决条件。
回到最初,在头脑中不断记住三大支柱流程、绩效、目的。人工智能中的伦理是关于完整性和真实性的。
最终,任务是建造一个伟大的、安全的、道德上正确的产品。焦点自然是首先建立一个好的产品,然后才是安全和道德的东西。
首先关注技术需求是很自然的,然而与直觉相反的是,应该首先关注后者。两年前,当我们开始我们的信任研究时,我们的想法是有一个质量证明,向用户或客户表明这是一个值得信赖的产品。这就是为什么我们发明了 AIQ,一种心理测量方法来陈述、比较和跟踪数字助理的技能。然而,我们有点太快了,因为市场仍处于发展阶段,而不是真正改善现有的对话式人工智能。我们一开始也关注技术技能,而不是如何建立和发展信任的实际决定性软因素。
来源:瑞士认知
这里有一集播客更详细地讨论了这个话题。
现在,我们后退一步,专注于在人工智能背景下影响信任建立的不太明显的因素。这些是微观感知水平上的良好影响因素,从个性特征到偏见,到过去的经历,到社会化和教养。我们只是在收集数据,通过关联、定性和定量的方法来探索人工智能中信任的这些前因。
来源:玛丽莎·特肖普
产品上市后有没有可能改变 AI 的形象或者影响消费者行为?
如果你想探索你的信任形象,你需要从各种角度看问题和定义:你可能想看个人(像你的目标群体或员工的特征),你可以从消费者的角度看建立、维持和发展信任的过程,以及破坏和重新获得信任。你必须清楚演员和角色(谁是可信的?)和情况:是像自动驾驶汽车这样的高风险情况,还是我们谈论的人工智能驱动的客服聊天机器人?
最后,答案是肯定的,然而,在两个方向上,无论是好是坏。当我们谈论人工智能时,我们必须非常敏感,中立,或者像汉斯·罗斯林所说的“实事求是”。关于做什么来维持一段关系或如何行动的研究非常清楚,如果你打破了信任关系,我不确定人工智能是否与其他技术有任何不同。违规就是违规,不管是脸书的数据违规还是导弹失误。
如果发生了信任违约,你必须立即、直接、清楚地沟通发生了什么,不要辩解地解释自己,要真实可信,并询问需要什么来获得另一次机会。
你会为企业主或产品经理推荐哪些书籍和其他资源来学习人工智能中的信任建设?
我建议检查一下欧洲高级人工智能专家组。他们刚刚发布了一个构建可信人工智能的框架。该框架有三个主要部分,包括合法人工智能、道德人工智能和健壮人工智能。报告讨论了后两者的要点。
另一套全面的众包标准来自于 IEEE 自主智能系统伦理全球倡议,它被称为伦理一致设计。
雷切尔·博茨曼:你能相信谁?她写了在数字时代信任是如何建立、失去和恢复的,她也有几个被强烈推荐的 TED 演讲。
这次采访是由来自 Omdena 的迈克尔·布哈特完成的,Omdena 是一个创新平台,人工智能工程师和领域专家在这里合作构建现实世界问题的解决方案。
如何像构建产品一样构建您的数据平台
从(标准开发。)零到真正的数据英雄
图片由 Unsplash 上的 Austin Distel 提供。
在过去的几年里,许多公司已经将数据平台作为大规模聚合、处理和利用数据的有效方式。尽管数据平台越来越受欢迎,但是,关于如何成功构建数据平台的文献却很少。
巴尔摩西 、CEO&蒙特卡洛 和 阿图尔古普特 、前 优步数据平台团队产品经理 分享设计数据平台的建议,最大化数据对您组织的价值和影响
你的公司喜欢数据。很多。你的老板要求今年增加人手,以加强你的数据工程团队(Presto 和 Kafka 和 Hadoop,哦,我的天!).你的数据副总裁经常潜伏在你公司的 Eng-Team Slack 频道,以了解人们对迁移到雪花的“感受”。你的 CEO 甚至想成为数据驱动型,不管这意味着什么。说数据是贵公司的重中之重是一种保守的说法。
为了满足贵公司对数据贪得无厌的胃口,您甚至可能正在构建一个复杂的多层数据生态系统:换句话说, 一个数据平台 。
数据平台的核心是所有数据的中央存储库,处理数据的收集、清理、转换和应用,以生成业务洞察。对于大多数组织来说,构建数据平台不再是一件美好的事情,而是一件必要的事情,许多企业从竞争中脱颖而出,因为他们能够从数据中收集可操作的见解,无论是改善客户体验、增加收入,还是定义自己的品牌。
就像许多人将数据本身视为产品一样,像优步、 LinkedIn 和脸书这样的数据优先公司也越来越多地将数据平台视为“产品”,拥有专门的工程、产品和运营团队。然而,尽管数据平台无处不在且广受欢迎,但在谁在使用它们、如何使用它们以及工程师和产品经理如何优化这些体验方面,数据平台往往缺乏远见。
无论您是刚刚起步还是正在扩展,我们都将分享五个最佳实践来避免这些常见的陷阱,并构建您梦想中的数据平台:
使你的产品目标与业务目标一致
将您的平台目标与您业务的总体数据目标保持一致非常重要。图片由 Unsplash 上的John Schnobirch提供。
几十年来,数据平台被视为达到目的的手段,而不是“目的”,也就是你正在构建的核心产品。事实上,尽管数据平台为许多服务提供了动力,为驱动我们生活的应用提供了丰富的见解,但直到最近,它们才得到真正应有的尊重和关注。
当您构建或扩展您的数据平台时,您应该问的第一个问题是:数据如何映射到您公司的目标?
要回答这个问题,你得戴上你的数据平台产品经理的帽子。与具体的产品经理不同,数据平台产品经理必须了解全局与特定区域的目标,因为数据会满足其他所有职能团队的需求,从营销和招聘到业务开发和销售。
例如,如果你的业务目标是增加收入(要么做大,要么回家!),数据是如何帮助你实现这些目标的?为了这个实验,考虑以下问题:
- 哪些服务或产品推动收入增长?
- 这些服务或产品收集哪些数据?
- 在使用这些数据之前,我们需要对其做些什么?
- 哪些团队需要这些数据?他们会用它做什么?
- 谁将有权访问这些数据或其生成的分析?
- 这些用户需要以多快的速度访问这些数据?
- 平台需要解决哪些合规性或治理检查(如果有的话)?
通过回答这些问题,您将更好地了解如何确定产品路线图的优先级,以及您需要为谁(通常是工程师)构建,还是为谁(包括分析师在内的日常平台用户)设计。此外,这种 KPI 开发和执行策略的整体方法为您的平台设置了跨团队的更可扩展的影响。
从合适的利益相关者那里获得反馈和认同
不言而喻,在整个产品开发过程中接受预先认可和反复反馈是数据平台之旅的必要组成部分。没有被广泛理解的是你应该关心谁的声音。
是的,你需要你的 CTO 或 VP 对最终产品的数据进行最终确认,但是他们的决定通常是由他们信任的顾问告知的:员工工程师、技术项目经理和其他日常数据从业者。
在为她的公司开发新的数据编目系统时,我们采访的一位产品经理在一家领先的运输公司花了 3 个月试图说服她的工程副总裁接受她的团队的想法,结果却被他的参谋长在一封电子邮件中拒绝了。
根据你公司的 DNA 考虑不同的策略。我们建议同时遵循以下三个步骤:
- 销售愿景的领导力。
- 向你的实际用户推销基本原理和日常使用案例。
- 运用 以客户为中心的方法 ,不管你在和谁说话。将平台定位为在您的数据生态系统中为不同类型的人物角色赋能的一种方式,包括您的数据团队(数据工程师、数据科学家、分析师和研究人员)和数据消费者(项目经理、高管、业务开发和销售人员等)。一个伟大的数据平台将使技术用户能够轻松高效地完成他们的工作,同时也允许技术含量较低的人物角色利用丰富的见解,或者在没有工程师和分析师太多帮助的情况下,根据数据整合可视化。
在为公司构建数据平台时,你必须考虑各种各样的数据角色,包括工程师、数据科学家、产品经理、业务功能用户和总经理。(图片由 Atul Gupte 提供)
在一天结束时,重要的是,这种体验培养了一个数据爱好者社区,他们可以一起构建、共享和学习。既然你的平台有潜力服务于整个公司,每个人都应该对它的成功感到投资,即使这意味着在这个过程中做出一些妥协。
优先考虑长期增长和可持续性,而不是短期收益
考虑到短期可用性的数据解决方案通常更容易实施,但随着时间的推移,最终会比考虑到可持续性的平台更加昂贵。(图片由 Atul Gupte 提供。)
与其他类型的产品不同,数据平台的成功不仅仅是因为它们有利于“率先上市”。由于数据平台几乎完全是内部工具,我们发现最好的数据平台是在考虑可持续性而不是特定功能的情况下构建的。
记住:你的客户就是你的公司,你公司的成功就是你的成功。这并不是说你的路线图不会改变几次(它会),但是当你真的要改变时,要带着成长和成熟的想法去做。
例如,优步的大数据平台历时五年建成,并随着业务需求不断发展;Pinterest 已经经历了几次核心数据分析产品的迭代;领衔群雄的是, LinkedIn 自 2008 年以来一直在构建和迭代其数据平台!
我们的建议是:选择对您的组织环境有意义的解决方案,并根据这些期望和期限调整您的计划。有时,作为更大的产品开发战略的一部分,速赢可以帮助实现内部认同——只要它不是短视的。罗马不是一天建成的,你的数据平台也不是。
签署您的数据的基线指标以及您如何衡量它
如果您不能信任您的数据,那么您的数据平台有多好并不重要,但是数据质量对不同的利益相关者来说意味着不同的事情。因此,如果您和您的利益相关者在这个定义上不一致,您的数据平台就不会成功。
为了解决这个问题,重要的是为您的数据可靠性、设定基准预期,换句话说,就是您的组织在整个数据生命周期中提供高数据可用性和健康的能力。为软件应用程序可靠性设置清晰的服务水平目标(SLO)和服务水平指标(sli)是显而易见的。数据团队应该为他们的数据管道做同样的事情。
这并不是说不同的利益相关者会对“好数据”有相同的看法;事实上,他们可能不会,这没关系。与其将方钉安装到圆孔中,不如创建一个数据可靠性的基线指标,并在构建新的平台功能时,获得最小公分母的认可,这一点很重要。
知道何时构建与购买
您必须做出的第一个决定是,是从头开始构建平台,还是从供应商那里购买技术(或几种支持技术)。
虽然像优步、LinkedIn 和脸书这样的公司已经选择建立自己的数据平台,通常是基于开源解决方案,但这并不总是对你的需求有意义。虽然没有一个神奇的公式可以告诉你是建造还是购买,但我们发现购买是有价值的,直到你确信:
- 该产品需要使用敏感/机密信息(例如,财务或健康记录)运行,出于法规原因,这些信息不能与外部供应商共享
- 需要进行特定的定制,以便与其他内部工具/系统配合使用
- 这些定制足够小,供应商可能不会优先考虑它们
- 与购买相比,构建还有其他一些战略价值(例如,企业的竞争优势或有利于招聘人才)
我们采访的一家医疗保健初创公司的数据工程副总裁指出,如果他 20 多岁,他会想要建立。但是现在,在他快 30 岁的时候,他几乎只买。
“我有热情,”他说,“但是如果我有时间、精力和资源从头开始建立一个数据平台,那我就完了。我现在长大了,也更聪明了——我知道不该不相信专家。”
当谈到你可以把时间(更重要的是金钱)花在什么地方时,购买一个经过实践检验的真正解决方案,并有一个专门的团队来帮助你解决出现的任何问题,通常会更有意义。
下一步是什么?
从产品开发的角度来看,构建数据平台是一个令人兴奋的旅程,它将受益于应用。图片来自。
将您的数据平台构建为一个产品将有助于您确保围绕数据优先级达成更大的共识,实现数据质量和其他关键 KPI 的标准化,促进更大的协作,从而为您的公司带来前所未有的价值。
除了作为有效数据管理、可靠性和民主化的工具,将数据平台构建为产品的好处还包括:
- 指导销售工作(根据潜在客户的反应,让您了解应该将工作重点放在哪里)
- 驾驶应用产品路线图
- 改善客户体验(帮助团队了解您的服务难点是什么,什么有效,什么无效)
- 在整个公司范围内标准化数据治理和合规性措施(GDPR、CCPA 等)。)
乍看之下,构建数据平台似乎势不可挡,但如果方法正确,您的解决方案有可能成为整个组织的力量倍增器。
想了解关于构建可靠数据平台的更多信息?向 巴尔摩西 和蒙特卡洛团队伸出援手。
如何构建您的第一个 Python 包
让全世界都能方便地获得你的优秀代码,因为你也很优秀
在媒体上阅读此文,而不是使用此 好友链接 的媒体会员!
这篇博文现在也有波兰语版本,请在bulldogjob . pl上阅读
大约两年前,我发表了第一篇与数据科学相关的博客。它是关于分类相关性,我真的认为没有人会觉得它有用。这只是实验性的,对我自己来说。1.7K 鼓掌后来,我明白了我不能决定其他人会发现什么是有用的,我很高兴我能在网上帮助其他人,就像其他人在网上帮助我一样。
当时我对 Python 和 Github 还很陌生,所以我也尝试着为我写的这些分类相关性编写代码,并将其发布在 Github 上。我给那段代码起了个名字: Dython ,就像 pYTHON 的数据工具里一样。
但这不是这篇博文的内容——它是关于在我刚刚提到的所有事情之后我做的最后一件实验性的事情:我创建了一个 Python 库并上传到 PyPI——你可能知道它是pip install
。同样,这一切都是从学习练习开始的——但是随着每月大约 1.5K 的安装,我再次意识到我低估了自己对他人有用的代码能力。
但是为什么我要告诉你这一切?因为几乎每个人的笔记本电脑或 Github 账户上都有一些很酷的代码。这段很酷的代码可能对其他人很有帮助——尽管我们大多数人认为这可能不是真的,还有*“其他人能在我的一小段代码中找到什么价值”*。我也是这么想的,结果发现我错了。你也可能是错的,我在这里劝你——并帮助你——只需几个步骤就可以把你漂亮的代码变成一个完整的 Python 包——这样你就可以用一个pip install
节省其他人几个小时的编程时间。成为协助其他程序员的人——让我向你展示如何通过六个步骤来做到这一点。我们开始吧。
在我们开始之前:代码清理和源代码控制
我相信这是不言而喻的,但我还是想确保我们在同一页上。程序员分为两类:一类编写可读代码,另一类使用名为 *x,x1,x2,yx,*等变量。如果你属于第一种,可以直接跳过去。如果你是第二种类型——是时候转换到另一边了。记住其他人会阅读你的代码,所以要确保它是可读的。给事物起一个有意义的名字,把长函数分解成短编码的单一用途的方法,等等。你知道,就像他们教的那些编码课程一样。
另一件事,我假设你正在使用一些源代码控制,可能是 GitHub。虽然这并不是真正必需的,但比建议的要多。如果你以前从未使用过 GitHub,这是一个花几分钟学习如何使用的好机会——查看官方教程,或者这篇博文,然后开始使用。
步骤 1:选择您的 API
把你的代码变成一个包的第一步是决定用户应该如何使用它——并使它可导入。我们将把它分成两个动作:
#1:公共和私有方法
您的代码可能由几个函数和方法组成,但并不是所有的函数和方法都是供用户使用的——有些是内部函数,应该只供您的代码使用。虽然 Python 不支持私有方法,但约定是用下划线前缀def _private_function()
标记私有方法。像这样重命名你所有的内部函数,这样用户会很容易理解什么应该向他们公开,什么不应该。
Pro 提示: 您可以使用特殊变量__all__
来精确定义当用户使用from your_package import *
时,哪些函数需要公开,哪些不需要公开。查看 StackOverflow 上的线程了解更多信息。
#2:添加__init__.py
如果您的代码由几个模块(文件)组成,如下所示:
your_package
|-- module1.py
|-- module2.py
您需要在您的包中添加另一个文件__init__.py
,以便让 Python 将your_package
目录解释为 Python 包。这意味着现在它应该是这样的:
your_package
|-- __init__.py
|-- module1.py
|-- module2.py
您可以将文件留空作为起点,但它必须在那里,以便允许from your_package import module1
。
Pro 提示:__init__.py
中的代码在你的包被导入后被执行,这允许你做各种很酷的事情。例如,你可以使用__init__.py
来缩短你的 API。假设您的代码中最重要的方法imp_func
在module1
中。您可以允许用户将其作为from your_package import imp_func
而不是from your_package.module1 import imp_func
导入,只需添加:
from .module1 import imp_func
到您的__init__.py
文件。
第二步:记录
文档就像排队——我们希望每个人都能简单地做这件事,但是我们倾向于尽可能地放松自己。步骤 2 这里与我们开始部分之前的相关,因为它意味着让其他人理解你的代码做什么。您需要添加两种类型的文档:
#1:文档字符串
库中的每个函数都应该有一个文档字符串,它总结了函数的内容。它应包含:
- 用简单的语言解释这个函数应该做什么
- **参数:**解释什么是函数期望的参数和参数类型
- **返回值:**解释函数返回的内容
- **示例:**虽然不是必须的,但添加一个用法示例总是有用的
这里有一个例子:
你可以在 DataCamp 上的这篇超酷文章中了解更多关于文档字符串格式的信息。
#2:自述文件
自述文件是对软件包内容的总结。当放置在你的包的顶层目录时,GitHub 将它作为你的包的“登陆页”,作为访客看到的第一件东西显示给他们。
一个好的自述文件会有软件包的概述,安装信息(比如需求)和一些快速启动的例子,描述你的软件包的基本用法。
自述文件通常以一种被称为 MarkDown 的格式编写,你可以在这里了解更多关于的内容。这就是它们通常被命名为README.md
的原因。
第三步:许可
当您的代码即将公开时,您应该为它附加一个许可证,向其他人解释他们应该如何使用您的代码。你可能想要使用一个普通的许可证,比如麻省理工学院的 许可证 或者阿帕奇 2.0 的 许可证 。GitHub 会通过点击 License 选项来帮助你选择一个,它会给你的包添加一个名为LICENSE
的新文件。如果坚持不用 GitHub,可以手动添加文件。
第四步:重新整理包装
此时,您的包应该是这样的:
your_package
|-- README.md
|-- LICENSE
|-- __init__.py
|-- module1.py
|-- module2.py
现在,我们将添加一个文件,从您的代码中构建一个可安装的 Python 包。为此,您必须添加一个名为setup.py
的新文件,并按照以下方式重新排列您的文件:
your_package
|-- setup.py
|-- README.md
|-- LICENSE
|-- your_package
|-- __init__.py
|-- module1.py
|-- module2.py
安装文件规定了 Python 安装程序在安装软件包时需要知道的一切。一个非常基本的,你可以简单地复制粘贴,看起来像这样:
除了编辑你的个人信息,还有两件事你必须记录:
- **版本:**每次你发布 PyPI 的新版本(我们马上会讨论),你都必须修改你的版本号
- 安装需要:这是你的包的所有外部依赖的列表。一定要在这里列出所有的东西,这样 Python 会把它们和你的包一起安装
第五步:注册 PyPI
我们快到了!接下来:去pypi.org创建一个账户。你需要它来上传你的新图书馆。
步骤 6:构建和部署!
我们差不多完成了。剩下的工作就是运行一些命令,从您的代码中构建一个可安装的 Python 包,并将其部署到 PyPI。
在开始之前,我们需要安装twine
,这将允许我们部署到 PyPI。这很简单,因为:
pip install twine
接下来,我们将创建一个可安装包。转到setup.py
文件所在的目录,运行:
python setup.py sdist bdist_wheel
这将创建几个新目录,如dist
、build
和your_package.egg-info
。我们现在关心的是dist
,因为它包含了我们想要部署到 PyPI 的安装文件。你会发现里面有两个文件:一个压缩的tar
文件和一个和轮子文件。很快,全世界都可以看到它们。
Pro 提示: 将这些目录添加到您的.gitignore
文件中,防止将安装文件推送到您的 repo 中。(没听说过 .gitignore
? 读此 )
接下来,通过运行以下命令来验证您刚刚创建的分发文件是否正常:
twine check dist/*
是时候把你的包上传到 PyPI 了。我建议首先部署到PyPI测试域,这样您就可以验证一切是否如您所愿。为此,请使用:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
去test.pypi.org看看你的新图书馆。满意吗?太好了,让我们来看看真正的 PyPI:
twine upload dist/*
就是这样。从现在开始,每个人都可以使用pip install
安装你的软件包。干得好!
Pro 提示: 您可以使用 Bash 脚本让您的生活变得更轻松,它将使用一个命令来构建、检查和部署您的包。在与setup.py
相同的目录下创建一个名为build_deploy.sh
的新文件。将以下代码复制粘贴到该文件中:
现在你需要做的就是跑:
./build_deploy.sh
从文件所在的目录,就是这样。您也可以运行:
./build_deploy.sh --test
上传到测试域。(注意,在第一次运行之前,您必须使脚本可执行。只需运行文件所在目录下的 chmod +x build_deploy.sh
。)
额外的一英里:写一篇博客
你的令人敬畏的代码现在可供每个人使用——但是人们仍然不知道你的令人敬畏的代码现在可供他们使用。你怎么能让他们知道?写一篇博文,告诉你为什么首先要编写这段代码,以及它的用例是什么。分享你的故事,这样其他人就会知道你刚刚用你出色的代码为他们节省了多少精力。
最后的话
让你的代码更上一层楼——向全世界发布——在第一次这么做的时候可能看起来很可怕,这既是出于个人原因(“谁会想要使用它?”)和技术原因(“我怎么做得到?”)。我希望在这篇文章中,我帮助你克服了这些挫折,现在你也可以帮助世界上成千上万的其他程序员。干得好,欢迎来到开源社区!
如何用 10 个步骤构建垃圾邮件分类器
如果你刚刚开始机器学习,很有可能你会进行一个分类项目。作为一个初学者,我建立了一个垃圾短信分类器,但做了大量的研究,知道从哪里开始。在本文中,我将用 10 个步骤向您介绍我的项目,让您更容易使用 Tf-IDF 矢量器和朴素贝叶斯模型构建您的第一个垃圾邮件分类器!
1.加载并简化数据集
如果您在 pandas 中阅读,我们的 SMS 文本消息数据集有 5 列:v1(包含每条文本消息的分类标签 ham/spam)、v2(包含文本消息本身)和三个没有使用的未命名列。我们将 v1 和 v2 列分别重命名为 class_label 和 message,同时去掉其余的列。
import pandas as pd
df = pd.read_csv(r'spam.csv',encoding='ISO-8859-1')
df.rename(columns = {'v1':'class_label', 'v2':'message'}, inplace = True)
df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis = 1, inplace = True)df
看看“5572 行 x 2 列”意味着我们的数据集有 5572 条短信!
2.浏览数据集:条形图
在开始处理数据之前,在分类问题中执行一些探索性数据分析(EDA)是一个好主意,以便可视化、从中获取一些信息或找到数据的任何问题。我们将查看我们有多少垃圾邮件,并为其创建一个条形图。
#exploring the datasetdf['class_label'].value_counts()
我们的数据集有 4825 封垃圾邮件和 747 封垃圾邮件。这是一个不平衡的数据集;火腿信息的数量远远高于垃圾信息的数量!这可能会导致我们的模型有偏差。为了解决这个问题,我们可以对我们的数据进行重新采样,以获得相同数量的垃圾邮件。
为了生成条形图,我们使用 Matplotlib 中的 NumPy 和 pyplot。
3.探索数据集:单词云
在我的项目中,我生成了垃圾邮件中最常出现的单词的单词云。
首先,我们将从数据集中过滤掉所有垃圾邮件。df_spam 是一个只包含垃圾消息的数据帧。
df_spam = df[df.class_label=='spam']df_spam
接下来,我们将把数据帧转换成一个列表,列表中的每个元素都是垃圾消息。然后,我们将列表中的每个元素连接成一个大的垃圾邮件字符串。该字符串的小写形式是我们创建单词云所需的格式。
spam_list= df_spam['message'].tolist()filtered_spam = filtered_spam.lower()
最后,我们将导入相关的库,并将我们的字符串作为参数传入:
import os
from wordcloud import WordCloud
from PIL import Imagecomment_mask = np.array(Image.open("comment.png"))
#create and generate a word cloud image
wordcloud = WordCloud(max_font_size = 160, margin=0, mask = comment_mask, background_color = "white", colormap="Reds").generate(filtered_spam)
显示后:
很酷吧。在我们的数据集中,垃圾短信中最常见的词是“免费”、“立即打电话”、“认领”、“中奖”等。
对于这个单词云,我们需要枕头库,只是因为我使用了遮罩来创建漂亮的语音气泡形状。如果您希望它是方形的,请省略 mask 参数。
类似地,对于业余消息:
4.处理不平衡的数据集
要处理不平衡的数据,您有多种选择。我在我的项目中得到了一个相当好的 f 值,即使是未采样的数据,但是如果你想重新采样,请看这个。
5.分割数据集
首先,让我们将类标签从字符串转换成数字形式:
df['class_label'] = df['class_label'].apply(lambda x: 1 if x == 'spam' else 0)
在机器学习中,我们通常将数据分成两个子集——训练和测试。我们将训练集以及它的已知输出值(在本例中,0 或 1 对应于垃圾邮件或火腿)提供给我们的模型,以便它学习我们数据中的模式。然后,我们使用测试集来获得模型在这个子集上的预测标签。让我们看看如何分割我们的数据。
首先,我们从 sklearn 库中导入相关的模块:
from sklearn.model_selection import train_test_split
然后我们分开:
x_train, x_test, y_train, y_test = train_test_split(df['message'], df['class_label'], test_size = 0.3, random_state = 0)
现在,让我们看看我们的测试和训练子集有多少条消息:
print('rows in test set: ' + str(x_test.shape))
print('rows in train set: ' + str(x_train.shape))
所以我们有 1672 条消息用于测试,3900 条消息用于训练!
6.应用 Tf-IDF 矢量器进行特征提取
我们的朴素贝叶斯模型要求数据要么在 Tf-IDF 向量中,要么在单词向量计数中。后者是使用计数矢量器实现的,但我们将通过使用 Tf-IDF 矢量器获得前者。
Tf-IDF 矢量器为短信中的每个单词创建 TF-IDF 值。Tf-IDF 值的计算方式是为出现频率较低的词赋予较高的值,以便由于英语语法而出现多次的词不会掩盖出现频率较低但更有意义和有趣的词。
lst = x_train.tolist()
vectorizer = TfidfVectorizer(
input= lst , # input is the actual text
lowercase=True, # convert to lowercase before tokenizing
stop_words='english' # remove stop words
)features_train_transformed = vectorizer.fit_transform(list) #gives tf idf vector for x_train
features_test_transformed = vectorizer.transform(x_test) #gives tf idf vector for x_test
7.训练我们的朴素贝叶斯模型
我们将我们的朴素贝叶斯模型(也称为多项式)拟合到 x_train 的 Tf-IDF 矢量版本,并将真实输出标签存储在 y_train 中。
from sklearn.naive_bayes import MultinomialNB
# train the model
classifier = MultinomialNB()
classifier.fit(features_train_transformed, y_train)
8.检查精确度和 f 值
是时候传入我们对应于 x_test 的 Tf-IDF 矩阵,以及真实的输出标签(y_test)了,来看看我们的模型做得有多好!
首先,让我们看看模型的准确性:
print("classifier accuracy {:.2f}%".format(classifier.score(features_test_transformed, y_test) * 100))
我们的准确度很高!然而,如果我们的模型变得有偏差,这并不是一个很好的指标。因此,我们执行下一步。
9.查看混淆矩阵和分类报告
现在让我们看看我们的混淆矩阵和 f-measure 分数,以确认我们的模型是否正常:
labels = classifier.predict(features_test_transformed)
from sklearn.metrics import f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_reportactual = y_test.tolist()
predicted = labels
results = confusion_matrix(actual, predicted)
print('Confusion Matrix :')
print(results)
print ('Accuracy Score :',accuracy_score(actual, predicted))
print ('Report : ')
print (classification_report(actual, predicted) )
score_2 = f1_score(actual, predicted, average = 'binary')
print('F-Measure: %.3f' % score_2)
我们的 f 值是 0.853,我们的混淆矩阵显示我们的模型只做了 61 个错误的分类。在我看来相当不错😊
10.我们混淆矩阵的热图(可选)
您可以使用 seaborn 库创建一个热图来可视化您的混淆矩阵。下面的代码就是这么做的。
这就是制作你自己的垃圾邮件分类器!总而言之,我们导入了数据集并对其进行了可视化。然后我们把它分成 train/test,转换成 Tf-IDF 向量。最后,我们训练了我们的朴素贝叶斯模型,并看到了结果!如果你愿意,你可以更进一步,把它部署成一个 web 应用程序。
参考资料/资源:
[1] D. T,混淆矩阵可视化(2019),https://medium . com/@ dtuk 81/混淆-矩阵-可视化-fc31e3f30fea
- C.文斯,朴素贝叶斯垃圾邮件分类器(2018),https://www . code project . com/Articles/1231994/Naive-Bayes-Spam-Classifier
- H.Attri,使用 TF-IDF 算法的特征提取(2019),https://medium . com/@ hritikattri 10/Feature-Extraction-using-TF-IDF-algorithm-44 eedb 37305 e
- A.Bronshtein,Python 中的训练/测试拆分和交叉验证(2017),https://towardsdatascience . com/Train-Test-Split-and-Cross-Validation-in-Python-80 b 61 beca 4 b 6
- 数据集:https://www.kaggle.com/uciml/sms-spam-collection-dataset
- 完整代码:https://github . com/samimakhan/Spam-Classification-Project/tree/master/Naive-Bayes
如何使用 Python 构建地理编码 Web 应用程序
易于遵循的指南和教程代码
格伦·卡斯滕斯-彼得斯在 Unsplash 上的照片
我们经常需要将地址转换为地理位置(纬度和经度),这称为地理编码。您可以使用几个免费地理编码 API(当然有限制)。在本教程中,我将向您展示如何创建免费的地理编码应用程序,您可以拖放带有地址的 CSV 文件,并以 CSV 格式获取(下载)地理编码地址。
我们使用 Geopandas 和 Streamlit 用 Python 构建地理编码应用。可选地,你需要一个像 Visual studio 代码这样的 IDE 来运行应用程序。让我们开始吧。我们首先导入库。
下面这张 GIF 展示了我们将要构建的一瞥。它将允许用户上传文件,并通过选择正确的栏目进行互动。
地理编码应用程序-上传 CSV 文件
简化基础知识
web 应用程序使用 Streamlit。Streamlit 是一个简单易用的纯 Python 的 web 应用构建库。我创建了一个 python 文件(app.py ),我们将使用它来编写代码。
让我们首先导入我们需要的库
import time
import base64import streamlit as stimport pandas as pd
import geopandas as gpdimport geopy
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiterimport plotly_express as px
我们首先创建标题,然后运行应用程序来测试它是否有效。
st.image(“geocoding.jpg”)st.title(“Geocoding Application in Python”)st.markdown(“Uppload a CSV File with address columns (Street name & number, Postcode, City)”)
Streamlit 使用一个定义良好的 API,您可以简单地立即开始使用。看看上面的代码,我打赌你能猜到它是做什么的。在代码的第一行,我们使用st.image()
显示一幅图像。在第二行中,我们还使用st.tittle()
将测试显示为 tittle。最后,我们使用st.markdown()
显示文本。现在,让我们运行应用程序。
运行 Streamlit 就像在终端上写一样简单:
streamlit run app.py
运行应用程序将启动浏览器,如果没有错误,您可以看到应用程序正在运行。图像、标题和文本都在那里(见下图)。我们将继续致力于这个界面。
使用 Streamlit 的地理编码应用程序
上传 CSV 文件
上传文件,我们可以用st.file_upoader()
。我们创建一个函数,允许我们使用st.file_upoader()
与本地数据进行交互。
我们创建主函数,并在其中上传一个 CSV 文件。一旦 CSV 被上传,我们就可以使用 Pandas 来读取数据并显示数据的前几行。我们将在开发应用程序的过程中编辑这个主菜单。你可以在最后一部分——应用程序中找到这个函数的最终代码。
创建或选择地址列
我们需要一个可能格式化的地址列,在这个应用程序中,因此我们设计,以便它可以接受一个格式良好的列和地理编码或从数据中的列创建地址列。下面是一个格式正确的地址示例。它有街道名称和号码,邮政编码,城市和国家。
Karlaplan 13,115 20,STOCKHOLM, Sweden
以下两个功能允许用户选择他们想要的选项,然后在主菜单功能下处理选择。第一个从 DataFrame 列格式化并创建一个地址列。
下面的第二个函数只是选择一个可能格式化的列作为地址列。
地理编码
我们现在可以开始地理编码,下面的功能使用 nomim 地理编码器。该函数返回包含纬度和经度列的地理编码数据框。
一旦我们对数据进行地理编码,我们就可以在地图上显示它。下面这个函数使用 Plotly Express。要将图形传递给 Streamlit,可以使用st.plotly_chart()
。请记住,您可以使用其他库来绘制数据。
下载地理编码 CSV 文件
对数据进行地理编码后,应用程序会再次显示带有纬度和经度的数据框。这将是很好的,也能够下载地理编码的数据。
要下载文件,我们可以编写下面的函数,它允许我们右键单击并用给定的名称保存文件。
该应用程序
将所有代码放在一起,地理编码应用程序代码如下所示。
如果我们愿意,我们可以添加更多的功能,并在此基础上构建其他用例。以下是如何在应用程序中下载地理编码文件的一瞥。
地理编码应用程序-下载地理编码文件
代码也存放在这个 Github 存储库中。
Python 中的地理编码教程。通过在 GitHub 上创建帐户,为 shaka som/地理编码开发做出贡献。
github.com](https://github.com/shakasom/geocoding)
如何构建您的机器学习应用程序
通过 Google App Engine 构建和部署 Dash 应用
这比造一匹马容易多了
今天的机器学习不再是一件新奇或神奇的事情。事实上,所有的在线教程都让它变得和以前一样可行。只需从互联网上抓取大量代码并稍加调试,您的模型就可以运行了。然而,网上几乎没有资源告诉你如何向他人展示你的机器学习进展。无论是为产品原型、你的投资组合,还是向非技术人群解释你的模型的作用,为你的机器学习项目构建一个应用程序总是一个很好的点睛之笔。
什么是机器学习应用?让我给你举几个例子:
- 虚拟个人助理,比如 Siri 和 Alexa 。你的声音被用作输入,他们提取你的话语,并用相应的命令做出回应,通过他们用庞大的数据集训练的模型。
- 垃圾邮件过滤。关于传入电子邮件的基本信息用于确定电子邮件是否可能是垃圾邮件。
- 产品推荐。几天前,你在网上购买了一些运动鞋,突然,你和你室友的社交媒体开始收到运动鞋广告。你的浏览历史一些个人信息被用来为你推荐广告。
仔细想想,机器学习应用就在你身边。我必须承认,将一个应用程序工业化需要大量的时间和精力,但我们可以在云基础上构建我们自己的简单机器学习应用程序,而无需考虑所有的极限情况和负载测试。它可以作为一个完美的个人投资组合,或者用于开发测试。在谷歌云服务的帮助下,我们来构建一个应用吧!
第一部分。建立模型
我们将首先为这个应用程序建立我们的模型。让我们只使用虹膜数据集。我们从 Scikit-learn 加载 Iris 数据集,并在其上构建简单的逻辑回归:
第二部分。在本地构建应用程序
然后我们用破折号在本地构建 app。我们的目的是建立一个 web 界面,您可以在其中输入您为遇到的这种鸢尾花测量的不同值,它将返回基于输入预测的最可能的物种。
我们应用的工作流程
我知道这是一大段代码,但是请耐心听我说。首先,我们初始化应用程序。这里要介绍一下 flask,帮助用Google app Engine部署 App。
这里的第二部分是设置应用布局。代码在不同的部分进行了注释,并说明了它们的用途。如果你没有任何前端经验,阅读起来会有点困难,但一定要相信学习过程。这里我们不做任何计算,只是设置零件及其对应的 id。
这里的第三个部分是一个回调函数,它使得应用程序具有“交互性”。输出和输入是在实际函数之前说明的:我们有一个输出,对应于布局部分的输出区域。我们有五个输入,即 GO 按钮和 4 个花朵测量的数字输入。这里使用状态是为了确保应用程序只有在整个表单完成后才从用户那里获取值,你可以在这里了解更多信息。这里的按钮决定只有在你按下按钮后才开始工作。
现在,如果您将所有这些代码放在一个笔记本或 python 文件中,并在本地运行它,您将获得这样的信息作为输出。
代码的输出
只需点击 URL 或将其粘贴到您的浏览器中,即可访问您构建的应用。请注意,这是 localhost,这意味着其他人无法通过此链接访问它,除非您设置了特殊的防火墙规则。
如果您输入 1 作为值,然后单击 GO 按钮…
第三部分。部署应用程序
我们现在已经有了本地运行的应用程序,但是如果你要和别人分享它,你需要和那个人分享你所有的代码和数据,并让他运行它。仅仅是环境的差异就已经够难调试的了,更不用说如果你把它展示给你根本不会编码的老板。这就是为什么我们需要使用云基础平台来部署它:你只需要配置一次,并通过一个简单的 URL 来共享它,就像这样:https://frankxu.uc.r.appspot.com(你实际上可以点击它并访问这个应用程序)。我们更喜欢谷歌云平台,因为每个用户都有 300 美元/年的免费积分。
在此之前,因为我们需要谷歌云引擎,让我们确保每个人都在同一页面上。你需要设置一个活动的谷歌云项目,然后选择一个项目并启用计费。然后,在你的笔记本电脑上安装和设置Google Cloud SDK 工具,这样你就可以通过几行代码轻松部署你的 app。
首先要做的是新建一个文件夹,在这种情况下,我们姑且称之为 破折号 。在 Dash 下我们希望有三个文件: main.py 包含你所有的源代码, app.yaml 包含云部署设置,以及requirements . txt包含所有需要的包。
创建我们需要的文件的代码示例
在 main.py 中,只需将上面的所有代码按同样的顺序粘贴到其中,或者你也可以在这里访问它。在 app.yaml 中,你会放入这样两行,分别指定你运行的环境和服务器名称。
app.yaml 的内容
在requirements . txt中,简单放入一个你用过的 python 包的列表。
requirements.txt 内容
你可以在这里下载这三个文件。现在我们已经为部署做好了一切准备。
打开你的终端,进入 Dash 目录。根据您是否为此项目创建了应用程序,您可能需要先创建一个应用程序。选择应用程序所需的位置,然后在出现提示时输入 Y 继续,并等待几分钟以部署应用程序。
部署完成后,您可以进入 gcloud app 浏览 或者将网址粘贴到您的浏览器来浏览 app。加载需要几秒钟,但你应该会看到云服务的确切应用程序。该应用程序将一直运行,直到您禁用它(转到应用程序引擎下的设置),并且链接是可共享的,这意味着只要有互联网,您就可以将其发送给任何人使用。将应用程序添加到你的作品集也不错,这肯定比普通的简历或演示文稿更令人印象深刻。
**下一步是什么?**希望本教程结束后,你能够建立自己的机器学习应用程序。玩玩 main.py 就行了,不要改它的初始化和定型部分,有问题多向技术社区学习。整个项目及相关文件可以在 my Github 找到。
如何在 Discord 上构建自己的 AI 聊天机器人?
为初学者创建一个简单的人工智能聊天机器人的最简单方法
参与项目是学习过程中最关键的阶段。在这一步,你必须能够将理论上所学的所有技能和知识运用到现实中。当涉及到人工智能或数据科学时,这变得更加重要。
随着我开始更深入地研究这个领域,我意识到找到应用项目并不是一件困难的事情。我们在很多领域几乎不用人工智能。因此,我们可以发现许多新的和不同的应用与其他领域,如医学,工程,会计等。尽管最困难的事情是知道为了完成这个特定的项目应该遵循什么样的步骤。
在这篇文章中,我将与你分享我在 Discord 上创建和构建自己的 AI 聊天机器人的亲身经历。
我在 Discord 上开发和部署的人工智能模型的例子
对于那些从未听说过 Discord 的人来说,这是一个流行的群聊应用,最初是为了给游戏玩家或极客提供一个建立社区和交谈的地方。关于 Discord 有趣的是它有一个开发者门户,在那里你可以做很多有趣的事情,比如部署你自己的 AI 聊天机器人。因此,您需要从这里注册并加入 Discord 开发者门户。
在我们开始真正的工作之前,我们先来谈谈,首先,我建造我的 AI 聊天机器人的步骤。实际上,这个项目是自然语言处理应用的一部分。NLP 或自然语言处理是一种通过人工智能让机器理解人类语言的技术。找出你需要知道的关于它的一切。
现在,我们准备好了。我们开始吧!
1.选择聊天机器人的功能
你的第一个任务是选择你希望你的聊天机器人提供什么服务。会不会只是一个简单的聊天机器人?能够回答正常问题并自己说话?还是希望它在日常工作中帮到你?或者建议每天吃一些健康的食物。好像很棒!不是吗?这第一步有助于了解您必须收集哪些具体数据。如果你的聊天机器人会回答一般的问题,并且是一个正常的说话者,那么你就不需要给它输入专门的文本数据。
我在这里提到了两个灵感来源:
- 健康膳食聊天机器人:聊天机器人会根据你的营养需求(蛋白质、脂肪和碳水化合物)建议一餐。它必须与任何食物数据库相连接,这样它才能搜索到最适合你需求的食物。
- 提醒聊天机器人:它给你一个关于你的会议和你添加到你的日程中的所有事情的概述。
2.收集或创建文本数据
在这一步中,您可以收集数据平台上可用的文本数据,也可以根据您想要制作的内容创建自己的数据。您可以下载许多开放数据集并根据您的项目进行调整。你可以从这里查看。
如果您想创建自己的数据,最好遵循以下格式,这样您就可以使用我的主代码毫无问题地训练您的模型:
只要遵守格式,您可以添加任意数量的标签。AI 聊天机器人通常会学习所有新句子的模式,并将它们与标签相关联,以获得响应。我们将在下一部分更详细地解释它是如何做到这一点的。
3.构建和训练模型
我们在这个项目中遵循的 NLP 管道如下所示:
当用户写下一个句子并发送给聊天机器人时。该模型遵循 3 个基本步骤。第一步(句子分割)包括将书面文本分成有意义的单元。这些单元是第二步(单词标记化)的输入,其中它们被分成称为“标记”的更小的部分。这些记号对于寻找这种模式非常有用,并且被认为是词干化和词汇化的基础步骤[3]。第三步,词汇化指的是为了分析文本而对文本进行的词汇处理。之后,该模型将预测句子的标签,以便它可以选择适当的响应。
你可以从 这里 查看与这一整部分相关的主要 python 代码。这段代码对于构建和训练模型非常重要。您可以修改它以满足您的项目需求。
4.在不和谐中部署您的模型
一开始,你必须在不和谐开发者门户上注册。完成后,访问Discord 应用页面,点击创建应用。然后写下你的应用程序的名字。
当您点击保存更改时,您现在可以通过点击添加机器人按钮来创建您自己的机器人。之后,您需要通过点击显示令牌来获取和复制您的令牌。
这个令牌在您的 bot 主文件中使用,以便调用它。你需要使用client:run('TOKEN')
,用上面复制的令牌替换TOKEN
。
为了部署您的模型,您必须在主 python 文件的末尾添加以下代码:
不要忘记用您自己的代码来更改“TOKEN”。
一旦你运行了整个 python 代码,你就可以打开你的不和谐,开始和你的 AI 聊天机器人说话。只要你不中断 python 文件的运行,它就会保持在线。
很高兴有机会分享我构建一个简单有效的 AI 聊天机器人的经验。祝你好运!
参考
[1]德文·德尔菲诺,“什么是不和谐?”:关于流行的群聊平台 (2020),商业内幕,技术参考,你需要知道的一切。
[2] Bastien L,Traitement naturel du langage:tout savoir sur Le 自然语言处理 (2019),Le Big Data,杂志 de l’IA。
[3]奎师那,用 NLTK (2019),Guru99,全民教育。
如何使用 Python 构建自己的 AI 个人助理
打造你的 AI 助手指南:
人工智能个人助理是一款理解口头或书面命令并完成客户分配的任务的软件。这是弱人工智能的一个例子,它只能执行用户设计的任务。
想像苹果 Siri、微软 Cortana、谷歌助手一样打造自己的个人 AI 助手?
你可以看看这个博客,通过几个简单的步骤就可以创建一个!
使用 python 编程语言,开发人员最常用的脚本可以用来构建您的个人人工智能助手,以执行用户设计的任务。
图片来源:Freepik
现在,让我们使用 python 为我们的个人语音助手编写一个脚本。
技能:
实现的语音助手可以执行以下任务,它可以打开 YouTube、Gmail、Google chrome 和 stack overflow。预测当前时间,拍摄照片,搜索维基百科以提取所需数据,预测不同城市的天气,从《印度时报》获得头条新闻,还可以回答计算和地理问题。
语音助手的以下查询可以根据用户需要进行操作。
所需软件包:
要构建个人语音助手,需要使用 pip 命令在您的系统中安装以下软件包。
-
语音识别 —语音识别是家庭自动化和人工智能设备中使用的一项重要功能。这个库的主要功能是试图理解人类所说的话,并将语音转换成文本。
-
pyttsx3 — pyttxs3 是 python 中的文本到语音转换库。该软件包支持 Mac os x、Windows 和 Linux 上的文本到语音引擎。
-
维基百科 —维基百科是一个多语言的在线百科全书,许多人都在使用它,他们来自学术界,从大一新生到学生,再到希望获得某个特定主题信息的教授。python 中的这个包从维基百科中提取所需的数据。
-
ecapture —此模块用于从您的相机中捕捉图像
-
日期时间 —这是 python 中的一个内置模块,它处理日期和时间
-
os —该模块是 python 中的标准库,提供与操作系统交互的功能
-
时间 —时间模块帮助我们显示时间
-
Web 浏览器 —这是 python 中的一个内置包。它从网上提取数据
-
子进程 —这是一个标准库,用于处理各种系统命令,如注销或重启你的电脑。
10)Json-Json 模块用于存储和交换数据。
- 请求 -请求模块用于发送所有类型的 HTTP 请求。它接受 URL 作为参数,并提供对给定 URL 的访问。
12)wolfram Alpha—Wolfram Alpha 是一个 API,它可以使用 Wolfram 的算法、知识库和 AI 技术来计算专家级的答案。Wolfram 语言使之成为可能。
实现:
导入以下库
设置语音引擎:
pyttsx3 模块存储在变量名引擎中。
Sapi5 是微软的文本到语音引擎,用于语音识别。
语音 Id 可以设置为 0 或 1,
0 表示男性声音
1 表示女声
现在定义一个函数 speak 将文本转换成语音。speak 函数将文本作为其参数,进一步初始化引擎。
runAndWait: 该函数在处理所有当前排队的命令时阻塞。它适当地调用引擎通知的回调,并在该调用之前排队的所有命令从队列中清空时返回。
启动问候用户的功能:
为人工智能助手定义一个函数 wishMe 来问候用户。
现在()。hour 函数抽象当前时间的小时。
如果小时数大于零小于 12,语音助手会提示您“早上好”。
如果小时数大于 12 小于 18,语音助手会用下面的消息祝您“下午好”。
否则它会发出“晚上好”的信息
为您的人工智能助手设置命令功能:
定义一个函数 takecommand 让人工智能助手理解并接受人类语言。麦克风捕获人类语音,识别器识别语音以给出响应。
异常处理用于处理运行时错误期间的异常,并且 recognize_google 函数使用 google audio 来识别语音。
主要功能:
主函数从这里开始,人类给出的命令存储在变量语句中。
如果在用户给出的语句中有以下触发词,它调用虚拟助理说出以下命令。
技能 1——从维基百科获取数据:
以下命令有助于从维基百科中提取信息。 wikipedia.summary() 函数有两个参数,用户给出的语句和需要从维基百科中提取多少句子存储在变量结果中。
技能 2——访问网络浏览器——谷歌浏览器、电子邮件和 YouTube:
网络浏览器从网络上提取数据。 open_new_tab 函数接受 URL 作为需要访问的参数。
Python 时间休眠函数用于增加程序执行的延迟。我们可以使用这个函数在给定的时间内暂停程序的执行。
技巧三——预测时间:
当前时间从 datetime.now() 函数中提取,该函数显示时、分、秒,并存储在变量名 strTime 中。
技能 4-获取最新消息:
如果用户想知道最新的新闻,语音助手被编程为通过使用网络浏览器功能从《印度时报》获取头条新闻。
技能 5-拍摄照片:
ec.capture() 功能用于从相机中捕捉图像。它接受 3 个参数。
摄像头索引 —第一个连接的摄像头将显示为索引 0,下一个摄像头将显示为索引 1
窗口名 —可以是变量,也可以是字符串。如果您不想看到该窗口,请键入 False
保存名称 —可以给图像命名,如果您不想保存图像,请输入 false
技能 6-从网上搜索数据:
从网络浏览器中,通过将用户语句(命令)传递给 open_new_tab() 函数,您可以搜索所需的数据。
用户 : 嘿 G-One,请搜索蝴蝶的图片
语音助手打开谷歌窗口&从网络上获取蝴蝶图像。
技能 7-设置您的人工智能助手来回答地理和计算问题:
这里我们可以使用名为 Wolfram alpha API 的第三方 API 来回答计算和地理问题。Wolfram 语言使之成为可能。客户端是为 wolfram alpha 创建的实例(类)。 res 变量存储 wolfram alpha 给出的响应。
要访问 wolfram alpha API,需要一个唯一的应用 ID,可通过以下方式生成:
- 登录 wolfram alpha 的官方页面,如果您没有帐户,请创建一个帐户。
作者图片
2.使用您的 wolfram ID 登录
作者图片
3.现在你将看到网站的主页。前往右上角的帐户部分,在那里您可以看到您的电子邮件。在下拉菜单中,选择我的应用程序(API)选项。
作者图片
4.您将看到以下窗口,现在单击获取 APP_ID 按钮
作者图片
5.现在,您将看到以下对话框,给出一个合适的名称和描述,然后单击应用程序 ID 按钮,将生成一个应用程序 ID,这是一个唯一的 ID。使用 App Id use 可以访问 Wolfram alpha API。
作者图片
人类 :嘿 G-One,加州的首府是哪里?
G-One 语音助手: 美国萨克拉门托
技能 8-额外功能:
让你的人工智能助手回答以下问题会很有趣,比如它能做什么,谁创造了它,不是吗?
技能 9-预测天气:
现在,为了让你的人工智能助手检测天气,我们需要从打开的天气图中生成一个 API 键。
开放式天气地图是一项提供天气数据的在线服务。通过在官网生成一个 API ID,你可以使用 APP_ID 让你的语音助手在任何需要的时候检测所有地方的天气。这个天气检测需要导入的必要模块是 json 和 request 模块。
city_name 变量使用 takeCommand() 函数接受人类给出的命令。
请求模块的 get 方法返回一个响应对象。response 对象的 json 方法将 json 格式的数据转换成 python 格式。
变量 X 包含嵌套字典列表,该列表检查“COD”的值是否为 404,即是否找到了城市。
温度和湿度等数值存储在变量 Y 的主键中。
人类: 嘿 G-One,我想获取天气数据
G-One: 城市名是什么?
人类: 喜马偕尔邦
G-One: 开尔文单位的温度为 301.09,百分比湿度为 52,描述为小雨。
技能 10-注销您的电脑:
这里的 subprocess.call() 函数用于处理系统函数,以注销或关闭您的 PC。这将调用你的人工智能助手自动关闭你的电脑。
万岁,我们终于打造了自己的 AI 语音助手。此外,你还可以给你的人工智能语音助手添加更多的功能来执行更多的任务。
作者图片
查看我的 GitHub 个人资料以获取代码:
https://github . com/mmirthula 02/AI-Personal-Voice-assistant-using-Python
编码快乐!!
如何使用深度学习构建自己的聊天机器人
实现智能聊天机器人解决方案的全面分步指南
如果您对开发聊天机器人感兴趣,您会发现有很多强大的机器人开发框架、工具和平台可以用来实现智能聊天机器人解决方案。使用深度学习,而不是使用任何 bot 开发框架或任何其他平台,从零开始开发一个简单、智能的聊天机器人怎么样?在本教程中,您可以了解如何使用深度学习和 Keras 开发端到端的特定领域智能聊天机器人解决方案。
概念
在进入编码部分之前,首先,我们需要理解一些设计概念。由于我们要开发一个基于深度学习的模型,我们需要数据来训练我们的模型。但我们不会收集或下载任何大型数据集,因为这是一个简单的聊天机器人。我们可以创建自己的数据集来训练模型。为了创建这个数据集,我们需要理解我们要训练的意图是什么。“**意图”**是用户与聊天机器人交互的意图,或者聊天机器人从特定用户接收的每条消息背后的意图。根据您正在开发的聊天机器人解决方案的领域,这些意图可能会因聊天机器人解决方案的不同而不同。因此,了解你的聊天机器人与你将要工作的领域相关的正确意图是很重要的。
那为什么它需要定义这些意图呢?这是需要理解的非常重要的一点。为了回答问题、从领域知识库中搜索和执行各种其他任务来继续与用户对话,你的聊天机器人真的需要理解用户说什么或他们打算做什么。这就是为什么你的聊天机器人需要理解用户信息背后的意图(来识别用户的意图)。
如何让你的聊天机器人理解用户的意图,让用户觉得它知道他们想要什么,并提供准确的回答。这里的策略是定义不同的意图,并为这些意图制作训练样本,并使用这些训练样本数据作为模型训练数据(X)和意图作为模型训练类别(Y)来训练您的聊天机器人模型。
履行
必需的包
所需的 python 包如下,(这里我提到了我在开发中使用的包的版本)
定义意图
我将定义几个简单的意图和对应于这些意图的一堆消息,并根据每个意图类别映射一些响应。我将创建一个名为“intents.json”的 JSON 文件,包括如下数据。
数据准备
首先我们需要导入所有需要的包
现在我们加载 json 文件并提取所需的数据。
变量“ training_sentences ”保存所有的训练数据(即每个意图类别中的样本消息),变量“ training_labels ”保存每个训练数据对应的所有目标标签。
然后我们使用 scikit-learn 提供的“ LabelEncoder() ”函数将目标标签转换成模型可理解的形式。
接下来,我们通过使用“记号赋予器”类对我们的文本数据语料库进行矢量化,它允许我们将词汇量限制到某个定义的数字。当我们使用这个类进行文本预处理任务时,默认情况下,所有标点符号都将被删除,将文本转换为空格分隔的单词序列,然后这些序列被拆分为标记列表。然后它们将被索引或矢量化。我们还可以添加“oov_token ”,它是“out of token”的一个值,用于在推理时处理词汇表之外的单词(token)。
使用“ pad_sequences ”方法使所有的训练文本序列大小相同。
模特培训
让我们为提议的模型定义我们的神经网络架构,为此我们使用 Keras 的“顺序”模型类。
我们的模型架构如下所示。
现在我们准备训练我们的模型。简单地说,我们可以用训练数据和标签调用“ fit ”方法。
训练后,最好保存所有需要的文件,以便在推理时使用。以便我们保存训练的模型、拟合的记号赋予器对象和拟合的标签编码器对象。
推理
好吧!!!!现在是时候检查我们的模型表现如何了。😊
我们将实现一个聊天功能,与一个真正的用户互动。当收到新的用户消息时,聊天机器人将计算新文本序列和训练数据之间的相似度。考虑到每个类别的置信度得分,它将用户消息分类到具有最高置信度得分的意图。
你可以看到它的工作非常完美!!!
与聊天应用程序集成
此外,您可以将训练好的聊天机器人模型与任何其他聊天应用程序集成,以便更有效地与现实世界的用户打交道。
我已经使用 flask 开发了一个应用程序,并将这个经过训练的聊天机器人模型与该应用程序集成在一起。
最终的解决方案是这样的,
最后的想法
我们讨论了如何从头开始使用深度学习开发聊天机器人模型,以及我们如何使用它来与真实用户互动。通过这些步骤,任何人都可以实现自己的与任何领域相关的聊天机器人。
作为进一步的改进,您可以尝试不同的任务来增强性能和功能。
- **使用更多数据进行训练:**您可以向训练数据集中添加更多数据。一个包含大量意图的大型数据集可以产生一个强大的聊天机器人解决方案。
- 应用不同的自然语言处理技术:您可以向您的聊天机器人解决方案添加更多的自然语言处理解决方案,如 NER (命名实体识别),以便为您的聊天机器人添加更多的功能。有了 NER 模型和你的聊天机器人,你可以很容易地找到任何出现在用户聊天信息中的实体,并使用它进行进一步的对话。你还可以添加一个情感 分析模型来识别用户信息背后不同的情感基调,它会给你的聊天机器人增添一些色彩。
- **尝试不同的神经网络架构:**你也可以用不同的超参数尝试不同的神经网络架构。
- **添加表情符号:**你也可以在建立你的模型时考虑表情符号。
您可以从 Github 资源库中找到本文的源代码。
希望你喜欢这篇文章,并继续关注另一篇有趣的文章。另外,我很高兴听到你的反馈。
如何为数据科学项目构建自己的数据集
听说过 BYOD:构建自己的数据集吗?
马库斯·斯皮斯克在 Unsplash 上的照片
当我们谈论数据科学时,排在前面的是数据。
当我开始我的数据科学之旅时,它是芝加哥犯罪数据集或葡萄酒质量或沃尔玛销售——我可以得到的常见项目数据集。接下来,当我进行 IBM 数据科学专家认证时,我了解了 API 和对健壮数据集的访问,但这是有代价的!
对于一个初学数据的科学家来说,困境肯定是——学完理论后该做什么?当然,有大量的数据集可用,但免费的数据集很少给你解决实际问题的务实见解,或者有时它们太小,无法用于深度学习应用。
你想从一个项目开始,构建一个模型,运行结果,并积极寻找一个数据集?为什么不构建自己的数据集呢?
不用说,第一个选择是网络抓取。因此,在这个故事中,我将从介绍数据科学项目的数据类型和公认的数据格式开始,接下来,我将说明一种古怪的方式来废弃 Google 的独家数据集(这本身就是一个项目!)
注意:这需要 Python 的工作知识,并理解在 Python 中读写不同的文件格式。
数据科学中的数据类型介绍
作者图片
a.数据
离散数据
离散数据具有不同且独立的值。例如:100 次抛硬币中的人头数。离散数据只有在具有确定值的情况下才会出现。这种类型的数据无法测量,但可以计数。
连续数据
连续数据表示可以测量的数据,具有单位,因此可以参与数学计算。例子:年龄,身高,体重,工资。连续数据可以用实数线上的区间来描述。
区间数据
区间值表示两个区间之间具有相同差值的有序单位。因此,当我们有一个包含有序数值的变量,并且我们知道这些数值之间的确切差异时,我们称之为区间数据。例如:60 度和 50 度之间的差是可测量的 10 度,80 度和 70 度之间的差也是可测量的 10 度。
比率数据
比率值也是具有相同差值的有序单位。比率值与区间值相同,不同之处在于它们有一个绝对零点。很好的例子是身高、体重、长度等。
比率数据可以相加、相减、相乘、相除,具有集中趋势的测量值—平均值、中值、众数、标准偏差和变异系数。
b.分类数据
分类数据代表数据的特征。它可以是任何像一个人的性别,语言,收入≥50K 或<50K etc. Categorical data can also take on numerical values like 1 for female and 0 for male. (Note that those numbers don’t have mathematical meaning).
Nominal Data
Nominal values represent discrete and unordered units and are used to label variables that have no quantitative value. When I say unordered, that means nominal data that has no order. Examples:
- Colors — red, green, yellow, blue, orange
- Seasons — Fall, Winter, Summer, Spring
- Type of bank accounts — Checking, Savings
- States — Illinois, New York, California, Michigan
Therefore, even if you change the order of values for nominal data, the meaning remains unchanged. A type of nominal data that contains only two categories (male and female) is called 二分法
序数数据
序数值表示离散的和有序的单位。因此,除了排序问题之外,它几乎与名义数据相同。示例:
- 字母等级— A、B、C、D、F
- 服装尺寸——XS,小号,中号,大号,大号,XXL
- 排名— 1、2、3
- 教育——小学、高中、学士、硕士
由于有序性,序数数据通常用于处理非数字特征,如快乐、客户满意度等。
数据科学中可以使用的其他数据类型有:
- 图像
- 声音的
- 录像
- 文本
- 时间序列
1.图像
a.自带设备
作者图片
我确信我们每个人都曾是图像的收藏者。小狗,猫,演员,异国旅行目的地。这里什么都能用😄
在一生中,你会没有项目可做。
问题陈述:
- 识别幼犬的品种
- 检测小狗的情绪
从你的硬盘里找出你一生中所有的小狗图片。从 OpenCV、Python 图像库或 matplotlib 库开始读取图像。确保所有的图片都是一种文件格式:jpeg 或 png。一旦读取了图像,您就可以像使用 Googled 数据集构建任何其他模型一样进行操作。分成 70%–30%的训练和测试数据集,使用一些进行验证,您就得到您的数据集了!
想过吗?
b.网页抓取
信不信由你,使用 Python 中的 google-image-downloader 下载一堆图像很容易
pip install googleimagedownloader
接下来,确保你有谷歌浏览器。获取与您正在运行的 Google Chrome 版本相对应的 Chromedriver 版本,并使用以下命令行代码从 Google Chrome 批量下载图像
$ googleimagesdownload -k "puppies" -s medium -l 200 -o dataset/train -i puppies -cd ~/chromedriver
该命令将使用关键字“小狗”从谷歌图片中抓取 200 张图片。它会将这些图像输出到:dataset/train/puppies/
。-cd
参数指向我们之前下载的“chromedriver”可执行文件的位置。
声音好听吗?
2.声音的
泰勒·斯威夫特、阿里吉特·辛格、黑粉红、BTS、J·巴尔文——从全球范围内选择你最喜欢的。
*问题陈述:*从音频文件中识别语言。
要构建自己的音频数据集,请在一个地方收集歌曲(音频文件)。唯一乏味的事情是收集足够多的歌曲来建立一个基于训练数据的模型,验证并测试它。其次,在 Python 中导入 mp3 文件可能是一项任务。
为了方便起见,我建议先把 mp3 文件转换成 WAV。你可以按照文档中关于如何在 Python 中读写 WAV 文件来开始你的工作。wave
模块为 WAV 声音格式提供了一个方便的接口。
获得多样化音频的另一种方法是从 soundcloud 获取文件。互联网上有一些工具可以用来从 Soundcloud 下载 mp3 格式的音频。这无疑是一条漫长的道路,但是一旦你有了音频文件,就按照你在 Python 中对音频文件项目的理想做法去做。
3.录像
猜猜任何数量的游戏日期编辑工作!😛
问题陈述:
- 识别一个人是否戴着口罩
- 确定是否遵循了社交距离衡量标准——人与人之间的距离
- 家庭安全系统——认识这个人吗?
对于视频,数据科学项目主要是面部识别项目,鉴于非常时期,许多类似于上述问题陈述的项目是由来自世界各地的数据科学家构建的。
为了建立一个视频数据集,你的来源可以是你的家庭视频,你戏弄你的兄弟姐妹,基本上是任何有人形和移动的东西。OpenCV 将再次成为你的英雄。OpenCV 提供了一个非常简单的接口来读取、写入和显示视频。
读取视频文件的第一步是创建一个 VideoCapture 对象。接受的视频格式是 mp4 ,我相信它不需要美国格式转换,除非在 iPhones 上拍摄。
接下来,您可以应用面部识别算法来解决问题。
4.文本
接下来是从你的 Fitbit 或 iWatch 获取数据。
在我的一篇博客中,一位读者对这个数据科学项目的想法发表了评论,我在这里写的是如何创建自己的数据集!
如果你使用任何可穿戴设备,这可能会成为一个有趣的数据集——按照一般数据保护法规汇编的公司应该以良好格式的 csv 文件发送你的所有个人数据。接下来你知道的就是分析你自己的数据!
我最近从 Fitbit 下载了两年的健康数据。您可以按照流程从这里导出您的 Fitbit 账户数据。
感谢您的阅读!我希望你喜欢这篇文章。请务必让我知道,在您的数据科学之旅中,您希望在这个夏天构建和处理哪些数据集。
快乐数据 Tenting!
免责声明:本文表达的观点仅代表我个人,不代表严格的观点。
了解你的作者
拉什是芝加哥伊利诺伊大学的研究生。她喜欢将数据可视化,并创造有见地的故事。当她不赶着赶学校的最后期限时,她喜欢喝一杯热巧克力,写一些关于技术、UX 等的东西。
如何建立自己的 YouTube 评论数据集
应用自然语言处理技术理解最新的黑粉色回归
使用 YouTube 数据 API 收集评论
基思·皮茨在 Unsplash 上的照片
这是涵盖文本数据收集、数据预处理和情感分析的系列文章的第一篇。在这篇文章中,我将具体谈谈为什么我想从 Blackpink 的最新音乐视频 中收集评论,你如何喜欢那个 ,,然后向你介绍如何从任何你想要的视频中建立你自己的 YouTube 评论数据集。
如果你想切入正题,立即开始收集评论,你可以按照我的回购脚本:
[## xwillamy/custom _ yt _ comments _ dataset
你应该首先建立一个虚拟环境。您可以通过输入以下内容来创建 Python 3 虚拟环境…
github.com](https://github.com/XWilliamY/custom_yt_comments_dataset)
要不,我们开始吧!
为了这个项目,我对分析 Blackpink 最新音乐视频的 YouTube 评论很感兴趣,该视频于 2020 年 6 月 26 日发布,名为How You Like That。**
黑粉色——“你觉得那辆 M/V 怎么样?”
通过打破 24 小时内观看次数最多的 YouTube 剪辑、24 小时内观看次数最多的 K-Pop act、 和最快达到 2 亿观看次数的视频等记录,Blackpink 向世界展示了它是一个值得重视的团体。然而,在《你喜欢怎样》之前,该组合的最后一张专辑 Kill this Love 于一年多前的 2019 年 4 月 4 日发行。从那时起到 2020 年 6 月 26 日,只剩下一首歌,与 Lady Gaga 合作的一首名为“酸糖”的歌曲。既然 Blackpink 已经为它的粉丝增添了更多关于他们自己的内容,我很想知道 blings(black pink 的官方粉丝名称)是如何回应的。
粉丝们对这四名成员和他们的经纪人 YG 有什么看法?他们对 Blackpink 的最新歌曲和个人成员有什么看法?这些情绪在不同的语言中有所不同吗?
这些指导性问题促使我对他们音乐视频的评论进行情感分析。我选择 YouTube 作为数据源,不仅因为它是一个受欢迎的社交媒体平台,还因为它是第二大搜索引擎,截至 2017 年每月有 30 亿次搜索。这使得它成为娱乐公司推广其艺人新单曲和专辑的宝贵资源。此外,由于每个视频都附有评论部分,这些宣传视频也成为粉丝与艺术家和其他粉丝直接接触的论坛。
除此之外,我还想挑战自己,从头开始构建和清理数据集。我鼓励您也这样做,原因如下:
- 接触网络抓取和使用 API:了解如何收集数据对于扩充现有数据集或创建新数据集来解决您可能对某个主题的疑问和假设非常有用。
- 对数据进行更好的自定义:您可以更好地控制要包含在自定义数据集中的要素,并且可以在分析数据时根据需要进行更改。
- 实践数据清理技术:通常情况下,公开可用的数据集已经被清理和修剪到一定程度。与此同时,由于俚语、缩写、拼写错误、表情符号以及讽刺和挖苦,YouTube 评论和一般社交媒体文本很难处理。清理这些类型的文本将迫使你考虑每种技术的有效性和后果。
对于这个项目,我选择通过 YouTube 的数据 API 查询评论来熟悉 API。下面几节将向您介绍我是如何收集感兴趣的评论的。假设您对 Python 有所了解。我还包含了对 API 和 JSON 的简短介绍。如果您已经熟悉它们,您可以直接跳到数据收集部分。
API 和 JSON 快速入门
什么是 API?
**资料来源:Scopus,【https://blog.scopus.com/file/what-is-an-apijpg **
API 是应用编程接口的缩写。它的作用是将用户的请求发送给服务提供者,然后将服务提供者生成的结果返回给用户。 Geeksforgeeks 使用了在在线网站上搜索酒店房间的例子;API 将用户的请求发送到酒店预订的网站,然后从网站返回最相关的数据给预定的用户。从这个意义上说,API,尤其是那些由大公司生产的 API,为用户提供了获取感兴趣的数据的工具。
JSON 是什么?
例子来自 https://www.shapediver.com/blog/json-objects-explained/shape diver
根据 w3schools,JSON,JavaScript Object Notation 的缩写,是一种存储和传输数据的轻量级格式。JSON 的语法与 Python 中的字典非常相似。JSON 用花括号表示,它的数据存储在用逗号分隔的 key:value 对中。
了解这种数据格式很重要,因为它是 API 响应的最常见格式。例如,YouTube 数据 API 提供的响应是一个 JSON 对象。
数据收集
关于设置 YouTube API 证书的快速教程
1.前往谷歌开发者控制台并创建一个新项目。
单击向下箭头按钮
选择新项目选项(或选择现有项目)
并给它一个名字!
2.一旦你建立了一个新的项目,选择+启用 API 和服务
4.搜索 YouTube 数据 API v3 并点击启用。
5.然后回到凭证。你可以点击汉堡菜单,☰
6.选择+创建凭据,然后选择 API 密钥。
根据开发者文档,我们不需要用户授权来获取关于公共 YouTube 频道的信息,所以我们只需要一个 API 密钥来收集视频评论。
7.最后,安装 Python 的 Google API 客户端。
**pip install --upgrade google-api-python-client**
如果你很好奇,你可以在这里阅读更多关于用 Python 设置 Google APIs 的内容:
** [## Python 快速入门| YouTube 数据 API | Google 开发者
本快速入门指南解释了如何设置一个简单的 Python 命令行应用程序,该应用程序向…
developers.google.com](https://developers.google.com/youtube/v3/quickstart/python)
使用 YouTube 数据 API v3 查询 YouTube 评论
设置好凭据后,我们现在就可以开始收集评论了!我们将首先构建调用 YouTube API 的服务:
现在让我们来看看感兴趣的资源。为了获得 YouTube 上对特定视频的所有评论,我们需要发送一个对 CommentThreads 的请求。Python 中对 commentThread 的请求示例如下所示:
# you only need to build the service once
service = build_service('path/to/apikey.json') response = service.commentThreads().list(
part='snippet',
maxResults=100,
textFormat='plainText',
order='time',
videoId='ioNng23DkIM'
).execute()
在上面列出的参数中,有两个参数是必需的,**part**
、**、**以及**allThreadsRelatedToChannelId**
、**channelId**
、**id**
和**videoId**
中的一个。对于**part**
参数,我们需要传递一个由**id**
、**snippet**
和**replies**
的任意组合组成的逗号分隔列表。**snippet**
关键字将返回关于评论线程和线程的顶级评论的基本细节,而 replies
包含对顶级评论的回复列表。
第二个必需的参数是一个过滤器,我们可以在**allThreadsRelatedToChannelId**
、**channelId**
、**id**
和**videoId**
之间选择。由于我只对 Blackpink 的你喜欢那个的 YouTube 评论感兴趣,所以我选择了按**videoId**
过滤。
一个视频的 ID 可以从它的 YouTube 链接中获得。它们通常看起来像这样:
[https://www.youtube.com/watch?v=ioNng23DkIM](https://www.youtube.com/watch?v=ioNng23DkIM)
在这种情况下,视频 ID 将为 ioNng23DkIM。一般来说,视频 ID 跟在?v= '。
但有时链接可能如下所示,例如当您通过视频上的共享选项获得链接时:
[https://youtu.be/ioNng23DkIM](https://youtu.be/ioNng23DkIM)
在这种情况下,ID 将直接位于“youtu.be”之后。
我们可以用跟随函数的来处理这两种情况(尽管如果你要手动获取 YouTube 视频链接,这是不必要的。如果是这样的话,可以只复制链接的 ID 部分。)
决定感兴趣的项目
对于这个项目,我只对顶级评论、回复和喜欢的数量以及评论者是否也对视频进行了评级(喜欢)感兴趣,所以我只将字符串“snippet”传递给参数部分。
运行上面的代码后,您将得到一个 JSON 响应,其中的看起来像下面的:
{
"kind": "youtube#commentThreadListResponse",
"etag": etag,
"nextPageToken": string,
"pageInfo": {
"totalResults": integer,
"resultsPerPage": integer
},
"items": [
[commentThread Resource](https://developers.google.com/youtube/v3/docs/commentThreads#resource)
]
}
感兴趣的项目是**nextPageToken**
和**items**
。先来说说**items**
。关键字**items**
包含一个**commentThreads**
列表,每个**commentThread**
由后面的组成:
{
"[**kind**](https://developers.google.com/youtube/v3/docs/commentThreads#kind)": "youtube#commentThread",
"[**etag**](https://developers.google.com/youtube/v3/docs/commentThreads#etag)": **etag**,
"[**id**](https://developers.google.com/youtube/v3/docs/commentThreads#id)": **string**,
"[**snippet**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet)": {
"[**channelId**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.channelId)": **string**,
"[**videoId**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.videoId)": **string**,
"[**topLevelComment**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.topLevelComment)": [**comments Resource**](https://developers.google.com/youtube/v3/docs/comments#resource),
"[**canReply**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.canReply)": **boolean**,
"[**totalReplyCount**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.totalReplyCount)": **unsigned integer**,
"[**isPublic**](https://developers.google.com/youtube/v3/docs/commentThreads#snippet.isPublic)": **boolean**
},
"[**replies**](https://developers.google.com/youtube/v3/docs/commentThreads#replies)": {
"[**comments**](https://developers.google.com/youtube/v3/docs/commentThreads#replies.comments[])": [
[**comments Resource**](https://developers.google.com/youtube/v3/docs/comments#resource)
]
}
}
因为我选择只将字符串**snippet**
传递给 part 参数,所以我将只获得上面 JSON 资源的**snippet**
部分。**snippet**
是包含**channelId**
、**videoId**
、**topLevelComment**
、**canReply**
、**totalReplyCount**
和**isPublic**
的键和相应值的字典。
在这些资源中,我选择保存**topLevelComment**
和**totalReplyCount**
的值。然而,我们仍然没有访问到**topLevelComment**
的实际文本内容。我们可以提取文本、顶级评论收到的赞数,以及评论者是否也通过索引到**topLevelComment**
对象中对视频进行了评级。它是一个注释资源,看起来像这样:
{
"[**kind**](https://developers.google.com/youtube/v3/docs/comments#kind)": "youtube#comment",
"[**etag**](https://developers.google.com/youtube/v3/docs/comments#etag)": **etag**,
"[**id**](https://developers.google.com/youtube/v3/docs/comments#id)": **string**,
"[**snippet**](https://developers.google.com/youtube/v3/docs/comments#snippet)": {
"[**authorDisplayName**](https://developers.google.com/youtube/v3/docs/comments#snippet.authorDisplayName)": **string**,
"[**authorProfileImageUrl**](https://developers.google.com/youtube/v3/docs/comments#snippet.authorProfileImageUrl)": **string**,
"[**authorChannelUrl**](https://developers.google.com/youtube/v3/docs/comments#snippet.authorChannelUrl)": **string**,
"[**authorChannelId**](https://developers.google.com/youtube/v3/docs/comments#snippet.authorChannelId)": {
"[**value**](https://developers.google.com/youtube/v3/docs/comments#snippet.authorChannelId.value)": **string**
},
"[**channelId**](https://developers.google.com/youtube/v3/docs/comments#snippet.channelId)": **string**,
"[**videoId**](https://developers.google.com/youtube/v3/docs/comments#snippet.videoId)": **string**,
"[**textDisplay**](https://developers.google.com/youtube/v3/docs/comments#snippet.textDisplay)": **string**,
"[**textOriginal**](https://developers.google.com/youtube/v3/docs/comments#snippet.textOriginal)": **string**,
"[**parentId**](https://developers.google.com/youtube/v3/docs/comments#snippet.parentId)": **string**,
"[**canRate**](https://developers.google.com/youtube/v3/docs/comments#snippet.canRate)": **boolean**,
"[**viewerRating**](https://developers.google.com/youtube/v3/docs/comments#snippet.viewerRating)": **string**,
"[**likeCount**](https://developers.google.com/youtube/v3/docs/comments#snippet.likeCount)": **unsigned integer**,
"[**moderationStatus**](https://developers.google.com/youtube/v3/docs/comments#snippet.moderationStatus)": **string**,
"[**publishedAt**](https://developers.google.com/youtube/v3/docs/comments#snippet.publishedAt)": **datetime**,
"[**updatedAt**](https://developers.google.com/youtube/v3/docs/comments#snippet.updatedAt)": **datetime**
}
}
我们可以对响应进行如下索引:
comment = response['items']['snippet']['topLevelComment']['snippet']['textDisplay']
综上所述,我们可以使用下面的代码片段来获得感兴趣的数据点。
如果您对额外的数据点感兴趣,比如评论更新的时间,您可以这样写:
published_at = item['snippet']['topLevelComment']['snippet']['updatedAt']
对于**commentThreads**
资源来说,另一个有趣的价值是**nextPageToken**
。每当我们提交一个请求,我们就会在**items**
列表中获得**maxResults**
个评论。我们可以获得的最大结果数限制在 1 到 100 之间。因此,如果一个视频有超过 100 条评论,我们将需要多次调用 API。**nextPageToken**
帮助我们直接从下一页开始评论,而不是从头再来。我们只需要稍微修改一下我们的 API 调用:
response = service.commentThreads().list(
part='snippet',
maxResults=100,
textFormat='plainText',
order='time',
videoId='ioNng23DkIM',
pageToken=response['nextPageToken']
).execute()
注意,我们的第一次服务调用不需要**nextPageToken**
。相反,我们使用从当前 JSON 响应中获得的**nextPageToken**
来调用服务对象。
把所有的放在一起
下面的函数将帮助我们从 YouTube 视频中获取评论:
如果你觉得合适,可以随意改变功能!在导入必要的库(#1)之后,我更改了函数的参数,以包含一个额外的变量 csv_filename (#2)。#3、#5 和#6 中概述了保存感兴趣特征的列表、为这些数据点建立索引的代码以及将数据点保存到列表中的代码。然后,我将 JSON 响应中每一项的所需特性逐行保存到 csv 文件(#7)。在我们检查了 JSON 响应中的每一项之后,我们检查是否有 nextPageToken (#8)。如果没有,我们将以字典的形式返回我们感兴趣的数据点(#9)。
后续步骤
为了使这个程序更加模块化,我们还可以做更多的事情。例如,我们可以编写一个函数,接受一个关键字列表并返回一个包含每个给定关键字相关信息的字典,而不是为每个特性编写一个硬编码列表(#2、#5)。我们还可以编写一个字典来映射长的、复杂的索引,比如将published_at
映射到速记。例如:
shorthand = {
'updated_at' : item['snippet']['topLevelComment']['snippet']['updatedAt']
}
这将涉及到第一次的一些工作,以简化以后的事情。幸运的是,这些函数(以及更多)已经在包装器库中可用 youtube-data-api 。
然而,如果你想收集现成的评论,我的 repo 包含如何运行提供的脚本get _ comments _ of _ video _ id . py的说明。
请注意,Google 确实对您可以进行的 API 调用数量设置了每日限额。这个额度定在每天 1 万条左右,变成我一天能收集到的差不多 25 万条评论。为了解决这些限制,我创建了两个 API 键来收集更多的注释。
包扎
在本文中,我们了解了如何使用 YouTube 数据 API (v3)从感兴趣的视频中收集 YouTube 评论。在我的下一篇文章中,我们将遵循经典的 NLP 管道来预处理我们的数据以进行情感分析。
感谢您跟随我踏上数据科学之旅!**
如何从维基百科建立你自己的领域数据集或语料库
维基百科(Python 库)|美汤| MediaWikiAPI | DBpedia | SPARQL
维基百科是 21 世纪最值得信赖和众包的数字信息财富,如果有任何疑问,我们可以参考它来回答问题,了解网络系列的情节,找到电影演员的生物数据,了解更多关于世界伟大领袖或震撼地球的灾难,了解过去和未来。
太戏剧化了,是吧?
维基百科是一个创建丰富数据集或语料库的伟大平台,因为它有自然语言内容以及名为 DBpedia 的语义结构化数据库。
本博客讨论了两种简单、快速和轻量级的方法来管理特定领域的数据集或从维基百科构建 coropra 来训练机器学习模型。
那么,让我们来看看这些丰富的知识如何成为你下一个项目的输入数据。
方法 1:使用维基百科的传统抓取
这是你一定已经熟悉的东西——网络抓取。旁边还有美汤,维基百科现在有自己的刮痧库( pypi 链接)。
下面是一个简单的程序,使用维基百科,python 库,来抓取内容。
import wikipediaresults_list = wikipedia.search("<your_search_term>")wiki_search_results = []for each_result in results_list:
wiki_page_result = {}
wiki_page_obj = wikipedia.page(each_result)
wiki_page_result['title'] = wiki_page_obj.title
wiki_page_result['content'] = wiki_page_obj.content
wiki_page_result['url'] = wiki_page_obj.url
wiki_page_result['links'] = wiki_page_obj.links
wiki_search_results.append(wiki_page_result)
限制:
这种方法的局限性是无论如何都不会刮擦表。
解决方案:
以下是使用 MediaWikiAPI 和 Beautifulsoup 从维基百科页面提取表格的示例代码:
from mediawikiapi import MediaWikiAPI
from bs4 import BeautifulSoupmediawikiapi = MediaWikiAPI()
media_wiki_page = mediawikiapi.page(wiki_page_obj) # scrape the HTML with BeautifulSoup to find tables soup = BeautifulSoup(media_wiki_page.html(), 'html.parser')
tables = soup.findAll("table", {"class": "wikitable"})print(tables[0])
我用维基百科、MediaWikiAPI 和 Beautiful Soup 创建了一个复合代码来抓取维基百科页面。这段代码抓取作为搜索词响应的页面,搜索词基本上是您感兴趣的主题或领域。更深入地说,这段代码还从所有搜索响应页面获取相关链接,并抓取它们的内容。
链接到 GitHub 知识库使用维基百科抓取维基百科内容。
方法 2: DBpedia 和 SPARQL
DBpedia
DBpedia 是通过从维基百科项目中提取实体及其关系创建的,并以 N-Triples 格式存储。换句话说,DBpedia 是一个 RDF 图数据库。这些数据库的特点是它们在存储数据的同时保留了嵌入的语义关系。
比如:“我叫纳芭妮塔,来自印度。我住在爱尔兰。”
N-triples 数据库会将您的这些信息视为:
entity:me relation_type:name "Nabanita"
entity:me relation_type:country "India"
entity:me relation_type:residence "Ireland"
一般来说,这种格式也称为:
**subject** **predicate** **object**
*(about what?)* *(what is the relationship?) * *(the value.)*
SPARQL
SPARQL 是 RDF 数据库查询语言。语法与其他传统的查询语言非常不同,但是目标非常相似,因此可读性很强。
SPARQL 查询的快照
目标: 在维基百科上获取运动员的详细信息,如出生日期、姓名和国家。另外,我希望名字是英文的。此外,国家是一个可选变量,即即使“国家”为空,我也需要运动员的信息。出生日期和姓名是必填项。
结果 SPARQL 查询:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX ling: <http://purl.org/linguistics/gold/> SELECT DISTINCT ?a, ?dob, ?name, ?c
WHERE{
?a a dbo:Athlete;
dbo:birthDate ?dob;
foaf:name ?name.
OPTIONAL{?a dbo:country ?c}
FILTER(LANG(?name) = "en").
}
查询解释:
所有的前缀都是已经存在的标准定义或 RDF 词汇表。把它们当作进口货。在主查询中,我们选择不同的运动员(?a)哪一个是主体;出生日期(?dob),名字(?姓名)和国家(?c)哪些是对象。在“WHERE”中,第一行表示—选择一个类型(用 a 或 rdfs:type 表示)dbo:athlete 的主题。rdfs:type 或 a 和 dbo:athlete 是预定义的词汇表。“;”是用来继续使用选定的主题,即’?一个。此外,我们选择 dbo:birthDate(预定义词汇),值/对象将被检索为“?dob”和 foaf:name 一样?姓名。在“可选”中,我们选择相同主题的国家(?a)使用词汇 dbo:country 作为谓语,但我们说它是可选的。换句话说,即使 dbo:county 没有关联的值,也要检索结果。最后一行“过滤器”,根据变量“过滤语言”?name”并指定它应该是英文的。如果没有指定语言,那么 SPARQL 将检索不同语言的对象。因此,除非需要解决特定的目标,否则我们将会有不需要的重复数据。
输出:
输出看起来有点像这个图像(当限制为 2 时)。您可以在这里尝试执行自己的 SPARQL 查询。使用 SPARQL 的一个很大的优点是可以选择多种响应类型,包括 HTML、JSON 和 csv 文件格式。
如何在 Python 中执行 SPARQL 查询:
Python 有一个包装 SPARQL 服务的包装器,叫做 SPARQLWrapper 。这可用于查询位于https://dbpedia.org/sparql的 SPARQL 端点并检索结果。在本例中,我检索了一个 json 对象,并将其规范化为 pandas 数据帧。
import pandas as pd
from SPARQLWrapper import SPARQLWrapper, JSON
from pandas.io.json import json_normalize# SPARQL query
query = '''PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX ling: <http://purl.org/linguistics/gold/>SELECT DISTINCT ?a, ?dob, ?ht, ?hpn, ?g, ?name, ?c
WHERE{{
?a a dbo:Athlete;
dbo:birthDate ?dob;
foaf:name ?name.
OPTIONAL{{?a dbo:country ?c}}
FILTER(LANG(?name) = "en").
}}'''# initialise the SPARQL endpoint
sparql = SPARQLWrapper('http://dbpedia.org/sparql')# set query
sparql.setQuery(query)# set the response format
sparql.setReturnFormat(JSON)# execute the query
results = sparql.query().convert()# normalize the json object to a pandas dataframe
df_results = json_normalize(results['results']['bindings'])
为了从维基百科中搜集所有运动员的数据,我创建了一个知识库,执行这个示例查询的稍微增强版本。
链接到 GitHub 存储库以使用 SPARQLWrapper 查询 DBpedia。
**总之,**这是我们搜集或查询维基百科内容并进行创作的两种方式
- 丰富且设计精良的数据集
- 训练自然语言处理模型的语料库
- 试用 SPARQL
- 为 DBpedia 项目做贡献
一些有用的资源:
要了解关于 RDF 数据库和链接数据的更多信息:
引言这一系列课程是对 RDF 的介绍,RDF 是语义网的核心数据模型,也是
www.cambridgesemantics.com](https://www.cambridgesemantics.com/blog/semantic-university/learn-rdf/) [## 什么是 RDF?让数据的力量增加两倍
RDF 代表资源描述框架,是 W3C 开发并同意的数据交换标准
www.ontotext.com](https://www.ontotext.com/knowledgehub/fundamentals/what-is-rdf/)