自动编码器和异常检测与机器学习中的欺诈分析

4月30日2017
通过

这篇文章首次发表于 Shirin游乐场,并对 188bet appR-bloggers)

我之前所有关于机器学习的文章都是关于监督学习的。但是我们也可以使用机器学习来进行无监督的学习。后者是例如用于聚类和(非线性)降维。

对于这个任务,我用Kaggle的信用卡欺诈数据集来自以下研究:

安德里亚·达尔·波佐罗,奥利维尔·Caelen里德。Johnson和Gianluca Bontempi。不平衡分类用欠采样校正概率。在计算智能与数据挖掘研讨会上,IEEE,2015

数据集提供了超过280000个信用卡使用实例,并且对于每个交易,我们知道这是不是欺诈。

这样的数据集在执行机器学习时需要特殊处理,因为它们严重不平衡:只有0.17%的交易是欺诈性的。

虽然我们可以尝试使用分类器,比如随机森林或者支持向量机,通过应用取样过多或不足的技术,我们也可以尝试在数据中发现异常(假设我们期望我们的欺诈案例是整个数据集中的异常)。

在处理如此严重的反应标签失衡时,在度量模型性能时,我们还需要小心。因为只有少数的欺诈案例,一个预测一切都是非欺诈的模型已经达到了99%以上的准确率。尽管精确度很高,这样的模型并不一定能帮助我们找到我们真正想要找到的欺诈性案件——俗话说的“大海捞针”!

下面,我将演示如何使用自动编码器和异常检测,如何使用自动编码器对分类模型进行预培训,以及如何在不平衡数据上度量模型性能。

探索数据

图书馆时髦诗)
从https://www.kaggle.com/dalpozz/creditcardfraud下载信用卡 < CSV“信用卡.csv”)

数据集包含数值输入变量V1到V28,这是对原始特征进行PCA转换的结果(由于保密问题无法提供)。

响应变量告诉我们一笔交易是否存在欺诈(值= 1)。

信用卡 % > %
  格格图aesx =  +
    geom_bar颜色 = “灰色”, 填满 = “lightgrey”) +
    主题BW()

有两个额外的功能,时间(每个事务与第一个事务之间的时间(秒)和数量(这笔交易中转移了多少钱)。

因为时间只告诉我们交易的顺序,它并没有告诉我们任何关于实际时间的信息(即金宝搏网址交易的时间)。因此,我正在按天将它们正常化,并根据一天中的时间将它们分为四组。

总结信用卡$时间)
αi min.第一曲。中位数平均值是3。最大值。# 0 54202 84692 94814 139320 172792
#24小时有多少秒?1小时=60分钟=60 x 60秒=3600秒三千六百 * 24
α〔1〕86400
按日分割交易信用卡$白天 < ifelse信用卡$时间 > 三千六百 * 24, “day2”, “俊”)

按日进行交易信用卡$Time_day < ifelse信用卡$白天 = = “day2”, 信用卡$时间 - - - - - - 八万六千四百, 信用卡$时间)

总结信用卡(信用卡$白天 = = “俊”, ]$Time_day)
αi min.第一曲。中位数平均值是3。最大值。##0 38432 54689 52948 70977 86400
总结信用卡(信用卡$白天 = = “day2”, ]$Time_day)
αi min.第一曲。中位数平均值是3。最大值。# 1 37843 53425 51705 68182 86392
# bin事务根据一天的时间信用卡$时间 < A.因子ifelse信用卡$Time_day <= 三万八千一百三十八, “GR1”, 第一个曲。                          ifelse信用卡$Time_day <= 五万二千三百二十七, “GR2”, #意思意思                                 ifelse信用卡$Time_day <= 69580, “GR3”, 第3区平均值                                        “gr4“”)))
信用卡 % > %
  格格图aesx = 白天 +
    geom_bar颜色 = “灰色”, 填满 = “lightgrey”) +
    主题BW()

现在我们可以看到,这个数据集中的事务都是连续两天记录的,这两天的事务数量大致相同。

现在,我删除了用于创建时间箱里。

信用卡 < 选择信用卡, - - - - - -Time_day, - - - - - -白天)

将类变量转换为因子信用卡$ < 因素信用卡$)
信用卡 % > %
  格格图aesx = 时间 +
    geom_bar颜色 = “灰色”, 填满 = “lightgrey”) +
    主题BW() +
    端面缠绕 ~ , 尺度 = “免费”, ncol = 2)

