比赛网址连接: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)
关系简易图:
版权声明:本文为qq_41612527原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。