【推荐系统篇】--推荐系统之之特征工程部分---构建训练集流程

一、前述

根据前文中架构,本文我们讨论线下部分构建训练集部分。因为我们离线部分模型的选择是逻辑回归,所以我们数据必须有x和y.

二、具体流程

1.从数据库中分离出我们需要的数据。

用户行为表(日志)

用户历史下载表

商品词表(商品的基本特征)

2.构建训练集中的关联特征

流程:

2.构建训练集中的基本特征

总结:注意特征名离散化因为如果特征不离散化会造成数据之间有关系。

三、具体构建过程

1、hive建表

真实的生产场景涉及到大概五十张表的字段,这里全部简化流程,直接给出最终的三张表:

应用词表:

CREATE EXTERNAL TABLE IF NOT EXISTS dim_rcm_hitop_id_list_ds
(
    hitop_id    STRING,
    name        STRING,
    author      STRING,
    sversion    STRING,
    ischarge    SMALLINT,
    designer    STRING,
    font        STRING,
    icon_count  INT,
    stars       DOUBLE,
    price       INT,
    file_size   INT,
    comment_num INT,
    screen      STRING,
    dlnum       INT
)row format delimited fields terminated by ‘\t‘;
/**  *  *模拟app的商品词表  hitop_id    STRING,  应用软件ID  name        STRING,  名称  author      STRING,   作者  sversion    STRING,   版本号  ischarge    SMALLINT,  收费软件  designer    STRING,    设计者  font        STRING,   字体  icon_count  INT,      有几张配图  stars       DOUBLE,   评价星级  price       INT,      价格  file_size   INT,      大小  comment_num INT,      评论数据  screen      STRING,   分辨率  dlnum       INT       下载数量  */

用户历史下载表:

CREATE EXTERNAL TABLE IF NOT EXISTS dw_rcm_hitop_userapps_dm
(
    device_id           STRING,
    devid_applist       STRING,
    device_name         STRING,
    pay_ability         STRING
)row format delimited fields terminated by ‘\t‘;
/**  *用户下载历史表   这里没有用户这个概念   手机设备ID就是userId  * device_id           STRING,   手机设备ID    devid_applist       STRING,     下载过软件列表    device_name         STRING,     设备名称    pay_ability         STRING      支付能力  */

正负例样本(用户当前行为即日志)表:

CREATE EXTERNAL TABLE IF NOT EXISTS dw_rcm_hitop_sample2learn_dm
(
    label       STRING,
    device_id   STRING,
    hitop_id    STRING,
    screen      STRING,
    en_name     STRING,
    ch_name     STRING,
    author      STRING,
    sversion    STRING,
    mnc         STRING,
    event_local_time STRING,
    interface   STRING,
    designer    STRING,
    is_safe     INT,
    icon_count  INT,
    update_time STRING,
    stars       DOUBLE,
    comment_num INT,
    font        STRING,
    price       INT,
    file_size   INT,
    ischarge    SMALLINT,
    dlnum       INT
)row format delimited fields terminated by ‘\t‘;
/**  * 正负例样本表 = 浏览记录+标签  label       STRING,        Y列,-1或1代表正负例    label值实际上是批处理得出来的,用户浏览了并在一段时间内下载为正例  device_id   STRING,        设备ID  hitop_id    STRING,        应用ID  screen      STRING,        手机软件需要的分辨率  en_name     STRING,        英文名  ch_name     STRING,        中文名  author      STRING,        作者  sversion    STRING,        版本  mnc         STRING,      Mobile Network Code,移动网络号码  event_local_time STRING,   浏览的时间  interface   STRING,  designer    STRING,  is_safe     INT,  icon_count  INT,  update_time STRING,  stars       DOUBLE,  comment_num INT,  font        STRING,  price       INT,  file_size   INT,  ischarge    SMALLINT,  dlnum       INT  */

 2、load数据

分别往三张表load数据:

商品词表:

load data local inpath ‘/opt/sxt/recommender/script/applist.txt‘ into table dim_rcm_hitop_id_list_ds;

用户历史下载表:

load data local inpath ‘/opt/sxt/recommender/script/userdownload.txt‘ into table dw_rcm_hitop_userapps_dm;

正负例样本表:

load data local inpath ‘/opt/sxt/recommender/script/sample.txt‘ into table dw_rcm_hitop_sample2learn_dm;

3、构建训练数据

3.1创建临时表

