基于用户的画像

前言

根据用户历史信息与用户的人口属性标签(包括性别、年龄、学历)通过机器学习、数据挖掘技术建立模型预测用户标签,制定用户的画像,便于前期调研,需求分析,后期营销等,故为用户制定相应的画像是一项非常有意义的工作

导入先关库

import datetime
import pandas as pd
import numpy as np
import pyecharts
import seaborn as sns
import re
import gc
import matplotlib.pyplot as plt
import warnings
import jieba
import lightgbm as lgb
import xgboost as xgb
from pyecharts.charts import WordCloud
from jieba import analyse  # 从 jieba 中导入关键词分析模
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error, roc_auc_score, precision_scorewarnings.filterwarnings('always')
warnings.filterwarnings('ignore')
sns.set(style="darkgrid")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示%matplotlib inline
train_path = "user_tag_query.TRAIN.csv"train = pd.read_csv(train_path)

数据探索

train.sample(2)
Unnamed: 0 age Gender Education QueryList
843 8852 5 1 0 湖水月色空前打一国家\t今天双色球开奖结果\t降魔伏妖\t伏妖降魔能制宜打一肖\t徐霞客属什...
499 99465 2 2 4 u盘\t沉香by红夜\t悲观主义者有哪些表现\t杨洋icon微博\t美术欣赏\t好看的小说推...
pd.plotting.scatter_matrix(train[["age", "Gender", "Education"]], alpha=0.3, figsize=(16, 8), diagonal='kde');

