精华内容
下载资源
问答
  • 1.样本的主要行为样本启动后会向系统目录下面释放一个被加密的ELF文件,母包会联网下载广告图片,推送弹框广告; SK文件检测模拟器和虚拟机环境,干扰沙箱检测apk文件; 释放的ELF文件会获取系统权限,破坏卸载其他...
     1.样本的主要行为
    
    • 样本启动后会向系统目录下面释放一个被加密的ELF文件,母包会联网下载广告图片,推送弹框广告;
    • SK文件检测模拟器和虚拟机环境,干扰沙箱检测apk文件;
    • 释放的ELF文件会获取系统权限,破坏卸载其他root工具的正常使用,导致恶意的ELF文件无法被删除;
    • ELF文件同时会从远端获取指令,静默下载安装其他其他恶意子包,且安装的系统目录下面导致无法卸载;
    • 恶意子包进一步获取从远端获取指令静默下载安装其他恶意子包; 恶意子包的行为静默安装卸载,获取用户安装的文件信息并上传到远端服务器;
    • 同时恶意的ELF文件会获取用户手机类的杀软信息伪造杀软更新或者系统更新,进而更近一步诱导用户去点击安装已经下载的应用;

     2.病毒行为流程图
    
    • 整个母包子包和恶意ELF行为流程如下

    流程图

    展开全文
  • 商业计划样本(模板)

    2010-05-12 13:16:17
    以下是本样本目录表。注意,当你作好你的商业计划书后,要重新编排页码。有关图表信息请参阅本样本第九章,提供这些信息资料的编排意见。 第一章:摘要 3 第二章:公司介绍 6 一、宗旨(任务) 6 二、公司简介 6 三...
  • IMDb,CC,MOC,FIB,将项目标题与douban ID连接的各种广告牌。 所有等级列表 请参见CSV文件分配代码段 未分配: 豆瓣TOP 250: 如何建立排行榜 在data目录中上传排名数据文件,例如01_IMDbtop250.csv 。 文件名...
  • 文章目录一 个性化电商广告推荐系统介绍1.1 数据集介绍1.2 项目效果展示1.3 项目实现分析1.4 点击率预测(CTR--Click-Through-Rate)概念 一 个性化电商广告推荐系统介绍 1.1 数据集介绍 Ali_Display_Ad_Click是阿里...

    一 个性化电商广告推荐系统介绍

    1.1 数据集介绍

    • Ali_Display_Ad_Click是阿里巴巴提供的一个淘宝展示广告点击率预估数据集

      数据集来源:天池竞赛

    • 原始样本骨架raw_sample

      淘宝网站中随机抽样了114万用户8天内的广告展示/点击日志(2600万条记录),构成原始的样本骨架。 字段说明如下:

      1. user_id:脱敏过的用户ID;
      2. adgroup_id:脱敏过的广告单元ID;
      3. time_stamp:时间戳;
      4. pid:资源位;
      5. noclk:为1代表没有点击;为0代表点击;
      6. clk:为0代表没有点击;为1代表点击;

      用前面7天的做训练样本(20170506-20170512),用第8天的做测试样本(20170513)

    • 广告基本信息表ad_feature

      本数据集涵盖了raw_sample中全部广告的基本信息(约80万条目)。字段说明如下:

      1. adgroup_id:脱敏过的广告ID;
      2. cate_id:脱敏过的商品类目ID;
      3. campaign_id:脱敏过的广告计划ID;
      4. customer_id: 脱敏过的广告主ID;
      5. brand_id:脱敏过的品牌ID;
      6. price: 宝贝的价格

      其中一个广告ID对应一个商品(宝贝),一个宝贝属于一个类目,一个宝贝属于一个品牌。

    • 用户基本信息表user_profile

      本数据集涵盖了raw_sample中全部用户的基本信息(约100多万用户)。字段说明如下:

      1. userid:脱敏过的用户ID;
      2. cms_segid:微群ID;
      3. cms_group_id:cms_group_id;
      4. final_gender_code:性别 1:男,2:女;
      5. age_level:年龄层次; 1234
      6. pvalue_level:消费档次,1:低档,2:中档,3:高档;
      7. shopping_level:购物深度,1:浅层用户,2:中度用户,3:深度用户
      8. occupation:是否大学生 ,1:是,0:否
      9. new_user_class_level:城市层级
    • 用户的行为日志behavior_log

      本数据集涵盖了raw_sample中全部用户22天内的购物行为(共七亿条记录)。字段说明如下:

      user:脱敏过的用户ID;
      time_stamp:时间戳;
      btag:行为类型, 包括以下四种:
      ​ 类型 | 说明
      ​ pv | 浏览
      ​ cart | 加入购物车
      ​ fav | 喜欢
      ​ buy | 购买
      cate_id:脱敏过的商品类目id;
      brand_id: 脱敏过的品牌id;
      这里以user + time_stamp为key,会有很多重复的记录;这是因为我们的不同的类型的行为数据是不同部门记录的,在打包到一起的时候,实际上会有小的偏差(即两个一样的time_stamp实际上是差异比较小的两个时间)

    1.2 项目效果展示

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhalIRQ0-1584263257718)(img/1545049355235.png)]

    1.3 项目实现分析

    • 主要包括

      • 一份广告点击的样本数据raw_sample.csv:体现的是用户对不同位置广告点击、没点击的情况
      • 一份广告基本信息数据ad_feature.csv:体现的是每个广告的类目(id)、品牌(id)、价格特征
      • 一份用户基本信息数据user_profile.csv:体现的是用户群组、性别、年龄、消费购物档次、所在城市级别等特征
      • 一份用户行为日志数据behavior_log.csv:体现用户对商品类目(id)、品牌(id)的浏览、加购物车、收藏、购买等信息

      我们是在对非搜索类型的广告进行点击率预测和推荐(没有搜索词、没有广告的内容特征信息)

      1. 推荐业务处理主要流程: 召回 ===> 排序 ===> 过滤
        • 离线处理业务流
          • raw_sample.csv ==> 历史样本数据
          • ad_feature.csv ==> 广告特征数据
          • user_profile.csv ==> 用户特征数据
          • raw_sample.csv + ad_feature.csv + user_profile.csv ==> CTR点击率预测模型
          • behavior_log.csv ==> 评分数据 ==> user-cate/brand评分数据 ==> 协同过滤 ==> top-N cate/brand ==> 关联广告
          • 协同过滤召回 ==> top-N cate/brand ==> 关联对应的广告完成召回
        • 在线处理业务流
          • 数据处理部分:
            • 实时行为日志 ==> 实时特征 ==> 缓存
            • 实时行为日志 ==> 实时商品类别/品牌 ==> 实时广告召回集 ==> 缓存
          • 推荐任务部分:
            • CTR点击率预测模型 + 广告/用户特征(缓存) + 对应的召回集(缓存) ==> 点击率排序 ==> top-N 广告推荐结果
      2. 涉及技术:Flume、Kafka、Spark-streming\HDFS、Spark SQL、Spark ML、Redis
        • Flume:日志数据收集
        • Kafka:实时日志数据处理队列
        • HDFS:存储数据
        • Spark SQL:离线处理
        • Spark ML:模型训练
        • Redis:缓存

    1.4 点击率预测(CTR–Click-Through-Rate)概念

    • 电商广告推荐通常使用广告点击率(CTR–Click-Through-Rate)预测来实现

      点击率预测 VS 推荐算法

      点击率预测需要给出精准的点击概率,比如广告A点击率0.5%、广告B的点击率0.12%等;而推荐算法很多时候只需要得出一个最优的次序A>B>C即可。

      点击率预测使用的算法通常是如逻辑回归(Logic Regression)这样的机器学习算法,而推荐算法则是一些基于协同过滤推荐、基于内容的推荐等思想实现的算法

      点击率 VS 转化率

      点击率预测是对每次广告的点击情况做出预测,可以判定这次为点击或不点击,也可以给出点击或不点击的概率

      转化率指的是从状态A进入到状态B的概率,电商的转化率通常是指到达网站后,进而有成交记录的用户比率,如用户成交量/用户访问量

      搜索和非搜索广告点击率预测的区别

      搜索中有很强的搜索信号-“查询词(Query)”,查询词和广告内容的匹配程度很大程度影响了点击概率,搜索广告的点击率普遍较高

      非搜索广告(例如展示广告,信息流广告)的点击率的计算很多就来源于用户的兴趣和广告自身的特征,以及上下文环境。通常好位置能达到百分之几的点击率。对于很多底部的广告,点击率非常低,常常是千分之几,甚至更低

    展开全文
  • 本小节主要根据广告点击样本数据集(raw_sample)、广告基本特征数据集(ad_feature)、用户基本信息数据集(user_profile)构建出了一个完整的样本数据集,并按日期划分为了训练集(前七天)和测试集(最后一天),利...

    四 LR实现CTR预估

    4.1 Spark逻辑回归(LR)训练点击率预测模型

    • 本小节主要根据广告点击样本数据集(raw_sample)、广告基本特征数据集(ad_feature)、用户基本信息数据集(user_profile)构建出了一个完整的样本数据集,并按日期划分为了训练集(前七天)和测试集(最后一天),利用逻辑回归进行训练。

      训练模型时,通过对类别特征数据进行处理,一定程度达到提高了模型的效果

    '''从HDFS中加载样本数据信息'''
    _raw_sample_df1 = spark.read.csv("hdfs://localhost:9000/data/raw_sample.csv", header=True)
    # _raw_sample_df1.show()    # 展示数据,默认前20条
    # 更改表结构,转换为对应的数据类型
    from pyspark.sql.types import StructType, StructField, IntegerType, FloatType, LongType, StringType
      
    # 更改df表结构:更改列类型和列名称
    _raw_sample_df2 = _raw_sample_df1.\
        withColumn("user", _raw_sample_df1.user.cast(IntegerType())).withColumnRenamed("user", "userId").\
        withColumn("time_stamp", _raw_sample_df1.time_stamp.cast(LongType())).withColumnRenamed("time_stamp", "timestamp").\
        withColumn("adgroup_id", _raw_sample_df1.adgroup_id.cast(IntegerType())).withColumnRenamed("adgroup_id", "adgroupId").\
        withColumn("pid", _raw_sample_df1.pid.cast(StringType())).\
        withColumn("nonclk", _raw_sample_df1.nonclk.cast(IntegerType())).\
        withColumn("clk", _raw_sample_df1.clk.cast(IntegerType()))
    _raw_sample_df2.printSchema()
    _raw_sample_df2.show()
    
    # 样本数据pid特征处理
    from pyspark.ml.feature import OneHotEncoder
    from pyspark.ml.feature import StringIndexer
    from pyspark.ml import Pipeline
    
    stringindexer = StringIndexer(inputCol='pid', outputCol='pid_feature')
    encoder = OneHotEncoder(dropLast=False, inputCol='pid_feature', outputCol='pid_value')
    pipeline = Pipeline(stages=[stringindexer, encoder])
    pipeline_fit = pipeline.fit(_raw_sample_df2)
    raw_sample_df = pipeline_fit.transform(_raw_sample_df2)
    raw_sample_df.show()
    
    '''pid和特征的对应关系
    430548_1007:0
    430549_1007:1
    '''
    

    显示结果:

    root
     |-- userId: integer (nullable = true)
     |-- timestamp: long (nullable = true)
     |-- adgroupId: integer (nullable = true)
     |-- pid: string (nullable = true)
     |-- nonclk: integer (nullable = true)
     |-- clk: integer (nullable = true)
    
    +------+----------+---------+-----------+------+---+
    |userId| timestamp|adgroupId|        pid|nonclk|clk|
    +------+----------+---------+-----------+------+---+
    |581738|1494137644|        1|430548_1007|     1|  0|
    |449818|1494638778|        3|430548_1007|     1|  0|
    |914836|1494650879|        4|430548_1007|     1|  0|
    |914836|1494651029|        5|430548_1007|     1|  0|
    |399907|1494302958|        8|430548_1007|     1|  0|
    |628137|1494524935|        9|430548_1007|     1|  0|
    |298139|1494462593|        9|430539_1007|     1|  0|
    |775475|1494561036|        9|430548_1007|     1|  0|
    |555266|1494307136|       11|430539_1007|     1|  0|
    |117840|1494036743|       11|430548_1007|     1|  0|
    |739815|1494115387|       11|430539_1007|     1|  0|
    |623911|1494625301|       11|430548_1007|     1|  0|
    |623911|1494451608|       11|430548_1007|     1|  0|
    |421590|1494034144|       11|430548_1007|     1|  0|
    |976358|1494156949|       13|430548_1007|     1|  0|
    |286630|1494218579|       13|430539_1007|     1|  0|
    |286630|1494289247|       13|430539_1007|     1|  0|
    |771431|1494153867|       13|430548_1007|     1|  0|
    |707120|1494220810|       13|430548_1007|     1|  0|
    |530454|1494293746|       13|430548_1007|     1|  0|
    +------+----------+---------+-----------+------+---+
    only showing top 20 rows
    
    +------+----------+---------+-----------+------+---+-----------+-------------+
    |userId| timestamp|adgroupId|        pid|nonclk|clk|pid_feature|    pid_value|
    +------+----------+---------+-----------+------+---+-----------+-------------+
    |581738|1494137644|        1|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |449818|1494638778|        3|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |914836|1494650879|        4|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |914836|1494651029|        5|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |399907|1494302958|        8|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |628137|1494524935|        9|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |298139|1494462593|        9|430539_1007|     1|  0|        1.0|(2,[1],[1.0])|
    |775475|1494561036|        9|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |555266|1494307136|       11|430539_1007|     1|  0|        1.0|(2,[1],[1.0])|
    |117840|1494036743|       11|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |739815|1494115387|       11|430539_1007|     1|  0|        1.0|(2,[1],[1.0])|
    |623911|1494625301|       11|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |623911|1494451608|       11|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |421590|1494034144|       11|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |976358|1494156949|       13|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |286630|1494218579|       13|430539_1007|     1|  0|        1.0|(2,[1],[1.0])|
    |286630|1494289247|       13|430539_1007|     1|  0|        1.0|(2,[1],[1.0])|
    |771431|1494153867|       13|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |707120|1494220810|       13|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    |530454|1494293746|       13|430548_1007|     1|  0|        0.0|(2,[0],[1.0])|
    +------+----------+---------+-----------+------+---+-----------+-------------+
    only showing top 20 rows
    
    'pid和特征的对应关系\n430548_1007:0\n430549_1007:1\n'
    
    • 从HDFS中加载广告基本信息数据
    _ad_feature_df = spark.read.csv("hdfs://localhost:9000/datasets/ad_feature.csv", header=True)
    
    # 更改表结构,转换为对应的数据类型
    from pyspark.sql.types import StructType, StructField, IntegerType, FloatType
    
    # 替换掉NULL字符串
    _ad_feature_df = _ad_feature_df.replace("NULL", "-1")
     
    # 更改df表结构:更改列类型和列名称
    ad_feature_df = _ad_feature_df.\
        withColumn("adgroup_id", _ad_feature_df.adgroup_id.cast(IntegerType())).withColumnRenamed("adgroup_id", "adgroupId").\
        withColumn("cate_id", _ad_feature_df.cate_id.cast(IntegerType())).withColumnRenamed("cate_id", "cateId").\
        withColumn("campaign_id", _ad_feature_df.campaign_id.cast(IntegerType())).withColumnRenamed("campaign_id", "campaignId").\
        withColumn("customer", _ad_feature_df.customer.cast(IntegerType())).withColumnRenamed("customer", "customerId").\
        withColumn("brand", _ad_feature_df.brand.cast(IntegerType())).withColumnRenamed("brand", "brandId").\
        withColumn("price", _ad_feature_df.price.cast(FloatType()))
    ad_feature_df.printSchema()
    ad_feature_df.show()
    

    显示结果:

    root
     |-- adgroupId: integer (nullable = true)
     |-- cateId: integer (nullable = true)
     |-- campaignId: integer (nullable = true)
     |-- customerId: integer (nullable = true)
     |-- brandId: integer (nullable = true)
     |-- price: float (nullable = true)
    
    +---------+------+----------+----------+-------+-----+
    |adgroupId|cateId|campaignId|customerId|brandId|price|
    +---------+------+----------+----------+-------+-----+
    |    63133|  6406|     83237|         1|  95471|170.0|
    |   313401|  6406|     83237|         1|  87331|199.0|
    |   248909|   392|     83237|         1|  32233| 38.0|
    |   208458|   392|     83237|         1| 174374|139.0|
    |   110847|  7211|    135256|         2| 145952|32.99|
    |   607788|  6261|    387991|         6| 207800|199.0|
    |   375706|  4520|    387991|         6|     -1| 99.0|
    |    11115|  7213|    139747|         9| 186847| 33.0|
    |    24484|  7207|    139744|         9| 186847| 19.0|
    |    28589|  5953|    395195|        13|     -1|428.0|
    |    23236|  5953|    395195|        13|     -1|368.0|
    |   300556|  5953|    395195|        13|     -1|639.0|
    |    92560|  5953|    395195|        13|     -1|368.0|
    |   590965|  4284|     28145|        14| 454237|249.0|
    |   529913|  4284|     70206|        14|     -1|249.0|
    |   546930|  4284|     28145|        14|     -1|249.0|
    |   639794|  6261|     70206|        14|  37004| 89.9|
    |   335413|  4284|     28145|        14|     -1|249.0|
    |   794890|  4284|     70206|        14| 454237|249.0|
    |   684020|  6261|     70206|        14|  37004| 99.0|
    +---------+------+----------+----------+-------+-----+
    only showing top 20 rows
    
    • 从HDFS加载用户基本信息数据
    from pyspark.sql.types import StructType, StructField, StringType, IntegerType, LongType, FloatType
    
    # 构建表结构schema对象
    schema = StructType([
        StructField("userId", IntegerType()),
        StructField("cms_segid", IntegerType()),
        StructField("cms_group_id", IntegerType()),
        StructField("final_gender_code", IntegerType()),
        StructField("age_level", IntegerType()),
        StructField("pvalue_level", IntegerType()),
        StructField("shopping_level", IntegerType()),
        StructField("occupation", IntegerType()),
        StructField("new_user_class_level", IntegerType())
    ])
    # 利用schema从hdfs加载
    _user_profile_df1 = spark.read.csv("hdfs://localhost:9000/datasets/user_profile.csv", header=True, schema=schema)
    # user_profile_df.printSchema()
    # user_profile_df.show()
    
    '''对缺失数据进行特征热编码'''
    from pyspark.ml.feature import OneHotEncoder
    from pyspark.ml.feature import StringIndexer
    from pyspark.ml import Pipeline
    
    # 使用热编码转换pvalue_level的一维数据为多维,增加n-1个虚拟变量,n为pvalue_level的取值范围
    
    # 需要先将缺失值全部替换为数值,便于处理,否则会抛出异常
    from pyspark.sql.types import StringType
    _user_profile_df2 = _user_profile_df1.na.fill(-1)
    # _user_profile_df2.show()
    
    # 热编码时,必须先将待处理字段转为字符串类型才可处理
    _user_profile_df3 = _user_profile_df2.withColumn("pvalue_level", _user_profile_df2.pvalue_level.cast(StringType()))\
        .withColumn("new_user_class_level", _user_profile_df2.new_user_class_level.cast(StringType()))
    # _user_profile_df3.printSchema()
    
    # 对pvalue_level进行热编码,求值
    # 运行过程是先将pvalue_level转换为一列新的特征数据,然后对该特征数据求出的热编码值,存在了新的一列数据中,类型为一个稀疏矩阵
    stringindexer = StringIndexer(inputCol='pvalue_level', outputCol='pl_onehot_feature')
    encoder = OneHotEncoder(dropLast=False, inputCol='pl_onehot_feature', outputCol='pl_onehot_value')
    pipeline = Pipeline(stages=[stringindexer, encoder])
    pipeline_fit = pipeline.fit(_user_profile_df3)
    _user_profile_df4 = pipeline_fit.transform(_user_profile_df3)
    # pl_onehot_value列的值为稀疏矩阵,存储热编码的结果
    # _user_profile_df4.printSchema()
    # _user_profile_df4.show()
    
    # 使用热编码转换new_user_class_level的一维数据为多维
    stringindexer = StringIndexer(inputCol='new_user_class_level', outputCol='nucl_onehot_feature')
    encoder = OneHotEncoder(dropLast=False, inputCol='nucl_onehot_feature', outputCol='nucl_onehot_value')
    pipeline = Pipeline(stages=[stringindexer, encoder])
    pipeline_fit = pipeline.fit(_user_profile_df4)
    user_profile_df = pipeline_fit.transform(_user_profile_df4)
    user_profile_df.show()
    

    显示结果:

    +------+---------+------------+-----------------+---------+------------+--------------+----------+--------------------+-----------------+---------------+-------------------+-----------------+
    |userId|cms_segid|cms_group_id|final_gender_code|age_level|pvalue_level|shopping_level|occupation|new_user_class_level|pl_onehot_feature|pl_onehot_value|nucl_onehot_feature|nucl_onehot_value|
    +------+---------+------------+-----------------+---------+------------+--------------+----------+--------------------+-----------------+---------------+-------------------+-----------------+
    |   234|        0|           5|                2|        5|          -1|             3|         0|                   3|              0.0|  (4,[0],[1.0])|                2.0|    (5,[2],[1.0])|
    |   523|        5|           2|                2|        2|           1|             3|         1|                   2|              2.0|  (4,[2],[1.0])|                1.0|    (5,[1],[1.0])|
    |   612|        0|           8|                1|        2|           2|             3|         0|                  -1|              1.0|  (4,[1],[1.0])|                0.0|    (5,[0],[1.0])|
    |  1670|        0|           4|                2|        4|          -1|             1|         0|                  -1|              0.0|  (4,[0],[1.0])|                0.0|    (5,[0],[1.0])|
    |  2545|        0|          10|                1|        4|          -1|             3|         0|                  -1|              0.0|  (4,[0],[1.0])|                0.0|    (5,[0],[1.0])|
    |  3644|       49|           6|                2|        6|           2|             3|         0|                   2|              1.0|  (4,[1],[1.0])|                1.0|    (5,[1],[1.0])|
    |  5777|       44|           5|                2|        5|           2|             3|         0|                   2|              1.0|  (4,[1],[1.0])|                1.0|    (5,[1],[1.0])|
    |  6211|        0|           9|                1|        3|          -1|             3|         0|                   2|              0.0|  (4,[0],[1.0])|                1.0|    (5,[1],[1.0])|
    |  6355|        2|           1|                2|        1|           1|             3|         0|                   4|              2.0|  (4,[2],[1.0])|                3.0|    (5,[3],[1.0])|
    |  6823|       43|           5|                2|        5|           2|             3|         0|                   1|              1.0|  (4,[1],[1.0])|                4.0|    (5,[4],[1.0])|
    |  6972|        5|           2|                2|        2|           2|             3|         1|                   2|              1.0|  (4,[1],[1.0])|                1.0|    (5,[1],[1.0])|
    |  9293|        0|           5|                2|        5|          -1|             3|         0|                   4|              0.0|  (4,[0],[1.0])|                3.0|    (5,[3],[1.0])|
    |  9510|       55|           8|                1|        2|           2|             2|         0|                   2|              1.0|  (4,[1],[1.0])|                1.0|    (5,[1],[1.0])|
    | 10122|       33|           4|                2|        4|           2|             3|         0|                   2|              1.0|  (4,[1],[1.0])|                1.0|    (5,[1],[1.0])|
    | 10549|        0|           4|                2|        4|           2|             3|         0|                  -1|              1.0|  (4,[1],[1.0])|                0.0|    (5,[0],[1.0])|
    | 10812|        0|           4|                2|        4|          -1|             2|         0|                  -1|              0.0|  (4,[0],[1.0])|                0.0|    (5,[0],[1.0])|
    | 10912|        0|           4|                2|        4|           2|             3|         0|                  -1|              1.0|  (4,[1],[1.0])|                0.0|    (5,[0],[1.0])|
    | 10996|        0|           5|                2|        5|          -1|             3|         0|                   4|              0.0|  (4,[0],[1.0])|                3.0|    (5,[3],[1.0])|
    | 11256|        8|           2|                2|        2|           1|             3|         0|                   3|              2.0|  (4,[2],[1.0])|                2.0|    (5,[2],[1.0])|
    | 11310|       31|           4|                2|        4|           1|             3|         0|                   4|              2.0|  (4,[2],[1.0])|                3.0|    (5,[3],[1.0])|
    +------+---------+------------+-----------------+---------+------------+--------------+----------+--------------------+-----------------+---------------+-------------------+-----------------+
    only showing top 20 rows
    
    
    • 热编码中:"pvalue_level"特征对应关系:
    +------------+----------------------+
    |pvalue_level|pl_onehot_feature     |
    +------------+----------------------+
    |          -1|                   0.0|
    |           3|                   3.0|
    |           1|                   2.0|
    |           2|                   1.0|
    +------------+----------------------+
    
    • “new_user_class_level”的特征对应关系
    +--------------------+------------------------+
    |new_user_class_level|nucl_onehot_feature     |
    +--------------------+------------------------+
    |                  -1|                     0.0|
    |                   3|                     2.0|
    |                   1|                     4.0|
    |                   4|                     3.0|
    |                   2|                     1.0|
    +--------------------+------------------------+
    
    user_profile_df.groupBy("pvalue_level").min("pl_onehot_feature").show()
    user_profile_df.groupBy("new_user_class_level").min("nucl_onehot_feature").show()
    

    显示结果:

    +------------+----------------------+
    |pvalue_level|min(pl_onehot_feature)|
    +------------+----------------------+
    |          -1|                   0.0|
    |           3|                   3.0|
    |           1|                   2.0|
    |           2|                   1.0|
    +------------+----------------------+
    
    +--------------------+------------------------+
    |new_user_class_level|min(nucl_onehot_feature)|
    +--------------------+------------------------+
    |                  -1|                     0.0|
    |                   3|                     2.0|
    |                   1|                     4.0|
    |                   4|                     3.0|
    |                   2|                     1.0|
    +--------------------+------------------------+
    
    
    # raw_sample_df和ad_feature_df合并条件
    condition = [raw_sample_df.adgroupId==ad_feature_df.adgroupId]
    _ = raw_sample_df.join(ad_feature_df, condition, 'outer')
    
    # _和user_profile_df合并条件
    condition2 = [_.userId==user_profile_df.userId]
    datasets = _.join(user_profile_df, condition2, "outer")
    # 查看datasets的结构
    datasets.printSchema()
    # 查看datasets条目数
    print(datasets.count())
    

    显示结果:

    root
     |-- userId: integer (nullable = true)
     |-- timestamp: long (nullable = true)
     |-- adgroupId: integer (nullable = true)
     |-- pid: string (nullable = true)
     |-- nonclk: integer (nullable = true)
     |-- clk: integer (nullable = true)
     |-- pid_feature: double (nullable = true)
     |-- pid_value: vector (nullable = true)
     |-- adgroupId: integer (nullable = true)
     |-- cateId: integer (nullable = true)
     |-- campaignId: integer (nullable = true)
     |-- customerId: integer (nullable = true)
     |-- brandId: integer (nullable = true)
     |-- price: float (nullable = true)
     |-- userId: integer (nullable = true)
     |-- cms_segid: integer (nullable = true)
     |-- cms_group_id: integer (nullable = true)
     |-- final_gender_code: integer (nullable = true)
     |-- age_level: integer (nullable = true)
     |-- pvalue_level: string (nullable = true)
     |-- shopping_level: integer (nullable = true)
     |-- occupation: integer (nullable = true)
     |-- new_user_class_level: string (nullable = true)
     |-- pl_onehot_feature: double (nullable = true)
     |-- pl_onehot_value: vector (nullable = true)
     |-- nucl_onehot_feature: double (nullable = true)
     |-- nucl_onehot_value: vector (nullable = true)
    
    26557961
    
    • 训练CTRModel_Normal:直接将对应的特征的特征值组合成对应的特征向量进行训练
    # 剔除冗余、不需要的字段
    useful_cols = [
        # 
        # 时间字段,划分训练集和测试集
        "timestamp",
        # label目标值字段
        "clk",  
        # 特征值字段
        "pid_value",       # 资源位的特征向量
        "price",    # 广告价格
        "cms_segid",    # 用户微群ID
        "cms_group_id",    # 用户组ID
        "final_gender_code",    # 用户性别特征,[1,2]
        "age_level",    # 年龄等级,1-
        "shopping_level",
        "occupation",
        "pl_onehot_value",
        "nucl_onehot_value"
    ]
    # 筛选指定字段数据,构建新的数据集
    datasets_1 = datasets.select(*useful_cols)
    # 由于前面使用的是outer方式合并的数据,产生了部分空值数据,这里必须先剔除掉
    datasets_1 = datasets_1.dropna()
    print("剔除空值数据后,还剩:", datasets_1.count())
    

    显示结果:

    剔除空值数据后,还剩: 25029435
    
    
    • 根据特征字段计算出特征向量,并划分出训练数据集和测试数据集
    from pyspark.ml.feature import VectorAssembler
    # 根据特征字段计算特征向量
    datasets_1 = VectorAssembler().setInputCols(useful_cols[2:]).setOutputCol("features").transform(datasets_1)
    # 训练数据集: 约7天的数据
    train_datasets_1 = datasets_1.filter(datasets_1.timestamp<=(1494691186-24*60*60))
    # 测试数据集:约1天的数据量
    test_datasets_1 = datasets_1.filter(datasets_1.timestamp>(1494691186-24*60*60))
    # 所有的特征的特征向量已经汇总到在features字段中
    train_datasets_1.show(5)
    test_datasets_1.show(5)
    

    显示结果:

    +----------+---+-------------+------+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    | timestamp|clk|    pid_value| price|cms_segid|cms_group_id|final_gender_code|age_level|shopping_level|occupation|pl_onehot_value|nucl_onehot_value|            features|
    +----------+---+-------------+------+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    |1494261938|  0|(2,[1],[1.0])| 108.0|        0|          11|                1|        5|             3|         0|  (4,[0],[1.0])|    (5,[1],[1.0])|(18,[1,2,4,5,6,7,...|
    |1494261938|  0|(2,[1],[1.0])|1880.0|        0|          11|                1|        5|             3|         0|  (4,[0],[1.0])|    (5,[1],[1.0])|(18,[1,2,4,5,6,7,...|
    |1494553913|  0|(2,[1],[1.0])|2360.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494553913|  0|(2,[1],[1.0])|2200.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494436784|  0|(2,[1],[1.0])|5649.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    +----------+---+-------------+------+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    only showing top 5 rows
    
    +----------+---+-------------+-----+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    | timestamp|clk|    pid_value|price|cms_segid|cms_group_id|final_gender_code|age_level|shopping_level|occupation|pl_onehot_value|nucl_onehot_value|            features|
    +----------+---+-------------+-----+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    |1494677292|  0|(2,[1],[1.0])|176.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494677292|  0|(2,[1],[1.0])|698.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494677292|  0|(2,[1],[1.0])|697.0|       19|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[1],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494684007|  0|(2,[1],[1.0])|247.0|       18|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[4],[1.0])|(18,[1,2,3,4,5,6,...|
    |1494684007|  0|(2,[1],[1.0])|109.0|       18|           3|                2|        3|             3|         0|  (4,[1],[1.0])|    (5,[4],[1.0])|(18,[1,2,3,4,5,6,...|
    +----------+---+-------------+-----+---------+------------+-----------------+---------+--------------+----------+---------------+-----------------+--------------------+
    only showing top 5 rows
    
    
    from pyspark.ml.classification import LogisticRegression
    lr = LogisticRegression()
    # 设置目标字段、特征值字段并训练
    model = lr.setLabelCol("clk").setFeaturesCol("features").fit(train_datasets_1)
    # 对模型进行存储
    model.save("hdfs://localhost:9000/models/CTRModel_Normal.obj")
    # 载入训练好的模型
    from pyspark.ml.classification import LogisticRegressionModel
    model = LogisticRegressionModel.load("hdfs://localhost:9000/models/CTRModel_Normal.obj")
    # 根据测试数据进行预测
    result_1 = model.transform(test_datasets_1)
    # 按probability升序排列数据,probability表示预测结果的概率
    # 如果预测值是0,其概率是0.9248,那么反之可推出1的可能性就是1-0.9248=0.0752,即点击概率约为7.52%
    # 因为前面提到广告的点击率一般都比较低,所以预测值通常都是0,因此通常需要反减得出点击的概率
    result_1.select("clk", "price", "probability", "prediction").sort("probability").show(100)
    
    

    显示结果:

    +---+-----------+--------------------+----------+
    |clk|      price|         probability|prediction|
    +---+-----------+--------------------+----------+
    |  0|      1.0E8|[0.86822033939259...|       0.0|
    |  0|      1.0E8|[0.88410457194969...|       0.0|
    |  0|      1.0E8|[0.89175497837562...|       0.0|
    |  1|5.5555556E7|[0.92481456486873...|       0.0|
    |  0|      1.5E7|[0.93741450446939...|       0.0|
    |  0|      1.5E7|[0.93757135079959...|       0.0|
    |  0|      1.5E7|[0.93834723093801...|       0.0|
    |  0|     1099.0|[0.93972095713786...|       0.0|
    |  0|      338.0|[0.93972134993018...|       0.0|
    |  0|      311.0|[0.93972136386626...|       0.0|
    |  0|      300.0|[0.93972136954393...|       0.0|
    |  0|      278.0|[0.93972138089925...|       0.0|
    |  0|      188.0|[0.93972142735283...|       0.0|
    |  0|      176.0|[0.93972143354663...|       0.0|
    |  0|      168.0|[0.93972143767584...|       0.0|
    |  0|      158.0|[0.93972144283734...|       0.0|
    |  1|      138.0|[0.93972145316035...|       0.0|
    |  0|      125.0|[0.93972145987031...|       0.0|
    |  0|      119.0|[0.93972146296721...|       0.0|
    |  0|       78.0|[0.93972148412937...|       0.0|
    |  0|      59.98|[0.93972149343040...|       0.0|
    |  0|       58.0|[0.93972149445238...|       0.0|
    |  0|       56.0|[0.93972149548468...|       0.0|
    |  0|       38.0|[0.93972150477538...|       0.0|
    |  1|       35.0|[0.93972150632383...|       0.0|
    |  0|       33.0|[0.93972150735613...|       0.0|
    |  0|       30.0|[0.93972150890458...|       0.0|
    |  0|       27.6|[0.93972151014334...|       0.0|
    |  0|       18.0|[0.93972151509838...|       0.0|
    |  0|       30.0|[0.93980311191464...|       0.0|
    |  0|       28.0|[0.93980311294563...|       0.0|
    |  0|       25.0|[0.93980311449212...|       0.0|
    |  0|      688.0|[0.93999362023323...|       0.0|
    |  0|      339.0|[0.93999379960808...|       0.0|
    |  0|      335.0|[0.93999380166395...|       0.0|
    |  0|      220.0|[0.93999386077017...|       0.0|
    |  0|      176.0|[0.93999388338470...|       0.0|
    |  0|      158.0|[0.93999389263610...|       0.0|
    |  0|      158.0|[0.93999389263610...|       0.0|
    |  1|      149.0|[0.93999389726180...|       0.0|
    |  0|      122.5|[0.93999391088191...|       0.0|
    |  0|       99.0|[0.93999392296012...|       0.0|
    |  0|       88.0|[0.93999392861375...|       0.0|
    |  0|       79.0|[0.93999393323945...|       0.0|
    |  0|       75.0|[0.93999393529532...|       0.0|
    |  0|       68.0|[0.93999393889308...|       0.0|
    |  0|       68.0|[0.93999393889308...|       0.0|
    |  0|       59.9|[0.93999394305620...|       0.0|
    |  0|      44.98|[0.93999395072458...|       0.0|
    |  0|       35.5|[0.93999395559698...|       0.0|
    |  0|       33.0|[0.93999395688189...|       0.0|
    |  0|       32.8|[0.93999395698469...|       0.0|
    |  0|       30.0|[0.93999395842379...|       0.0|
    |  0|       28.0|[0.93999395945172...|       0.0|
    |  0|       19.9|[0.93999396361485...|       0.0|
    |  0|       19.8|[0.93999396366625...|       0.0|
    |  0|       19.8|[0.93999396366625...|       0.0|
    |  0|       12.0|[0.93999396767518...|       0.0|
    |  0|        6.7|[0.93999397039920...|       0.0|
    |  0|      568.0|[0.94000369247841...|       0.0|
    |  0|      398.0|[0.94000377983931...|       0.0|
    |  0|      158.0|[0.94000390317214...|       0.0|
    |  0|     5718.0|[0.94001886593718...|       0.0|
    |  0|     5718.0|[0.94001886593718...|       0.0|
    |  1|     5608.0|[0.94001892245145...|       0.0|
    |  0|     4120.0|[0.94001968693052...|       0.0|
    |  0|     1027.5|[0.94002127571285...|       0.0|
    |  0|     1027.5|[0.94002127571285...|       0.0|
    |  0|      989.0|[0.94002129549211...|       0.0|
    |  0|      672.0|[0.94002145834965...|       0.0|
    |  0|      660.0|[0.94002146451460...|       0.0|
    |  0|      598.0|[0.94002149636681...|       0.0|
    |  0|      598.0|[0.94002149636681...|       0.0|
    |  0|      563.0|[0.94002151434789...|       0.0|
    |  0|      509.0|[0.94002154209012...|       0.0|
    |  0|      509.0|[0.94002154209012...|       0.0|
    |  0|      500.0|[0.94002154671382...|       0.0|
    |  0|      498.0|[0.94002154774131...|       0.0|
    |  0|      440.0|[0.94002157753851...|       0.0|
    |  0|      430.0|[0.94002158267595...|       0.0|
    |  0|      388.0|[0.94002160425322...|       0.0|
    |  0|      369.0|[0.94002161401436...|       0.0|
    |  0|      368.0|[0.94002161452811...|       0.0|
    |  0|      368.0|[0.94002161452811...|       0.0|
    |  0|      368.0|[0.94002161452811...|       0.0|
    |  0|      368.0|[0.94002161452811...|       0.0|
    |  0|      366.0|[0.94002161555560...|       0.0|
    |  0|      366.0|[0.94002161555560...|       0.0|
    |  0|      348.0|[0.94002162480299...|       0.0|
    |  0|      299.0|[0.94002164997645...|       0.0|
    |  0|      299.0|[0.94002164997645...|       0.0|
    |  0|      299.0|[0.94002164997645...|       0.0|
    |  0|      298.0|[0.94002165049020...|       0.0|
    |  0|      297.0|[0.94002165100394...|       0.0|
    |  0|      278.0|[0.94002166076508...|       0.0|
    |  1|      275.0|[0.94002166230631...|       0.0|
    |  0|      275.0|[0.94002166230631...|       0.0|
    |  0|      273.0|[0.94002166333380...|       0.0|
    |  0|      258.0|[0.94002167103995...|       0.0|
    |  0|      256.0|[0.94002167206744...|       0.0|
    +---+-----------+--------------------+----------+
    only showing top 100 rows
    
    
    • 查看样本中点击的被实际点击的条目的预测情况
    result_1.filter(result_1.clk==1).select("clk", "price", "probability", "prediction").sort("probability").show(100)
    
    

    显示结果:

    +---+-----------+--------------------+----------+
    |clk|      price|         probability|prediction|
    +---+-----------+--------------------+----------+
    |  1|5.5555556E7|[0.92481456486873...|       0.0|
    |  1|      138.0|[0.93972145316035...|       0.0|
    |  1|       35.0|[0.93972150632383...|       0.0|
    |  1|      149.0|[0.93999389726180...|       0.0|
    |  1|     5608.0|[0.94001892245145...|       0.0|
    |  1|      275.0|[0.94002166230631...|       0.0|
    |  1|       35.0|[0.94002178560473...|       0.0|
    |  1|       49.0|[0.94004219516957...|       0.0|
    |  1|      915.0|[0.94021082858784...|       0.0|
    |  1|      598.0|[0.94021099096349...|       0.0|
    |  1|      568.0|[0.94021100633025...|       0.0|
    |  1|      398.0|[0.94021109340848...|       0.0|
    |  1|      368.0|[0.94021110877521...|       0.0|
    |  1|      299.0|[0.94021114411869...|       0.0|
    |  1|      278.0|[0.94021115487539...|       0.0|
    |  1|      259.0|[0.94021116460765...|       0.0|
    |  1|      258.0|[0.94021116511987...|       0.0|
    |  1|      258.0|[0.94021116511987...|       0.0|
    |  1|      258.0|[0.94021116511987...|       0.0|
    |  1|      195.0|[0.94021119738998...|       0.0|
    |  1|      188.0|[0.94021120097554...|       0.0|
    |  1|      178.0|[0.94021120609778...|       0.0|
    |  1|      159.0|[0.94021121583003...|       0.0|
    |  1|      149.0|[0.94021122095226...|       0.0|
    |  1|      138.0|[0.94021122658672...|       0.0|
    |  1|       58.0|[0.94021126756458...|       0.0|
    |  1|       49.0|[0.94021127217459...|       0.0|
    |  1|       35.0|[0.94021127934572...|       0.0|
    |  1|       25.0|[0.94021128446795...|       0.0|
    |  1|     2890.0|[0.94028789742257...|       0.0|
    |  1|      220.0|[0.94028926340218...|       0.0|
    |  1|      188.0|[0.94031410659516...|       0.0|
    |  1|       68.0|[0.94031416796289...|       0.0|
    |  1|       58.0|[0.94031417307687...|       0.0|
    |  1|      198.0|[0.94035413548387...|       0.0|
    |  1|      208.0|[0.94039204931181...|       0.0|
    |  1|     8888.0|[0.94045237642030...|       0.0|
    |  1|      519.0|[0.94045664687995...|       0.0|
    |  1|      478.0|[0.94045666780037...|       0.0|
    |  1|      349.0|[0.94045673362308...|       0.0|
    |  1|      348.0|[0.94045673413334...|       0.0|
    |  1|      316.0|[0.94045675046144...|       0.0|
    |  1|      298.0|[0.94045675964600...|       0.0|
    |  1|      298.0|[0.94045675964600...|       0.0|
    |  1|      199.0|[0.94045681016104...|       0.0|
    |  1|      199.0|[0.94045681016104...|       0.0|
    |  1|      198.0|[0.94045681067129...|       0.0|
    |  1|      187.1|[0.94045681623305...|       0.0|
    |  1|      176.0|[0.94045682189685...|       0.0|
    |  1|      168.0|[0.94045682597887...|       0.0|
    |  1|      160.0|[0.94045683006090...|       0.0|
    |  1|      158.0|[0.94045683108140...|       0.0|
    |  1|      158.0|[0.94045683108140...|       0.0|
    |  1|      135.0|[0.94045684281721...|       0.0|
    |  1|      129.0|[0.94045684587872...|       0.0|
    |  1|      127.0|[0.94045684689923...|       0.0|
    |  1|      125.0|[0.94045684791973...|       0.0|
    |  1|      124.0|[0.94045684842999...|       0.0|
    |  1|      118.0|[0.94045685149150...|       0.0|
    |  1|      109.0|[0.94045685608377...|       0.0|
    |  1|      108.0|[0.94045685659402...|       0.0|
    |  1|       99.0|[0.94045686118630...|       0.0|
    |  1|       98.0|[0.94045686169655...|       0.0|
    |  1|       79.8|[0.94045687098314...|       0.0|
    |  1|       79.0|[0.94045687139134...|       0.0|
    |  1|       77.0|[0.94045687241185...|       0.0|
    |  1|       72.5|[0.94045687470798...|       0.0|
    |  1|       69.0|[0.94045687649386...|       0.0|
    |  1|       68.0|[0.94045687700412...|       0.0|
    |  1|       60.0|[0.94045688108613...|       0.0|
    |  1|      43.98|[0.94045688926037...|       0.0|
    |  1|       40.0|[0.94045689129118...|       0.0|
    |  1|       39.9|[0.94045689134220...|       0.0|
    |  1|       39.6|[0.94045689149528...|       0.0|
    |  1|       32.0|[0.94045689537319...|       0.0|
    |  1|       31.0|[0.94045689588345...|       0.0|
    |  1|      25.98|[0.94045689844491...|       0.0|
    |  1|       23.0|[0.94045689996546...|       0.0|
    |  1|       19.0|[0.94045690200647...|       0.0|
    |  1|       16.9|[0.94045690307800...|       0.0|
    |  1|       10.0|[0.94045690659874...|       0.0|
    |  1|        3.5|[0.94045690991538...|       0.0|
    |  1|        3.5|[0.94045690991538...|       0.0|
    |  1|        0.4|[0.94045691149716...|       0.0|
    |  1|     3960.0|[0.94055740378069...|       0.0|
    |  1|     3088.0|[0.94055784801535...|       0.0|
    |  1|     1689.0|[0.94055856072019...|       0.0|
    |  1|      998.0|[0.94055891273943...|       0.0|
    |  1|      888.0|[0.94055896877705...|       0.0|
    |  1|      788.0|[0.94055901972029...|       0.0|
    |  1|      737.0|[0.94055904570133...|       0.0|
    |  1|      629.0|[0.94055910071996...|       0.0|
    |  1|      599.0|[0.94055911600291...|       0.0|
    |  1|      599.0|[0.94055911600291...|       0.0|
    |  1|      599.0|[0.94055911600291...|       0.0|
    |  1|      499.0|[0.94055916694603...|       0.0|
    |  1|      468.0|[0.94055918273839...|       0.0|
    |  1|      459.0|[0.94055918732327...|       0.0|
    |  1|      399.0|[0.94055921788912...|       0.0|
    |  1|      399.0|[0.94055921788912...|       0.0|
    +---+-----------+--------------------+----------+
    only showing top 100 rows
    
    
    
    展开全文
  • 目录 灰色样本 两个和灰色程序相关的Case 远控工具 年会X吉姆尼 灰色样本 在我们日常的分析工作中,除了我之前提到过的最常见的干净程序以及恶意程序以外,在这种看似“非黑即白”的世界里面,其实还存在着一...

    目录

    灰色样本

    两个和灰色程序相关的Case

    远控工具

    年会X吉姆尼


    灰色样本


    在我们日常的分析工作中,除了我之前提到过的最常见的干净程序以及恶意程序以外,在这种看似“非黑即白”的世界里面,其实还存在着一种介于二者之间的灰色程序。比如说骇客工具、游戏辅助以及那些严重影响用户日常工作和生活的广告程序等。这类样本也需要由我们分析师判定和归类,但与恶意程序相比所不同的是,一般情况下,我们的产品并不会直接将这些程序查杀掉,而是会弹出一个提示框,由用户去决定这些可疑程序的去留。

    其实对于这些样本的判定,我觉得还是非常考验一个分析师的魄力的,此时分析能力已经是次要的了。因为处在当今这个互联网上啥啥都免费的时代,很多公司为了创造收入,只能从广告以及推广上做文章,于是,各种恼人的广告铺天盖地而来。定时或者不定时地在我们屏幕的正中央或者右下角弹出推广信息,这些弹窗有时还会做一个假的关闭按钮,这样就会令很多小白用户不知所措了。很多时候,这类程序还会采用恶意程序经常采用的自我保护措施,小白用户即便想要卸载,也很难将其清理干净。但考虑到这些程序的开发公司很多都是正规的大厂,为了不必要的麻烦,我们也不好直接将其查杀掉,所以会将其列为灰色程序,由用户选择处理的方式。而我之所以在一开头用了“魄力”这个词,是因为如果分析师真的不小心将人家的干净程序列为了恶意的,就算是列为灰色的,那么极有可能会收到该公司对我们的起诉了。即便你真有确凿的证据证明人家的软件有问题,可是人家可能依旧会起诉你,欲加之罪何患无辞,闹上法庭那就是一件很麻烦的事情了,因此在我看来,我们这一行还是有一定的风险的。每发布一条特征,都需要经过再三的斟酌。

     

    两个和灰色程序相关的Case


    而这里既然谈到了灰色程序,我曾经遇到过两件事可以和大家分享一下。

    第一件事是在我上线处理日常Case的时候遇到的。没记错的话应该是周六,还是我国的一家软件开发公司,他们给我们发邮件说卡巴将其列为了恶意程序,被直接查杀了,于是就问我们是否可以解除误报。我先是简单看了一下,个人认为直接将其列为恶意确实有些过头了,我觉得调整为干净也未尝不可,尽管它也存在一些恼人的成分在里面。谨慎起见,为了避免出现不必要的麻烦,我还看了一下起初为其进行归类的分析师是谁,发现是美国病毒分析部的负责人将其列为恶意的。尽管我也有关掉这条查杀特征的权限,但我觉得还是和这个分析师沟通一下比较好。由于这个问题有点复杂,我也算是绞尽脑汁,把考研以及六级英语的作文技巧都搬出来了,以“总-分-总”的形式写了一篇好几百字的E-mail,交代了前因后果,说了我的分析看法,最后说是否需要调整查杀结论由美国分析师决定。再三检查确认无误之后,忐忑地点击了发送按钮,然后就下班静待结果了。

    由于存在时差,因此美国同事也不可能立刻回复我。第二天尽管我休息,但我依旧来到公司做一些研究。打开邮件系统,发现美国的同事回复我了,写得虽然比较简略,但也把结论说得很明白,那就是经过他的再次分析,决定将其调整为灰色程序,并且他已经修改完了。我回复了一句Thank you,然后赶紧又给那家公司回复了处理结果。也许和他的预期还是有些差距,但至少我们的产品不会直接将其查杀掉了,因此他多多少少还是比较满意的吧。

    经历了这件事,我最大的感慨就是终于明白了考研以及四六级英语出题人的良苦用心。感觉当初备考时学习的那些作文技巧确实是可以运用于实际的书面交流中的,而“总-分-总”的形式也确实是一种比较科学的表达方法。后来回到珠海当了老师,我也和每一届的同学分享我的这个经历,从而鼓励大家要好好学习,特别是英语的学习,不存在没用的知识,只存在不会运用知识解决实际问题的人。

    关于灰色程序的第二件事发生在Rocky身上。众所周知,在我们日常的工作和学习中,只要是使用电脑,那么就免不了和压缩包打交道。因为很多时候我们需要处理的文件会很多,如果不打个包的话,传输以及处理起来就会很不方便,也就是说,解压缩软件在当今社会拥有着广泛的使用群体。除了比较老牌的winzip以及winrar以外,这些年也是出现了很多后起之秀也想来分一杯羹。其中既有大公司,也有小企业。而不论是老牌的还是后来者,大家普遍采取的是免费的模式,采用弹出式或者其它广告形式来盈利。当然你也可以一次性花钱买断,这样就不会有弹出广告了。

    我记得很清楚,一次我在处理线上Case的时候,收到一条由我们的技术支持发来的解除误报的请求,说是一家公司开发了一款压缩软件(我这里姑且将其叫做X-zip吧),然后就被我们的产品提示为灰色的广告程序了。那家公司觉得有些冤枉,于是就联系了我们的技术支持想改变我们的检测结果。一般来说,拿到这样的Case,我们分析师首先得尝试复现一下这条检测,以确认我们的产品确实会检测该软件。我发现,该软件是被一条启发式特征给检测到的,这条特征还很新,是几天前发布的,作者是Rocky。

    我觉得以Rocky的水平,肯定不会无缘无故地就将某个公司的产品直接查杀的,其背后肯定有确凿的证据。我看了一下他写的那条特征,其检测原理是只要某个程序体内包含有X-zip的完整名字,特别是在安装的过程中出现了这个名字,那也就说明它是X-zip公司推出的软件,于是就将其判定为灰色广告程序了。那么这也就说明了,Rocky就是想干掉该软件。

    稳妥起见,我又通过多引擎扫描看了看兄弟厂商的检测结果,发现还真是有不少大厂将其列为了灰色程序,严重的还有直接将其定义为恶意程序的。这样我就更加确定了我们对这个程序的检测结果是正确的。后来也经过与Rocky的商量,我就回复我们的技术支持说这个检测结果是正确的,它就是灰色的广告程序。

    这里我提到了多引擎扫描,其实除了卡巴以外,从检测结果的准确性和及时性这两个方面来看,我最为认可的友商就是NOD32了,有些时候,他们获取到的恶意样本比卡巴还早,使得他们的查杀速度遥遥领先于其它厂商,而且还基本不会出现误报的情况,并且听说他们的病毒库还很小,特征很精致,一条特征可以匹配到很多个样本,让我很是佩服。

    而我刚才提到的X-zip这款工具,本以为那是我唯一的一次与它的交集,但没想到后来我到高校当了老师,又遇到了一次。当时我是在检查大家在线提交的作业,我发现一个同学上交的是一个html文件,而我要求大家要提交文档的形式,于是这就让我感觉很奇怪。打开这个网页文件,发现是一个推广页面,意思是我如果想查看这个同学的作业,需要安装一款解压缩软件,而为了获取我的信任,它还列出了这个同学所提交的文件名,确实是我的这次实验要求的内容。而之所以要安装这款软件,它的解释是因为我当前的解压缩工具有些古老了,而他这款可以实现超高压缩比,并且还宣称自己通过了主流杀软的验证等,说得还是挺让人心动的。我好奇地点了一下该工具的下载链接,发现下载下来的安装文件正是X-zip。我把这个安装包上传到VirusTotal进行多引擎扫描,发现在总共73家杀软中,有52家将其列为了恶意或者广告类程序(Adware),而大厂所定义的样本查杀名称(Verdict)里面也包含有X-zip,说明这些大厂绝对不是误报,而就是想干掉它,否则不会取一个这么准确的名字。

    除了使用多引擎以外,我还上网搜了搜有关X-zip的新闻,发现之前还有一家国内的安全公司对这款软件做了详细的分析,以证明它确实存在着一些恼人以及恶意的行为。那么现在结论就很明确了,这就是一款有问题的软件,自身行为有问题,诱导用户安装也很有问题。而它这种逐步获得用户信任的方式,也可以理解为是一种社会工程学技巧,我后来甚至还在我的《计算机网络安全》这门课上的《社会工程学》章节以它作为例子为大家做了分析。而由此引申开去,其实当今网络上有非常多的软件也会有类似的诱导行为,比如我明明想安装谷歌浏览器,结果搜索出来的前几条结果根本就不是谷歌,排在前几位的浏览器也会说自己采用了非常先进的技术,甚至图标都会和Chrome如出一辙,使得很多人一不小心就安装错了。这种例子在我身边比比皆是,因此处于当今这样的一个网络时代,时常怀有戒心,擦亮双眼真的非常重要。

     

    远控工具


    关于远控工具的故事也是源自于一个Case。这次也是我在线时候,直接收到了K公司发来的邮件,说是我们的杀毒软件直接把他们的产品列为远控木马了。为了证明他们的清白,他们在邮件中甚至还附上了他们公司的工商登记证书等材料,说明他们是合法合规的企业。

    看到这些,我突然有点惊讶。因为K公司的这款软件在很早以前就是非常知名的远控木马,很多入门级别的分析文章都会拿这款木马作为例子,也是杀软重点查杀的对象。我在最初接触恶意程序的时候,也在视频里看过这款木马的使用方法和查杀方式。它可以很轻易地生成远控客户端,然后经过黑客的免杀处理,辅之以社会工程学技巧,就可以使网络上的无数用户中招了。没想到K公司今天竟然把它商业化了,成立了公司来推广这个产品,真的是此一时,彼一时,三十年河东,三十年河西啊。

    我也不敢懈怠,由于Rocky那天不在,我就问了一下Seth关于这种Case的处理方式。他和我说我们卡巴认可的远控工具只有三四种,其余都是需要列为木马干掉的。因此只要回复说我们的检测结果是正确的就可以了。我觉得也对,不能因为人家成立了公司,我们就要给它解除检测,毕竟远控工具是一种非常敏感的软件,是黑客常用的攻击工具,一旦我们放松了警惕,市面上就可能涌现出一大批类似的程序了,那样的话可就糟糕了,不如一开始就高标准严要求,绝对不能开这样的先河。

     

    年会X吉姆尼


    时光飞逝,2016年很快就到了尾声,时间不知不觉就来到了2017年的一月份。我毕业已经有半年多的时间了,而加入卡巴也有十个月了。由于西方要过圣诞节假期,而我们的很多客户也处在欧美,因此那段时间我们的Case量很少。另外,估计黑客也在过节吧,毕竟是难得的休息时间,因此我们分析师当时分析的新涌现出来的恶意样本也是寥寥无几。

    一般来说,企业都会在年终搞一个年会,租一个场地,大家吃吃喝喝,做做游戏,演演节目,乐呵乐呵。比如在2009年的年初,当时我还在老师的企业卖书,我们的老大就在一家酒店租了个很大的场地组织了一场年会。当时每个部门都出了至少一个节目,比如我们库房就是用手语表演小虎队的《爱》,我个人还表演了一个纸牌魔术,同时我还被抓出来当作主持。最开心的是我当时在抽奖环节还抽中了一等奖,也就是一部诺基亚的1110手机。尽管那款手机能实现的功能非常简单,也就只能打电话和发短信,还是个黑白屏,但我就喜欢这种简约的款式,后来也是用了蛮久,直至被诺基亚5800所取代。

    而在2010年初,我已经加入了苏宁电器,当时的年会是在一家更大型的酒店举办的,摆了N桌,同样是每个部门都得出节目,我就表演了几个魔术以及跆拳道的破板表演,其中一个魔术由于道具原因还没呈现出效果,但总体上还是挺好的。

    卡巴的年会是在2017年的年初举办的,这次我们是去一家度假村。上午我们集体坐大巴从公司出发,下午举办的活动。也是摆了N桌,这次就不需要表演节目了,大家更期待的是抽奖环节,比如iPhone、iPad以及笔记本电脑等,在我看来公司也是投了不少钱在奖品方面,可惜我啥也没抽中,我们部门也没人中奖。由于我们部门也都不是爱玩的人,因此晚上的卡拉OK环节我们就没有参加,各自回房间了。当时我是和“渣兔”一个房间,我发现他回来以后竟然还找了几张纸边听录音边抄写英语单词,我就很佩服他的好学精神。不知道他仅仅是想提升自己的英语水平,还是说以后有出国的打算。第二天上午我们是自由活动,然后下午就回公司了。

    其实我个人属于非常不爱玩的人,喜欢安静,因此我所经历的这三家企业的年会并没有给我留下多深刻的印象,唯一期待的也就是抽奖环节。如果可以选择的话,我宁愿选择直接放假在家宅着发呆。当然了,如果参加年会并不需要被抓出来表演节目,那么我也是能够接受的。

    其实这次年会有件事对我产生了一定的影响。那就是在去往年会的路上,Rocky并没有跟我们一起,而是自己开车去的度假村。我早就知道Rocky的车是一辆越野车,他朋友圈时不时也会分享一些假期去沙漠开车冲坡的视频,很是热血,很是阳刚,于是我就一直想见见他的车。来到度假村和Rocky见了面,我说想看看车,于是我们几个就一起来到停车场参观。可能由于Rocky平时“豁车”比较厉害吧,他的车头有些新伤,很多地方都损坏了,一个大灯都破了,他说要等假期去修修,其实从之前的聊天中,我就得知他的车已经修过几次了,不是这里磕了就是那里撞了,也许这就是越野车的命运吧。

    Rocky的车是一辆铃木吉姆尼,作为入门级别的越野车还是非常不错的,他那款性价比高,越野能力超强。而目前最新款的吉姆尼虽然外观更加方正酷炫,但是受到各方面影响,加价情况还是比较严重的,刚推出的时候甚至一度炒到了30W人民币,要知道Rocky那款也就十几万。他那款吉姆尼如果硬要举几个缺点的话,一方面是发动机动力有待提高,而Rocky后来也确实进行了更换,配置了一台性能更加强劲的发动机。其实这也就说明,玩越野的人,往往后期在车辆改装上的投入还是蛮多的,甚至可能远远超过当初买车的价格。另外,吉姆尼的空间也有些偏小,第二排几乎不能坐人,但这对越野却是一个优势,因为小巧的车身反而便于通过复杂的路面环境。因此尽管最新款的吉姆尼要30W,依旧有不少人为了情怀而买单。想想同等价位,偏重家庭以及公路舒适性的话,完全可以买一辆丰田汉兰达了,而且这款车还非常保值。或者必须要买硬派越野车,也可以考虑三菱帕杰罗劲畅了。但不管怎么讲,萝卜白菜各有所爱,其实我也蛮喜欢最新款吉姆尼的设计的,很方正,是硬汉的感觉。

    尽管我当时并没有驾照,但是我觉得越野真的是一件很酷的事情。当时也想着自己以后也应该把驾照考下来,买一辆越野车,假期也像Rocky一样去探索未知的世界,甚至还可以去最偏远的地方做慈善,成为志愿者去做救援,毕竟越野车不惧任何路段,皮实耐造,我觉得这才是人生,是直到现在我依旧想要完成的一个目标。因此,看了Rocky的吉姆尼,了解了Rocky的经历,可以说在我的心中埋下了一粒小小的种子,我也在静待它的生根、发芽、开花与结果。

     

    回到目录

    下一篇

    展开全文
  • 目录 第一部分通用流程: 第二部分:数据挖掘 第三部分:搜索和推荐 第四部分:计算广告 第五部分:深度学习 第六部分:算法工程 第一部分通用流程: 第一章:问题建模:评估指标,样本选择,交叉验证 评估...
  • 画册,就是把内容以图文的形式有计划化的布局在页面上,是企业在宣传中使用的一种广告媒体,它具有传递信息的作用。 1. 产品样本:主要有企业画册、非赢利性宣传画册,其设计内容大致包括企业文化、企业形象或产品...
  • auc的第一种理解、auc的第二种理解、auc的计算方式、pr...文章目录1. 基础知识1.1 混淆矩阵1.2 假正率和真正率2. ROC曲线与经典AUC的理解2.1 ROC曲线2.2 PR曲线2.3 如何选择ROC曲线和PR曲线3. AUC的深度理解(工业级别.
  • 将titanium-admob文件夹复制到您的lib/ (合金)或您的Resources/ (经典)目录。 将示例代码复制到您的Titanium应用程序中(如果是Classic应用程序,请调整代码以适合您的需求)。 在hyperloop包括hyperloop和ti....
  • 我们的工作中经常遇到如何求两个句子的相似,比如如何判断搜索query和广告query的相似,搜索query和app的...四、 深度学习的模型搭建(一)老样子先贴结果吧,样本是处理后的搜索query和广告点击query,准确率在95%左右
  • 文章目录1.机器学习1.1 通过内容进行年龄和性别预测...样本数据约7000w,90万用户三个月内点击广告的日志来预测用户性别和年龄 机器学习:lightgbm(入门级1.3左右) 深度学习:推荐RNN+NLP相关算法(霸榜大佬1.4+)
  • 目录1、背景2、 GBDT与LR融合现状3、GBDT与LR融合方案参考文献 1、背景 CTR预估(Click-Through Rate Prediction)是互联网计算广告中的关键环节,预估准确性直接影响公司广告收入。 CTR预估中用的最多的模型是LR...
  • 文章目录案例背景1 检验指标的确定2 确定检验统计量3 埋点收集数据4 确定H0,H15 确定显著性水平6 计算样本量7 利用统计工具实现检验 案例背景 某网站首页双12 活动 banner主色调选择(现提供两个版本的banner), ...
  • 目录一:逻辑回归介绍:二:逻辑回归问题的原理:三:逻辑回归的损失问题:四:逻辑回归的优化:五:逻辑回归API介绍:六:分类评估方法:1:混淆矩阵:2:精准率和召回率:3:TPR 与FPR:4:ROC曲线:5:AUC指标: ...
  • ::程序运行后会在桌面建立一个 "快捷方式样本.lnk" ::程序绝对路径自己修改。比较适合用来隐藏QQ多个图标, 广告程序图标等等。 ::配置文件 ico.ini 不能改名字且必须要和程序在同一个目录。 ::本程序名字自己随便...
  • 护照-天蓝色广告 天蓝色活动目录 此示例演示如何在使用带有Express的Node.js构建的Web应用程序中设置OpenId Connect身份验证。 Azure Active Directory OIDC Node.js Web应用程序示例 此示例演示如何在使用带有...
  • 近期出现的手电筒root病毒,一旦在手机上成功安装后,即会通过私自发送扣费短信订制包月业务,造成用户话费损失,并注入大量恶意elf文件至手机system目录,危害用户手机系统安全。此外,此类病毒还会私自下载并安装...
  • 2007年8月8日,中国最大的企业电子商刊(样本/目录/画册/杂志)制作推广平台iebook第一门户(www.滥发广告,屏蔽!)宣布,旗下多年研发的国际顶级·电子杂志制作推广系统软件iebook超级精灵对所代理的的全部共享...
  • 分类: 机器学习 代码2013-11-13 12:31 767人阅读 评论(0) 收藏 举报 ...K近邻算法作为数据挖掘十大经典算法之一,其算法思想可谓是intuitive,就是从训练集里找离预测点最近的K个样本来预测分类
  • 机器学习基础复习

    2021-03-19 07:56:51
    文章目录手推公式,现场造轮子kmeanslogistic regression线性回归手撕代码计算机基础python深拷贝和浅拷贝的问题正则表达式散列表MetricAUC绘图/计算 方法为什么ROC比PR对不均衡样本更鲁棒?什么时候选择PR,什么...
  • 用于点击率预测的纸质深层兴趣网络广告数据集的实验代码( ) ,吕富玉,沉卫晨,王梦涵,孙飞,朱瑜,杨克平。...运行2_gen_dien_input.py ,生成输入数据(对负样本进行采样可能需要很长时间。) 运行
  • 目录1. 如果领导让自己同时带一个NLP团队和CV团队,而此时对CV却不熟悉,一般如何快速建立这样的多种类型的知识体系呢?2. 王老师看好深度强化学习在推荐领域的前景么?能不能谈一下您的理解。3. 老师,我有两个问题...
  • 要进行自定义,请在项目的根目录下创建config.real.js [1],对其进行编辑并构建: cp config.js config.real.js npm run build 请参阅config.js的注释以获取API文档。 [1]请注意,此文件未检入,因为它可
  • 它采用新型的启发式扫描方式,提供多层次的防护方式,紧紧的和你的操作系统融合一起,拒绝接纳任何包含恶意的代码进入你的电脑,比如病毒、蠕虫、特洛伊木马以及广告软件、间谍软件等等。新型的基因式扫描杀毒软件。...
  • 新增:职位描述样本;新增:聊天套餐;新增:店铺招聘按天收费;新增:手机端注册增加隐私政策等内容(针对最新政策文件);优化:CRM整体业务流程;优化:简历创建、职位创建相关选项;优化:城市、职位分类关键字自动匹配;...
  • 针对事先指定的规则和示例样本,系统自动从海量文档中筛选出符合需求的样本。 7. 自动摘要 能够对单篇或多篇文章,自动提炼出内容的精华,方便用户快速浏览文本内容。 8. 关键词提取 能够对单篇文章或文章集合,提取...
  • 目录 第1章 公式与函数基本操作 1  1.1 Excel公式的基本操作 1  1.1.1 公式的输入与编辑 1  1.1.2 公式中的运算符 2  1.1.3 单元格的引用方式 3  1.1.4 名称的定义及应用 5  1.2 Excel函数的基本操作 7  ...
  • 目录 第1章 数据挖掘基本概念 1.1 数据挖掘的定义 1.1.1 统计建模 1.1.2 机器学习 1.1.3 建模的计算方法 1.1.4 数据汇总 1.1.5 特征抽取 1.2 数据挖掘的统计限制 1.2.1 整体情报预警 1.2.2 邦弗朗尼原理 ...
  • 目录 第1章 数据挖掘基本概念 1.1 数据挖掘的定义 1.1.1 统计建模 1.1.2 机器学习 1.1.3 建模的计算方法 1.1.4 数据汇总 1.1.5 特征抽取 1.2 数据挖掘的统计限制 1.2.1 整体情报预警 1.2.2 邦弗朗尼原理 ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

样本目录广告