创建处理数据时所需要的临时表
CREATE TABLE IF NOT EXISTS tmp_dw_rcm_hitop_prepare2train_dm    
(
    device_id           STRING,
    label               STRING,
    hitop_id            STRING,
    screen              STRING,
    ch_name             STRING,
    author              STRING,
    sversion            STRING,
    mnc                 STRING,
    interface           STRING,
    designer            STRING,
    is_safe             INT,
    icon_count          INT,
    update_date         STRING,
    stars               DOUBLE,
    comment_num         INT,
    font                STRING,
    price               INT,
    file_size           INT,
    ischarge            SMALLINT,
    dlnum               INT,
    idlist              STRING,
    device_name         STRING,
    pay_ability         STRING
)row format delimited fields terminated by ‘\t‘;

最终保存训练集的表
CREATE TABLE IF NOT EXISTS dw_rcm_hitop_prepare2train_dm
(
    label                   STRING,
    features       STRING
)row format delimited fields terminated by ‘\t‘;

3.2 训练数据预处理过程

首先将数据从正负例样本和用户历史下载表数据加载到临时表中

INSERT OVERWRITE TABLE tmp_dw_rcm_hitop_prepare2train_dm
SELECT
    t2.device_id,
    t2.label,
    t2.hitop_id,
    t2.screen,
    t2.ch_name,
    t2.author,
    t2.sversion,
    t2.mnc,
    t2.interface,
    t2.designer,
    t2.is_safe,
    t2.icon_count,
    to_date(t2.update_time),
    t2.stars,
    t2.comment_num,
    t2.font,
    t2.price,
    t2.file_size,
    t2.ischarge,
    t2.dlnum,
    t1.devid_applist,
    t1.device_name,
    t1.pay_ability
FROM
(
    SELECT
        device_id,
        devid_applist,
        device_name,
        pay_ability
    FROM
        dw_rcm_hitop_userapps_dm
) t1
RIGHT OUTER JOIN
(
    SELECT
        device_id,
        label,
        hitop_id,
        screen,
        ch_name,
        author,
        sversion,
        IF (mnc IN (‘00‘,‘01‘,‘02‘,‘03‘,‘04‘,‘05‘,‘06‘,‘07‘), mnc,‘x‘)      AS   mnc,
        interface,
        designer,
        is_safe,
        IF (icon_count <= 5,icon_count,6)                                   AS   icon_count,
        update_time,
        stars,
        IF ( comment_num IS NULL,0,
        IF ( comment_num <= 10,comment_num,11))                             AS   comment_num,
        font,
        price,
        IF (file_size <= 2*1024*1024,2,
        IF (file_size <= 4*1024*1024,4,
        IF (file_size <= 6*1024*1024,6,
        IF (file_size <= 8*1024*1024,8,
        IF (file_size <= 10*1024*1024,10,
        IF (file_size <= 12*1024*1024,12,
        IF (file_size <= 14*1024*1024,14,
        IF (file_size <= 16*1024*1024,16,
        IF (file_size <= 18*1024*1024,18,
        IF (file_size <= 20*1024*1024,20,21))))))))))    AS    file_size,
        ischarge,
        IF (dlnum IS NULL,0,
        IF (dlnum <= 50,50,
        IF (dlnum <= 100,100,
        IF (dlnum <= 500,500,
        IF (dlnum <= 1000,1000,
        IF (dlnum <= 5000,5000,
        IF (dlnum <= 10000,10000,
        IF (dlnum <= 20000,20000,20001))))))))          AS      dlnum
    FROM
        dw_rcm_hitop_sample2learn_dm
) t2
ON (t1.device_id = t2.device_id);

选择右外关联的原因是因为以用户行为为基准。

这张表得到的数据就是关联特征中的数据,截图如下:

然后再利用python脚本处理格式
这里要先讲python脚本加载到hive中
ADD FILE /opt/sxt/recommender/script/dw_rcm_hitop_prepare2train_dm.py;
可以通过list files;查看是不是python文件加载到了hive

在hive中使用python脚本处理数据的原理:
Hive会以输出流的形式将数据交给python脚本,python脚本以输入流的形式来接受数据,接受来数据以后,在python中就行一系列的数据处理,处理完毕后,又以输出流的形式交给Hive,交给了hive就说明了就处理后的数据成功保存到hive表中了。

INSERT OVERWRITE TABLE dw_rcm_hitop_prepare2train_dm
SELECT
TRANSFORM (t.*)
USING ‘python dw_rcm_hitop_prepare2train_dm.py‘
AS (label,features)
FROM
(
    SELECT
        label,
        hitop_id,
        screen,
        ch_name,
        author,
        sversion,
        mnc,
        interface,
        designer,
        icon_count,
        update_date,
        stars,
        comment_num,
        font,
        price,
        file_size,
        ischarge,
        dlnum,
        idlist,
        device_name,
        pay_ability
    FROM
        tmp_dw_rcm_hitop_prepare2train_dm
) t;