age_list = pd.Series({0: "未知年龄",1: "0-18岁",2: "19-23岁",3: "24-30岁",4: "31-40岁",5: "41-50岁",6: "51+岁"})pie_data = pd.concat([train["age"].value_counts(), age_list], axis=1)pie_list = []
for i in pie_data.iloc[:, 0].get_values():pie_list.append(int(i))from pyecharts import options as opts
from pyecharts.charts import Page, Piedef pie_base() -> Pie:c = (Pie().add("", [list(z) for z in zip(pie_data.iloc[:, 1], pie_list)]).set_global_opts(title_opts=opts.TitleOpts(title="用户年龄段数")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")).render_notebook())return c
pie_base()

数据清洗

train_clean = train.copy()
def stopwordslist(filepath):  stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()] return stopwords  # 对句子进行分词
def seg_sentence(sentence, path):  sentence_seged = jieba.cut(sentence.strip())  stopwords = stopwordslist(path)  # 这里加载停用词的路径  outstr = ''  for word in sentence_seged:  if word not in stopwords:  if word != '\t':  outstr += word  outstr += " "  return outstr  

去除停止词

在文本相关的任务中,大多需要先对样本进行分词、去停用词等预置处理。通过对训练数据进行细致的分析,结合人们进行日常检索的先验知识,发现“空格”、“标点”及很多停用词均有助于判别用户的基本属性。

train_clean["QueryList"] = train_clean["QueryList"].apply(lambda x: seg_sentence(x, "stopword.txt"))
from jieba import analyse
def wordcloud_diamond(words, title) -> WordCloud:c = (WordCloud().add("", words, word_size_range=[20, 100])# .set_global_opts(title_opts=opts.TitleOpts(title=title)).render_notebook())return cdef extract(data):keyWords = jieba.analyse.extract_tags(sentence=data,  # 要分词的任意一篇中文文章topK=100,  # 选取200 个关键词withWeight=True  # 显示每一个分词所占的权重)return keyWords

分词

提取关键信息,过滤掉了文档频率低于5的词,才能达到最好的预测效果

wc = train_clean["QueryList"].apply(lambda x: extract(x)) #分词,提取关键词

个人词云

print("ID 10 的个人画像")
wordcloud_diamond(wc.iloc[10], "用户画像")
ID 10 的个人画像

print("ID 68 的个人画像")
wordcloud_diamond(wc.iloc[68], "用户画像")
ID 68 的个人画像

数据转换和特征处理

def transform(x):a = np.array(x).Tb = pd.DataFrame(data=a, columns=a[0]).drop(0)b.index = [x.index]return ba = wc.apply(lambda x: transform(x))
queryData = pd.DataFrame({})
for i in a:queryData = pd.concat([queryData, i.T], axis=1)
del a
queryData = queryData.T.astype(float)
indexs = queryData.count()[queryData.count() > 5].index #筛选出现频率超过5次的特征
X = queryData[indexs].fillna(0)
del indexs, queryData

开始建模

交叉验证

from sklearn.model_selection import KFold
n_fold = 4
folds = KFold(n_splits=n_fold,shuffle=True)print(folds)
KFold(n_splits=4, random_state=None, shuffle=True)
y1, y2, y3 = train_clean["age"], train_clean["Gender"], train_clean["Education"]
def kf_class(X, y, model):clf_dict = {}for fold_n, (train_index, valid_index) in enumerate(folds.split(X)):print(fold_n)X_train, X_valid = X.iloc[train_index], X.iloc[valid_index]y_train, y_valid = y.iloc[train_index], y.iloc[valid_index]model.fit(X_train, y_train)print('finish train')print('Train accuracy: {}'.format(model.score(X_train, y_train)))print('Test accuracy: {}'.format(model.score(X_valid, y_valid)))clf_dict[fold_n] = modeldel X_train, y_traindel X_valid, y_validgc.collect()return clf_dict

LGB模型

lgb_clf = kf_class(X, y2, lgb.LGBMClassifier())
0
finish train
Train accuracy: 0.7466666666666667
Test accuracy: 0.56
1
finish train
Train accuracy: 0.72
Test accuracy: 0.6
2
finish train
Train accuracy: 0.7333333333333333
Test accuracy: 0.84
3
finish train
Train accuracy: 0.7466666666666667
Test accuracy: 0.6
feature_importance_df = pd.DataFrame([X.columns.values, lgb_clf[0].feature_importances_], index=["Feature", "importance"]).T
feature_importance_df["importance"] = feature_importance_df["importance"].astype(float)

特征筛选

from pyecharts.charts import Bar
from pyecharts import options as opts
cols = feature_importance_df.sort_values(by="importance", ascending=False)[: 15]bar = Bar()
bar.add_xaxis(cols["Feature"].values.tolist())
bar.add_yaxis("top 15 feature", [int(i) for i in cols["importance"].values])bar.set_global_opts(title_opts=opts.TitleOpts(title="特征重要性"))
bar.render_notebook()

筛选强特征后再建模

features = feature_importance_df[feature_importance_df["importance"] > 3]["Feature"].values
rf_clf = kf_class(X[features], y2, RandomForestClassifier(min_samples_leaf=2,min_samples_split=3,n_estimators=25))
0
finish train
Train accuracy: 0.9453333333333334
Test accuracy: 0.692
1
finish train
Train accuracy: 0.9453333333333334
Test accuracy: 0.72
2
finish train
Train accuracy: 0.944
Test accuracy: 0.732
3
finish train
Train accuracy: 0.9413333333333334
Test accuracy: 0.704
time: 2.48 s

最后简易模型训练集准确率在94%+,测试集准确率在70%+

在特征处理上仍有加强空间

总结

  • 用户群主要集中在30岁以下,研究所本科学历
  • 特征处理时,使用了jieba提取关键词,高频词,可在已有数据外训练词典和词向量,加强特征
  • 建模时尝试了多种模型,最终选用了LGB模型来筛选强特征,然在再二次建模,后续可以使用交叉
    验证的4个模型在融合,得到更强的模型,整体流程如下

建立数据挖掘的用户画像相关推荐

  1. 【数据挖掘】用户画像

    概念区分 Persona和Profile,经常都翻译为用户画像,二者的概念有相关的部分,但是也有区别. - Persona,也叫做用户角色,是描绘抽象一个自然人的属性,用于产品和用户调研. - Pro ...

  2. 使用大数据分析建立电力企业用户画像的一种思路

    为什么要建立企业用户画像 电能作为新能源的主要转化对象,在低碳.环保方面较其他化石能源具有先天优势,"煤改电"是低碳与保护生态环境战略的长远趋势.但从短期看,煤改电带来的经济负担较 ...

  3. 榆熙教育:如何建立拼多多用户画像,分析目标群体?

    不少拼多多新人都在抱怨品牌不好做,加入现有品牌资源又难以出圈,营销之路困难重重.眼看着其他拼多多资深商家品牌规划路线成熟,就自乱阵脚.怎么做品牌?做品牌从来就不是一件难事,难的是对品牌路线规划的模糊, ...

  4. 如何建立用户画像和用户体系?

    消费品企业应该如何使用内部产生以及外部采集的数据,像互联网公司一样建立用户画像与会员体系,以数据驱动的方式进行精细化的生产,运营和销售? 传统的管理咨询公司,虽然有无数顶尖的大脑,但是他们的大脑只靠E ...

  5. 手把手教你建立用户画像和用户场景

    作者:晨光文具互联网产品经理 (转载已取得授权) 通常在产品设计过程中会遇到一个问题,你的产品适用于什么样的用户,什么样的场景.简而言之就是什么样的用户在什么场景下使用你的产品.这也是产品经理设计产品 ...

  6. 浅谈所谓的产品「用户画像」

    2015上半年,我国网民已达到6.68亿,年底肯定能够顺利突破7亿,其中使用手机上网人群占整体88.9%.不同于传统PC上网,每个家庭共用一台设备,手机上网存在着独特性.唯一性和私密性的特点,每个人的 ...

  7. 浅谈产品的用户画像:它并不是万能的

    本文有PMCAFF 原创作者 一条产品狗 原创发布于pmcaff.com 2015上半年,我国网民已达到6.68亿,年底肯定能够顺利突破7亿,其中使用手机上网人群占整体88.9%.不同于传统PC上网, ...

  8. 手把手教你搭建用户画像,数据分析效率提升百倍

    人们面对大数据,更多的是将大数据进行汇总.计算,借助数据可视化分析问题.解决问题,这是分析解决问题的一种思维方式和工作方法. 面对大数据这一新业态,政府.企业更关心的是如何让大数据落地,并产生实际的商 ...

  9. 看完后,别再说自己不懂用户画像了

    用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念.现在我们运营谈及用户画像,它也是和精准营销.精细化运营直接钩挂的.这篇文章主要讲产品和运营角度的用户画像. 希望看完后,解决你一切关于用 ...

  10. 终于有人把用户画像的流程、方法讲明白了

    导读:用户标签是个性化推荐.计算广告.金融征信等众多大数据业务应用的基础,它是原始的用户行为数据和大数据应用之间的桥梁,本文会介绍用户标签的构建方法,也就是用户画像技术. 作者:马海平 于俊 吕昕 向 ...

最新文章

  1. php 学习笔记 数组1
  2. c语言中24个字母,菜鸟求助,写一个随机输出26个英文字母的程序
  3. 内存分配_go内存分配管理
  4. 文件菜单服务器属性,服务器属性(“数据库设置”页) - SQL Server | Microsoft Docs...
  5. 获取Web.config配置节
  6. 优秀项目解析:区块链上的房地产交易
  7. 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
  8. Html和Css学习笔记-html进阶-div与span
  9. vue中的静态资源打包
  10. 虚方法和重写方法的继承特性
  11. Chrome浏览器查看Axure原型图文件,提示Axure RP Extension for Chrome
  12. fudannlp java_中文NLP工具
  13. [渝粤教育] 长安大学 液压传动 参考 资料
  14. 我最喜欢的一节计算机课400字,我最喜欢的一堂课作文400字(精选10篇)
  15. linux内核audit,linux audit审计(7)--读懂audit日志
  16. WPM3012-3/TR单P沟道 增强型MOS 场效应晶体管WILLSEM
  17. 天文专业转计算机专业,计算机专业以后可以向天文学方向发展吗
  18. Ardunio开发实例-数字温度传感器
  19. Python50图之01散点图 02气泡图
  20. Go语言——Json处理

热门文章

  1. 到电容三点式振荡器有点郁闷。我纳闷C1与C2两端的瞬时极性为什么是粉红框框圈出的那样?
  2. PAT 甲级 1048 Find Coins
  3. import time python_Python——入门级(import 模块)
  4. Duck Duck Go Architecture
  5. Android Thermal
  6. php模拟用户自动在qq空间发表文章的方法
  7. Lookup Transformation
  8. 让机器辨别气味:利用图神经网络预测分子的嗅觉属性
  9. 大话Ajax,详解~
  10. 实战 逆向最新黄鸟抓包软件