文章目录
- 目录
- 1.比赛相关介绍
- 1.1 比赛介绍
- 1.2 数据集介绍
- 1.3 评价标准介绍
- 1.4 个人理解
- 2. 解决方案
- 2.1 统计用户和event信息
- 2.2 计算用户相似度
- 2.3 用户社交关系信息处理
- 2.4 构建event和event相似度数据
- 2.5 活跃度/event热度数据
- 2.6 构建特征
- 2.7 模型构建和预测
- 3. 遇到的问题
- 4. 总结
目录
kaggle比赛官网链接
下载好的数据集链接(百度云,提取码:ino3)
1.比赛相关介绍
1.1 比赛介绍
根据user actions, event metadata, and demographic information(社交信息)预测用户对哪个event感兴趣
1.2 数据集介绍
共有六个文件:train.csv,test.csv, users.csv,user_friends.csv,events.csv和 event_attendees.csv。
- train.csv 有六列: user,event, invite,timestamp,interested和not_interested。 Test.csv 包含与train.csv相同的列,但interested和not_interested除外。每行对应于在我们的应用程序中向用户显示的事件。 event是一个标识我们系统中事件的id。 user是表示系统中用户的id。 invite 是一个二进制变量,指示用户是否已被邀请参加该事件。 timestamp是ISO-8601 UTC时间字符串,表示用户在我们的应用程序中看到事件时的大致时间(+/- 2小时)。 有兴趣是一个二进制变量,指示用户是否单击了此事件的“感兴趣”按钮; 如果用户单击了“兴趣”,则为1;如果用户未单击该按钮,则为0。类似地, not_interested是一个二进制变量,指示用户是否点击了此事件的“Not Interested”按钮; 如果用户单击按钮则为1,否则为0。用户可能会看到一个事件,并且单击既不感兴趣也不感兴趣,因此有些行包含0,0作为 感兴趣的值,not_interested。
- users.csv包含有关我们的一些用户(包括列车和测试文件中出现的所有用户)的人口统计数据,它包含以下列: user_id, locale, birthyear, gender, joinedAt, location和 timezone。 user_id是我们系统中用户的ID。 locale是一个表示用户区域设置的字符串,其格式应为 language _ territory。birthyear是一个4位整数,表示用户出生的年份。 性别是男性还是女性,具体取决于用户的性别。 joinedAt是ISO-8601 UTC时间字符串,表示用户首次使用我们的应用程序时。 location 是表示用户位置的字符串(如果已知)。timezone是一个有符号整数,表示用户的UTC偏移量(以分钟为单位)。
- user_friends.csv包含有关此用户的社交数据,包含两列:user和friends。 user是我们系统中用户的id,而 friends是用户朋友ID的空格分隔列表。
- events.csv 包含有关我们系统中事件的数据,并且有110列。前九列是 event_id,user_id,start_time,city,state,zip,country, lat和lng。 event_id是事件的id,user_id 是创建事件的用户的id。 城市, 州, 邮编和 国家/地区代表有关场地位置的更多详细信息(如果已知)。 lat 和lng 是代表场地的纬度和经度坐标的浮点数,四舍五入到小数点后三位。 start_time 是ISO-8601 UTC时间字符串,表示事件计划何时开始。最后101列需要更多解释; 首先,我们确定了在我们事件的大型随机子集的名称或描述中出现的100个最常见的词干(通过Porter Stemming获得)。最后101列是count_1, count_2,…, count_100, count_other,其中 count_N是一个整数,表示第N个最常见词干出现在此事件的名称或描述中的次数。 count_other 是其余词的统计,其茎不是100个最常见的词干之一。
- event_attendees.csv包含有关哪些用户参加了各种事件的信息,并包含以下列: event_id,yes,maybe,invite和no。event_id 标识事件。是,也许, 邀请,并且没有以空格分隔的用户ID列表,表示用户表示他们要去,可能去,被邀请或不去参加活动。
从数据介绍主要有3类数据
1.用户的历史数据 => 对event是否感兴趣/是否参加
2.用户社交数据 => 朋友圈
3.event相关的数据 => event相关的信息
简单思考
1.要把更多维度的信息纳入考量
2.协同过滤是基于 用户-event 历史交互数
3.需要把社交数据 和 event相关信息 作为影响最后结果的因素纳入考量
4.视作分类模型, 每一个人 感兴趣/不感兴趣 是target, 其他影响结果的是feature
5.影响结果的feature包括由协同过滤产出的推荐度
初步思路简图
1.3 评价标准介绍
-
对于测试集中的每个用户,提交事件列表。这些事件为模型预测出的用户最感兴趣到用户最不感兴趣的排序。
-
此竞赛的评估指标是前200个推荐的平均精度(任何一个用户的最大事件数为116,因此200不会产生有意义的限制)。您可以在 Kaggle wiki上找到有关此评估指标的更多信息 。
-
可以从数据页面下载样本提交文件。提交文件的格式应如下:
有一个标题:“用户,事件”
包含两列
用户:按排序顺序的用户ID
事件:以空格分隔的推荐事件列表,从用户最感兴趣的事件列表到用户最不感兴趣的事件列表
提交样本的前几行:
用户,事件
1776192,2877501688 1024025121 4078218285 2972428928 3025444328 1823369186 2514143386
3044012,2529072432 1532377761 1390707377 1502284248 3072478280 1918771225
4236494,152418051 4203627753 2790605371 799782433 823015621 2352676247 110357109
1.4 个人理解
- 我们需要从users.csv,user_friends.csv,events.csv和 event_attendees.csv文件提取出一些对预测用户是否会对某些事件感兴趣的特征。
- 最终我们需要实现一个模型能够输出每个用户对所有事件的一个感兴趣程度,并根据感兴趣程度对事件进行降序排序输出。
2. 解决方案
具体代码
2.1 统计用户和event信息
- 1.读取train.csv和test.csv文件
- 2.统计出用户和事件信息,构建用户-索引字典和事件-索引字典
- 3.构建用户-事件字典和事件-用户字典
- 4.构建用户-事件-兴趣矩阵
- 5.构建关联用户字典和关联事件字典。
2.2 计算用户相似度
- 1.读取user.csv文件
- 2.对user数据结构中的每一列进行处理,主要是将字符型的数据转换为数值型的数据,其中locale(locale库进行处理),joinedAt(datetime进行事件处理),location(pycountry进行编码)。
- 3.将处理后的特征进行归一化处理。
- 4.通过scipy.spatial.distance库中的函数计算每两个用户之间的相似度,从而构成一个用户相似矩阵。
2.3 用户社交关系信息处理
- 1.读取user_friends.csv文件
- 2.统计每个用户其朋友的数量(如果你有更多的朋友,可能你性格外向,更容易参加各种活动)
- 3.统计每个用户其朋友参与事件的情况,构建用户-用户朋友参与事件情况矩阵。(如果你朋友会参加某个活动,可能你也会跟随去参加一下)
2.4 构建event和event相似度数据
- 1.读取events.csv文件
- 2.将数据按照属性是否有具体的意义划分为两个矩阵
- 3.对具有意义的属性列进行hash处理,其余的列复制即可。
- 4.对上面的2个矩阵进行归一化处理
- 5.对上面两个矩阵分别计算用户-event和event-event相识度,构建两个相似度矩阵。
2.5 活跃度/event热度数据
- 1.读取event_attendees.csv文件
- 2.统计每个活动参加和不参加的人数,从而计算出互动的活跃度。
2.6 构建特征
- 1.读取之前几个步骤保存下来的文件
- 2.基于之前的得到的特征,根据User-based协同过滤,得到event的推荐度;
- 3.根据基于物品的协同过滤,得到Event的推荐度;
- 4.基于用户的朋友个数来推断用户的社交程度。朋友对用户的影响
- 5.活动本身的热度
- 6.把前面user-based协同过滤和item-based协同过滤以及各种热度和影响度作为特征组合在一起生成新的train,用于分类器分类使用。
2.7 模型构建和预测
- 读取前面保存好的训练集进行模型的训练(XGBT)
- 进行交叉验证,判断模型的性能
- 使用模型对测试集上的用户进行预测。
3. 遇到的问题
- 由于电脑性能有限,所以在统计用户和时间信息的时候,我们只关注在train和test两个文件中出现的用户和事件,其余的不作考虑,因为我们最终是要对通过对train中的数据的学习,然后对test中用户的预测。其他的没有出现的用户则不用考虑。如果电脑的性能允许的话,最好是对所有的用户都进行考虑。否则会出现用户的一些朋友在不在考虑的用户范围内。
- 再用文件user.csv文件计算用户相似度矩阵的时候,我们需要对该文件中的一些类型属性进行处理,尤其是国家属性和时间属性。其中国家属性不能简单使用one-hot进行处理,否则矩阵会非常的稀疏,应该使用pycountry库对其进行编码处理。时间属性则需要将年月进行提出。在将特征数据都转换为数值型的数据后,需要对特征数据进行归一化处理,然后使用scipy对每个用户两两之间计算相似性(向量的相似性)
- 时间属性特征一定要单独处理
- 有具体含义的特征和没有具体含义的特征需要单独进行处理
- 构建event-event相似矩阵的时候,也要对特征进行处理(类别性的数据,数值型的数据)
4. 总结
- 了解问题
- 问题分析
- 通过查阅资料,了解要解决的问题是什么(分类还是回归)
- 通过查阅文档,了解给出的数据中每个属性代表的意义。
- 结合实际的生活和自己的理解,给出初步的解决方案。
2.初步想法:
- 1.通过查阅资料发现本文解决的问题是一个推荐问题,需要我们输出TOPN.
- 2.从给出的数据可以看出,除了传统的基于用户的协同过滤和基于物品(活动)的协同过滤外,还应该利用用户的朋友圈的信息
3.具体方案:
- 1.基于user.csv文件,得出用户-用户之间的相似度矩阵
- 方法1:通过历史行为,找出关联用户
- 方法2:通过用户的信息,即该数据集中其他的属性信息,通过度量不同用户之间向量的距离作为用户之间的相似度。
- 2.基于event,得出event-event之间的相似度矩阵和用户-event的相似度矩阵。
- 方法1:基于用户的历史信息,找出关联的事件和用户关联的事件
- 方法2:基于事件的属性,即数据中其他属性的信息,衡量不同事件的向量的距离作为事件与事件之间的相似度。
- 3.基于friend.csv文件,得出用户的朋友数目和用户朋友的活跃度
- 用户的朋友数目越多,则其越外向,越有可能参与活动
- 用户朋友都是那种乐意参加活动的人,那么用户自己参加活动的可能性也会很高。
- 4.基于event_attendees.csv文件得出互动的活跃度
- 活跃度越高的事件,用户参加的可能性越大。
4.具体实施:
- 1.数据清洗
- 类别数据转换为数值型的数据
- 事件数据进行拆分
- 缺失数据进行填充
- 2.处理用户和活动之间的关联数据
- 得到用户列表(不重复)
- 得到活动列表(不重复)
- 得到用户和活动的的关联数据。
- 3.用户与用户之间的相似度矩阵
- 通过用户信息计算用户之间的相似性
- 通过用户的活动行为计算用户之间的相似性(如果两个用户参加的活动好多都相同,那么这两个用户之间相似)
- 4.构建event 和 event之间的相似度矩阵
- 通过event的属性信息计算event之间的相似性
- 通过用户参与活动的历史信息计算event之间的相似性。(相似的用户购买的产品也相似)
- 5.用户社交关系挖掘
- 统计每个用户的朋友信息
- 统计每个用户朋友活跃度信息(参加活动总数/总的朋友数)
- 6.统计event热度
- 统计每个活动参与的人数信息作为活动的热度标准
- 7.串起所有的数据处理和准备流程
- 计算上诉的特征,并进行保存
- 8.构建特征
- 读取上诉保存的特征
- 基于用户-用户的相似度矩阵,得出基于用户的活动推荐度
- 基于活动-活动的相似度矩阵,得出基于活动的活动推荐度
- 合并所有的特征,并进行保存
- 9.建模与预测
- 模型训练
- 参数调节
- 模型评估
- 进行预测