四个交易的分布时间箱子显示,大多数欺诈案件发生在第1组(尽管,我不能说确切的时间,因为最初时间特性没有告诉我们第一个事务是什么时候发生的)。

我还想看看转帐金额的分配情况:

总结信用卡(信用卡$ = = “0”, ]$数量)
# #分钟。第一曲。中位数平均值是3。最大值。## 0.00 5.65 22.00 88.29 77.05 25691.16
总结信用卡(信用卡$ = = “1”, ]$数量)
αi min.第一曲。中位数平均值是3。最大值。##0.00 1.00 9.25 122.21 105.89 2125.87
信用卡 % > %
  格格图aesx = 数量 +
    几何直方图颜色 = “灰色”, 填满 = “lightgrey”, 垃圾箱 = 50) +
    主题BW() +
    端面缠绕 ~ , 尺度 = “免费”, ncol = 2)

有趣的是,欺诈性信用卡交易的平均转帐金额较高,但与常规交易相比,最大金额要低得多。

建模

为了建模,我用R的H2O实现包裹。有关更多详细信息和其他示例,见我的帖子我的机器学习网络研讨会,在用H2O构建神经网络执行超参数优化的网格搜索

图书馆H2o)
H2奥尼特nthreads = -1)
##连接成功!####R连接到H2O集群:35\3535353535\35\35\\\\\35\35\\35\\35\35\\\35\\35\\\35\\35\\\\\\\35\水柱R总核数:2 H2O允许的核数:2 H2O群集正常:真H2O连接IP:本地主机H2O连接端口:54321 H2O连接代理:NA H2O内部安全:假R版本:R版本3.4.0(2017-04-21)
将数据转换为H2OFrame信用卡 < A.H2O信用卡)

然后,我将数据集分为训练集和测试集。因为我想检查一个预先训练过的模型的性能,我将数据分成两个单独的训练集和一个独立的测试集,以进行最终的模型比较。

分裂 < H2拆分框架信用卡, 
                         比率 = c0.4, 0.4 
                         种子 = 四十二)

无监督培训  < 分裂[[]]
列车监控  < 分裂[[2]]
测试 < 分裂[[3.]]

响应 < “班”
特征 < 塞特夫姓氏无监督培训 响应)

自编码器

首先,我正在使用深度学习自动编码器训练无监督神经网络模型。与,我们可以简单地设置autoencoder = TRUE

在这里,我正在应用一种叫做“瓶颈”训练的技术,中间的隐藏层很小。这意味着我的模型将不得不降低输入数据的维度(在这种情况下,最多2个节点/维度)。

然后,autoencoder模型将学习输入数据的模式,而不考虑给定的类标签。在这里,它会学习,哪些信用卡交易是类似的,哪些交易是异常值或异常。我们需要记住,自动编码器模型对我们数据中的异常值很敏感,这可能会抛弃其他典型的模式。

模型神经网络 < H2o.deeplearningx = 特征,
                             training_frame = 无监督培训,
                             模特儿身份证 = “模型神经网络”,
                             autoencoder = 真的,
                             可再生的 = 真的, 对于真正的问题,慢慢关闭                             忽略常量 = ,
                             种子 = 四十二,
                             隐藏的 = c, 2,  
                             时代 = One hundred.,
                             激活 = ”“双曲正切)

因为训练需要一段时间,我正在保存模型:

H2O.SaveMod模型神经网络, 路径=“模型神经网络”,  = 真的)
模型神经网络 < H2o.loadModel“模型神经网络”)
模型神经网络
##模型详细信息:自动编码器高斯分布,二次损失776的重量/偏见,16.0 KB,2622851个训练样本,小批量1 35\35\35\35\\35\\35\35\35\35\\35 35 35 35.0.0.0.0.709865 0.3200.320080.0.0 0.0.0 0.0.0 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 \\\\元%0.000000.000000.000000.0.164717 0.1920 53 0.000000 \353535717 0.19253 0.000000.000000.000000.0 0.369681 0.425 672 0.000000 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.314106 0.226376 0.067917 4 0.227664 1.089589 0.112032 0.672444 5 0.011072 0.605586 0.091124 0.722602 H2O自动编码:在培训数据上报告了Deeplarning*。* * # # # #训练集指标:# # = = = = = = = = = = = = = = = = = = = = = # # # # MSE:(提取h2o.mse)0.001472071 # # RMSE:0.03836757(提取“h2o.rmse”)
#转换为自动编码的表示形式自动测试系统 < H2o.predict模型神经网络, 测试)

