2019腾讯广告算法大赛之清洗广告数据集和用户数据集

版权声明:版权归世界上所有无产阶级所有 https://blog.csdn.net/qq_41776781/article/details/89814665

研一下半学期参加的比赛,失败原因如下:

第一,pandas几乎是从零开始,对于某些数据的清洗如果使用pandas封装的函数可能只需要很短的时间,但是使用python的判断语句会很慢,而且可能做不出来。 

okay  2019/06/05 已学习

第二,因为赛题中需要自己构造训练数据和标签,对题目理解的不是很好,导致构造数据集的目标一直再修改,

第三,比赛之前虽然实现了和题目相关代码,以及可能用到的算法,但是仅仅关注的是代码中的含义和数据的变化,但是对于代码的作者对于这个问题的整体构架是不清楚的。


但是幸运的是最后在参考两个大佬的写的Idea之后也成功的构造出了训练的集,以及搭建了一个xgboost模型,作为一个三流学生也是唯一值得高兴的事吧!!!!!!!!!构建训练集参考的是小凤仙分享的idea, 对于模型的搭建参考的是鱼佬在知乎上分享的idea, 大家可以关注一下。。。。。。。。。。。

下面分享一下自己如何构造训练集和最后搭建的模型相关源码吧,感觉那个地方不好,大佬们可以指导一下,不胜感激!!!毕竟比赛不重要能有进步才重要。

首先是对静态广告数据中脏数据的清洗,静态广告数据中脏数据包括三种情况,

第一:  创建时间为0 , 将数据进行split()之后判断第二项数据是否是 '0', 是0的话就跳过

第二:  广告行业ID中出现多值的情况,  判断该列属性中是否存在(,)逗号  存在即跳过

第三: 某项数据记录中存在缺失,   判断标准是判断该条静态广告记录的长度是否为7   不是的话即跳过该记录

最后保存的结果形式为:

然后是对广告操作数据进行清洗,广告操作数据集中脏数据包括两种情况

第一: 广告创建修改时间是0230的记录, 

第二: 该条广告操作记录中广告ID不存在于静态广告数据集中,之所以有这个判断是因为在构造训练集的时候,需要广告操作数据中的出价、人群定向以及投放时间这三个属性,也需要广告静态数据中的广告大小、广告行业ID一类的属性,如果广告ID只存在某一个文件中则无法构造数据集,

在保存广告操作数据时,最后做了两项工作,

第一:  当该条记录表示的为创建操作时,将该条记录中的创建时间中的‘0’,修改成对应的静态广告数据中的创建时间。

第二:  为了简化处理,暂且不考虑广告操作数据集中的修改操作,注意这样处理会存在缺失一些训练数据的

最后广告操作数据集的保存结果如下:

最后是对用户数据集进行清洗操作,用户数据并不存在异常数据,所以只需要正常保存即可。

最后在构造训练集的时候,当广告操作数据集中的人群定向中的属性是'ALL'时,这个时候就需要对每一列属性进行去重操作,并保留唯一值,赋值给广告操作中的人群定向。

下一节介绍我如何清洗曝光广告日志以及如何构建标签的。

1、清洗静态广告和动态广告中的脏数据的代码

# -*- coding: utf-8 -*-
# @Time    : 2019/4/30 14:49
# @Author  : YYLin
# @Email   : [email protected]
# @File    : Dataload_Ad_Data.py
import pandas as pd
import time

# 当load_ad值为 Static_Ad 表示清洗的是静态数据集
load_ad = 'Static_Ad'

