MyException - 我的异常网
当前位置:我的异常网» Access » Amazon Employee Access 数据分析汇报

Amazon Employee Access 数据分析汇报

www.MyException.Cn  网友分享于:2013-05-16  浏览:0次
Amazon Employee Access 数据分析报告

Amazon Employee Access 数据分析报告

报告摘要

  • 目标:本分析旨在利用Amazon的员工编号相关信息,来分析和预测当员工申请访问某个编号的资源时,是否被允许访问。
  • 方法: 在原有部分变量的基础上,利用特征工程的方法,新增了单变量、双变量、三变量、四变量出现的频率和变量出现的条件概率等变量,利用随机森林模型,对目标变量进行预测。
  • 结论:
    • 一、对于训练集数据分析发现,各变量之间存在着一定的联系,其中ROLE_TITLE变量和ROLE_RODE变量存在一对一的关系,ROLE_TITLE变量和ROLE_FAMILY变量存在多对一的关系,其他变量之间也存在较强的对应关系。
    • 二、根据这种方法建模,发现模型具有一定的预测效果。

目录
* 问题描述
* 数据加载
* 数据探索
* 描述性统计
* 变量间的对应关系探索
* 变量分布探索
* 特征工程
* 降维
* 新增单变量频率
* 新增双变量频率
* 新增三变量频率
* 新增四变量频率
* 新增各变量出现的条件概率
* 模型建立
* 模型预测与评价

一、问题描述

利用Amazon员工的编号信息,包括员工经理的编号、员工所在分类的编号、员工所在部门编号、员工职位编号、员工类别编号等信息,来预测当员工申请访问某个 编号的资源时,是否被允许访问。

变量名 含义
ACTION 1代表资源被授权访问,0代表资源未被授权访问
RESOURCE 资源编号
MGR_ID 员工经理的编号
ROLE_ROLLUP_1 公司员工分类1,如美国工程
ROLE_ROLLUP_2 公司员工分类2,如美国零售
ROLE_DEPTNAME 公司部门描述,如零售
ROLE_TITLE 职位名称,如高级工程零售经理
ROLE_FAMILY_DESC 公司员工类别扩展描述,如零售经理,软件工程
ROLE_FAMILY 公司员工类别描述,如零售经理
ROLE_CODE 员工角色编号

二、数据加载

加载所需的python库

import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.graphics.api as smg
import patsy
get_ipython().magic('matplotlib inline')
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from scipy import stats
import seaborn as sns
载入train数据集
amazon = pd.read_csv("C:/Users/cs/Desktop/Amazon/train.csv")
data =amazon
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE
0 1 39353 85475 117961 118300 123472 117905 117906 290919 117908
1 1 17183 1540 117961 118343 123125 118536 118536 308574 118539
2 1 36724 14457 118219 118220 117884 117879 267952 19721 117880
3 1 36135 5396 117961 118343 119993 118321 240983 290919 118322
4 1 42680 5905 117929 117930 119569 119323 123932 19793 119325

三、数据探索

3.1 描述性统计

train数据集共有32769个样本,不存在缺失值

data.info()
data.describe()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE
count 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000 32769.000000
mean 0.942110 42923.916171 25988.957979 116952.627788 118301.823156 118912.779914 125916.152644 170178.369648 183703.408893 119789.430132
std 0.233539 34173.892702 35928.031650 10875.563591 4551.588572 18961.322917 31036.465825 69509.462130 100488.407413 5784.275516
min 0.000000 0.000000 25.000000 4292.000000 23779.000000 4674.000000 117879.000000 4673.000000 3130.000000 117880.000000
25% 1.000000 20299.000000 4566.000000 117961.000000 118102.000000 118395.000000 118274.000000 117906.000000 118363.000000 118232.000000
50% 1.000000 35376.000000 13545.000000 117961.000000 118300.000000 118921.000000 118568.000000 128696.000000 119006.000000 118570.000000
75% 1.000000 74189.000000 42034.000000 117961.000000 118386.000000 120535.000000 120006.000000 235280.000000 290919.000000 119348.000000
max 1.000000 312153.000000 311696.000000 311178.000000 286791.000000 286792.000000 311867.000000 311867.000000 308574.000000 270691.000000

