数据挖掘之性别训练
Posted 小说推荐与点评
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据挖掘之性别训练相关的知识,希望对你有一定的参考价值。
摘要:业务存在大量数据,需要根据用户行为对用户添加性别年龄标签。本次主要处理性别标签。
一、训练过程:
1. 先爬取qq资料页的号码与性别。根据解析出的 qq号/性别 列表匹配出 user_id/性别 列表,加上一个序列号,保存到一个用户/index/性别的字典中,存在一个文件里。
样例
Y054AOYY78WZWTWDY5QYB62Z9US4RR3W 0 Male
55O6XT2ZYWL7YWYQ5C84X3VF29PXAPND 1 Male
US485633ATU91PWZZ019A7TA55EQQ408 2 Female
X1SU532WBZRVB15SQA0S22XNA303ZZUA 3 Female
XY8R0CV2WZVWM1T75QS1MPUT529Q13V5 4 Male
BU3R1116UUB9ZD1PT7X9YW28S2MB7B21 5 Female
13P6RRW7UWABBV59A40AAW8DA1000697 6 Male
2. 找到所有这些user_id的行为,如近90天,取 user_id,ActionType,ActionIndex这几列,
联合ActionType_ActionIndex为特征key的维度
'user_id/特征key/ gender分类'
0012C25V6YXZ0235N224O18SNYZAFZ82 c_54 Male
001YW18225PWS4USDTP5Y7XRZS9083U6 b_505692 Male
003X90C0BP7P0R844ZET7U2D14A48Z12 b_507712 Female
0088V21YVUUXZ0A9UQ5YSZ2CP10OU475 c_20 Female
00QB15Z011RPX120WX5Z9Z0X3O3X0ZS5 b_515978 Male
00WVYQSYXOC2QXY5100YW9T6AAF042R5 c_36 Male
00WYUT3W706TQXR320XXPDX308R3AW0W c_35 Female
0112C941Q349V3V2T51B2Z0211Z5VQ10 c_7502 Male
01134VB462B3T2Z8WY4VZW295039T2U7 b_64 Male
3. 分析下所有行为标签来筛选特征,目前选择的标准:
1) 该行为标签在所有人中出现的比率大于0.001(至少1000个人中有一个标签)
2) 该行为标签在男女的lift值之差大于一定阈值(现在选的0.3)
lift(行为标签a,男) = 该样本在男性UV中出现的总次数/男性UV的总数
lift (行为标签a,女) = 该样本在女性UV中出现的总次数/女性UV的总数
diff =abs(lift(male) - lift(female)) / min(lift(male/female)) > 0.3
=> 有效行为标签当特征
这样筛选出特征来,保存到一个字典中,用于组织特征矩阵
样例
f_2:564:: 0
4_4031188 1
b_130 2
c_44 3
f_6:501813:: 4
4. 这样根据两个字典和2里的行为数据流,初始化生成一个全0矩阵feature_mat,维度 UV数*特征数
根据行为数据流,每读到一行,改写feature_max[Dict_uv[user_id]][Dict_feature[feature_key]]= 1
目前只把在所有特征中,有大于n条特征的uv当做有效uv进行训练和测试(现在取n> 10)
就组织成了所有样本的特征矩阵
训练数据 X = 特征矩阵
y = X每行对应的user_id对应的性别(同样存在1中的字典里)
5. 训练模型,引用Python机器学习包,sklearn的线性模型 逻辑回归
fromsklearn.linear_model import LogisticRegression
classifier = LogisticRegression(class_weight='balanced')
用该模型来fit X,y矩阵就行,然后交叉验证准确度
metric =cross_val_score(classifier, X, y,cv=5,scoring='accuracy')
目前交叉验证结果:
阈值1,选取行为标签在所有人中出现的比率大于阈值0.001
阈值2,该行为标签在男女的lift值之差大于一定阈值(现在选的0.3) 有721维特征
阈值3,目前只把在所有特征中,有大于n条特征的uv当做有效uv进行训练和测试(目前n>5)
交叉验证准确度为 69~70%的样子。
下面是10-FoldsCross Validation的结果
[0.69747899 0.69467787 0.68814192 0.69187675 0.68160598 0.70028011
0.69719626 0.68878505 0.68381665 0.69597755]
在已经有的样本条件下我试了很多不同的参数和特征组合,差不多这样已经是最优的了。
二、 对以后的样本做分类 与结论。
找到所有需要分类的UV,可以分成n分,分别键uv字典,同理找到所有的行为数据流通过保存的特征字典生成新的特征矩阵,然后离线测试,读本地训练好的逻辑回归模型,计算出分数score。
如果做2分类score >= 0.5归于1类即Male,<0.5归于0类即Female。
或者不直接分类,保存score,以后想要女性人群比如200万,就取Top200万score小的user_id就可以。
每次测试一批新的样本,保存
user_id/ score / gender_class到指定hive表里
之后需要组织一下SQL和把各部分的python脚本放到一起,将符合条件的user_id跑出对应的性别分数,通过分数确定该用户行为偏男性还是女性。
以上是关于数据挖掘之性别训练的主要内容,如果未能解决你的问题,请参考以下文章
Py:数据挖掘之对个人微信朋友圈好友的性别区域昵称签名信息进行情感分析——Jason niu