项目背景
面向C的app应用,用户的行为分析是亘古不变的话题。其中有一个方向是根据用户在app上的行为特征,来预用户的留存。
不同公司之间的产品,用户的行为或许有差别。本次实验案例采用部分用户数据,在T当天的登陆、查看、主动聊天、被动聊天,在T-1~T-3 三天前的 登陆 、查看、聊天,和被动的聊天, 和在T+1当天,系统推送的通知等行为,来预测用户在T+1天,是否会登陆。
数据特征
with open(os.path.join(data_dir,'alldt_hc'),'rb') as reader:
data = pickle.load(reader)
print(data)
print(data.iloc[0])
已经将数据用pickle缓存在本地二进制文件中,可以加速数据读取
数据是pandas的Dataframe

样本数据4647875 rows x 20 columns 。样本数据采取随机抽样用户的460万条样例,中等规模,可以通过本地程序计算。数据量集太大,会影响本地计算效率,数据量级太小,采样可能会不均衡,无法反应真实用户的实际状态。
数据第一列为type,分类两类用户,可以对整体用户研究,也可以对分类用户研究,最后一列为act,目标值act为目标值,1为目标活跃,0为不活跃
中间2-19列,共计18个特征。数据特征做了基本的处理,矩阵为0-1矩阵,处理了异常值,可以直接使用,1为用户在对于当天有触发这个行为,0代表没有触发。
需要针对用户的18个行为,来预测用户act是否活跃。
采用算法
数据特征已经做了基本的处理,可以直接采用算法,先看看效果。这里采用决策树,随即森里,逻辑回归,svm如果跑的数据纬度超过10万,计算复杂度会高,这里不使用。
先导入实验中用到的包
import pandas as pd import numpy as np np.set_printoptions(suppress=True) import os.path, pickle from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge, LogisticRegression,LogisticRegressionCV from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import mean_squared_error,confusion_matrix from sklearn.feature_extraction import DictVectorizer from sklearn.model_selection import GridSearchCV,cross_val_score,train_test_split from sklearn import datasets,tree from sklearn.preprocessing import OneHotEncoder,StandardScaler from sklearn.decomposition import PCA from matplotlib import pyplot as plt import pydotplus
实验测试数据集分离,这里不考虑细分用户类型的影响,将type特征删除
del data['type'] x = data.values[:,:-1] y = data.values[:,-1] x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=1,train_size=0.6)
决策树算法
tree_model = DecisionTreeClassifier(max_depth=8)
tree_model.fit(x_train,y_train)
# 模型保存
with open(os.path.join(data_dir,'tree_model.mx'),'wb') as writer:
pickle.dump(tree_model,writer)
with open(os.path.join(data_dir,'tree_model.mx'),'rb') as reader:
tree_model = pickle.load(reader)
print(tree_model.score(x_test,y_test))
采用决策树模型的scroe评分函数,查看准确率只有0.74285,准确率不高
这里模型的保存,采用pickle进行保存,这样跑一次的算法下次直接调用,可以不再进行训练
准确率不高的原因,在于数据本身的不可分性。相同特征的数据,存在有多种状态,导致分类不能有效区分。也可能反应,这些特征不能有效反应出用户群体的特征,有些特征没有采集到。