从大型数据集中有效地找到最相似的运动

数据挖掘 Python 相似
2022-03-06 11:37:58

作为过去采访任务的一部分,我正在使用如下所示的体育流媒体数据集:

pd.DataFrame({'away_contestant_country': {0: 'Japan', 1: 'Canada'},
 'competition_name': {0: 'NPB', 1: 'FIBA AmeriCup (W)'},
 'customer_country': {0: 'Japan', 1: 'Canada'},
 'device_category': {0: 'Web', 1: 'Unknown'},
 'home_contestant_country': {0: 'Japan', 1: 'Brazil'},
 'live_or_on_demand': {0: 'Live', 1: 'Live'},
 'match_date': {0: '2021-06-11T08:45:00.000Z', 1: '2021-06-13T19:10:00.000Z'},
 'match_title': {0: 'Lions v Dragons', 1: 'Brazil vs. Canada'},
 'sport_name': {0: 'Baseball', 1: 'Basketball'},
 'stream_end_time': {0: '2021-06-11T12:02:18.000Z',
  1: '2021-06-13T20:14:05.000Z'},
 'stream_start_time': {0: '2021-06-11T09:41:37.000Z',
  1: '2021-06-13T20:13:36.000Z'},
 'tournament_end_date': {0: '2021-11-29T00:00:00.000Z',
  1: '2021-06-19T00:00:00.000Z'},
 'tournament_start_date': {0: '2021-03-02T00:00:00.000Z',
  1: '2021-06-11T00:00:00.000Z'},
 'venue_country': {0: 'Japan', 1: 'Puerto Rico'},
 'viewer_id': {0: 5049, 1: 9062}})

其中每个实例都是流式传输事件的用户。在提取了流长度等一些特征后,数据在数值和分类类型之间混合。我们的数据集有大约 37k 行和 15 个特征。

我的目标是:

  1. 从数据中找出N个最相似和最不相似的运动。

  2. 构建一个可重用的函数,可以将运动名称作为输入并返回前 N 个最相似的运动。

我曾尝试使用余弦相似度和高尔相似度来计算每个实例之间的相似度并平均每项运动的得分,但在提交反馈中我被告知,随着数据集大小的增加,将每个流与其他流进行比较会变得非常昂贵. 虽然我同意,但如果没有某种相似性矩阵,我无法找到一种合适的方法来找到运动之间的相似性。

我还尝试采用输入运动的“平均”向量,它具有中值数值特征值和模式分类特征值,并使用它来计算所有其他实例之间的相似性。例如,制作一个平均 Rugby 流实例,然后将其与所有其他体育流实例进行比较。虽然速度快得多,但这并不能提供完全令人满意的结果。

这不可能是一个分类问题,因为所需的函数只是简单地给出了一个运动名称作为输入。我已经考虑过聚类算法,但我不确定如何继续使用生成的聚类来找到类似的运动。

这项任务对于大型数据集是否可行,或者是否有更简单/更有效的方法来实现我的目标?

1个回答

如果我正确理解了您的问题,我会提出以下建议:

  1. 先清理数据
  2. 编码分类特征
  3. 运行降维算法(如PCA

从这一点您可以开始分析。您可以使用 k-means 聚类作为基线,因为聚类的数量将少于运动的数量。或者您可以简单地使用欧几里得距离。