欢迎光临散文网 会员登陆 & 注册

通过姓名预测性别原来这么简单!(附代码教程)

2021-11-17 18:28 作者:深度之眼官方账号  | 我要投稿


说在前面:

性别是可变的,名字是一个较弱的性别预测因子。本文用到的是Quis应用的功能,是Joachim Valente创建的一个联系人应用程序。


Quis是一个联系人应用程序,用于按时间顺序对联系人进行排序并在地图上查看它们,以及其他实验性功能。其中一个功能是按性别过滤联系人,即使这些信息在联系人数据库中是不可用的。


过滤联系人功能是过滤器通过一个轻量级的监督机器学习模型——更准确地说是一个计数向量化器加上逻辑回归——在应用程序中嵌入了来自世界各地的数十万个名字的训练。


本文将分解整个过程,从在 Jupyter notebook 中训练模型到将其部署到生产环境。代码在公众号,回复“姓名”得。

 

带有本文中描述的性别过滤器的联系人应用程序 Quis 的屏幕截图


准备


本教程要用到Python/Jupyter notebooks, Pandas 和Scikit-Learn。如果还没学会这些,关注公众号,免费资料可以领教程的宝贝们!


首先,提出一个问题


世界上有数百万个名字,我们无法将它们全部存储在像智能手机这样资源受限的环境中。


假设100万个名字有10个字符,这将需要1,000,000 x (10+1)个字节≈10 MB平均数。此外,还可能会偶然发现以前从未见过的名字,比如Khaleesi或Anakin,但是你还得去预测他们的性别。


解决方案是训练一个模型,来学习辨别女性和男性名字


机器学习教程


一个有监督的机器学习项目通常包括 5 个步骤。



步骤1:收集训练数据


第一步也是最关键的一步是收集训练数据。


关于姓名和性别,在网上可以免费获得多种数据集,例如这个包含1930年到2015年美国 95,000个名字的数据集:

https://data.world/howarder/gender-by-name


或者这个包含来自182个国家的177,000个名字的数据集:

https://data.world/howarder/gender-by-name


我们将使用第二个数据集,下载名为wgnd_noctry.tab CSV文件的文件。



处理数据


创建一个新的 Jupyter 笔记本。加载数据预览其内容:





预处理


我们的目标是预测给定名称(输入X)的性别(输出或标签y)。此外,我们需要一些预处理来清理原始数据。



拆分训练和测试数据


在有监督的机器学习问题中,我们总是留出一部分数据集(通常在 10% 到 20% 之间)用于测试—它允许我们计算模型的准确性,并验证我们的模型按照预期工作。Scikit-Learn为此提供了方便的功能。



(n,) 表示大小为 n 的向量


步骤 2—生成特征


收集数据后,下一步是构建用作模型输入的特征。在这种情况下,可能会想到许多特征:字母的数量、元音的数量、名称是否以a或者o结尾(对西班牙语或意大利语名称有用)、是否以辅音结尾,等等


但是,我们将自动构建数千个功能,而不是手动设计功能。


How?


使用计数向量器?


计数向量化器是一种自动从语料库构建词汇和特征的方法。更准确地说,a ( p – q )-char 计数向量化器通过收集出现在语料库中p ≤ n ≤ q 的n-gram来生成特征,这是p和q之间大小的子串的另一种说法。


让我们举一个具体的例子。假设我们有五个名字:Chris、Christina、Marius、Marta 和 Matthias。然后,一个 (2-4)-char 计数向量化器将学习以下词汇。


词汇表是在训练示例中找到的二元组、三元组和四元组的集合


使用该词汇表,计数向量化器可以将任何名称(在语料库中或不在语料库中)转换为一个大的稀疏向量v,其中v(i)是i名称中标记出现的次数。例如,名称 Rita 和 Laetitia 将被转换为大小为 55 的向量,如下所示:


“Tina”这个名字包含三个二元组、两个三元组和一个四元组


“Laetitia”这个名字包含两次双字母“ti”。它包括我们词汇表中没有的其他 n-gram,如“lae”


整个过程可以使用Scikit-Learn分3行完成。



你会注意到几个参数:


min_df 是语料库中某个标记出现在词汇表中的最少次数。(例如,khal如果它以 Khaleesi 的名字只出现一次,我们将丢弃)。min_df有助于过度拟合并减少我们的词汇表和模型的大小。


ngram_range 令牌中的最小和最大字符数。


analyzer='char' 意味着我们使用字符级标记化而不是字级标记。


preprocessor 是在构建词汇表之前应用于每个名称的函数。在这里,我们添加了前导^和尾随$,这是表示开始和结束的常见做法。这很重要,因为例如,a姓名末尾的字母a与中间的字母大不相同。


让我们来探索学习到的词汇。提示:Sckit-Learn估计器在调用.fit()后学到的参数总是以下划线作为后缀。





第3步:模型架构


多亏了计数向量化器,我们现在可以将训练集中的15万个名字转换成8414个数字特征。


