智源 - 看山杯 专家发现算法大赛 2019 知乎

比赛网址连接:https://www.biendata.com/competition/zhihu2019/
问题背景:高效的将知乎用户新提出的问题邀请其他用户进行解答,以及挖掘用户有能力且感兴趣的问题进行邀请下发,优化邀请回答的准确率,提高问题解答率以及回答生产数。
环境:jupyter

#_*_ coding:utf-8 _*_
# @Time    : 2019/11/15 19:11
# @Author  : xm_ai
# @Email   : 793790994@qq.com

# 加载import
import numpy as np
import pandas as pd
import warnings, gc
warnings.filterwarnings('ignore')
path = 'data/'

# 每一行代表一个单字及其 64 维 embedding 的表示
train1 = pd.read_table(path + "single_word_vectors_64d.txt", header=None, names=['word_id', 'word_num'])

train1.info()

train1.head(5)

# 每一行代表一个词及其 64 维 embedding 的表示
train2 = pd.read_table(path + "word_vectors_64d.txt", header=None, names=['word_vertor_id', 'word_vertor_num'])

train2.info()

train2.head(5)


 #每一行代表一个话题及其 64 维 embedding 的表示
train3 = pd.read_table(path + "topic_vectors_64d.txt", header=None, names=['topic_id', 'topic__num'])

train3.info()

train3.head(5)

#包含邀请数据集 (数据集 7 和 8) 及回答数据集 (数据集5) 表中涉及到的所有问题列表,每一行代表一个问题的相关信息, 每一行有 7 列, 列之间采用 /tab 分隔符分割。
train4 = pd.read_table(path + "question_info_0926.txt", header=None)

train4.info()


train4.head(5)


#为邀请数据集 (数据集 7 和 8) 中用户最近 2 个月内的所有回答,每一行代表一个回答的相关信息, 每一行有 20 列, 列之间采用 /tab 分隔符分割
train5 = pd.read_table(path + "answer_info_0926.txt", header=None)

train5.info() 
train5.head(5)

# 包含邀请数据集 (数据集 7 和 8) 中用户相关特征信息,每一行代表一个用户的相关信息, 每一行有 21 列, 列之间采用 /tab 分隔符分割。
train6 = pd.read_table(path + "member_info_0926.txt", header=None)

train6.info()
train6.head(5)

# 包含用户最近 1 个月的邀请数据,每一行代表一个问题邀请的相关信息, 每一行有 4 列, 列之间采用 /tab 分隔符分割
train7 = pd.read_table(path + "invite_info_0926.txt", header=None)

train7.info()
train7.head(5)

#未来 7 天的问题邀请数据,参赛队伍需提交的最终结果数据集, 每一行代表一个问题邀请相关信息,每一行有 3 列, 列之间采用 /tab 分隔符分割。
train8 = pd.read_table(path + "invite_info_evaluate_1_0926.txt", header=None)

train8.info()

train8.head(5)

# 总结怎么对每个数据集进行拼接操作


# 第一步首先将  question_info_0926.txt question_info_0926.txt和 member_info_0926.txt进行合并
#首先将邀请数据集4问题列表和邀请数据集7问题是否回答 以及邀请集6 member用户ID联系在一起
path = 'data/'
member_path = path + 'member_info_0926.txt'   # 用户信息路径
question_path = path + 'question_info_0926.txt'  # 问题信息路径
invito_path = path + 'invite_info_0926.txt'   # 邀请记录路径



#手动添加mermber的21个特征(在比赛之中有提到)给user_feature
user_feature = pd.read_table(member_path, header=None, names=['memberID', 'm_sex', 'm_keywords', 'm_amount_grade', 'm_hot_grade', 'm_registry_type',
                                  'm_registry_platform', 'm_access_frequencies', 'm_twoA', 'm_twoB', 'm_twoC', 'm_twoD',
                                  'm_twoE', 'm_categoryA', 'm_categoryB', 'm_categoryC', 'm_categoryD', 'm_categoryE',
                                  'm_salt_score', 'm_attention_topics', 'm_interested_topics'], nrows=100)