python处理流程:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------------
#  File Name: dw_rcm_hitop_prepare2train_dm.py
#  Copyright(C)Huawei Technologies Co.,Ltd.1998-2014.All rights reserved.
#  Describe:
#  Input:  tmp_dw_rcm_hitop_prepare2train_dm
#  Output: dw_rcm_hitop_prepare2train_dm

import sys
import codecs
import random
import math
import time
import datetime

if __name__ == "__main__":
    random.seed(time.time())
    for l in sys.stdin:
        d = l.strip().split(‘\t‘)
        if len(d) != 21:
            continue

        # Extract data from the line
        label = d.pop(0)
        hitop_id = d.pop(0)
        screen = d.pop(0)
        ch_name = d.pop(0)
        author = d.pop(0)
        sversion = d.pop(0)
        mnc = d.pop(0)
        interface = d.pop(0)
        designer = d.pop(0)
        icon_count = d.pop(0)
        update_date = d.pop(0)
        stars = d.pop(0)
        comment_num = d.pop(0)
        font = d.pop(0)
        price = d.pop(0)
        file_size = d.pop(0)
        ischarge = d.pop(0)
        dlnum = d.pop(0)
        hitopids = d.pop(0)
        device_name = d.pop(0)
        pay_ability = d.pop(0)

        # Construct feature vector
        features = []
        features.append(("Item.id,%s" % hitop_id, 1))
        features.append(("Item.screen,%s" % screen, 1))
        features.append(("Item.name,%s" % ch_name, 1))
        features.append(("All,0",1))
        features.append(("Item.author,%s" % author, 1))
        features.append(("Item.sversion,%s" % sversion, 1))
        features.append(("Item.network,%s" % mnc, 1))
        features.append(("Item.dgner,%s" % designer, 1))
        features.append(("Item.icount,%s" % icon_count, 1))
        features.append(("Item.stars,%s" % stars, 1))
        features.append(("Item.comNum,%s" % comment_num,1))
        features.append(("Item.font,%s" % font,1))
        features.append(("Item.price,%s" % price,1))
        features.append(("Item.fsize,%s" % file_size,1))
        features.append(("Item.ischarge,%s" % ischarge,1))
        features.append(("Item.downNum,%s" % dlnum,1))

        ####User.Item and User.Item*Item
        idlist = hitopids[:-2].split(‘,‘)
        idCT = 0;
        for id in idlist:
            features.append(("User.Item*Item,%s" % id +‘*‘+hitop_id, 1))
            idCT += 1
            if idCT >= 3: #取每一个用户的前3个下载历史进行关联,因为用户量比较多,所以这里最后结果覆盖还是比较全的。
                break;
        features.append(("User.phone*Item,%s" % device_name + ‘*‘ + hitop_id,1))#升维
        features.append(("User.pay*Item.price,%s" % pay_ability + ‘*‘ + price,1))

        # Output

        output = "%s\t%s" % (label, ",".join([ "%s:%d" % (f, v) for f, v in features ]))#这里join相当于是把list中的数据进行拆分,然后添加上分号。
        print output

经过上述处理之后的数据如图所示:

 特征工程部分前期准别结束。

原文地址:https://www.cnblogs.com/LHWorldBlog/p/8650983.html

时间: 2024-08-24 18:42:35

【推荐系统篇】--推荐系统之之特征工程部分---构建训练集流程的相关文章

最近看到的“特征工程”相关文章,特汇总在一起方便浏览~

最近看到的“特征工程”相关文章,特汇总在一起方便浏览~ 对于搞数据的和玩深度学习的特征工程是不可少的一环,尤其是特征选择,好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 这里先上一篇总括<特征工程技术与方法> 这篇文章详细梳理了特征工程所包含的内容,对机器学习中的特征.特征的重要性.特征提取与选择.特征的构建.学习等子类问题也给与了总结,总之看过这篇文章之后对特征工程就能有一个总体的认识.(这张图总结的太好了,一目了然,贴出来!)

特征工程之特征表达

? ? ? ? ? 在特征工程之特征选择中,我们讲到了特征选择的一些要点.本篇我们继续讨论特征工程,不过会重点关注于特征表达部分,即如果对某一个特征的具体表现形式做处理.主要包括缺失值处理,特殊的特征处理比如时间和地理位置处理,离散特征的连续化和离散化处理,连续特征的离散化处理几个方面. 一.缺失值处理 ? ? ? ? ? 特征有缺失值是非常常见的,大部分机器学习模型在拟合前需要所有的特征都有值,不能是空或者NULL.那么如果有缺失值我们需要怎么处理呢? ? ?首先我们会看是该特征是连续值还是离