if load_ad == 'Static_Ad':
    # 将静态广告(ad_static_feature)转化成csv格式 对于创建时间这一列的数据集没有转化时间 待做 未完成
    # 19-04-19 已经将静态广告数据中的时间戳转化成对应的时间
    Ad_Static_Feature_Data = []

    # 定义曝光日志中的相关列
    Ad_Static_Feature_Data_columns = ['ad_id', 'Creation_time', 'Ad_account_id', 'Commodity_id', 'Commodity_type',
                                      'Ad_Industry_Id', 'Ad_material_size']

    # 为数据集增加列名称
    Ad_Static_Feature_Data.append(Ad_Static_Feature_Data_columns)
    with open('../Dataset/tencent-dataset-19/ad_static_feature.out', 'r') as f:
        for i, line in enumerate(f):
            # print(i, ':', line,'\n', len(line), type(line))
            line = line.strip().split('\t')
            # print(i, ':', line,  '\n', type(line), len(line))
            # print('每一个元素的取值类型: ', type(line[1]), type(line[2]), type(line[3]), type(line[4]))

            # 测试数据集的时候使用
            # if i > 1000:
                # break

            # 分别用于判断该条广告数据是否存在记录缺失 是否创建时间为0 广告行业是否存在多值
            if line[1] == '0':
                # print("数据集中创建时间为0的数据集是: ", line)
                continue
            if ',' in line[5]:
                # print("数据集中广告行业ID存在多值记录是: ", line)
                continue
            if len(line) != 7:
                # print("广告数据集中出现缺失数据: ", line)
                continue

            # 4-19新加该功能 静态广告时间的格式是2018/6/26 4:35:50
            # print(line[1], type(line[1]), line)
            loacl_time = int(line[1])
            time_local = time.localtime(loacl_time)
            line[1] = time.strftime("%Y-%m-%d %H:%M:%S", time_local)

            Ad_Static_Feature_Data.append(line)
    print("***********userFeature_data[0]:\n", Ad_Static_Feature_Data[1])
    print("***********userFeature_data[0][1]:\n", Ad_Static_Feature_Data[1][0])

    user_feature = pd.DataFrame(Ad_Static_Feature_Data)
    user_feature.to_csv('../Dataset/tencent-dataset-19/dataset-for-train/Ad_Static_Feature_Data.csv', index=False, header=False)

    '''
    # 使用pandas删除不需要的列元素 测试完成 暂时不使用
    remove_data = pd.read_csv('../Dataset/tencent-dataset-19/dataset-for-train/Ad_Static_Feature_Data_redo.csv')
    print(remove_data.info())

    remove_data = remove_data.drop(['Ad_account_id'], axis=1)
    remove_data = remove_data.drop(['Commodity_id'], axis=1)
    remove_data.to_csv('../Dataset/tencent-dataset-19/dataset-for-train/Ad_Static_Feature_Data_redo.csv', index=False)
    '''