隐藏层降维

因为我用了一个瓶颈模型中间的隐藏层有两个节点,我们可以使用这种降维来探索我们的特征空间(类似于我们可以用主成分分析来做的事情)。我们可以使用H2O.深部特征(函数并绘制它以显示输入数据的简化表示。

训练特征 < H2o.deepfeatures模型神经网络, 无监督培训,  = 2) % > %
  as.data.frame() % > %
  突变 = as.vector无监督培训(, 三十一)))
格格图训练特征, aesx = DF.L2.C1, y = DF.L2.C2, 颜色 =  +
  geom_pointα = 零点一)

在这里,我们没有看到与非欺诈实例不同的欺诈交易集群,因此,仅使用我们的AutoEncoder模型进行维度缩减不足以识别此数据集中的欺诈行为。

但是我们可以使用其中一个隐藏层的降维表示作为模型训练的特征。例如,使用第一个或第三个隐藏层的10个功能:

让我们看第三个隐藏层训练特征 < H2o.deepfeatures模型神经网络, 无监督培训,  = 3.) % > %
  as.data.frame() % > %
  突变 = A.因子as.vector无监督培训(, 三十一)))) % > %
  A.H2O()
features_dim < 塞特夫姓氏训练特征 响应)
model_nn_dim < H2o.deeplearningy = 响应,
                               x = features_dim,
                               training_frame = 训练特征,
                               可再生的 = 真的, 对于真正的问题,慢慢关闭                               balance_classes = 真的,
                               忽略常量 = ,
                               种子 = 四十二,
                               隐藏的 = c, 2,  
                               时代 = One hundred.,
                               激活 = ”“双曲正切)