#手动添加question的7个特征(在比赛之中有提到)给question_feature
question_feature = pd.read_table(question_path, header=None, names=['questionID', 'q_createTime', 'q_title_chars', 'q_title_words', 'q_desc_chars',
                               'q_desc_words', 'q_topic_IDs'], nrows=100)

#手动添加invito_path的4个特征(在比赛之中有提到)给invite_info_data
invite_info_data = pd.read_table(invito_path, header=None, names=['questionID', 'memberID', 'time', 'label'], nrows=100)

#数据合并操作

#将invite_info_data中与user_feature,question_feature内容相同的部分进行合并操作
#invite_info_data与user_feature 的memberID进行合并
#invite_info_data与question_feature 的questionID进行合并
invite_info_data = invite_info_data.merge(user_feature, how='left', on='memberID')
invite_info_data = invite_info_data.merge(question_feature, how='left', on='questionID')
invite_info_data['day'] = invite_info_data['time'].apply(lambda x: int(x.split('-')[0][1:]))

invite_info_data.info()

evaluate_path = path + 'invite_info_evaluate_1_0926.txt'   # 验证集路径

#手动添加验证集的3个特征(在比赛之中有提到)给evaluare_info_data
evaluate_info_data = pd.read_table(evaluate_path, header=None,names=['questionID', 'memberID', 'time'])
# evaluate_info_data['day'] = evaluate_info_data['time'].apply(lambda x: int(x.split('-')[0][1:]))
#evaluare_info_data与user_feature 的memberID进行合并
#evaluare_info_data与question_feature 的questionID进行合并
evaluate_info_data = evaluate_info_data.merge(user_feature, how='left', on='memberID')
evaluate_info_data = evaluate_info_data.merge(question_feature, how='left', on='questionID')

evaluate_info_data.info()

# 对缺失数据进行填充
for column in list(invite_info_data.columns[invite_info_data.isnull().sum() > 0]):
    if invite_info_data[column].astype == 'object':
        invite_info_data[column].fillna('1', inplace=True)
    else:
        invite_info_data[column].fillna(-1, inplace=True)


# cat_features是指 用来做处理的类别特征
import catboost as cbt

feature_name = ['q_topic_IDs', 'q_desc_words', 'q_desc_chars', 'q_title_words', 'q_title_chars', 'q_createTime',
               'm_interested_topics', 'm_attention_topics', 'm_salt_score', 'm_categoryA', 'm_categoryB', 'm_categoryC',
               'm_categoryE', 'm_categoryD', 'm_twoE', 'm_twoD', 'm_twoC', 'm_twoB', 'm_twoA', 'm_access_frequencies', 'm_registry_platform', 
                'm_keywords',  'm_sex',  'm_amount_grade',  'm_hot_grade',  'm_registry_type', 'questionID', 'memberID']

cat_list = [i for i in invite_info_data.select_dtypes(object).columns if i not in ['label', 'time'] and i in feature_name]

cbt_model = cbt.CatBoostClassifier(iterations=10, learning_rate=0.05, max_depth=11, l2_leaf_reg=1, verbose=1,
                                   early_stopping_rounds=400, task_type='GPU', eval_metric='AUC',
                                   cat_features=cat_list)

cbt_model.fit(invite_info_data[feature_name], invite_info_data['label'])

result = cbt_model.predict_proba(evaluate_info_data[feature_name])[:, 1]



result_path = 'data/sample_sub_1.txt'
data_result = pd.read_table(result_path, header=None, names=['memberID', 'm_sex', 'm_keywords', 'label'], nrows=5)
data_result['label'] = result

data_result.to_csv('sample_sub_1.txt', sep='\t', index=False, header=None)

关系简易图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值