判断是否为羊毛党

  • 合并用户表和现金表,过滤掉没有钱包事件的用户
    • 合并总表
    • 取出有用的列
    • 修正时间格式
    • 将表分开成羊毛党用户(invalid)的行为和非羊毛用户(valid)的行为
  • 数据探索
    • 同parentID下的用户操作时间对比
    • 同parentID下的子用户数
    • 不同用户的操作间隔
    • 不同用户的钱包金额
  • 构造模型需要的特征
    • 特征1,'amount' 用户钱包操作的最大金额
    • 特征2,'coinType' 是否是silver
    • 特征3,'isPayOneForLevelTwo' 是否为1
    • 特征4,'sisters' ,同parentId下的用户数
    • 特征5,'sametime_' 用户交易行为7天内,同个parentID下的交易用户数
    • 将特征2与3整合成为一个'isPayOneForLevelTwo_or_coinType'
    • 特征6,'max_time'
    • 选取特征
    • 样本均衡 下采样
    • 建模
    • XGB
  • 保存模型
  • 预测数据

合并用户表和现金表,过滤掉没有钱包事件的用户

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
cash = pd.read_csv('cash.csv')
cash.head()

user = pd.read_csv('user.csv',encoding='gbk')
user.head()

合并总表

df = pd.merge(cash,user,left_on='userId',right_on='_id',how='inner')

取出有用的列

data = df[['userId', 'accountType', 'coinType','showType', 'changeType', 'amount', 'reasonType','createdAt_x','createdAt_y', 'phone',  'parentId','role', 'isPayOneForLevelTwo','isQuitBusinessMan',  'accessStatus', 'status', 'phoneAccessStatus', 'levelName', 'teamPower']]

修正时间格式

data['createdAt_x']=pd.to_datetime(data['createdAt_x'])

将表分开成羊毛党用户(invalid)的行为和非羊毛用户(valid)的行为

invalid = data[data['status']=='inValid']
valid = data[data['status']=='valid']
user.status.value_counts()"""
valid      73686
inValid    23903
Name: status, dtype: int64
"""

数据探索

同parentID下的用户操作时间对比

time_diff = (invalid.groupby('parentId')['createdAt_x'].max()-invalid.groupby('parentId')['createdAt_x'].min()).dt.days
time_diff2 = (valid.groupby('parentId')['createdAt_x'].max()-valid.groupby('parentId')['createdAt_x'].min()).dt.days

羊毛党用户,同个parentID 的账号操作时间范围。
同parentID的羊毛党多个用户的操作时间,80%都在7天内

time_diff.describe(percentiles=[0.75,0.8,0.95,0.99])


非羊毛党用户80%都在6天以上

time_diff2.describe(percentiles=[0.2,0.75,0.8,0.95,0.99])

同parentID下的子用户数

非羊毛用户,同parentID 下的用户数50%在2以内

user[user['status']=='valid'].groupby('parentId')['status'].count().describe([0.25,0.5,0.8,0.9])


羊毛用户均值37,中位数4,说明整体分布右偏,50%都在4以上

user[user['status']=='inValid'].groupby('parentId')['status'].count().describe([0.25,0.5,0.8,0.9])

不同用户的操作间隔

80%羊毛用户操作间隔在2天内

(invalid.groupby('userId')['createdAt_x'].max()-invalid.groupby('userId')['createdAt_x'].min()).dt.days.describe()


70非羊毛用户操作间隔大于2天

(valid.groupby('userId')['createdAt_x'].max()-valid.groupby('userId')['createdAt_x'].min()).dt.days.describe([0.2,0.3,0.4,0.5,0.8,0.9])

不同用户的钱包金额

非羊毛

valid.amount.describe(percentiles=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])


羊毛

invalid.amount.describe(percentiles=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])


结论:
羊毛与非羊毛用户的钱包操作金额,少数非羊毛用户的钱包操作金额有高金额,
其他并无明显差距

构造模型需要的特征

clean = data[['userId','parentId','amount','coinType', 'createdAt_x','isPayOneForLevelTwo','status']]
max_time = pd.DataFrame(clean.groupby('userId')['createdAt_x'].max())

特征1,‘amount’ 用户钱包操作的最大金额

max_amount = pd.DataFrame(clean.groupby('userId')['amount'].max())
max_amount

max_time['amount']=max_amount['amount']

特征2,‘coinType’ 是否是silver

silver用户一定为非羊毛用户