机器学习之(四)特征工程以及特征选择的工程方法

关于特征工程(Feature Engineering),已经是很古老很常见的话题了,坊间常说:"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已".由此可见,特征工程在机器学习中占有相当重要的地位.在实际应用当中,可以说特征工程是机器学习成功的关键.纵观Kaggle.KDD等国内外大大小小的比赛,每个竞赛的冠军其实并没有用到很高深的算法,大多数都是在特征工程这个环节做出了出色的工作,然后使用一些常见的算法,比如LR,就能得到出色的性能.遗憾的是,在很多的书籍中并没有直接

(七)机器学习里的特征工程

不管是工业界还是学术界,机器学习都是一个炙手可热的方向,但是学术界和工业界对机器学习的研究各有侧重,学术界侧重于对机器学习理论的研究,工业界侧重于如何用机器学习来解决实际问题.我们结合美团在机器学习上的实践,进行一个实战系列的介绍,介绍机器学习在解决工业界问题的实战中所需的基本技术.经验和技巧.本文主要结合实际问题,概要地介绍机器学习解决实际问题的整个流程,包括对问题建模.准备训练数据.抽取特征.训练模型和优化模型等关键环节:另外几篇则会对这些关键环节进行更深入地介绍. 下文分为: 1)机器学习

【特征工程】特征工程技术与方法

引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而,单纯学习机器学习的算法流程,可能仍然不会使用这些算法,尤其是应用到实际问题的时候,常常不知道怎么提取特征来建模. 特征是机器学习系统的原材料,对最终模型的影响是毋庸置疑的. 特征工程的重要意义 数据特征会直接影响你使用的预测模型和实现的预测结果.准备和选择的特征越好,则实现的结果越好. 影响预测结果好坏的因素:模型的选择.可用的数据.特征的提取. 优质的特征往往描述了数据的固有结构. 大多数模型都可

人工智能_1_初识_机器学习介绍_特征工程和文本特征提取

# 人工智能:预测,分类 # 人工智能: # 自动的工作 # 机器学习(包含深度学习) # 以前的限制因素:计算能力,数据,算法发展 # 用途: # 图像识别 # 识别图片中不同的地方(医学CT) 不用人工识别 # 图片艺术化(可以替代ps) # 无人驾驶 # 人脸识别 # 自然语言处理 # 语音识别 # 自动写报告 # 传统预测 # 性能评估 # NLP # 推荐系统 # 机器学习的数据:文件格式,csv(逗号分隔值) # 不使用数据库: # 1,性能瓶颈,数量过多,2,3GB 读取慢 # 2

特征工程(Feature Enginnering)学习记要

最近学习特征工程(Feature Enginnering)的相关技术,主要包含两块:特征选取(Feature Selection)和特征抓取(Feature Extraction).这里记录一些要点,作为备忘. 特征选取 R中的FSelector包实现了一些特征选取的算法,主要分两大类: Algorithms for filtering attributes: cfs, chi.squared, information.gain, gain.ratio, symmetrical.uncertai

特征工程(转载)

最近想拿一个DateCastle比赛上的关于预测客户人品的项目实际操作下我的sas,拿到数据后发现,最急需解决的问题是特征工程的问题,有1300多个维度的特征,自己想到的思路是由于这些特征是什么,都没有中文的说明,所以无法根据业务经验进行特征筛选,所以需要先通过相关性分析,然后再考虑PCA等方法,正巧看到一篇关于特征工程的详细解说文章~在这就分享给大家啦~ http://machinelearningmastery.com/discover-feature-engineering-how-to-

Hulu机器学习问题与解答系列 | 二十二:特征工程—结构化数据

听说最近冒出的大批呱儿子个个都是撑着眼皮也要看书的无眠小青蛙.我们学习Machine Learning的脚步又怎能停下来?动动手指,上滑开始~ 今天的内容是 [特征工程-结构化数据] 场景描述 特征工程是指结合问题寻找有效的特征并进行处理成适合模型的输入形式.机器学习中有句经典的话叫做"Garbage in, garbage out",意思是如果输入的数据是垃圾,那么得到的结果也是垃圾.可以看出模型成败的关键并不仅仅取决于模型的选取,还取决于我们是否有根据特定的问题找到了行之有效的输入