查看各变量上不同编号的种类数。可以发现,在30000多个样本中,RESOURCE、MGR_ID和ROLE_FAMILY上编号种类数较多,其他变量上编号种类数较少。
值得注意的是,ROLE_TITLE和ROLE_CODE种类数一致。

f = lambda x: x.unique().size
data.apply(f)
ACTION 2 RESOURCE 7518 MGR_ID 4243 ROLE_ROLLUP_1 128 ROLE_ROLLUP_2 177 ROLE_DEPTNAME 449 ROLE_TITLE 343 ROLE_FAMILY_DESC 2358 ROLE_FAMILY 67 ROLE_CODE 343 dtype: int64

3.2 变量间的对应关系探索

3.2.1 ROLE_TITLE与ROLE_CODE

画出ROLE_TITLE和ROLE_CODE变量的散点图,存在明显的正相关关系。

fig,ax = plt.subplots(nrows=1,ncols=1,figsize=(8,5))
plt.scatter(data.ROLE_TITLE,data.ROLE_CODE)
<matplotlib.collections.PathCollection at 0xabb0c50>

png

将两个变量的值合并,编号的种类数目仍为343,

TITLE_CODE = data.ROLE_TITLE*1000000+data.ROLE_CODE
TITLE_CODE.unique().size
343
# 定义f2,用来计算交叉表每一行或每一列中非0值的个数
f2 = lambda x: x[x!=0].count()
# 画出两个变量间的交叉表
TICO = pd.crosstab(data.ROLE_TITLE,data.ROLE_CODE)
# 观察交叉表中ROLE_CODE变量对应的ROLE_TITLE变量个数
TICO.apply(f2).plot()
# 在变量ROLE_CODE上,对应的ROLE_TITLE个数为0,说明两个变量间至少存在一对多的对应关系
TICO.apply(f2)[TICO.apply(f2)>1]
Series([], dtype: int64)

png


   观察交叉表中ROLE_TITLE变量对应的ROLE_CODE变量个数,也为0,说明两个变量间存在一一对应的关系
TICO.apply(f2,axis=1).plot()
TICO.apply(f2,axis=1)[TICO.apply(f2,axis=1)>1]
Series([], dtype: int64)

png

3.2.2 ROLE_ROLLUP_1与ROLE_DEPTNAME

# 将两个变量的值合并,编号的种类数目发生了较大的变化,但仍可发现,存在一定的对应关系
RO1_DEP= data.ROLE_ROLLUP_1*10000000+data.ROLE_DEPTNAME
data.ROLE_ROLLUP_1.unique().size, data.ROLE_DEPTNAME.unique().size, RO1_DEP.unique().size
# ctRO1DEP = pd.crosstab(data.ROLE_ROLLUP_1,data.ROLE_DEPTNAME)
(128, 449, 1185)

3.2.3 ROLE_ROLLUP_2与ROLE_DEPTNAME

# 将两个变量的值合并,编号的种类数目发生了较大的变化,但仍可发现,存在一定的对应关系
RO2_DEP= data.ROLE_ROLLUP_2*10000000+data.ROLE_DEPTNAME
data.ROLE_ROLLUP_2.unique().size, data.ROLE_DEPTNAME.unique().size, RO2_DEP.unique().size
(177, 449, 1398)

3.2.4 ROLE_ROLLUP_1与ROLE_ROLLUP_2

# 将两个变量合并,编号的唯一值数目变化不大,说明两者之间存在很强的对应关系
RO1_RO2= data.ROLE_ROLLUP_1*10000000+data.ROLE_ROLLUP_2
data.ROLE_ROLLUP_1.unique().size, data.ROLE_ROLLUP_2.unique().size, RO1_RO2.unique().size
(128, 177, 187)
#画出两个变量间的交叉表
ctRO12 = pd.crosstab(data.ROLE_ROLLUP_1,data.ROLE_ROLLUP_2)
# 观察交叉表中ROLE_ROLLUP_2变量对应的ROLE_ROLLUP_1变量个数
ctRO12.apply(f2).plot()
# 在变量ROLE_ROLLUP_2上,只有三个值对应的ROLE_ROLLUP_1个数大于1(非一一对应关系),说明两个变量间有很强的一对多的对应关系
ctRO12.apply(f2)[ctRO12.apply(f2)>1]
ROLE_ROLLUP_2
118164    2
118178    2
119256    9
dtype: int64

