机器学习实验(十三):90%的准确率,根据中文名字预测性别!

Posted 风雪夜归子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习实验(十三):90%的准确率,根据中文名字预测性别!相关的知识,希望对你有一定的参考价值。


声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents



               90%的准确率,根据中文名字预测性别!


一、概述

  性别是人类差异最大的特征之一,不同的性别拥有不同的特征,譬如购物、电视剧、书籍等方面男生和女生的爱好有很大的不同。因此,知道了用户的性别就可以更加准确的判断用户的潜在行为和需求。由此可知,性别识别的重要性和价值性不言而喻,每个机器学习模型的构建,基本都会需要准确识别用户的性别。

  目前业内预测用户性别的方法有很多,大多数都是基于用户的行为数据、兴趣等方面进行性别判定,识别的准确性也参差不齐。但是,很多的时候我们拿不到用户的行为数据,这个时候用用户的行为数据、兴趣数据建立机器学习模型就显得力不从心了。同时,从用户的行为数据着手建立模型去预测用户的性别效果也并不会见得有多好,因为影响模型准确性的主要原因是这些用户的行为在性别上区分度有多大,如果区分度不明显,那模型和算法的准确性将会遇到明显的瓶颈。同时,基于用户行为的性别识别涉及的数据面非常广、数据依赖链条很长、数据计算复杂度很高,识别效能反而成为了痛点!


二、模型建立

  在这里,我们分享一下我们MSO用户性别预测模型:基于用户中文名字的用户性别预测方法!我们仅仅是根据用户的中文名字进行预测,没有用到用户的行为数据,但是实际识别准确率却高达 90% 以上,为什么准确率这么高?主要是因为男生、女生在取名上有很大的差异!下面我们分步骤来讲解下MSO的用户性别识别模型构建过程。

  首先,做一个声明,本文中送列举的名字均是泛指,如果正好与你名字相同,纯属巧合!在详细讲解模型之前,为了规范,我们来一个约定,本文中的姓名指的是包括姓和名字,比如‘谭文’,姓是‘谭’,名字是‘文’。名字不包括姓,例如‘谭文’的名字就是‘文’。首先,我们对用户的名字进行简单的处理,本文我们主要讨论两个字和三个字的姓名,超过三个字的姓名不予考虑。对于两个字的姓名(也就是只有一个名字的姓名)我们认为名字的第一个字是‘ ’,第二个字是名字的本身。为了阐述清楚,就以‘谭文’这个姓名为例,我们会将其处理成‘谭 文’。

  接下里,我们看看用户名字在第一个字和第二个字上面的差异:



In [26]:
def name_count_bygender(rdd):
    rdd = rdd.map(lambda x: (x[0][0], x[0][1], x[1]))

    rdd = pd.DataFrame(rdd.collect(), columns = ['first_name', 'gender', 'num'])

    rdd = rdd.sort(['num'], ascending=False)
    return rdd

first_name_count_bygender = name_count_bygender(first_name_count_bygender)

first_name_count_bygender[first_name_count_bygender.gender=='男'].head(30)


/opt/cloudera/parcels/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:6: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)
Out[26]:
  first_name gender num
3352   170601
1379 33423
2869 12792
4546 10636
183 9411
5270 8954
4476 8861
4683 7605
5681 7508
5741 7399
5471 4857
4593 4733
3995 4580
4939 4315
3133 3612
4323 3580
1744 3317
2340 3157
5612 3089
3932 3082
150 3005
2575 2963
2045 2768
295 2737
3549 2691
3600 2669
1147 2601
3496 2580
4725 2519
2524 2464
In [28]:
first_name_count_bygender[first_name_count_bygender.gender=='女'].head(30)
Out[28]:
  first_name gender num
1871   139268
5896 15388
1929 10341
5131 9235
1756 8348
497 4937
2687 4815
1796 4604
3302 4387
4157 4015
5446 3693
2371 3561
5380 3501
3221 2852
1847 2787
5440 2691
517 2486
5429 2296
3611 2276
1527 2130
2209 2083
852 1904
3092 1864
4209 1843
5205 1786
698 1784
3204 1676
1283 1632
1063 1475
4374 1475
In [29]:
second_name_count_bygender = name_count_bygender(second_name_count_bygender)

second_name_count_bygender[second_name_count_bygender.gender=='男'].head(30)
/opt/cloudera/parcels/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:6: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)
Out[29]:
  first_name gender num
4657 40584
3535 14480
358 14251
6285 12183
678 11729
800 10492
1189 9816
841 8866
4880 7998
5049 7810
4788 7650
1355 7460
2736 6939
1576 6677
435 6608
4366 6425
6558 6361
4903

以上是关于机器学习实验(十三):90%的准确率,根据中文名字预测性别!的主要内容,如果未能解决你的问题,请参考以下文章

深度学习——机器学习策略

8个经过证实的方法:提高机器学习模型的准确率

不再需要传统物理理论,机器学习可直接准确预测行星运动

这9个特征工程的使用技巧,解决90%机器学习问题

2020-05-22 第十三章 支持向量机模型(python)

关于机器学习的基本查询

(c)2006-2024 SYSTEM All Rights Reserved IT常识