clean['coinType']=(clean['coinType']=='silver')*1
coin = pd.DataFrame(clean.groupby('userId')['coinType'].max())
max_time['coinType'] =coin['coinType']
max_time

特征3,‘isPayOneForLevelTwo’ 是否为1

user_ = user[['_id','parentId','isPayOneForLevelTwo','status']]
user_

特征4,‘sisters’ ,同parentId下的用户数

Child_id = pd.DataFrame(user.groupby('parentId',as_index=False)['_id'].count(),columns=['parentId','_id'])
user_C = pd.merge(user_,Child_id,on = 'parentId')
user_C.columns = ['userId','parentId','isPayOneForLevelTwo','status','sisters']
user_C

特征5,‘sametime_’ 用户交易行为7天内,同个parentID下的交易用户数

unique = max_time.reset_index()
unique = pd.merge(unique,user_C)

交易行为以及用户表合并后的表格

unique

valid = unique[unique['status']=='valid']  # 非羊毛党
invalid = unique[unique['status']=='inValid'] # 羊毛党

羊毛用户的有关联的账号数的分布

invalid.sisters.describe()


非羊毛用户的有关联的账号数的分布

valid.sisters.describe()

import datetime
data['time_min'] = data['createdAt_x']-datetime.timedelta(days=7)
data['time_max'] = data['createdAt_x']+datetime.timedelta(days=7)
"""
运行时间3hours
本次结果,已经保存.
计算每次钱包有事件发生时,7天内同parentID 下发生钱包事件的关联账号数"""# sametime_ = []
# for i in range(data.shape[0]):
#     parent = data.loc[i,'parentId']
#     sametime_users = len(data[(data['createdAt_x']<time_max[i])&(data['createdAt_x']>time_min[i])&(data['parentId']==parent)]['userId'].unique())
#     sametime_.append(sametime_users)
#     print(i)#data['sametime_'] = np.array(sametime_)# data.to_csv('cleaned_data.csv')

读取该文件

data = pd.read_csv('cleaned_data.csv')
data.head()


取最大的7天内在线的关联账号数

unique['sametime_'] = data.groupby('userId')['sametime_'].max().values

将特征2与3整合成为一个’isPayOneForLevelTwo_or_coinType’

unique['isPayOneForLevelTwo_or_coinType'] = ((unique['coinType']==1)|(unique['isPayOneForLevelTwo']==1))*1
data['createdAt_x']=pd.to_datetime(data['createdAt_x'])

特征6,‘max_time’

max_time = pd.DataFrame((data.groupby('userId')['createdAt_x'].max()-data.groupby('userId')['createdAt_x'].min()).dt.days)
unique.head()

unique_ =pd.merge(unique,right=max_time,left_on='userId',right_index=True)
unique_.columns
"""
Index(['userId', 'createdAt_x_x', 'amount', 'coinType', 'parentId','isPayOneForLevelTwo', 'status', 'sisters', 'sametime_','isPayOneForLevelTwo_or_coinType', 'createdAt_x_y'],dtype='object')
"""

选取特征

final_data = unique_[['amount','isPayOneForLevelTwo_or_coinType','sisters','sametime_','createdAt_x_y','status']]
final_data.status.value_counts()

样本均衡 下采样

## 下采样
data_val = final_data[final_data.status == 'valid'].sample(n=30000)
data_inva = final_data[final_data.status == 'inValid']
data_ = pd.concat([data_val,data_inva],axis=0)
X = data_[['amount','isPayOneForLevelTwo_or_coinType','sisters','sametime_','createdAt_x_y']]
y = data_['status']
X.head()

建模

from sklearn.model_selection import train_test_splitxtrain,xtest,ytrain,ytest = train_test_split(X,y)

XGB

from xgboost import XGBClassifier
from sklearn.metrics import classification_reportxgb = XGBClassifier().fit(xtrain,ytrain)
print(classification_report(ytest,xgb.predict(xtest)))

xgb.predict_proba(xtest)

第一列代表inValid的概率(羊毛党)
第二列代表valid的概率(非羊毛党)

[*zip(xgb.feature_importances_,data_.columns)]

保存模型

import joblib
joblib.dump(xgb,"xgboost.dat")
loaded_model = joblib.load("xgboost.dat")

预测数据

预测所有用户羊毛党的行为

final_data['userId']= unique['userId']
final_data['ProbabilityForInvalid']= xgb.predict_proba(final_data[['amount','coinType','isPayOneForLevelTwo','sisters','sametime_']])[:,0]

结果保存到本地

final_data.to_csv('羊毛党结论.csv')