png

# 统计ROLE_ROLLUP_2编号为118164、118178和119356样本的数目,样本数目的变量并不多,但总体上,未通过授权的比率比平均高
a = data.ROLE_ROLLUP_2[(data.ROLE_ROLLUP_2==118164) | (data.ROLE_ROLLUP_2==118178)| (data.ROLE_ROLLUP_2==119256)].count()
b = data.ACTION[(data.ROLE_ROLLUP_2==118164) | (data.ROLE_ROLLUP_2==118178)| (data.ROLE_ROLLUP_2==119256)].value_counts()
b,a
(1 380 0 36 Name: ACTION, dtype: int64, 416)
# 观察交叉表中ROLE_ROLLUP_1变量对应的ROLE_ROLLUP_2变量个数
# ctRO12.apply(f,axis=1).plot()
# 在变量ROLE_ROLLUP_1上,有32个值对应的ROLE_ROLLUP_2个数大于1
ctRO12.apply(f2,axis=1)[ctRO12.apply(f2,axis=1)>1].count()
32

3.2.5 ROLE_FAMILY与ROLE_FAMILY_DESC

# 将两个变量合并,编号的唯一值数目变化不大,说明两者之间存在很强的对应关系
FA_DESC= data.ROLE_FAMILY_DESC*1000000+data.ROLE_FAMILY   
data.ROLE_FAMILY_DESC.unique().size,data.ROLE_FAMILY.unique().size, FA_DESC.unique().size
(2358, 67, 2586)
#画出两个变量间的交叉表
ctFAFA = pd.crosstab(data.ROLE_FAMILY,data.ROLE_FAMILY_DESC)
# 在变量ROLE_FAMILY_DESC上,有170个值对应的ROLE_FAMILY个数大于1,
# 在变量ROLE_FAMILY上,有59个值对应的ROLE_FAMILY_DESC个数大于1,说明两个变量间有较强的一对多的对应关系

3.2.6 ROLE_TITLE和ROLE_FAMILY

# 将两个变量合并,唯一值没有发生变化,说明两者之间可能存在一对多关系
TIFA = data.ROLE_TITLE*1000000+data.ROLE_FAMILY
data.ROLE_TITLE.unique().size, data.ROLE_FAMILY.unique().size, TIFA.unique().size
(343, 67, 343)
#画出两个变量间的交叉表
ctTIFA = pd.crosstab(data.ROLE_TITLE,data.ROLE_FAMILY)
# 观察交叉表中ROLE_TITLE变量对应的ROLE_FAMILY变量个数
ctTIFA.apply(f2,axis=1).plot()
# 可以发现,ROLE_TITLE 与ROLE_FAMILY之间存在着一对多的关系,
ctTIFA.apply(f2,axis=1)[ctTIFA.apply(f2,axis=1)>1].count()
0

png

3.3 变量分布探索

# 画出变量ACTION的条形图,大部分的申请都被授权
fig,ax = plt.subplots(figsize=(8,5))
data.ACTION.value_counts().plot(kind="bar",color="lightblue")
ax.set_xticklabels(("Accessed","Not Accessed"),  rotation= "horizontal" )
ax.set_title("Bar plot of Action")
<matplotlib.text.Text at 0xd173080>

png