H2O.SaveModmodel_nn_dim, 路径=“model_nn_dim”,  = 真的)
model_nn_dim < H2o.loadModel“model_nn_dim / DeepLearning_model_R_1493574057843_49”)
model_nn_dim
##模型详细信息:神经元层状态:预测类,双阶级分类,伯努利分布CrossEntropy损失,184个权重/偏差,7.1千克,4098024个培训样本,mini-batch size 1##   layer units    type dropout       l1       l2 mean_rate rate_rms## 1     1    10   Input  0.00 %                                     ## 2     2    10    Tanh  0.00 % 0.000000 0.000000  0.299549 0.363303## 3     3     2    Tanh  0.00 % 0.000000 0.000000  0.009907 0.012193## 4     4    10    Tanh  0.00 % 0.000000 0.000000  0.248854 0.126722## 5     5     2 Softmax         0.000000 0.000000  0.160990 0.078139##   momentum mean_weight weight_rms mean_bias bias_rms## 1                                                   ## 2 0.000000   -0.539949   4.601841 -0.060170 2.765655## 3 0.000000   -0.384247   1.763649 -1.429832 0.570700## 4 0.000000   -0.004865   0.774441 -0.320202 0.668747## 5 0.000000    0.563951   1.365125  0.000000 0.397460## ## ## H2OBinomialMetrics: deeplearning## ** Reported on training data.\353535353535\\\\35; 35\ \35; \35\\ \\\\\\\\\\35\\\\\\\\35; \\\混淆矩阵(垂直:实际;横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横1最大F1 0.002173 0.0.706275 300 \35\35\35; \35\\\35;\\ \\35; \35; \ \ \ \ \\\ \\\\35; \\ \\\\\\最大特异性0.030005 1.000000 0 8 max absolute诳mcc 0.002173 0.302697 300诳诳9 max min诳u per诳u类精度0.002590 0.554634 277诳诳10 max mean诳u per诳u类精度0.002531 0.62276 280诳诳诳增益/升力表:用“H2O.gains lift”提取(
         
          ,
          )`或'H2O.Gainslift(
           
            ,有效=
            
             ,xval =
             
              )”
             
            
           
         

为了测量模型在测试数据上的性能,我们需要将测试数据转换为与培训数据相同的缩减维度:

测试模糊 < H2o.deepfeatures模型神经网络, 测试,  = 3.)
H2o.predictmodel_nn_dim, 测试模糊) % > %
  as.data.frame() % > %
  突变实际的 = as.vector测试(, 三十一))) % > %
  group_by实际的, 预测) % > %
  总结n = n() % > %
  突变频率 = n / 总和n
来源:本地数据帧[4×4]组:实际的[2]预测n频率
           
           
                 
            
             # 10 0 16710 0.29506286 2 0 1 39922 0.70493714 3 10 7 0.07608696 4 1 1 1 85 0.92391304
            
           
          
         

现在,这实际上在识别欺诈案件方面看起来相当不错:92%的欺诈案件被识别!然而,许多非欺诈案件也被归类为欺诈。对于现实生活中的应用程序,这不是一个好模型。让我们试试其他一些技巧……

异常检测

我们还可以询问在我们的测试数据中哪些实例被认为是异常值或异常,使用H2O函数。基于之前培训过的自动编码器模型,输入数据将被重建,对于每个实例,计算了实际值与重构值之间的均方误差(mean squared error, MSE)。

我还计算了两个类标签的平均MSE。

异常 < H2O.异常模型神经网络, 测试) % > %
  as.data.frame() % > %
  蒂伯尔::rownames_to_column() % > %
  突变 = as.vector测试(, 三十一)))

mean_mse < 异常 % > %
  group_by) % > %
  总结意思是 = 意思是重建.mse

这一点,现在我们可以画出:

格格图异常, aesx = as.numericrowname y = 重建.mse, 颜色 = A.因子)) +
  geom_pointα = 0.3) +
  geom_hline数据 = mean_mse, aesyintercept = 意思是, 颜色 =  +
  scale_color_brewer调色板 = “set2”中的) +
  实验室x = “实例”,
       颜色 = “班”)

正如我们在情节中看到的,对于欺诈和非欺诈案件没有完美的分类,但对于欺诈交易而言,平均MSE明显高于常规交易。

我们现在可以通过对我们认为的异常值应用MSE阈值来识别异常值实例。我们可以如。假设我们认为mse>0.02(根据上面的图选择)的每个实例都是异常/异常值。

异常 < 异常 % > %
  突变离群值 = ifelse重建.mse > 0.02, “离群值”, “no_outlier”

异常 % > %
  group_by, 离群值) % > %
  总结n = n() % > %
  突变频率 = n / 总和n 
##来源:本地数据帧[4 x 4]组:类[2]类离群值n频率##
               
           
                   
            
             1 0 no_outlier 56602 0.9994702642 2 0 outlier 30 0.0005297358 3 1 0 no_outlier 60 0.6521739130 4 1 1 outlier 32 0.3478260870
            
           
          
         

正如我们所看到的,离群值检测也不足以正确分类欺诈性信用卡交易(至少不包括此数据集)。

预培训监督模型

我们现在可以尝试使用AutoEncoder模型作为受监控模型的预培训输入。在这里,我再次使用神经网络。这个模型现在将使用来自自动编码器的权重进行模型拟合。

模型nn2 < H2o.deeplearningy = 响应,
                               x = 特征,
                               training_frame = 列车监控,
                               预培训的自动编码器  = “模型神经网络”,
                               可再生的 = 真的, 对于真正的问题,慢慢关闭                               balance_classes = 真的,
                               忽略常量 = ,
                               种子 = 四十二,
                               隐藏的 = c, 2,  
                               时代 = One hundred.,
                               激活 = ”“双曲正切)
H2O.SaveMod模型nn2, 路径=“模型nn2”,  = 真的)
模型nn2 < H2o.loadModel“型号\u nn_2/Deeplarning_型号\u r_1493574057843_9”)
模型nn2
##模型详细信息:神经元层状态:预测类,双阶级分类,伯努利分布CrossEntropy损失,424个重量/偏差,11.7千克,3643248个训练样本,小批量1 \\35\\35\35\35\35\35\\35\35\\35\35\35\\35\35\\\\\\\\\\\\\\\.21美元0337 0.326239 \355555 2 SoftMax 0.000000 0.000000 0.000000 0.137694 0.123830 \35\\3537 0.326239 35\35\35 35  35 \35\\35\\\35\\\35\\\\\\\35555555555555550.105522 4 0.000000 0.934361 1.759343 0.3047290.532527 5 0.000000-0.133149 2.641065 2.392999 3.137845 H二项式测量:在培训数据上报告的去皱**。\353535353535\35\\\35;\35; 35\\35;\35\\35\\\35\\35\\\35\35\\\35\\\\\\\\\\混淆矩阵(垂直:实际;横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横横1米ax f1 0.134320 0.998288 96 2 max f2 0.134320 0.999314 96 3 max f0 point5 0.134320 0.997263 96 4 max accuracy 0.134320 0.998295 96 5 max precision 1.0000001.000000 0 0 6 max recall 0.134320 1.000000 96 7 max specificity 1.000000 1.000000 8 max absolute诳mcc 0.134320 0.996597 96诳诳9 max min诳u per诳u类精度0.134320 0.996612 96诳10 max mean诳u per诳u类精度0.134320 0.998306 96(
         
          ,
          )`或'H2O.Gainslift(
           
            ,有效=
            
             ,xval =
             
              )”
             
            
           
         
