机器学习实验(十三):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 |
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 |
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%的准确率,根据中文名字预测性别!的主要内容,如果未能解决你的问题,请参考以下文章 |