# 画出其余变量的分布直方图,RESOURCE和MGR_ID变量的编号大多分布在0-1000000上,且分布相对离散,其余变量分布都集中在一定的值和区域内。
# 如变量ROLE_ROLLUP_1上,有21407个样本编号为117961;在ROLE_FAMILY上有10980个样本的编号为290919。
# data.ROLE_ROLLUP_1.value_counts(),data.ROLE_FAMILY.value_counts()
fig,ax = plt.subplots(nrows=4,ncols=2,figsize=(20,40))
data.RESOURCE.hist(ax=ax[0,0],bins=100)
ax[0,0].set_title("Hist plot of RESOURCE")
data.MGR_ID.hist(ax=ax[0,1],bins=100)
ax[0,1].set_title("Hist plot of MGR_ID")
data.ROLE_ROLLUP_1.hist(ax=ax[1,0],bins=100)
ax[1,0].set_title("Hist plot of ROLE_ROLLUP_1")
data.ROLE_ROLLUP_2.hist(ax=ax[1,1],bins=100)
ax[1,1].set_title("Hist plot of ROLE_ROLLUP_2")
data.ROLE_DEPTNAME.hist(ax=ax[2,0],bins=100)
ax[2,0].set_title("ROLE_DEPTNAME")
data.ROLE_TITLE.hist(ax=ax[2,1],bins=100)
ax[2,1].set_title("Hist plot of ROLE_TITLE")
data.ROLE_FAMILY_DESC.hist(ax=ax[3,0],bins=100)
ax[3,0].set_title("Hist plot of ROLE_FAMILY_DESC")
data.ROLE_FAMILY.hist(ax=ax[3,1],bins=100)
ax[3,1].set_title("Hist plot of ROLE_FAMILY")
<matplotlib.text.Text at 0xdb2fa90>

png

# 画出变量间相关系数矩阵图,变量编号的值之间并没有明显的线性关系
cm = np.corrcoef(data.values.T)
sns.set(font_scale=1)
cols = data.columns
hm = sns.heatmap(cm, 
            cbar=True,
            annot=True, 
            square=True,
            fmt='.2f',
            annot_kws={'size': 10},
            yticklabels=cols,
            xticklabels=cols)
plt.tight_layout()
plt.show()

png

四、特征工程

4.1 降维

# 由于ROLE_CODE和ROLE_FAMILY与ROLE_TITLE存在一对一和一对多的关系,认为他不能包含更多的信息,删去这两个变量
data = amazon
del data["ROLE_CODE"]
del data["ROLE_FAMILY"]
amazon = pd.read_csv("C:/Users/cs/Desktop/Amazon/train.csv")

4.2 新增单变量的频率