else:
    import linecache
    import sys
    # 用于将二维数组转化成一维数组
    import operator
    from functools import reduce

    def get_next_line(i_row):
        line = linecache.getline('../Dataset/tencent-dataset-19/ad_operation.dat', (i_row))
        line = line.strip().split('\t')
        # print("当前数据行的值是:", line)

        line_next = linecache.getline('../Dataset/tencent-dataset-19/ad_operation.dat', (i_row + 1))
        line_next = line_next.strip().split('\t')

        return line_next

    # 读取静态广告数据集中的广告ID将其转化成list数据
    Exposure_Log_Data = pd.read_csv('data/Ad_Static_Feature_Data.csv')

    Ad_id_in_static = Exposure_Log_Data['ad_id']
    Ad_time_in_static = Exposure_Log_Data['Creation_time']
    # print("静态广告数据集中的广告id和时间分别是:\n", Ad_id_in_static.head(5), '\n', Ad_time_in_static.head(5))

    # 保存静态广告中广告ID和对应的时间  注意时间类型是str()
    list_Ad_id_in_static = list(Ad_id_in_static)
    # print('静态广告数据集中广告ID的取值和数据类型分别是:',
    # len(list_Ad_id_in_static), list_Ad_id_in_static[0:5], type(list_Ad_id_in_static[0]))
    list_Ad_time_in_static = list(Ad_time_in_static)

    # print('静态广告数据集中创建时间的取值和数据类型分别是:', len(list_Ad_time_in_static), list_Ad_time_in_static[0:5],
    # type(list_Ad_time_in_static[0]))

    # 将广告操作对应的数据集(ad_operation.dat)进行清洗 清洗的内容包括一下几个部分
    Ad_Operation_Data = []
    # 定义操作数据对应的序列
    Ad_Operation_Data_columns = ['ad_id', 'Create_modify_time', 'ad_bid', 'Chose_People', 'Delivery_time']

    # 为数据集增加列名称
    Ad_Operation_Data.append(Ad_Operation_Data_columns)

    All_kind_ad = []
    with open('../Dataset/tencent-dataset-19/ad_operation.dat', 'r') as f:
        for i, line in enumerate(f):
            # print(i, ':', line, '\n', len(line), type(line))
            line = line.strip().split('\t')
            # print(i, ':', line, '\n', len(line), type(line[2]))

            if (i % 10000) == 0:
                print("***********我已经执行了%d行"%(i))

            # 首先需要判断该条数据是否在静态数据集之中 不存在则删除
            if int(line[0]) not in list_Ad_id_in_static:
                # print("*******该条数据不存在于静态数据集之中,需要删除*******", line)
                continue

            # 使用line[2]修改广告操作数据集中的时间选项 并进行保存 验证成功
            if '20190230' in line[1]:
                # print('数据集中出现2月30号的数据已删除', line)
                continue

            # 首先需要广告操作数据集中的训练时间
            if len(line[1]) == 14:
                data_list = list(line[1])
                data_list.insert(4, '-')
                data_list.insert(7, '-')
                data_list.insert(10, ' ')
                data_list.insert(13, ':')
                data_list.insert(16, ':')
                line[1] = ''.join(data_list)
                # print(line[1])

            if line[2] == '2':
                # 修改广告的操作时间
                ad_id_index = list_Ad_id_in_static.index(int(line[0]))
                line[1] = list_Ad_time_in_static[ad_id_index]

                # 修改曝光广告位置的值
                All_kind_ad.append(line[4])
                list_next_data = get_next_line(i + 1)

                if list_next_data[2] == '1':
                    tmp_value_ad_list = '?'.join(All_kind_ad)
                    tmp_value_ad_list = tmp_value_ad_list.strip().split('?')
                    # print("tmp_value_ad_list中的值是:\n", tmp_value_ad_list)
                    line = line[0:2]
                    line.append(tmp_value_ad_list[0])
                    line.append(tmp_value_ad_list[1])
                    line.append(tmp_value_ad_list[2])
                    All_kind_ad = []
                elif list_next_data[2] == '2' and list_next_data[0] != line[0]:
                    tmp_value_ad_list = '?'.join(All_kind_ad)
                    tmp_value_ad_list = tmp_value_ad_list.strip().split('?')
                    line = line[0:2]
                    line.append(tmp_value_ad_list[0])
                    line.append(tmp_value_ad_list[1])
                    line.append(tmp_value_ad_list[2])
                    All_kind_ad = []
                else:
                    continue
            elif line[2] == '1':
                continue

            else:
                print("广告操作类型既不是新建,也不是修改,:\n", line)
                sys.exit()

            Ad_Operation_Data.append(line)

            # if i >= 100:
                # break
            # sys.exit()
    # print("***********use Feature_data[0]:\n", Ad_Operation_Data[9])
    # print("***********userFeature_data[0][1]:\n", Ad_Operation_Data[9][1])

    Ad_Operation_Data = pd.DataFrame(Ad_Operation_Data)
    Ad_Operation_Data.to_csv('data/Ad_Operation_Data.csv', index=False, header=False)

2、清洗用户数据集的代码

# -*- coding: utf-8 -*-
# @Time    : 2019/4/30 14:40
# @Author  : YYLin
# @Email   : [email protected]
# @File    : Dataload_User.py
import pandas as pd
userFeature_data = []

user_Feature_columns = ['user_id', 'Age', 'Gender', 'Area', 'Marriage_Status', 'Education', 'Consuption_Ability', 'Device',
                     'Work_Status', 'Connection_Type', 'Behavior']

# 为数据集增加列名称 对于userFeature_data不需要对某一列的数据进行处理
userFeature_data.append(user_Feature_columns)
with open('../Dataset/tencent-dataset-19/user_data', 'r') as f:
    for i, line in enumerate(f):
        # print(i, ':', line,'\n', len(line), type(line))
        line = line.strip().split('\t')
        # print(i, ':', line, type(line),'\n', len(line))
        # if i > 1000:
            # break
        userFeature_data.append(line)

print("***********userFeature_data[0]:\n", userFeature_data[1])
print("***********userFeature_data[0][1]:\n", userFeature_data[1][0])
user_feature = pd.DataFrame(userFeature_data)
print("***********正在保存数据集************")
user_feature.to_csv('data/userFeature.csv', index=False, header=False)


猜你喜欢

转载自blog.csdn.net/qq_41776781/article/details/89814665