机器学习 day5 day6 分类问题实战:判断是否为羊毛党相关推荐

  1. 【阿旭机器学习实战】【13】决策树分类模型实战:泰坦尼克号生存预测

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文用机器学习中的决策树分类模型对泰坦尼克号生存项目进行预测. 关于决策树的详细介绍及原理参见前一 ...

  2. 自然语言处理入门实战1:基于机器学习的文本分类

    基于机器学习的文本分类 配置文件 数据集 数据预处理 model 模型 主函数 预测 结果 参考代码 本文参考复旦大学自然语言处理入门练习,主要是实现用tensorflow实现基于logistic/s ...

  3. 一文让你完全弄懂逻辑回归和分类问题实战《繁凡的深度学习笔记》第 3 章 分类问题与信息论基础(上)(DL笔记整理系列)

    好吧,只好拆分为上下两篇发布了>_< 终于肝出来了,今天就是除夕夜了,祝大家新快乐!^q^ <繁凡的深度学习笔记>第 3 章 分类问题与信息论基础 (上)(逻辑回归.Softm ...

  4. 基于统计概率和机器学习的文本分类技术

    基于统计概率和机器学习的文本分类技术 -- 社区产品机器审核机制 一.现状 目前,所在公司社区类产品(论坛.博客.百科)每天都会接收到大量的垃圾.灌水信息,高峰期16小时内(晚6点以后到第二天9点前) ...

  5. Paper:《Multimodal Machine Learning: A Survey and Taxonomy,多模态机器学习:综述与分类》翻译与解读

    Paper:<Multimodal Machine Learning: A Survey and Taxonomy,多模态机器学习:综述与分类>翻译与解读 目录 <Multimoda ...

  6. bert模型简介、transformers中bert模型源码阅读、分类任务实战和难点总结

    bert模型简介.transformers中bert模型源码阅读.分类任务实战和难点总结:https://blog.csdn.net/HUSTHY/article/details/105882989 ...

  7. 机器学习中的分类算法

    机器学习中的分类算法 机器学习,模式识别中很重要的一环,就是分类,因为计算机其实无法深层次地理解文字图片目标的意思,只能回答是或者不是.当然现在卷积神经网络正在希望计算机能够看懂东西,这次我们先来看一 ...

  8. tf第十二讲:TextCNN做文本分类的实战代码

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  9. 在托马斯·哈代的五月中学习机器学习之新闻分类

    先送上一首托马斯·哈代的诗 Growth in May I enter a daisy-and-buttercup land, And thence thread a jungle of grass: ...

最新文章

  1. 小乐乐打游戏(BFS+曼哈顿距离)
  2. ubuntu 18.04 配置notebook远程连接的坑
  3. SQL Server 临时表
  4. 技术开发人员需要改变性格吗?
  5. vue 自己捣鼓周日程日历组件(WSchedule)
  6. 如何创建计算机的桌面快捷方式,怎样创建桌面快捷方式 创建桌面快捷方式N种方法...
  7. C 实现黑客帝国数字雨
  8. 洛谷P5322 [BJOI2019]排兵布阵【分组背包】
  9. Word如何调整页边距
  10. Web APIs day6 | 正则阶段案例
  11. 快递100商家下单demo
  12. JS网页禁用右键- JS禁用网页右键
  13. python字体类型arial_python-3.x - 为什么我的font.name属性不影响使用Python-pptx制作的ppt上的字体? 我总是得到arial字体 - 堆栈内存溢出...
  14. 【Vue3】电商网站吸顶功能
  15. 高博课程第三次作业之轨迹的描绘
  16. 迷你世界进云服务器需要密码,迷你世界云服务器
  17. 5分钟教你如何利用华为云IoT进行物联网设备上云
  18. 软件测试的基本理论-移动端app测试-6
  19. serverStatus详解
  20. HTC Android 系列手机 工程测试命令

热门文章

  1. MinGW 完整版本(无需安装)
  2. Cisco Nexus 1000V, AVS , AVE的区别
  3. Metrics 简介
  4. 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?
  5. 【网红流水线车间】“制造”李佳琦们的神秘组织,到底是怎么让网红火起来的?...
  6. 可调速气体采样泵和液体采样泵选型介绍
  7. Unity3D使用LitJson.dll解析报错问题
  8. 可擦玻璃平顶的机器人_擦玻璃机器人的优点和缺点各是什么?智能擦窗机真的好用吗?有人工擦的干净吗...
  9. gitlab Enter passphrase for key
  10. python中wxpy的应用