我们需要训练一个模型来将这8414个数字转换为一个预测,该预测表示一个名字是女性(p = 0)或男性(p = 1)的可能性。


有许多架构可供选择:逻辑回归、决策树、神经网络、SVM 等等。


但是,因为我们将在第4步中序列化模型并将其嵌入到应用程序中,所以我们希望它尽可能轻量级,所以我们使用逻辑回归。


逻辑回归模型的形式为f(x1,…Xn = sigmoid(k1*x1 + k2*x2 +…+ kn*xn + b),其中sigmoid(x) = 1 / (1 + exp(-x)),它总是在0和1之间,可以解释为概率。


该模型通过一种称为随机梯度下降(SGD)的迭代过程,逐步减小其对提供给它的训练示例的预测误差,从而学习其参数k1, k2,…,kn(称为权重)和b(称为偏差)。


逻辑回归模型将向量(例如,计数向量化器的输出)映射到概率



为了避免两步过程——首先训练计数向量化器,然后训练逻辑回归——我们可以使用 Scikit-Learn管道。管道将连续步骤包装到单个模型中,因此只需调用.fit()一次。



现在可以预测性别了!






它似乎做得不错。你可以注意到,对于用拉丁字符(Ma和Yang)转录的中文名字来说,这并不是很有效,不过算是意料之中的。


我们计算原始概率来获得信心。下面的例子表明,Françoise勉强正确,但非常自信吉娜是一个女性的名字。




Optional. 我们可以进一步探索,看看模型认为哪些n-gram是典型的男性化和女性化。


我们可以识别-nice,一个表示胜利的女性后缀,后缀-a可能是世界上最常见的女性后缀,以及前缀Nya-在斯瓦希里语名称中很常见。


我们可以承认ABD-其前缀很多男性阿拉伯名字,日本后缀-ICH和-io和-lino这是在意大利和西班牙的男性常见的后缀。


最后,我们可以评估模型在测试集上的准确程度;换句话说,它预测正确性别的频率。




87%的准确率——对于我们的第一次尝试来说还不错,但肯定可以改进。



第4步-部署


许多书籍和在线教程都没有涵盖这一步,但这是至关重要的一步。一旦你在Jupyter notebook中训练了一个模型,你如何在生产中使用它?


最简单的方法是使用joblib(对 Python 的改进pickle)序列化您的模型:



但是,它有两个明显的缺点:如果您的notebook和prod中的Scikit-Learn版本不同,它可能会中断,并且它假定您的生产环境使用Python。


已经开发了更精细的解决方案,如ONNX(https://onnx.ai/),但因为我们有目的地保持模型简单,我们将做一些不同的事情:手动序列化它。我们需要保存参数——模型学到的东西,比如词汇和逻辑回归权重和偏差——并编写我们自己的计数向量化器和逻辑回归版本。




当然,在实践中,会将此代码转换为编写服务器的语言。


这样的模型需要多少空间?



与存储详尽列表相比,这减少100倍的空间,非常适合嵌入到智能手机应用程序中。


步骤5—监控和迭代


将模型部署到生产环境后,应对其进行监控以衡量其实际性能。不幸的是,我们的模型并不完美,需要迭代才能变得更好。这里有一些问题和改进的想法。


通过使用模型架构,毫无疑问可以提高 87% 的准确率。例如,我们可以尝试用另一种类型的分类器替换逻辑回归,或者使用计数向量化器超参数。(如果这样做,请记住使用验证集。)


有些名字在一些国家是阳性的,而在另一些国家是阴性的(比如Alexis或Andrea,在美国通常是阴性的,而在法国和意大利则分别是男性)。您可以将国家作为特征添加到模型中。或者,您可以为每个国家训练一个模型。


词汇量可能仍然太大,这对模型大小来说是一个问题,并且会引入过拟合。一种解决方案是添加正则化,例如通过增加min_df或减少ngram_range。


当前数据集包含数十万个名称,无论它们的受欢迎程度如何,它们都被一视同仁。然而,实际上,常见名称的错误比不常见名称的错误更严重,因为它们会影响更多用户。可能的解决方法包括从训练集中删除最不常见的名称并使用名称流行度作为样本权重。


有些名字喜欢Alex和Leslie被两性普遍使用。我们可以为男女通用或非性别名称引入第三个标签类。



参考文档:

[0] Raffo, Julio; Lax-Martinez, Gema, 2018, “WGND 1.0”,

https://doi.org/10.7910/DVN/YPRQH8, Harvard Dataverse, V1,

UNF:6:bUIQ2Bd/6h9Bup1ZI2PnwA== [fileUNF]


文章来源:

https://pub.towardsai.net/predicting-name-gender-from-notebook-to-production-99e51d2aabd7


免责声明:所载内容来源互联网,仅供参考(如有错漏欢迎指正)。转载稿件版权归原作者和机构所有,如有侵权,请联系我们删除。

通过姓名预测性别原来这么简单!(附代码教程)的评论 (共 条)

分享到微博请遵守国家法律