# 利用循环,得到每个自变量出现的频率,赋值到新的列中。
one= ["RESOURCE","MGR_ID","ROLE_ROLLUP_1","ROLE_ROLLUP_2","ROLE_DEPTNAME","ROLE_TITLE","ROLE_FAMILY_DESC"]
for i in range(0,len(one)):
    a=data[one[i]]
    b=data[one[i]].value_counts()/32769
    a=a.map(b)
    data[one[i]+"_prob"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob ROLE_ROLLUP_1_prob ROLE_ROLLUP_2_prob ROLE_DEPTNAME_prob ROLE_TITLE_prob ROLE_FAMILY_DESC_prob
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.653270 0.135006 0.002197 0.109341 0.210443
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.653270 0.120388 0.004852 0.002472 0.000366
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.005615 0.005615 0.016662 0.038329 0.001007
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.653270 0.120388 0.005798 0.141872 0.037963
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.008423 0.004211 0.001373 0.002289 0.000580

4.3 新增双变量的频率

# 利用循环,得到每两个自变量同时出现的频率,赋值到新的列中。
two = ["RESOURCE","MGR_ID","ROLE_ROLLUP_1","ROLE_ROLLUP_2","ROLE_DEPTNAME","ROLE_TITLE","ROLE_FAMILY_DESC"] 
for i in range(0,len(two)):
    for j in range(i+1,len(two)):
        a=data[two[i]]+data[two[j]]*1000000
        b=a.value_counts()/32769
        a=a.map(b)
        data[two[i]+"_"+two[j]+"_prob"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob ROLE_ROLLUP_1_ROLE_DEPTNAME_prob ROLE_ROLLUP_1_ROLE_TITLE_prob ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob ROLE_ROLLUP_2_ROLE_DEPTNAME_prob ROLE_ROLLUP_2_ROLE_TITLE_prob ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob ROLE_DEPTNAME_ROLE_TITLE_prob ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob ROLE_TITLE_ROLE_FAMILY_DESC_prob
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.135006 0.002014 0.089200 0.180659 0.002014 0.013855 0.033233 0.000671 0.001678 0.079557
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.120388 0.003815 0.002472 0.000366 0.003754 0.000580 0.000153 0.000153 0.000153 0.000366
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.005615 0.000397 0.001556 0.000061 0.000397 0.001556 0.000061 0.005615 0.000061 0.000061
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.120388 0.005401 0.125057 0.036956 0.005035 0.022460 0.007782 0.003052 0.001770 0.016204
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.004211 0.000671 0.000488 0.000305 0.000549 0.000244 0.000244 0.000183 0.000183 0.000519

5 rows × 36 columns

4.4 新增三变量的频率

# 利用循环,得到每三个自变量同时出现的频率,赋值到新的列中。
three = ["RESOURCE","MGR_ID","ROLE_ROLLUP_1","ROLE_ROLLUP_2","ROLE_DEPTNAME","ROLE_TITLE","ROLE_FAMILY_DESC"] 
for i in range(0,len(three)):
     for j in range(i+1,len(three)):
            for k in range(j+1,len(three)):
                a = data[three[i]]*100000*100000+data[three[j]]*1000000+data[three[k]]
                b = a.value_counts()/91690
                a = a.map(b)
                data[three[i]+"_"+three[j]+"_"+three[k]+"_"+"prob"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_DEPTNAME_prob ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_TITLE_prob ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob ROLE_ROLLUP_1_ROLE_DEPTNAME_ROLE_TITLE_prob ROLE_ROLLUP_1_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob ROLE_ROLLUP_1_ROLE_TITLE_ROLE_FAMILY_DESC_prob ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_TITLE_prob ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob ROLE_ROLLUP_2_ROLE_TITLE_ROLE_FAMILY_DESC_prob ROLE_DEPTNAME_ROLE_TITLE_ROLE_FAMILY_DESC_prob
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.000720 0.004951 0.011877 0.000185 0.000556 0.023220 0.000185 0.000556 0.003937 0.000218
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.001341 0.000207 0.000055 0.000055 0.000055 0.000131 0.000055 0.000055 0.000055 0.000055
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.000142 0.000556 0.000022 0.000055 0.000022 0.000022 0.000055 0.000022 0.000022 0.000022
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.001800 0.008027 0.002781 0.001091 0.000633 0.005682 0.000971 0.000534 0.001451 0.000545
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.000196 0.000087 0.000087 0.000044 0.000044 0.000109 0.000022 0.000022 0.000087 0.000065

5 rows × 71 columns

4.5 新增四变量的频率

# 利用循环,得到每三个自变量和RESOURCE同时出现的频率,赋值到新的列中。
four = ["RESOURCE","MGR_ID","ROLE_ROLLUP_1","ROLE_ROLLUP_2","ROLE_DEPTNAME","ROLE_TITLE","ROLE_FAMILY_DESC"] 
for i in range(1,len(four)):
     for j in range(i+1,len(four)):
            for k in  range(j+1,len(four)):
                a = data[four[0]]*100000*100000+data[four[i]]*1000000+data[four[j]]+data[four[k]]*0.000001
                b = a.value_counts()/32769
                a = a.map(b)
                data[four[0]+"_"+four[i]+"_"+four[j]+"_"+four[k]+"_"+"prob"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_DEPTNAME_prob RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_TITLE_prob RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_ROLLUP_1_ROLE_DEPTNAME_ROLE_TITLE_prob RESOURCE_ROLE_ROLLUP_1_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_ROLLUP_1_ROLE_TITLE_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_TITLE_prob RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_ROLLUP_2_ROLE_TITLE_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_DEPTNAME_ROLE_TITLE_ROLE_FAMILY_DESC_prob
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.000092 0.000092 0.000092 0.000031 0.000031 0.000061 0.000031 0.000031 0.000061 0.000031
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.000336 0.000305 0.000153 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.000061 0.000061 0.000031 0.000061 0.000031 0.000031 0.000061 0.000031 0.000031 0.000031
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031 0.000031
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.000061 0.000061 0.000061 0.000061 0.000061 0.000092 0.000031 0.000031 0.000061 0.000061

5 rows × 91 columns

4.6 新增各变量出现频率的条件概率

# RESOURCE 确定时其他单个变量同时发生的概率
resourcetwo = ['RESOURCE_MGR_ID_prob','RESOURCE_ROLE_ROLLUP_1_prob', 'RESOURCE_ROLE_ROLLUP_2_prob','RESOURCE_ROLE_DEPTNAME_prob', 
               'RESOURCE_ROLE_TITLE_prob','RESOURCE_ROLE_FAMILY_DESC_prob']
for i in range(0,len(resourcetwo)):
    a =  data[resourcetwo[i]]/data.RESOURCE_prob
    data[resourcetwo[i]+"_"+"probre"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_TITLE_prob RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_ROLLUP_2_ROLE_TITLE_ROLE_FAMILY_DESC_prob RESOURCE_ROLE_DEPTNAME_ROLE_TITLE_ROLE_FAMILY_DESC_prob RESOURCE_MGR_ID_prob_probre RESOURCE_ROLE_ROLLUP_1_prob_probre RESOURCE_ROLE_ROLLUP_2_prob_probre RESOURCE_ROLE_DEPTNAME_prob_probre RESOURCE_ROLE_TITLE_prob_probre RESOURCE_ROLE_FAMILY_DESC_prob_probre
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.000031 0.000031 0.000061 0.000031 1.000000 1.000000 1.000000 0.333333 0.666667 1.000000
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.000031 0.000031 0.000031 0.000031 0.033333 0.866667 0.366667 0.033333 0.033333 0.033333
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.000061 0.000031 0.000031 0.000031 0.500000 1.000000 1.000000 1.000000 1.000000 0.500000
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.000031 0.000031 0.000031 0.000031 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.000031 0.000031 0.000061 0.000061 0.250000 0.375000 0.250000 0.250000 0.500000 0.375000

5 rows × 97 columns

# 其他单个变量确定时RESOURCE变量同时发生的概率
resourcetwo = ['RESOURCE_MGR_ID_prob','RESOURCE_ROLE_ROLLUP_1_prob', 'RESOURCE_ROLE_ROLLUP_2_prob','RESOURCE_ROLE_DEPTNAME_prob', 
               'RESOURCE_ROLE_TITLE_prob','RESOURCE_ROLE_FAMILY_DESC_prob']
resourceone = [ 'MGR_ID_prob', 'ROLE_ROLLUP_1_prob','ROLE_ROLLUP_2_prob', 'ROLE_DEPTNAME_prob', 'ROLE_TITLE_prob','ROLE_FAMILY_DESC_prob']
for i in range(0,len(resourcetwo)):
    a =  data[resourcetwo[i]]/data[resourceone[i]]
    data[resourcetwo[i]+"_"+"proboth"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob RESOURCE_ROLE_ROLLUP_2_prob_probre RESOURCE_ROLE_DEPTNAME_prob_probre RESOURCE_ROLE_TITLE_prob_probre RESOURCE_ROLE_FAMILY_DESC_prob_probre RESOURCE_MGR_ID_prob_proboth RESOURCE_ROLE_ROLLUP_1_prob_proboth RESOURCE_ROLE_ROLLUP_2_prob_proboth RESOURCE_ROLE_DEPTNAME_prob_proboth RESOURCE_ROLE_TITLE_prob_proboth RESOURCE_ROLE_FAMILY_DESC_prob_proboth
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 1.000000 0.333333 0.666667 1.000000 0.054545 0.000140 0.000678 0.013889 0.000558 0.000435
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.366667 0.033333 0.033333 0.033333 0.100000 0.001215 0.002788 0.006289 0.012346 0.083333
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 1.000000 1.000000 1.000000 0.500000 0.333333 0.010870 0.010870 0.003663 0.001592 0.030303
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 1.000000 1.000000 1.000000 1.000000 0.016129 0.000047 0.000253 0.005263 0.000215 0.000804
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.250000 0.250000 0.500000 0.375000 0.222222 0.010870 0.014493 0.044444 0.053333 0.157895

5 rows × 103 columns

# RESOURCE 确定时其他两个变量同时发生的概率
resourcethree = [ 'RESOURCE_MGR_ID_ROLE_ROLLUP_1_prob','RESOURCE_MGR_ID_ROLE_ROLLUP_2_prob', 'RESOURCE_MGR_ID_ROLE_DEPTNAME_prob',
        'RESOURCE_MGR_ID_ROLE_TITLE_prob','RESOURCE_MGR_ID_ROLE_FAMILY_DESC_prob', 'RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob',
        'RESOURCE_ROLE_ROLLUP_1_ROLE_DEPTNAME_prob','RESOURCE_ROLE_ROLLUP_1_ROLE_TITLE_prob','RESOURCE_ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob',
        'RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_prob','RESOURCE_ROLE_ROLLUP_2_ROLE_TITLE_prob', 'RESOURCE_ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob',
        'RESOURCE_ROLE_DEPTNAME_ROLE_TITLE_prob', 'RESOURCE_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob','RESOURCE_ROLE_TITLE_ROLE_FAMILY_DESC_prob']
for i in range(0,len(resourcethree)):
    a =  data[resourcethree[i]]/data.RESOURCE_prob
    data[resourcethree[i]+"_"+"probre"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob_probre RESOURCE_ROLE_ROLLUP_1_ROLE_DEPTNAME_prob_probre RESOURCE_ROLE_ROLLUP_1_ROLE_TITLE_prob_probre RESOURCE_ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob_probre RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_prob_probre RESOURCE_ROLE_ROLLUP_2_ROLE_TITLE_prob_probre RESOURCE_ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob_probre RESOURCE_ROLE_DEPTNAME_ROLE_TITLE_prob_probre RESOURCE_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob_probre RESOURCE_ROLE_TITLE_ROLE_FAMILY_DESC_prob_probre
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.357389 0.119130 0.238259 0.357389 0.119130 0.238259 0.357389 0.119130 0.119130 0.238259
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.131043 0.011913 0.011913 0.011913 0.011913 0.011913 0.011913 0.011913 0.011913 0.011913
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.357389 0.357389 0.357389 0.178695 0.357389 0.357389 0.178695 0.357389 0.178695 0.178695
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.357389 0.357389 0.357389 0.357389 0.357389 0.357389 0.357389 0.357389 0.357389 0.357389
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.089347 0.089347 0.134021 0.134021 0.044674 0.089347 0.089347 0.089347 0.089347 0.134021

5 rows × 118 columns

# 其他两个变量确定时RESOURCE变量同时发生的概率
resourcethree = [ 'RESOURCE_MGR_ID_ROLE_ROLLUP_1_prob','RESOURCE_MGR_ID_ROLE_ROLLUP_2_prob', 'RESOURCE_MGR_ID_ROLE_DEPTNAME_prob',
        'RESOURCE_MGR_ID_ROLE_TITLE_prob','RESOURCE_MGR_ID_ROLE_FAMILY_DESC_prob', 'RESOURCE_ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob',
        'RESOURCE_ROLE_ROLLUP_1_ROLE_DEPTNAME_prob','RESOURCE_ROLE_ROLLUP_1_ROLE_TITLE_prob','RESOURCE_ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob',
        'RESOURCE_ROLE_ROLLUP_2_ROLE_DEPTNAME_prob','RESOURCE_ROLE_ROLLUP_2_ROLE_TITLE_prob', 'RESOURCE_ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob',
        'RESOURCE_ROLE_DEPTNAME_ROLE_TITLE_prob', 'RESOURCE_ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob','RESOURCE_ROLE_TITLE_ROLE_FAMILY_DESC_prob']
othertwo = ['MGR_ID_ROLE_ROLLUP_1_prob','MGR_ID_ROLE_ROLLUP_2_prob','MGR_ID_ROLE_DEPTNAME_prob', 'MGR_ID_ROLE_TITLE_prob',
       'MGR_ID_ROLE_FAMILY_DESC_prob', 'ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob', 'ROLE_ROLLUP_1_ROLE_DEPTNAME_prob', 'ROLE_ROLLUP_1_ROLE_TITLE_prob',
       'ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob', 'ROLE_ROLLUP_2_ROLE_DEPTNAME_prob', 'ROLE_ROLLUP_2_ROLE_TITLE_prob',
       'ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob', 'ROLE_DEPTNAME_ROLE_TITLE_prob','ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob',
       'ROLE_TITLE_ROLE_FAMILY_DESC_prob']
for i in range(0,len(resourcethree)):
    a =  data[resourcethree[i]]/data[othertwo[i]]
    data[othertwo[i]+"_"+"proboth"]=a
data.head()
ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME ROLE_TITLE ROLE_FAMILY_DESC RESOURCE_prob MGR_ID_prob ROLE_ROLLUP_1_ROLE_ROLLUP_2_prob_proboth ROLE_ROLLUP_1_ROLE_DEPTNAME_prob_proboth ROLE_ROLLUP_1_ROLE_TITLE_prob_proboth ROLE_ROLLUP_1_ROLE_FAMILY_DESC_prob_proboth ROLE_ROLLUP_2_ROLE_DEPTNAME_prob_proboth ROLE_ROLLUP_2_ROLE_TITLE_prob_proboth ROLE_ROLLUP_2_ROLE_FAMILY_DESC_prob_proboth ROLE_DEPTNAME_ROLE_TITLE_prob_proboth ROLE_DEPTNAME_ROLE_FAMILY_DESC_prob_proboth ROLE_TITLE_ROLE_FAMILY_DESC_prob_proboth
0 1 39353 85475 117961 118300 123472 117905 117906 0.000092 0.001678 0.000242 0.005415 0.000245 0.000181 0.005415 0.001574 0.000985 0.016245 0.006498 0.000274
1 1 17183 1540 117961 118343 123125 118536 118536 0.000915 0.000305 0.000997 0.002859 0.004412 0.029782 0.002906 0.018810 0.071478 0.071478 0.071478 0.029782
2 1 36724 14457 118219 118220 117884 117879 267952 0.000061 0.000092 0.003885 0.054983 0.014015 0.178695 0.054983 0.014015 0.178695 0.003885 0.178695 0.178695
3 1 36135 5396 117961 118343 119993 118321 240983 0.000031 0.001892 0.000091 0.002019 0.000087 0.000295 0.002166 0.000486 0.001402 0.003574 0.006162 0.000673
4 1 42680 5905 117929 117930 119569 119323 123932 0.000244 0.000275 0.005180 0.032490 0.067010 0.107217 0.019855 0.089347 0.089347 0.119130 0.119130 0.063069

5 rows × 133 columns

五、模型建立

# 划分测试集与训练集
from sklearn.cross_validation import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, roc_curve,roc_auc_score,classification_report 
y = data.ACTION
X = data
del X["ACTION"]
X_train, X_test, y_train, y_test = train_test_split(
         X, y, test_size=0.3, random_state=0)
# 利用以上处理所得的共133个自变量建立随机森林模型
forest = RandomForestClassifier(criterion='entropy',
                                n_estimators=1000, 
                                random_state=1,
                                n_jobs=2)
RFfit = forest.fit(X_train , y_train)

六、模型预测与评价

# 利用模型进行预测
preds = RFfit.predict(X_test)
# 得到模型的混淆矩阵如下所示
confusion_matrix(y_test,preds)
array([[ 138,  420],
       [  59, 9214]])
# 得到模型的ROC_AUC得分如下所示
pre = RFfit.predict_proba(X_test)
roc_auc_score(y_test,pre[:,1])
0.8639483844684166
# 得到摸型的ROC曲线如下所示
fpr,tpr,thresholds = roc_curve(y_test,pre[:,1])
fig,ax = plt.subplots(figsize=(8,5))
plt.plot(fpr,tpr)
ax.set_title("Roc of Logistic Randomforest")
<matplotlib.text.Text at 0x26395198>

png

利用Kaggle测试集得分为0.89,说明模型具有一定的效果。

文章评论

10个调试和排错的小建议
10个调试和排错的小建议
 程序员的样子
程序员的样子
中美印日四国程序员比较
中美印日四国程序员比较
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
代码女神横空出世
代码女神横空出世
我的丈夫是个程序员
我的丈夫是个程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
总结2014中国互联网十大段子
总结2014中国互联网十大段子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员都该阅读的书
程序员都该阅读的书
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员必看的十大电影
程序员必看的十大电影
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
一个程序员的时间管理
一个程序员的时间管理
程序员应该关注的一些事儿
程序员应该关注的一些事儿
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
每天工作4小时的程序员
每天工作4小时的程序员
那些争议最大的编程观点
那些争议最大的编程观点
老程序员的下场
老程序员的下场
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
我是如何打败拖延症的
我是如何打败拖延症的
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
编程语言是女人
编程语言是女人
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何成为一名黑客
如何成为一名黑客
旅行,写作,编程
旅行,写作,编程
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有