pred < as.data.frameH2o.predict对象 = 模型nn2, 新数据 = 测试 % > %
  突变实际的 = as.vector测试(, 三十一)))
pred % > %
  group_by实际的, 预测) % > %
  总结n = n() % > %
  突变频率 = n / 总和n 
##来源:本地数据帧[4 x 4]组:实际[2]实际预测n频率##
           
           
                  
            
             # 10 0 56512 0.997881057 20 1 120 0.002118943 3 10 16 0.173913043 4 11 76 0.826086957
            
           
          
         
pred % > %
  格格图aesx = 实际的, 填满 = 预测 +
    geom_bar() +
    主题BW() +
    秤灌装机调色板 = “set2”中的) +
    端面缠绕 ~ 实际的, 尺度 = “免费”, ncol = 2)

现在,这看起来好多了!我们确实错过了17%的欺诈案件,但我们也没有错误地分类太多的非欺诈案件。

在现实生活中,我们现在将花费更多的时间来改进模型,例如执行超参数优化的网格搜索,回到最初的特性(我们在这里没有),尝试不同的工程特性和/或尝试不同的算法。但在这里,我就讲到这里。

在高度不平衡数据上测量模型性能

由于对非欺诈案件的严重偏见,我们不能使用诸如精度或曲线下面积(AUC)等性能指标,因为他们会根据多数阶级正确分类的高比例得出过于乐观的结果。

AUC的另一种替代方法是使用精确-回忆曲线或敏感性(回忆)-特异性曲线。要计算和绘制这些指标,我们可以使用ROCR包裹。计算曲线下的面积有多种方法(参见普罗克但我将使用一个简单的函数来计算X的每个连续点对之间的面积(即X1-X0,X2-X1,等)。

图书馆ROCR)

# http://stackoverflow.com/questions/24563061/computing-integral-of-a-line-plot-in-r线性积分 < 函数x, y) {
  DX < 微分x)
  结束 < 长度y)
  我的 < y(:结束 - - - - - - )] + y(2:结束]) / 2
  总和DX * 我的)
} 

prediction_obj < 预测pred$p, pred$实际的)
票面价值mfrow = c, 2
票面价值马尔 = c五点一,4.1,4.1,二点一

# precision-recall曲线perf1 < 性能prediction_obj, 测量 = ”前的“, X测度 = “录制”) 

x < perf1@x.值[[]]
y < perf1@y.values[[]]
y(] < 0

情节perf1, 主要的 = 粘贴“决策调用曲线下的区域:\n”, 腹肌线性积分x,y 数字 = 3.))

#敏感性特异性曲线perf2 < 性能prediction_obj, 测量 = “森斯”, X测度 = “规范”) 

x < perf2@x.值[[]]
y < perf2@y.values[[]]
y(] < 0

情节perf2, 主要的 = 粘贴\nSensitivity-Specificity曲线下面积:\n, 腹肌线性积分x,y 数字 = 3.))

精确度是预测为欺诈的测试用例所占的比例,而这些测试用例实际上是欺诈的。真正积极的预测),而召回或敏感性是指被认定为欺诈的欺诈案件的比例。特异性是指非欺诈案件中被认定为非欺诈的比例。

精确召回曲线告诉我们正确的欺诈预测与检测到的欺诈案件比例之间的关系(例如如果所有或大部分欺诈案件都已查明,我们也有许多非欺诈案例被预测为欺诈,反之亦然)。因此,敏感性-特异性曲线告诉我们正确识别的两类标签之间的关系。如果我们有100%正确分类的欺诈案例,我们将没有正确分类的非欺诈案件,反之亦然)。

我们也可以从不同的角度来看,通过手动通过不同的预测阈值,计算出两类中有多少情况被正确分类:

阈值 < SEQ = 0,  = , 通过 = 零点一)
前阈 < 数据帧实际的 = pred$实际的)

 门槛 在里面 阈值) {
  
  预测 < ifelsepred$p > 门槛, , 0)
  预测真 < ifelse前阈$实际的 = = 预测, 真的, )
  前阈 < cbind前阈, 预测真)

}

姓氏前阈-1] < 阈值
前阈 % > %
  聚集x, y, 2:ncol前阈 % > %
  group_by实际的, x, y) % > %
  总结n = n() % > %
  格格图aesx = as.numericx y = n, 颜色 = 实际的 +
    geom_vlinexintercept = 零点六, α = 零点五) +
    geom_line() +
    geom_pointα = 零点五) +
    主题BW() +
    端面缠绕实际的 ~ y, 尺度 = “免费”, ncol = 2) +
    实验室x = “预测阈值”,
         y = “的实例数量”)

这个图告诉我们,当我们将预测阈值从默认的0.5增加到0.6时,我们可以在不丢失正确分类的欺诈案例的情况下增加正确分类的非欺诈案例的数量:

pred % > %
  突变预测 = ifelsepred$p > 零点六, , 0 % > %
  group_by实际的, 预测) % > %
  总结n = n() % > %
  突变频率 = n / 总和n 
##来源:本地数据帧[4 x 4]组:实际[2]实际预测n频率##
            
           
                  
            
             # 1 00 56558 0.998693318# 2 01 74 0.001306682# 31 0 16 0.173913043# 4 1 1 76 0.826086957
            
           
          
         

我们的最终模型现在正确地识别了83%的欺诈案例和几乎100%的非欺诈案例。


如果你对更多的机器学习帖子感兴趣,看看类别列表machine_learning在我的博客上


sessionInfo()
## R version 3.4.0 (2017-04-21)## Platform: x86_64-apple-darwin15.6.0 (64-bit)## Running under: macOS Sierra 10.12.3## ## Matrix products: default## BLAS: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRblas.0.dylib## LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib## ## locale:## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8## ## attached base packages:## [1] stats     graphics  grDevices utils     datasets  methods   base     ## ## other attached packages:##  [1] ROCR_1.0-7      gplots_3.0.1    h2o_3.10.4.4    dplyr_0.5.0    ##  [5] purrr_0.2.2     readr_1.1.0     tidyr_0.6.1     tibble_1.3.0   ##  [9] ggplot2_2.2.1   tidyverse_1.1.1## ## loaded via a namespace (and not attached):##  [1] gtools_3.5.0       reshape2_1.4.2     haven_1.0.0       ##  [4] lattice_0.20-35    colorspace_1.3-2   htmltools_0.3.6   ##  [7] yaml_2.1.14        foreign_0.8-68     DBI_0.6-1         ## [10] RColorBrewer_1.1-2 modelr_0.1.0       readxl_1.0.0      ## [13] plyr_1.8.4         stringr_1.2.0      munsell_0.4.3     ## [16] gtable_0.2.0       cellranger_1.1.0   rvest_0.3.2       ## [19] caTools_1.17.1     psych_1.7.3.21     evaluate_0.10     ## [22] labeling_0.3       knitr_1.15.1       forcats_0.2.0     ## [25] parallel_3.4.0     broom_0.4.2        Rcpp_0.12.10      ## [28] KernSmooth_2.23-15 scales_0.4.1       backports_1.0.5   ## [31] gdata_2.17.0       jsonlite_1.4       mnormt_1.5-5      ## [34] hms_0.3            digest_0.6.12      stringi_1.1.5     ## [37] grid_3.4.0         rprojroot_1.2      tools_3.4.0       ## [40] bitops_1.0-6       magrittr_1.5       lazyeval_0.2.0    ## [43] RCurl_1.95-4.8     xml2_1.1.1         lubridate_1.6.0   ## [46] assertthat_0.2.0   rmarkdown_1.5      httr_1.2.1        ## [49] R6_2.2.0           nlme_3.1-131       compiler_3.4.0

留下评论的作者,请关注他们的博客链接并发表评论: Shirin游乐场

188bet appR博客提供 每天更新的电子邮件金宝搏网址 R新闻和 教程关于下列主题: 数据科学, 大数据, R的工作,可视化( ggplot2, 箱形图, 地图, 动画)编程( RStudio, Sweave, 乳胶, SQL, 日食, 吉特, hadoop, 网页抓取)统计 回归, 主成分分析, 时间序列, 交易还有更多…



如果你走这么远,为什么不 订阅更新 从站点?选择你的味道: 电子邮件, 推特, 1188bet app,或 脸谱网

评论都关门了。

搜索R-blo188bet appggers


赞助商

永远不要错过更新!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

点击此处关闭(此弹出窗口将不再出现)