Kaggle 之书(四)

原文:annas-archive.org/md5/ef46492e324ad2e4ffd771274a9405da

译者:飞龙

协议:CC BY-NC-SA 4.0

第十二章:模拟和优化竞赛

强化学习RL)在机器学习的不同分支中是一个有趣的案例。一方面,它在技术层面上要求很高:来自监督学习的各种直觉并不适用,相关的数学工具也更为复杂;另一方面,它对于外行或非专业人士来说最容易解释。一个简单的类比是教你的宠物(我非常有意地避免狗与猫的争论)表演特技:你为做得好的特技提供奖励,否则拒绝。

强化学习在 Kaggle 的竞赛派对中是一个后来者,但近年来,随着模拟竞赛的引入,情况发生了变化。在本章中,我们将描述 Kaggle 宇宙中这个新而令人兴奋的部分。到目前为止——在撰写本文时——已经举办了四个特色竞赛和两个游乐场竞赛;虽然这个列表并不广泛,但它允许我们给出一个广泛的概述。

在本章中,我们将展示在几个模拟竞赛中提出的问题的解决方案:

  • 我们从Connect X开始。

  • 我们接着展示剪刀石头布,其中展示了构建竞争性代理的双重方法。

  • 接下来,我们展示了一个基于多臂老虎机的解决方案,用于Santa竞赛。

  • 我们以对剩余竞赛的概述结束,这些竞赛略超出了本章的范围。

如果强化学习对你来说是一个全新的概念,那么首先获得一些基本理解可能是个好主意。开始 RL 冒险的一个非常好的方式是 Kaggle 学习课程,该课程专门针对游戏 AI 背景下的这个主题(www.kaggle.com/learn/intro-to-game-ai-and-reinforcement-learning)。该课程介绍了诸如代理和策略等基本概念,同时也提供了一个(快速)介绍深度强化学习。课程中的所有示例都使用了来自游乐场竞赛Connect X的数据,其目标是训练一个能够在线连接跳棋的代理(www.kaggle.com/c/connectx/overview)。

在更广泛的意义上,值得指出的是,模拟和优化竞赛的一个重要方面是环境:由于问题的本质,你的解决方案需要表现出比仅仅提交一组数字(如“常规”监督学习竞赛的情况)更动态的特性。关于模拟竞赛中使用的环境的非常详尽和有信息量的描述可以在github.com/Kaggle/kaggle-environments/blob/master/README.md找到。

Connect X

在本节中,我们展示如何使用启发式方法解决玩跳棋的简单问题。虽然这不是深度学习解决方案,但我们认为这种概念的基本展示对那些没有显著先前接触 RL 的人来说更有用。

如果你刚开始接触使用 AI 玩棋类游戏的概念,汤姆·范·德·维勒www.kaggle.com/tvdwiele)的演示是一个值得探索的资源:tinyurl.com/36rdv5sa

Connect X的目标是在游戏棋盘上先于对手将你的棋子排成一行(水平、垂直或对角线)的数量X)。玩家轮流将棋子放入棋盘顶部的某一列。这意味着每一步的目的可能是为了赢得比赛,或者是为了阻止对手赢得比赛。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_01.png

图 12.1:Connect X 棋盘

Connect X是第一个引入代理的比赛:参与者必须提交能够与其他人玩游戏的游戏代理,而不是静态的提交(或与未见数据集评估的笔记本)。评估按步骤进行:

  1. 上传后,提交将自行对弈以确保其正常工作。

  2. 如果这个验证片段成功,就会分配一个技能评分,并且提交将加入所有竞争者的行列。

  3. 每个提交都会播放几个片段,随后进行排名调整。

考虑到这个设置,让我们继续展示如何为Connect X比赛构建一个提交。我们提供的代码适用于X=4,但可以轻松地适应其他值或变量X

首先,我们安装 Kaggle 环境包:

!pip install kaggle-environments --upgrade 

我们定义了一个环境,我们的代理将在其中被评估:

from kaggle_environments import evaluate, make
env = make("connectx", debug=True)
env.render() 

虽然你可能有一个尝试复杂方法的冲动,但开始简单是有用的——正如我们在这里所做的那样,通过使用简单的启发式方法。这些方法在伴随的代码中组合成一个单独的函数,但为了展示,我们一次描述一个。

第一条规则是检查是否有任何玩家有机会垂直连接四个棋子,如果有,就返回可能的位置。我们可以通过使用一个简单的变量作为我们的输入参数来实现这一点,它可以取两个可能的值,表示正在分析哪个玩家的机会:

def my_agent(observation, configuration):
    from random import choice
    # me:me_or_enemy=1, enemy:me_or_enemy=2
    def check_vertical_chance(me_or_enemy):
        for i in range(0, 7):
            if observation.board[i+7*5] == me_or_enemy \
            and observation.board[i+7*4] == me_or_enemy \
            and observation.board[i+7*3] == me_or_enemy \
            and observation.board[i+7*2] == 0:
                return i
            elif observation.board[i+7*4] == me_or_enemy \
            and observation.board[i+7*3] == me_or_enemy \
            and observation.board[i+7*2] == me_or_enemy \
            and observation.board[i+7*1] == 0:
                return i
            elif observation.board[i+7*3] == me_or_enemy \
            and observation.board[i+7*2] == me_or_enemy \
            and observation.board[i+7*1] == me_or_enemy \
            and observation.board[i+7*0] == 0:
                return i
        # no chance
        return -99 

我们可以定义一个类似的方法来处理横向机会:

 def check_horizontal_chance(me_or_enemy):
        chance_cell_num = -99
        for i in [0,7,14,21,28,35]:
            for j in range(0, 4):
                val_1 = i+j+0
                val_2 = i+j+1
                val_3 = i+j+2
                val_4 = i+j+3
                if sum([observation.board[val_1] == me_or_enemy, \
                        observation.board[val_2] == me_or_enemy, \
                        observation.board[val_3] == me_or_enemy, \
                        observation.board[val_4] == me_or_enemy]) == 3:
                    for k in [val_1,val_2,val_3,val_4]:
                        if observation.board[k] == 0:
                            chance_cell_num = k
                            # bottom line
                            for l in range(35, 42):
                                if chance_cell_num == l:
                                    return l - 35
                            # others
                            if observation.board[chance_cell_num+7] != 0:
                                return chance_cell_num % 7
        # no chance
        return -99 

我们对对角线组合重复相同的做法:

# me:me_or_enemy=1, enemy:me_or_enemy=2
def check_slanting_chance(me_or_enemy, lag, cell_list):
        chance_cell_num = -99
        for i in cell_list:
            val_1 = i+lag*0
            val_2 = i+lag*1
            val_3 = i+lag*2
            val_4 = i+lag*3
            if sum([observation.board[val_1] == me_or_enemy, \
                    observation.board[val_2] == me_or_enemy, \
                    observation.board[val_3] == me_or_enemy, \
                    observation.board[val_4] == me_or_enemy]) == 3:
                for j in [val_1,val_2,val_3,val_4]:
                    if observation.board[j] == 0:
                        chance_cell_num = j
                        # bottom line
                        for k in range(35, 42):
                            if chance_cell_num == k:
                                return k - 35
                        # others
                        if chance_cell_num != -99 \
                        and observation.board[chance_cell_num+7] != 0:
                            return chance_cell_num % 7
        # no chance
        return -99 

我们可以将逻辑组合成一个单独的函数,检查机会(与对手玩游戏):

 def check_my_chances():
        # check my vertical chance
        result = check_vertical_chance(my_num)
        if result != -99:
            return result
        # check my horizontal chance
        result = check_horizontal_chance(my_num)
        if result != -99:
            return result
        # check my slanting chance 1 (up-right to down-left)
        result = check_slanting_chance(my_num, 6, [3,4,5,6,10,11,12,13,17,18,19,20])
        if result != -99:
            return result
        # check my slanting chance 2 (up-left to down-right)
        result = check_slanting_chance(my_num, 8, [0,1,2,3,7,8,9,10,14,15,16,17])
        if result != -99:
            return result
        # no chance
        return -99 

这些块构成了逻辑的基础。虽然制定起来有点繁琐,但它们是将直觉转化为可用于在游戏中竞争的代理的启发式策略的有用练习。

请参阅存储库中的相关代码,以获取本例中代理的完整定义。

我们新定义的代理的性能可以与预定义的代理(例如,随机代理)进行比较:

env.reset()
env.run([my_agent, "random"])
env.render(mode="ipython", width=500, height=450) 

上述代码展示了如何从头开始设置一个相对简单问题的解决方案(这就是为什么连接 X是一个游乐场而不是一个特色竞赛的原因)。有趣的是,这个简单的问题可以用(几乎)最先进的方法(如 AlphaZero)来处理:www.kaggle.com/connect4alphazero/alphazero-baseline-connectx

在介绍性例子之后,你应该准备好深入更复杂(或者至少不是基于玩具示例)的竞赛。

剪刀石头布

模拟竞赛中提到的几个问题涉及玩游戏并非巧合:在各个复杂程度下,游戏提供了一个规则明确的环境,自然适合代理-行动-奖励框架。除了井字棋之外,连接棋盘是竞争性游戏中最简单的例子之一。随着游戏难度等级的提升(即游戏难度),让我们来看看剪刀石头布以及围绕这个游戏展开的 Kaggle 竞赛应该如何进行。

剪刀石头布竞赛的构想(www.kaggle.com/c/rock-paper-scissors/code)是对基本的剪刀石头布游戏(在一些地区被称为roshambo)的扩展:而不是通常的“三局两胜”的得分,我们使用“一千局一胜”。

我们将描述两种可能的解决问题的方法:一种基于博弈论方法,另一种更侧重于算法方面。

我们从纳什均衡开始。维基百科将这个定义为一个涉及两个或更多玩家的非合作博弈的解,假设每个玩家都知道其他玩家的均衡策略,并且没有玩家可以通过仅改变自己的策略来获得优势。

在博弈论框架下对剪刀石头布的出色介绍可以在www.youtube.com/watch?v=-1GDMXoMdaY找到。

用红色和蓝色表示我们的玩家,矩阵中的每个单元格都显示了给定移动组合的结果:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_02.png

图 12.2:剪刀石头布的收益矩阵

以一个例子来说明,如果双方都出石头(左上角的单元格),双方都得到 0 分;如果蓝色方出石头而红色方出布(第一行的第二列的单元格),红色方获胜——因此红色方得到+1 分,而蓝色方得到-1 分。

如果我们以 1/3 的等概率玩每个动作,那么对手也必须这样做;否则,如果他们总是出石头,他们将和石头平局,输给布,赢剪刀——每种情况发生的概率都是 1/3(或三分之一的概率)。在这种情况下,期望奖励是 0,这时我们可以改变策略为布,并一直获胜。同样的推理也可以用于布对剪刀和剪刀对石头的策略,由于冗余,我们不会展示结果的矩阵。

为了达到均衡,剩余的选项是两个玩家都需要采取随机策略——这就是纳什均衡。我们可以围绕这个想法构建一个简单的智能体:

%%writefile submission.py
import random
def nash_equilibrium_agent(observation, configuration):
    return random.randint(0, 2) 

在开始时(从笔记本直接写入文件)的魔法是满足这个特定竞赛提交约束的必要条件。

我们的纳什智能体与其他智能体相比表现如何?我们可以通过评估性能来了解:

!pip install -q -U kaggle_environments
from kaggle_environments import make 

在撰写本文时,导入后出现了一个错误(无法加载名为‘gfootball’的模块);Kaggle 的官方建议是忽略它。实际上,它似乎对执行代码没有影响。

我们首先创建石头剪刀布环境,并将模拟的每个模拟的 episodes 限制为 1,000 个:

env = make(
    "rps", 
    configuration={"episodeSteps": 1000}
) 

我们将利用在这个竞赛中创建的笔记本,该笔记本实现了基于确定性启发式算法的多个智能体(www.kaggle.com/ilialar/multi-armed-bandit-vs-deterministic-agents),并从那里导入我们竞争的智能体的代码:

%%writefile submission_copy_opponent.py
def copy_opponent_agent(observation, configuration):
    if observation.step > 0:
        return observation.lastOpponentAction
    else:
        return 0
# nash_equilibrium_agent vs copy_opponent_agent
env.run(
    ["submission.py", "submission_copy_opponent.py"]
)
env.render(mode="ipython", width=500, height=400) 

当我们执行前面的代码块并运行环境时,我们可以观察 1,000 个 epoch 的动画板。一个快照看起来像这样:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_03.png

图 12.3:评估智能体性能的渲染环境快照

在监督学习——无论是分类还是回归——中,通常有用简单基准来开始处理任何问题,通常是线性模型。尽管它不是最先进的,但它可以提供一个有用的期望值和性能度量。在强化学习中,一个类似的想法也成立;在这个能力中值得尝试的方法是多臂老虎机,这是我们能够诚实地称之为 RL 的最简单算法。在下一节中,我们将展示这种方法如何在模拟竞赛中使用。

圣诞竞赛 2020

在过去几年里,Kaggle 上形成了一种传统:在每年的 12 月初,会有一个以圣诞为主题的竞赛。实际的算法方面每年都有所不同,但就我们的目的而言,2020 年的竞赛是一个有趣的案例:www.kaggle.com/c/santa-2020

设置是一个经典的多臂老虎机MAB)算法,通过在自动售货机上重复操作来最大化奖励,但有两个额外特点:

  • 奖励衰减:在每一步,从机器获得奖励的概率会降低 3%。

  • 竞赛:您不仅受时间的限制(有限次数的尝试),还受另一个试图实现相同目标的玩家的限制。我们主要提到这个限制是为了完整性,因为它不是将我们的解决方案明确包含在内的关键因素。

对于如何解决通用多臂老虎机问题的方法的好解释,读者可以参考lilianweng.github.io/lil-log/2018/01/23/the-multi-armed-bandit-problem-and-its-solutions.html

我们展示的解决方案是从www.kaggle.com/ilialar/simple-multi-armed-bandit改编的,代码来自Ilia Larchenko (www.kaggle.com/ilialar)。我们的方法基于对奖励分布的连续更新:在每一步,我们从具有参数(a+1, b+1)的 Beta 分布中生成一个随机数,其中:

  • a 是从这个臂获得的总奖励(胜利次数)

  • b 是历史损失的数量

当我们需要决定拉哪个臂时,我们选择产生最高数字的臂并使用它来生成下一步;我们的后验分布成为下一步的先验。

下面的图表显示了不同(a, b)值对的 Beta 分布形状:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_04.png

图 12.4:不同(a,b)参数组合的 Beta 分布密度形状

如您所见,最初,分布是平坦的(Beta(0,0)是均匀的),但随着我们收集更多信息,概率质量会集中在峰值周围,这意味着不确定性更少,我们对判断更有信心。我们可以通过每次使用一个臂来减少a参数来整合特定于比赛的奖励衰减。

我们通过编写一个提交文件来开始创建我们的代理。首先,必要的导入和变量初始化:

%%writefile submission.py
import json
import numpy as np
import pandas as pd
bandit_state = None
total_reward = 0
last_step = None 

我们定义了一个指定 MAB 代理的类。为了阅读的连贯性,我们重新生成了整个代码,并在其中包含注释说明:

def multi_armed_bandit_agent (observation, configuration):
    global history, history_bandit
    step = 1.0         # balance exploration / exploitation
    decay_rate = 0.97  # how much do we decay the win count after each call

    global bandit_state,total_reward,last_step

    if observation.step == 0:
        # initial bandit state
        bandit_state = [[1,1] for i in range(configuration["banditCount"])]
    else:       
        # updating bandit_state using the result of the previous step
        last_reward = observation["reward"] - total_reward
        total_reward = observation["reward"]

        # we need to understand who we are Player 1 or 2
        player = int(last_step == observation.lastActions[1])

        if last_reward > 0:
            bandit_state[observation.lastActions[player]][0] += last_reward * step
        else:
            bandit_state[observation.lastActions[player]][1] += step

        bandit_state[observation.lastActions[0]][0] = (bandit_state[observation.lastActions[0]][0] - 1) * decay_rate + 1
        bandit_state[observation.lastActions[1]][0] = (bandit_state[observation.lastActions[1]][0] - 1) * decay_rate + 1
    # generate random number from Beta distribution for each agent and select the most lucky one
    best_proba = -1
    best_agent = None
    for k in range(configuration["banditCount"]):
        proba = np.random.beta(bandit_state[k][0],bandit_state[k][1])
        if proba > best_proba:
            best_proba = proba
            best_agent = k

    last_step = best_agent
    return best_agent 

如您所见,函数的核心逻辑是对 MAB 算法的直接实现。在bandit_state变量中,我们应用衰减乘数,这是针对我们竞赛的特定调整。

与前一个案例类似,我们现在已经准备好评估我们的代理在竞赛环境中的性能。下面的代码片段展示了如何实现这一点:

%%writefile random_agent.py
import random
def random_agent(observation, configuration):
    return random.randrange(configuration.banditCount)
from kaggle_environments import make
env = make("mab", debug=True)
env.reset()
env.run(["random_agent.py", "submission.py"])
env.render(mode="ipython", width=800, height=700) 

我们看到类似这样的情况:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_05.png

图 12.5:评估代理性能的渲染环境快照

在本节中,我们展示了如何在 Kaggle 的模拟竞赛中利用经典的多臂老虎机算法。虽然作为一个起点很有用,但这并不足以获得奖牌区,在那里深度强化学习方法更为流行。

我们将接着讨论基于其他方法的策略,在多样化的竞赛中。

游戏的名称

除了上述相对简单的游戏之外,模拟竞赛涉及更复杂的设置。在本节中,我们将简要讨论这些。第一个例子是 Halite,在竞赛页面上(www.kaggle.com/c/halite)定义为以下方式:

Halite […] 是一款资源管理游戏,你在这里建造并控制一支小型舰队。你的算法决定它们的移动以收集卤素,这是一种发光的能量来源。比赛结束时收集到的卤素最多的一方获胜,但如何制定有效且高效的策略取决于你。你控制你的舰队,建造新的船只,创建造船厂,并在游戏板上开采再生的卤素。

游戏的界面如下:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_12_6.png

图 12.6:Halite 游戏板

Kaggle 围绕这款游戏组织了两场比赛:一个游乐场版(www.kaggle.com/c/halite-iv-playground-edition)以及一个常规的特色版(www.kaggle.com/c/halite)。在这种情况下,经典的强化学习方法不太有用,因为,由于有任意数量的单位(船只/基地)和动态的对手池,信用分配问题对于拥有“正常”计算资源的人来说变得难以解决。

在完全普遍的意义上解释信用分配问题超出了本书的范围,但感兴趣的读者可以从维基百科条目(en.wikipedia.org/wiki/Assignment_problem)开始,并阅读 Mesnard 等人撰写的这篇出色的介绍性文章:proceedings.mlr.press/v139/mesnard21a.html

Tom van de Wielewww.kaggle.com/c/halite/discussion/183543)对获胜解决方案的描述提供了对在此情况下证明成功的修改方法的优秀概述(深度强化学习,每个单位独立分配信用)。

另一个涉及相对复杂游戏的竞赛是Lux AI (www.kaggle.com/c/lux-ai-2021)。在这个竞赛中,参与者被要求设计智能体来解决一个结合资源收集和分配的多变量优化问题,与其他玩家竞争。此外,成功的智能体还必须分析对手的移动并做出相应的反应。这个竞赛的一个有趣特点是“元”方法的流行:模仿学习 (paperswithcode.com/task/imitation-learning)。这是一种在强化学习中相当新颖的方法,专注于从演示中学习行为策略——而不需要特定的模型来描述状态-动作对的生成。这种想法的一个具有竞争力的实现(在撰写本文时)是由 Kaggle 用户 Ironbar 提供的 (www.kaggle.com/c/lux-ai-2021/discussion/293911)。

最后,没有对 Kaggle 模拟竞赛的讨论是不完整的,没有提及*Google Research Football with Manchester City F.C.*竞赛 (www.kaggle.com/c/google-football/overview)。这个竞赛背后的动机是让研究人员探索 AI 智能体在复杂环境如足球中的能力。竞赛概述部分将问题表述如下:

体育运动需要短期控制、学习概念如传球和高级策略之间的平衡,这很难教会智能体。目前存在一个环境和测试智能体的当前环境,但其他解决方案可能提供更好的结果。

与上述一些例子不同,这个竞赛主要由强化学习方法主导:

研究上述解决方案是学习如何利用强化学习解决这类问题的绝佳起点。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Firat_Gonen.png

Firat Gonen

www.kaggle.com/frtgnn

对于本章的访谈,我们采访了 Firat Gonen,他是数据集、笔记本和讨论的三位大师,同时也是 HP 数据科学全球大使。他向我们分享了他对 Kaggle 方法的看法,以及他的态度是如何随着时间的推移而演变的。

你最喜欢的比赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我最喜欢的比赛类型随着时间的推移而演变。我曾经更喜欢非常通用的表格比赛,只要有一台好笔记本电脑和一些耐心,就能掌握趋势。我觉得我以前能够很好地看到训练集和测试集之间的异常趋势。随着时间的推移,由于 Z by HP 授予我大使称号以及我的工作站设备,我逐渐转向了更多的计算机视觉比赛,尽管我还有很多东西要学。

你是如何应对 Kaggle 比赛的?这种方法与你在日常工作中所做的方法有何不同?

我通常喜欢尽可能推迟建模部分。我喜欢利用这段时间进行探索性数据分析(EDA)、处理异常值、阅读论坛等,尽量保持耐心。在我感觉特征工程完成之后,我尝试只构建基准模型,以掌握不同架构的结果。我的技术在与专业工作相关时也非常相似。我认为在大量时间内试图做到最好是没有用的;时间和成功之间必须有一个平衡。

告诉我们你参加的一个特别具有挑战性的比赛,以及你用来解决任务的见解。

弗朗索瓦·肖莱特举办的比赛极具挑战性;这是第一个迫使我们进入通用人工智能(AGI)的比赛。我记得在那个比赛中,我感到非常无力,我在那里学到了几种新技术。我认为每个人在记住数据科学不仅仅是机器学习的同时,都这样做过。在 Kaggle 上,其他一些技术,如混合整数规划,也重新浮出水面。

Kaggle 是否帮助你在你的职业生涯中?如果是的话,是如何帮助的?

当然:多亏了 Kaggle,我学到了很多新技术,并保持了知识的更新。在我的职业生涯中,我的主要责任大多在于管理。这就是为什么 Kaggle 对我保持对多件事情的更新非常重要。

你是如何利用 Kaggle 建立起你的作品集的?

我认为优势在于一种更间接的方式,人们看到了我的更传统教育资格中的实际技能(多亏了 Kaggle)和更多的理论技能。

在你的经验中,没有经验的 Kagglers 通常忽略了什么?你现在知道的事情,你希望在你最初开始时就知道?

我认为新来者犯的两个错误。第一个是进入新比赛时的恐惧,认为他们会得到很差的分数,并且会被记录下来。这是胡说八道。每个人都有不好的分数;这完全取决于你投入新比赛的程度。第二个是他们想尽快进入模型构建阶段,这是非常错误的;他们想看到他们的基准分数,然后他们会感到沮丧。我建议他们在特征生成和选择,以及在 EDA 阶段花时间。

在过去的比赛中,你犯过哪些错误?

我的错误,不幸的是,与新手非常相似。在几场竞赛中,我没有足够关注早期阶段,变得不耐烦,过了一段时间后,你会觉得自己没有足够的时间回头。

对于数据分析或机器学习,有没有你特别推荐使用的工具或库?

我推荐使用 PyCaret 进行基准测试以获得速度,以及 PyTorch 作为模型构建框架。

当人们参加竞赛时,他们应该记住或做最重要的事情是什么?

探索性数据分析以及之前的类似竞赛讨论。

你是否使用其他竞赛平台?它们与 Kaggle 相比如何?

说实话,我还没有在 Kaggle 之外尝试过,但从游客的角度来看,我已经体验过一些了。适应其他平台需要时间。

摘要

在本章中,我们讨论了模拟竞赛,这是一种越来越受欢迎的新竞赛类型。与以视觉或 NLP 为中心的竞赛相比,模拟竞赛涉及更广泛的方法(带有一定程度的数学内容),这反映了监督学习和强化学习之间的差异。

本章总结了本书的技术部分。在接下来的内容中,我们将讨论如何将你的 Kaggle 笔记本转化为项目组合,并利用它寻找新的职业机会。

加入我们书的 Discord 空间

加入我们书的 Discord 工作空间,每月与作者进行一次“问我任何问题”的会议:

packt.link/KaggleDiscord

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/QR_Code40480600921811704671.png

第三部分

利用比赛提升你的职业生涯

第十三章:创建你的项目和想法作品集

在 Kaggle 上的参与有其好处:在四个领域表现良好,并在其他 Kagglers 中的声望中排名靠前,无疑会带来满足感和成就感。然而,你在 Kaggle 上的经验也会超出 Kaggle 本身,并有助于推进你的职业生涯。这不仅仅是你在参加比赛、对从未处理过的数据进行实验或用新技术重复实验中获得的经验;还包括你与其他数据科学家建立的联系以及你可能会从公司那里获得的关注。

尽管 Kaggle 在很多公司中并未被完全认可为一种资格证明,但你参加比赛所做的工作可以充分展示你的能力,并帮助你从人群中脱颖而出。在本章中,我们将探讨如何通过在 Kaggle 本身以及其他网站上以适当的方式展示你的工作来脱颖而出。我们将涵盖以下主题:

  • 用 Kaggle 建立你的作品集

  • 在 Kaggle 之外安排你的在线存在

  • 监控竞争更新和新闻通讯

在下一章中,我们将通过探讨 Kaggle 如何通过增强你的专业网络和为你提供职业机会来直接影响你的职业生涯来结束本书。

用 Kaggle 建立你的作品集

Kaggle 声称自己是“数据科学的家园”,这一点必须放在正确的角度来考虑。正如我们详细讨论过的,Kaggle 对所有愿意竞争、根据给定的评估指标找出预测任务中最佳模型的人都是开放的。

在世界各地、教育背景或预测建模熟练程度方面没有限制。有时也有一些非预测性质的竞赛,例如强化学习竞赛、算法挑战和适合比数据科学家更广泛受众的分析竞赛。然而,根据指标从数据中做出最佳预测是 Kaggle 竞赛的核心目的。

实际数据科学有许多方面。首先,你的首要任务是解决问题,衡量你的模型的标准只是对解决问题好坏的或多或少精确的测量。你可能不仅要处理一个指标,还必须考虑多个指标。此外,问题可以以不同的方式解决,很大程度上取决于你如何表述它们。

关于数据,你很少能得到关于你必须使用的数据的规格说明,你可以修改任何现有的数据集以适应你的需求。有时,如果你需要,你甚至可以从头创建自己的数据集。没有关于如何组合数据或处理数据的指示。在解决问题时,你还必须考虑:

  • 技术债务

  • 随时间推移的解决方案的可维护性

  • 运行解决方案的时间和计算成本

  • 解释模型工作原理的可解释性

  • 对运营收入的影响(如果现实世界中的项目是商业项目,增加利润和/或降低成本是主导思想)

  • 在不同复杂性和抽象层次上沟通结果

通常,所有这些方面比原始性能对评估指标的影响更为重要。

技术债务这个术语在软件开发中比在数据科学中更为常见,尽管它也是一个相关的概念。对于技术债务,你应该考虑为了更快地交付你的项目而必须做的事情,但你将在以后以更高的成本重新做。由 David Sculley 和其他谷歌研究人员撰写的经典论文《机器学习系统中的隐藏技术债务》应该能让你了解该问题对于数据科学的相关性:proceedings.neurips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf

并非所有这些专业知识都可以通过 Kaggle 竞赛来补充。其中大部分应该通过在企业环境中直接实践和经验积累来获得。然而,与 Kaggle 竞赛相关的知识和技能并不完全独立于我们上面讨论的许多考虑因素,并且它们是许多企业级数据科学流程的良好补充。通过在 Kaggle 上竞赛,你将接触到不同类型的数据和问题;你需要执行广泛的特征工程和模型假设的快速迭代;你还必须设计使用通用开源包组合最先进解决方案的方法。这是一套宝贵的技能,应该在你的方面得到推广。做到这一点最好的方式是建立一个作品集,它收集了你基于 Kaggle 竞赛和其他 Kaggle 资源的解决方案和工作。

为了从 Kaggle 竞赛中构建作品集,你可以采取多种方法。最简单的方法是利用 Kaggle 提供的设施,特别是数据集、笔记本和讨论区。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Gilberto_Titericz.png

Gilberto Titericz

www.kaggle.com/titericz

在我们继续之前,我们在与 Gilberto Titericz 的访谈中提出了一份关于从 Kaggle 衍生出的职业机会的讨论。他是竞赛和讨论的大师,曾是排名第一,现在是 Kaggle 竞赛总金牌数排名第一。他还是 NVIDIA 的高级数据科学家,不久前在一篇关于 Wired 的文章中被提及(www.wired.com/story/solve-these-tough-data-problems-and-watch-job-offers-roll-in/)。

你最喜欢的竞争类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

自从我于 2011 年开始在 Kaggle 上比赛以来,我最喜欢的比赛类型是那些具有结构化表格数据的比赛。我在 Kaggle 中使用最多的技术是分类特征的编码(错误的方法有无限种)和堆叠集成。

你是如何应对 Kaggle 比赛的?这种方法与你在日常工作中所做的方法有何不同?

Kaggle 是一个机器学习的绝佳游乐场。与真实项目相比,Kaggle 中的问题已经非常明确和格式化,数据集已经创建,目标变量已经建立,指标也已经选定。因此,我总是带着 EDA(探索性数据分析)的心态开始参加 Kaggle 比赛。理解问题和了解数据集是超越其他玩家的关键之一。之后,我会花一些时间来定义一个合适的验证策略。这对于正确验证你的模型以及与 Kaggle 私有测试集评分方式保持一致非常重要。除了使用分层 K 折交叉验证对于大多数二分类问题都有效之外,我们还必须评估是否需要使用分组 K 折交叉验证或基于时间的分割来正确验证,避免过拟合,并在尽可能的情况下模拟私有测试集。之后,花一些时间进行特征工程和超参数优化实验也非常重要。此外,我总是在比赛中至少使用一个梯度提升树模型和一个基于深度学习的方法。这种不同方法的结合对于增加预测的多样性并提高比赛指标非常重要。

Kaggle 是否帮助你在职业生涯中取得进步?如果是的话,是如何帮助的?

是的,Kaggle 是我改变职业方向的主要原因。截至 2016 年,我是一名电子工程师,由于自 2011 年以来在比赛中学到的所有知识,我能够转向数据科学领域。Kaggle 帮助我理解机器学习的概念,并将从理论中学到的所有知识应用到实践中。此外,Kaggle 是一个出色的实验场所,你可以下载数据集并与之互动,以从数据中提取尽可能多的信息。结合比赛环境,这使得它成为学习编码和机器学习的完美场所,同时,它具有上瘾性,让你想要学习更多。赢得一些比赛可以使你的名字登上排行榜的顶端,这对任何人的职业生涯来说都是无价的。全球的猎头都在关注 Kaggle,以找到适合他们职位的合适人选,而通过比赛获得的知识和经验可以提升任何人的职业生涯。

你是如何利用 Kaggle 建立你的作品集的?

一旦我加入 Kaggle,我就花了几年的时间学习所有从数据中提取更多信息以及尽可能提高指标的技术、算法和技巧。高精度是大多数比赛的主要目标,但仅靠运气几乎是不可能的;知识和经验在目标是赢得比赛或至少进入金牌区时起着重要作用。我在 Kaggle 比赛中的奖牌数量是我的作品集;截至 2021 年 11 月,有 58 枚金牌和 47 枚银牌,这很好地总结了我在 Kaggle 获得的机器学习经验。考虑到每个比赛至少持续 1 个月,这超过了 105 个月的连续竞争性机器学习经验。

在您的经验中,不经验丰富的 Kagglers 通常忽视什么?您现在知道什么,而您希望自己在最初开始时就知道?

新手们经常 忽视合适的验证策略。这不仅仅发生在 Kaggle 上;我见过世界各地的数据科学家在构建模型时忽略了实验理论中最重要的事情之一。设置合适的验证策略没有普遍的规则,但数据科学家必须考虑模型未来将如何被使用,并使验证尽可能接近这一点。

在过去的比赛中,您犯过哪些错误?

犯过几个错误;不可能一一列举。我可能犯过所有可能的错误组合。错误的好处是你可以从中学习。一旦你犯了一个错误并且发现了它,你再次犯同样的错误的可能性就非常小。人们在 Kaggle 上犯的主要错误是相信排行榜的分数而不是他们本地的验证分数。过度拟合排行榜在 Kaggle 上是常态,这是与真实世界的最大区别。在真实项目中,我们必须构建一个我们信任的强大验证策略,因为在真实世界中,模型将在真实数据上被测试,而你只有一次机会命中目标,而不是每天多次提交。

您是否推荐使用特定的工具或库来进行数据分析与机器学习?

几年前我会推荐 R 语言,但考虑到 Python 在机器学习领域的快速发展以及它在生产中的通用性和易用性,我建议任何开始机器学习的人学习它。在表格数据库方面,我推荐使用 pandas 进行操作,如果您需要速度,则选择 cuDF(pandas 的 RAPIDS.ai GPU 版本)。对于数据探索分析(EDA),我推荐使用 Seaborn 或 Matplotlib 库中的 DataFrame,对于机器学习,推荐使用 Scikit-learn、SciPy、cuML(GPU)、XGBoost、LightGBM、CatBoost 和 PyTorch。请记住,使用原始特征构建简单的 XGBoost 模型既快又能够提供一个良好的基准,以便与后续模型进行比较。

当人们参加竞赛时,他们应该记住或做哪件事是最重要的?

参加 Kaggle 竞赛并提交公开的 Notebooks 很容易,但要在金牌区完成竞赛可能极具挑战性。所以对我来说,最重要的是记住,无论最终排名如何,我们都应该利用 Kaggle 来娱乐和学习,从讨论论坛、公开的 Notebooks,甚至从赛后获胜者的帖子中学习他们的想法和成功之处。

还要记住,使竞赛获胜者脱颖而出的不仅仅是复制别人的做法,而是跳出思维定式,提出新颖的想法、策略、架构和方法。

你使用其他竞赛平台吗?它们与 Kaggle 相比如何?

我在其他竞赛平台上赢得过几场比赛,但与 Kaggle 相比,主要区别在于用户数量。截至 2021 年 11 月,Kaggle 有 17.1 万活跃用户,这使得论坛、Notebooks 和数据集交互在内容上更加丰富。此外,Kaggle 还提供了一些独特的东西:你可以使用 Google 服务器免费编写和运行代码的 Notebooks,如果你没有好的硬件,这可能价值连城。

利用 Notebooks 和讨论

除了排名本身,Notebooks 是你在 Kaggle 上引起注意的方式,因为它们同时展示了你解决问题的方法、你展示想法的方式以及你编写代码的方式。作为在参与者之间轻松和公开分享解决方案和想法的一种方式,Notebooks 是展示雇主欣赏的能力的最重要工具(仅次于排名)。

事实上,近年来数据科学领域最重要的变化之一是其从杰出人才(独角兽数据科学家)的游戏转变为团队游戏,数据科学家必须与其他数据科学家和部门合作,以确保项目的成功。因此,在他们的招聘过程中,公司更关心你能否有效地沟通想法和结果,以及以干净和有效的方式编写代码。

在上一节中,我们讨论了现实世界项目需要更广泛的技术技能,从处理技术债务到设计成本效益解决方案。即使这些技能不会让你在竞赛中获胜,你仍然可以在 Kaggle 上展示这些技能。Notebooks 是完成这项工作的最佳工具。

参考第三章,使用 Kaggle Notebooks 工作和学习,了解 Kaggle Notebooks 的介绍。

你会在 Kaggle 上找到不同类型的 Notebooks。作为一个好的近似,我们可以将它们分为四类:

  • 竞赛排名的解决方案和想法

  • 探索性数据分析EDA)对数据进行分析

  • 解释机器学习模型或数据科学原理的教程

  • 从论文或其他原创解决方案中派生出的模型的新实现

这些中的每一个都可以通过一组有趣的技能为您提供优势。如果解决方案和竞赛的想法是展示您知道如何解决复杂数据科学问题的经典方式,那么其他三种可以展示给世界您能够:

  • 从数据中操作、表示和提取视觉和非视觉洞察力(EDA),这是一种在每个环境中都被认为非常重要的技能,从科学研究到商业

  • 在数据科学上进行教育,打开教育、导师和开发者倡导角色的门

  • 将研究转化为实践,在数据科学(尤其是在深度学习)创新每日出现并需要迅速转化为工作解决方案的时代,这是一项关键技能

即使您在 Kaggle 竞赛中排名不高或没有惊人的解决方案可以展示,如果您能以最佳方式推广这些其他三种类型的笔记本(EDA、教程和论文实现),这些笔记本也可以在现实世界中为您提供机会。为此,您需要了解如何编写可读且有趣的笔记本,这是从实践和经验中学习的东西。由于这是一门艺术,我们的建议是向他人学习,尤其是从笔记本大师那里学习,他们在笔记本用户排名中位居前列 (www.kaggle.com/rankings?group=notebooks&page=1&pageSize=20)。

我们建议您看看他们开发了什么样的笔记本,他们是如何使用图表来安排他们的工作的,他们是如何结构化他们的代码的,然后,最后,根据您的技能和兴趣,尝试模仿他们的其中一个笔记本。我们还建议您不要只把成功的机会赌在代码和图表上,还要赌在您所呈现的叙述上。无论您是在展示解决方案、教学还是在 TensorFlow 中实现神经网络架构,用文字解释笔记本单元格的方式对于留下持久积极的印象非常重要。

除了浏览高排名者的笔记本之外,还有一种方式可以通知您关于最近出现在 Kaggle 上的一些不太主流——但仍然精心制作的——笔记本。天体物理学家和热情的 Kaggle 用户 Heads or Tails,马丁·亨泽 (www.kaggle.com/headsortails),在讨论论坛上发布了一个每周的帖子“本周笔记本:隐藏的宝石”,这是一系列最有趣的笔记本的集合。目前,已经有超过 100 卷,作者继续在 Kaggle 上寻找任何可能有趣的东西。如果您想了解有关酷笔记本的最新信息,只需关注马丁·亨泽在 Kaggle 上的个人资料,或者不时检查他是否在他的讨论中发布了新内容。

如果你喜欢挖掘笔记本寻找灵感并从中学习,我们永远不会厌倦强调你不应该盲目复制他人的工作。Kaggle 上有很多笔记本,经常有人复制一个,做一些小的修改,然后将其作为自己的原创想法重新展示给其他 Kagglers。通常,人们还会从笔记本中挑选一个函数或代码的一部分,并将其插入到自己的工作中。在这两种情况下,请记住始终引用来源和作者。如果你无法追溯到原始作者,甚至只引用你找到所使用代码的最后一个笔记本也足够了。虽然展示的主要目的是展示你自己的努力和技能,但认识到你的代码或某些想法是从其他地方借鉴的非常重要。除了对其他 Kagglers 表示尊重的标志外,来源归属还表明你足够了解他人的努力和发明,并且知道如何在你的工作中应用它们。

在一定程度上,Kaggle 论坛上的讨论可以帮助你在数据科学和软件开发中引起对特定角色的关注。最初,Kaggle 上的讨论只是为了与组织者沟通或询问有关比赛本身的紧迫问题。然而,随着讨论获得了自己的用户排名和掌握等级,你可以在论坛上找到更多关于这些讨论的信息。

参考第 4 章,利用讨论论坛,了解 Kaggle 上的讨论介绍。

根据我们的经验,Kaggle 上的讨论可以分为四个类别:

  • 竞赛解决方案,详细解释(有时辅以相关笔记本)团队如何达到私人排行榜上的某个位置

  • 在比赛中帮助并解释需求

  • 感谢,赞美和闲聊

  • 帮助和指导其他竞争对手,向他们解释事情

我们观察到,在最后一种帖子中表现出色并因此广受关注可以帮助你获得开发者倡导者的角色,特别是如果你还有其他活跃的渠道与你的数据科学家同行互动(例如,Twitch 或 YouTube 频道、Twitter 账户或 Medium 博客)。

随着大型公司和初创公司中开发者倡导者角色的增长,对能够帮助其他数据科学家和开发者在项目中取得成功的专家的需求日益重要。如果你想了解更多关于这个角色的信息,以下在 draft.dev 上的文章解释得相当详细和全面:draft.dev/learn/what-is-a-developer-advocate

利用数据集

Kaggle 竞赛经常受到批评,因为它们展示的数据已经过清洗、井然有序,并且与现实世界中的数据相去甚远。我们的观点略有不同;我们发现 Kaggle 在竞赛中展示的数据也可能相当杂乱或噪声。有时展示的数据在质量和数量上可能不足以获得高分,你将需要在网上寻找额外的数据。

在数据科学项目中,Kaggle 缺失的是在组织的数据仓库和文件中收集和整理数据的过程,这个过程在现实世界中是不可能标准化的,因为它因公司而异,因问题而异。在现实世界中的数据处理主要应在现场学习。

将数据集引入 Kaggle 的目的是为了缓解人们认为 Kaggle 仅仅关注建模问题的想法。在这一点上,Kaggle 数据集非常有帮助,因为它们允许你创建和上传自己的数据,并记录特征及其值;同时,它们还要求你通过规划更新或完全替换数据的频率来管理你的数据。

请参阅第二章使用数据集组织数据,以了解 Kaggle 数据集的介绍。

更有趣的是,在 Kaggle 数据集中,你还被赋予了将使用 Kaggle Notebooks 构建的不同分析和模型附加到数据集的机会,这些模型可以是你在竞赛中想出的,或者是因为你仔细研究了上传的数据,发现了一些可以用它解决的问题。

此外,Kaggle 数据集还为你提供了一个模板,用于检查伴随你的数据的元信息的完整性。描述、标签、许可、来源和更新频率:这些只是所需信息(用于计算可用性评分)的一小部分,这些信息将帮助任何使用你数据的人了解如何使用它。你甚至可以在描述或讨论中指出与你想用它完成的工作相关的数据集任务。这是一种很好的方式来传达你对已上传数据的潜在价值的全面理解。

以前,任务曾是 Kaggle 数据集功能的一部分,但最近已经被移除:www.kaggle.com/product-feedback/292674。尽管如此,你可以使用数据描述和讨论来指出你期望你的数据可以用于什么。

所有这些特性使 Kaggle 数据集成为展示你在 Kaggle 上解决问题的经验以及一般的数据和机器学习算法能力的一个非常好的方式,因为它们允许你:

  • 发布和维护数据集

  • 用任务路线图展示你已理解数据的价值

  • 展示编码和完全工作的解决方案(因为 Kaggle Notebooks 可以立即在相同的数据上工作,无需任何准备),从数据准备到解释性数据分析再到预测建模

我们强烈推荐使用 Kaggle Datasets 来展示你在 Kaggle 竞赛或任何其他项目中完成的工作,因为它们将你的工作与其他人的工作区分开来,并整合了数据和 Notebooks。简而言之,Kaggle Datasets 可以向任何人展示你已实施的解决方案。然而,也存在一个缺点:你大部分时间都绑定在 Notebook 环境中(即使你使用脚本),这在包和版本要求方面并不完全透明,其他人需要知道才能在其他环境中运行代码。

事实上,Kaggle Notebooks 依赖于由配置文件、Dockerfile设置的 Docker 环境,该文件决定了已安装的版本。在浏览 Notebook 时,除非检查此配置文件,否则无法立即看出正在使用哪些版本的包。为此目的,以及为了复制设置,可以在 GitHub 上的 Kaggle 仓库中找到 Dockerfile(github.com/Kaggle/docker-python/blob/main/Dockerfile.tmpl),尽管它随时间变化,你可能需要跟踪你工作中使用的版本。

最后,除了这个方面,别忘了,即使只是浏览一下 Dataset 及其相关的 Notebooks,也需要访问 Kaggle 社区。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Gabriel_Preda.png

加布里埃尔·普雷达

www.kaggle.com/gpreda

我们与数据集、Notebooks 和讨论方面的 Kaggle 大师、Endava 的首席数据科学家加布里埃尔·普雷达进行了一次鼓舞人心的职业导向谈话。加布里埃尔拥有计算电磁学的博士学位,在完全投身数据科学之前,他在软件开发领域有着漫长的职业生涯。当他发现 Kaggle 时,他感觉在这个平台上如鱼得水,并投入了大量时间和精力,这在职业上为他带来了回报。

Kaggle 是否帮助你在职业生涯中取得进展?如何?

Kaggle 帮助我加速了在数据科学领域的学习曲线。在 Kaggle 之前,我四处寻找信息来源或要解决的问题,但方法并不系统,效果也不明显。在 Kaggle 上,我找到了一个与我兴趣相同的人组成的社区。我能够看到领域顶级专家的工作,从他们发布的带有分析或模型的 Notebooks 中学习,从他们那里获得洞察,向他们提问,甚至与他们竞争。在我加入 Kaggle 的时候,我主要在数据分析领域,但很快我就开始竞争;这意味着学习如何构建、验证和迭代改进模型。在 Kaggle 上大约两年后,我改变了我的职业道路;我从管理软件项目转变为全职数据科学工作。Kaggle 也给了我一些知名度,在我目前公司的面试中,候选人提到他们想加入我们,因为他们看到我在那里工作。

你是否曾经将你在 Kaggle 上完成的项目作为你的作品集的一部分,向潜在雇主展示?

我将我的 Kaggle 作品集作为潜在雇主的主要信息来源;我的 LinkedIn 个人资料指向我的 Kaggle 个人资料。此外,近年来,雇主对 Kaggle 的了解越来越多,其中一些雇主会具体询问你的 Kaggle 个人资料。还有一些潜在雇主明确表示他们不认为 Kaggle 相关。我不同意这种观点;就我个人而言,在面试候选人之前,我通常会检查他们的 GitHub 和 Kaggle 个人资料。我发现它们极其相关。一个好的 Kaggle 个人资料不仅能展示技术技能和某些语言、工具、技术或解决问题的经验,还能展示一个人通过讨论和 Notebooks 进行沟通的能力。这对于数据科学家来说是一个非常重要的品质。

你首先在 Notebooks(Kernels)中达到了大师级别,然后在讨论中,最后在数据集中。你能告诉我们你的经历吗?

我成为了第七位 Kernels 大师,并达到了第三名的排名。我想可能有两年的时间我在 Kernels 等级结构中排名前十。我开始写 Kernels 主要是为了在分析我发现更有趣的数据集的同时提高我对 R 语言的知识。我还尝试了各种技术,包括多边形裁剪、构建 Voronoi 多边形的双网格和 2D Delaunay 三角剖分。我逐渐开始专注于探索性数据分析,然后是构建数据集和比赛的模型。此外,一旦我开始更多地参加比赛,我就开始用 Python 编写用于比赛的 Kernels。大约在同一时间,我开始注意到我的某些 Kernels 引起了 Kagglers 的注意,主要是点赞和分支,但也有积极的评论。我写的某些用于在活跃比赛中探索数据的 Kernels 达到了非常广泛的受众,并为我赢得了许多金牌;因此,我达到了大师级,然后是大师级。目前,我很少发布与比赛相关的 Kernels;大部分我创建的是与发布的数据集相关的起始 Kernels。

接下来,我还获得了讨论大师级别。我从未预料到我会达到这个讨论层级。首先,我开始评论他人的 Kernels。然后,随着我越来越多地参与比赛,我的大部分评论都是在活跃比赛的讨论部分,要么是询问这些比赛中感兴趣的话题,要么是开始新的话题,例如,为比赛中的一个问题提出解决方案或收集资源来解决与比赛相关的各种开放性问题。我想提到我添加的一组特殊评论。作为一名 Kaggle Kernels 大师(第一批之一),当我发现非常好的内容时,我经常点赞新 Kagglers 的 Notebooks。

在这种情况下,我会尽量找一些时间来赞扬(尤其是如果内容质量很高)作者的成就。特别是对于初学者来说,除了通过点赞来表达你的赞赏之外,还能提供一些关于他们贡献的积极反馈,可能会给他们带来信心上的提升,使他们更愿意投入学习和在 Kaggle 上做出更多贡献。我喜欢这样做,并希望这能有所帮助。我曾经还编制了一份关于如何在 Kaggle 上评论的推荐清单。这是清单:简短(但不要太简短);具体;提供信息,而不是意见;有机会时赞扬他人的工作;保持冷静并尽量提供帮助;除非有意义(例如,如果是一个讨论,你需要将评论直接指向在那一线程中回应你的人),否则不要在评论中提及他人。

我达到的最后大师级别是在数据集领域。这也是我达到最高排名,第二名的级别。我在排名上的进步很慢。我从我喜欢的事情开始。在数据集中获得高知名度需要投资于数据的整理、清洗和文档化。如果你不喜欢这样的事情,你很可能不会继续下去。我追求的是对我个人和更广泛的社区都重要的事情:对我的国家、我的大陆,甚至是整个世界。我发布了关于我国家选举的数据集,以及关于欧洲各种社会、人口和经济主题的数据集。我专注于时事主题,这些主题对社区既有相关性又非常重要。例如,在疫情期间,我发布了关于 COVID-19 病例、疫苗接种、检测和病毒变种的全球数据集。我收集了超越简单数值、表格值的数据。文本数据,尤其是来自人们的直接贡献,为许多人提供了重要的见解。我获得最高点赞的数据集之一包括关于疫苗神话、板球、大流行、体育赛事和政治人物等多样化主题的 Reddit 帖子和评论或 Twitter 帖子(推文)。我在自动化数据收集、数据清洗和数据处理脚本上投入了大量精力。这为我节省了宝贵的时间(特别是对于频繁更新的数据集——其中一些是每小时通过脚本收集的)但同时也使我对整个过程有了更好的控制。每次我发布一个新的数据集时,我也会写一个或多个起始核。这些核并不是为了吸引大量观众。我创建它们作为潜在用户的数据集辅助核,以便他们更容易使用数据。在许多情况下,我更喜欢保留原始数据(正如我收集的,或从替代来源下载的)并包括一个用于数据清洗、转换和初步分析的核,以及这个过程的结果,即以更易访问的格式呈现的数据。通过这种方式,我试图在数据集中捕捉到比数据本身更多的内容;我还提供了关于数据转换技术的信息。

在 Kaggle 之外安排你的在线存在

由于 Kaggle 数据集和笔记本需要 Kaggle 账户,你必须考虑到并非每个人都已经有一个,或者只是为了查看你的作品而想要创建一个。你还必须考虑更易于访问的替代方案。更常见的是,Kagglers 选择在 GitHub (github.com/) 上创建一个项目,在 Medium (medium.com/) 上写文章,以及其他发布平台,或者在自己的博客上发布。然而,还有其他机会来推广你的作品和技能,例如:

如你所推断,确实有很多机会和媒体可以通过它们来传播你在 Kaggle 上的工作和技能,具体取决于你想要达到的目标。在本章中,我们的重点是仅仅博客和 GitHub 的存在(这是最常见的选项,而且相当有效),但你完全可以根据自己的需求选择任何不同的方法。

博客和出版物

写作可以是一种既能够精炼你的知识——因为你需要阅读某个主题以便撰写关于它的文章——又可以让他人了解你和你技能的方式。因你的写作而出名可以帮助你在多个方面,从被招聘人员和公司注意到到为 Kaggle 竞赛以及你更广泛的专业生活建立联系。

社交媒体(LinkedIn、Twitter 和 Facebook)允许你发布想法和短篇文字,这是我们建议你利用的资源。鉴于数据科学和 Kaggle 竞赛主题需要长时间的讨论和推理,然而,最佳的方法是撰写长篇文章并通过博客或发布写作的网站来发布。理想情况下,我们建议你协调社交媒体和你的文章之间的沟通,以推广它们,通过专门的帖子宣布它们或讨论你写作中的关键点。

让我们先讨论一下你可以在哪里发表你的文章。

Medium 上的文章,尤其是像Towards Data Science (towardsdatascience.com/)这样的Medium 出版物,可以获得很多关注。Medium 出版物是围绕一个共同的主题或话题撰写的故事的共享空间,通常由多位作者共同完成。作为一个网站,Medium 可以触及广泛的读者群,并且一些出版物在数据科学社区中以文章质量而享有很好的声誉。一个出版物可以有一位或多位编辑来挑选作品并确保其内容与出版物的政策和质量水平保持一致。你可以发布文章的 Medium 出版物包括:

每一份这些出版物都拥有一个巨大的优势,那就是它们已经拥有了一个庞大的读者群,可能比你社交媒体上的关注者还要多。你将获得的读者数量可能会超出你的预期,能够触及到公司以及其他你可以建立联系的专业人士。

除了 Medium 之外,这些其他网站也可能接受你的出版物:

  • Hacker Noon (www.publish.hackernoon.com/): 在技术博客作者中非常受欢迎,包含任何与技术相关的内容(相当广泛)。每月有四百万的读者,如果你想要触及众多对技术感兴趣的人,这是一个合适的地方。出现在首页非常困难,是一把双刃剑:你将获得很多关注,同时也会面临许多批评。

  • Dev.to (dev.to/): 主要面向开发者(近八十万人)的读者群,提供关于编码的文章和教程。你的帖子应该更注重你代码的质量和效果(建模处于幕后)。

  • FreeCodeCamp (www.freecodecamp.org/news/developer-news-style-guide/): 更专注于教程;人们去那里学习如何编码。对于推广机器学习课程和推广新软件包来说,这是一个理想的地方。

  • Analytics Vidhya (www.analyticsvidhya.com/about/write/):在印度非常受欢迎;它更多地围绕解释机器学习和深度学习基础的文章。

  • KDnuggets (www.kdnuggets.com/news/submissions.html):数据挖掘领域中最古老的出版物之一。它仍然在数据科学家和学者中拥有相当多的追随者(2021 年 3 月有 100 万独立访客)。

每个出版物都有其优点和缺点,并且在其触及的受众方面有所不同,因此你必须决定哪一个更适合你的内容。首先浏览他们提供的出版物,以便了解你的写作如何融入其中。

当然,如果你愿意,你也可以使用你自己的博客。拥有自己的博客有其优点,比如没有广告或编辑对你所写内容的审查。另一方面,你不能利用现有的受众,你必须通过在社交媒体上推广你的文章来努力创建一个受众群体。你可以在你选择的网络域名上从头开始建立自己的网站,或者你也可以在 GitHub 上创建自己的博客。

如果你决定使用 GitHub(因为它免费,你可能已经用它作为代码的存储库),这里有一个创建 GitHub 博客文章的简单快速指南:jmcglone.com/guides/github-pages/

如果你需要更加自动化的服务,可以使用像杰里米·霍华德fastpagesgithub.com/fastai/fastpages)这样的平台,因为它可以简化你处理带有代码示例的内容的方式,因为它会自动将笔记本和 Word 文档转换为博客页面,并为你发布。

如果你希望完全独立并建立自己的网站,这将需要更多的努力和一些费用;域名和网站空间并不是免费的。在这种情况下,自我推广你的内容变得至关重要。

写作关于你解决方案的主要优势是叙事元素,因为你必须伴随你的代码片段进行描述和解释,并且你需要以一种比在笔记本中更详细的方式写作。从某种意义上说,你描述你的工作的重要性与你所写的代码一样。通过调整你写作的语气,你可以接触到不同类型的受众。以易于理解的方式写作概念意味着你会扩大你的受众群体并与更多专业人士建立联系。相反,以高度技术化的方式写作可能会给那些可能考虑雇佣你的潜在公司留下深刻印象,尽管这限制了你的读者数量。

由于写作是一个非常个人化的行为,我们的提示和建议可能不适用于每个场景,因此我们的一般建议是在事先决定你写作的目的以及你希望通过它接触到的人。

GitHub

除了撰写文章和提供可以直接引导读者访问的代码仓库外,将您的代码放在 GitHub 上还可以帮助您在参加的每个比赛中不必重新发明轮子。您可以将希望重用的代码存储在项目或Gistsdocs.github.com/en/github/writing-on-github/editing-and-sharing-content-with-gists)中,这些是单独可访问的小段代码。

即使您可能希望将所有代码都留在 Kaggle 上,但随着时间的推移,您会发现很难访问,甚至可能完全找不到。这是因为您无法将 Kaggle 笔记本组织成单独的项目;它们将仅作为一个可以按一些属性(如投票数或您上次运行笔记本的时间)排序的长列表呈现。GitHub 使您更容易找到所需内容并重用它们。例如,您可以创建包含所有代码的脚本,然后将其下载并导入 Kaggle 笔记本,而无需复制任何内容。

在以下示例中,我们下载并重用了用于tabular神经网络的辅助函数:

!wget https://raw.githubusercontent.com/lmassaron/deep_learning_for_tabular_data/master/tabular.py
# Importing from Tabular
from tabular import gelu, Mish, mish
from tabular import TabularTransformer, DataGenerator 

使用wget命令可以直接访问 GitHub 上的代码并将其下载到笔记本的磁盘上;之后,您只需从其中导入所需的函数和类即可。要获取提供直接访问您代码的链接,您只需在 GitHub 仓库中找到包含该代码的文件,然后点击页面顶部的原始按钮:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_13_01.png

图 13.1:GitHub 上可视化文件的标题。注意标题栏右上角的原始按钮。

点击原始按钮后,您将被带到 GitHub 上存储文件的网页地址。您可以使用该网址从 GitHub 外部引用该文件。

GitHub 对于存储您可以在 Kaggle 讨论中使用的图像也非常有用(因为您不能再上传 Kaggle 论坛上的图像)。在图像的情况下,您不会有一个可以点击的原始按钮,但您可以右键单击图像并在另一个标签页中打开文件;这将产生相同的效果。

GitHub 是展示您工作的另一种绝佳方式,但鉴于网站的性质(针对开发者)以及您可以上传的内容(包含代码的文件),您应该预期会有一个非常技术性的观众。在公司中,人力资源部门可能不会深入查看您的 GitHub 账户,而是停留在README.md上,因此它应该写得很好,视觉效果吸引人。另一方面,招聘经理会更关注您项目中的代码。您应该在文件、程序和类中投入精力,使其结构良好,同时包括安装和复制您结果的必要说明。

你将不得不使用conda(docs.conda.io/en/latest/)或poetry(python-poetry.org/)等工具来确保为你的代码安装了正确的包。为了给你的项目提供最佳的结构,你可能需要像CookieCutter(drivendata.github.io/cookiecutter-data-science/)这样的东西。使用 CookieCutter 提供的模板为你的项目,可以轻松地将你的代码组织到特定的目录中,并提供允许其使用和理解的文件。一个 CookieCutter 模板将使你的项目更容易阅读、理解和维护。

最后,为了管理你的实验和数据源,你还需要为所使用的数据提供一个版本控制系统,而不仅仅是代码的版本控制系统,例如使用数据版本控制DVCdvc.org/)。所有这些资源和你需要正确运行它们的技能(创建你的环境、构建你的项目、版本化数据和模型)更接近于软件工程而不是数据科学能力。它们在 Kaggle 上不是那么相关——或者可以以简单的方式进行——并且将需要努力和学习。然而,它们将成为你将在 GitHub 项目上展示的能力的一部分,提高你在面试官面前留下好印象的机会。

如果你想要展示你模型的实时演示,你有几种不同的选择。最简单的方法是将代码运行在原始 Notebooks 上(只需在 GitHub 项目的README.md文件中放入你的 Kaggle Notebook 的链接)或Google Colab上。要让存储在 GitHub 上的 Notebook 在 Google Colab 中自动运行,只需将链接的域名从github.com更改为githubtocolab.com:链接将在 Colab 中打开你的 Notebook。

然而,你可以准备的最具印象的展示方式是使用HuggingFace Spaces(huggingface.co/spaces)来展示你的 Kaggle 模型如何在在线应用中使用。Spaces 是一种简单的方式来托管机器学习演示和创建你的在线作品集,如文档(huggingface.co/docs/hub/spaces)中所述。它们限制在 16GB 的 RAM 和 8 个 CPU 核心,但它们是免费的,足以展示你的模型如何在专用应用程序中运行。你可以在 HuggingFace 远程机器上安装你的依赖项,与 GitHub 同步代码和模型,或者使用Streamlit(streamlit.io/)或Gradio(gradio.app/)来构建应用程序。

例如,Kaggle 专家和哈佛大学教学助理Rashmi Banthiawww.kaggle.com/rashmibanthia)发布了她从Sartorious Cell Instance Segmentation比赛中的模型演示:huggingface.co/spaces/rashmi/Cell-Instance-Segmentation-MMDetection。通过将您的模型与一些示例一起在实时演示中展示,您甚至可以立即向非机器学习受众传达其有效性。

监控比赛更新和通讯

到现在为止,您可以看到在 Kaggle 上展示您的工作非常重要,这样您就可以向世界传达您对某些类型模型和数据问题的兴趣。从这个角度来看,您始终意识到竞赛提供的机会非常重要。

完成这一目标的主要方式是经常访问 Kaggle 网站,并同意接收他们的电子邮件。您可以从个人资料中的通知和电子邮件设置页面设置此选项,在那里您可以同意接收网站和电子邮件通知。您还可以选择接收包含 Kaggle 新功能和倡议提示的电子邮件,以及关于最近启动的比赛的新闻:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/B17574_13_02.png

图 13.2:Kaggle 发出的宣布一系列视频的电子邮件

如果您是 Twitter 用户,您会发现关注几个个人资料来了解 Kaggle 上的新内容很有用。Kagooletwitter.com/kagoole)是一个网络应用程序,可以通知您有关新比赛的信息,同时在其 Heroku 应用程序形式(kagoole.herokuapp.com/)中,为您提供过去比赛的解决方案。它是由Doarakkogithub.com/Doarakko/)创建的。您还可以关注的另一个 Twitter 个人资料是Is he Kerneler?twitter.com/HKerneler),由Regonngithub.com/regonn/)创建,它会告诉您每个活跃的 Kaggle 比赛关闭前还有多少时间。

如我们从第一章所知,Kaggle 并非唯一举办数据科学竞赛的组织。为了更好地跟踪 Kaggle 和其他数据科学竞赛网站上的实际情况,我们建议使用mlcontests.com/ods.ai/competitions等网站,这些网站监控 Kaggle 以及其他平台(如 AICrowd 和 DrivenData)上所有正在进行的比赛。例如,mlcontests.com为每个比赛提供有关奖项、截止日期和有用链接的信息。

它还从性能、机器和价格等方面提供了云 GPU 的比较。您可以通过注册邮箱直接接收大量此类信息到您的收件箱。

摘要

在本章中,我们讨论了如何展示您的工作,以及这如何有助于您的事业发展。它帮助您展示能力,虽然(当然)没有涵盖您整个数据科学知识和经验的全部范围,但仍然是一笔巨大的财富。

为了展示您的工作,您可以使用 Kaggle 资源或外部资源。Kaggle 资源为您提供了一个集成环境,如果您已经准备好了所有东西,那么它们相当容易访问且快速设置。外部资源(Medium 发布物、GitHub、HuggingFace Spaces 等)对于大多数招聘人员、人力资源官员和招聘经理来说更为人所知且易于访问,因为他们经常使用它们。

在下一章中,我们将通过讨论网络构建以及如何利用您的 Kaggle 努力获得面试机会,来完成我们对 Kaggle 竞赛为您提供的机遇的讨论。

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作空间,每月与作者进行一次 问我任何问题 的活动:

packt.link/KaggleDiscord

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/QR_Code40480600921811704671.png

第十四章:寻找新的职业机会

在上一章介绍了如何在竞赛中更好地突出你的工作和成就之后,我们现在将总结 Kaggle 如何积极影响你的职业生涯。最后一章讨论了利用所有努力寻找新的职业机会的最佳方式。我们期望你现在已经拥有了之前描述的所有工具(你的 Kaggle 讨论、笔记本、数据集,以及一个展示了许多来自 Kaggle 项目的 GitHub 账户),因此这一章将转向更软性的方面:如何建立人脉以及如何向招聘人员和公司展示你的 Kaggle 经验。

众所周知,建立人脉可以开启许多可能性,从被联系关于那些不在公开板上出现的新工作机会,到有可以依赖的人来解决你并非专家的数据科学问题。在 Kaggle 上建立人脉主要与竞赛期间的团队协作以及 Kagglers 组织的聚会和其他活动中的联系有关。

当谈到工作机会时,正如我们之前经常重复的,Kaggle 并不是人力资源和招聘经理广泛认可的选择候选人的来源。一些公司确实会认真考虑你的 Kaggle 排名和成就,但这只是一个特殊情况,而不是普遍规则。通常,你应该预期你的 Kaggle 经验会被忽视,有时甚至会被批评。然而,我们的经验告诉我们,你在 Kaggle 上学到的和实践的东西非常有价值,你可以通过展示你的编码和建模努力来推广它,并且能够谈论你独自或团队合作工作的经验。

在这里,我们将涵盖:

  • 与其他竞赛数据科学家建立联系

  • 参加 Kaggle Days 和其他 Kaggle 聚会

  • 被发现和其他工作机会

与其他竞赛数据科学家建立联系

人脉对于找工作至关重要,因为它们帮助你接触到可能知道机会在公开之前和开始寻找潜在候选人之前的人。近年来,Kaggle 越来越成为一个你可以与其他数据科学家建立联系、合作和交朋友的地方。在过去,竞赛并没有在论坛上引起很多交流,团队因为竞赛积分在团队成员之间平均分配而受到严重惩罚。排名的改进(见www.kaggle.com/general/14196)帮助许多 Kagglers 对组队有了更积极的看法。

如果你已经知道其他团队成员并且已经建立了分配任务和远程协作的方法,那么在 Kaggle 竞赛中组队是可行的。在这些情况下,每个团队成员都已经知道如何协作,通过:

  • 承担团队成员同意的实验部分

  • 与另一位团队成员合作构建解决方案

  • 基于他们的技能和经验探索新的解决方案

  • 准备模型和提交,以便它们可以轻松堆叠或混合

然而,如果你是第一次组队,你会发现要么进入一个团队,要么自己组织一个团队都很困难。除非你有联系,否则很难接触到排行榜上的其他人。首先,并不是所有人都会想组队,因为他们更喜欢独自竞争。此外,一些其他竞争者可能对组队感兴趣,但会过于谨慎而拒绝你的提议。在与你不太熟悉的 Kagglers 组建团队时,有一些担忧:

  • 加入团队的人不会为团队带来任何价值

  • 加入团队的人实际上不会进行合作,而只是成为免费搭车者

  • 加入团队的人违反(或将要违反)Kaggle 规则,这将导致整个团队的取消资格

  • 加入团队的人实际上对间谍活动和向其他团队泄露信息感兴趣

这些情况在比赛中通常是病态的,你应该意识到这些是许多人在评估是否第一次与另一位 Kaggler 组队时常见的考虑因素。只有通过展示你在 Kaggle 上拥有强大的背景,即一个人曾经独立参加过一些比赛,特别是发布了 Notebooks 并参与了讨论,你才能消除这些感知到的潜在问题。这将极大地增加你的提议的可信度,并更有可能使你被团队接受。

当你最终加入一个团队时,建立团队成员之间高效且专注的沟通方式非常重要(例如,在 Slack 或 Discord 上创建一个频道)。同时,达成关于日常操作的共识也是必不可少的,这些操作涉及以下两方面:

  • 决定如何分配你的实验努力。

  • 决定如何使用有限的每日提交(这往往是团队冲突的原因)。最终,只有团队领导选择最后的两个提交,但到达那里的过程自然涉及讨论和分歧。准备好向你的队友展示你为什么决定某些提交为最终版本,通过向他们展示你的本地交叉验证策略和结果。

在以积极的方式与团队一起工作后,你无疑会赢得其他团队成员的尊重和信任。在未来比赛中,你可能会发现与相同的人再次组队或加入他们帮助的另一个团队更容易。

你将在 Kaggle 上遇到并与之合作的人包括数据科学家、数据爱好者、学生、领域专家等等。下面,我们将与一群多样化的 Kagglers 进行交谈,他们描述了自己的日常工作以及 Kaggle 如何融入他们的生活。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Yirun_Zhang.png

Yirun Zhang

www.kaggle.com/gogo827jz

张一润是伦敦国王学院的最后一年博士生。他是笔记本和讨论的大师,曾是Jane Street Market Prediction竞赛(www.kaggle.com/c/jane-street-market-prediction)获胜团队的一员。

你能告诉我们一些关于你自己的情况吗?

我的研究领域在于将机器学习算法应用于解决现代无线通信网络中的挑战性问题,如时间序列预测、资源分配和优化。我还参与了研究 AI 隐私、联邦学习和数据压缩与传输的项目。

除了日常的博士生研究,我在 Kaggle 上活跃了将近两年,自从我的博士生第二年。我第一次参加的 Kaggle 竞赛是Instant Gratification*,在这个竞赛中,我使用了来自*sklearn库的多种机器学习和统计方法。这次竞赛帮助我形成了对 Kaggle 竞赛中机器学习建模流程的一般认识。

我在 Kaggle 社区中积极分享我的知识,包括笔记本和讨论帖子,现在已成为 Kaggle 笔记本和讨论的大师。通过在论坛上与其他人分享和讨论,我获得了宝贵的反馈和新知识,这也帮助我最近最终赢得了 Kaggle 竞赛。

请告诉我们你赢得的竞赛的一些情况。

Jane Street Market Prediction 确实非常艰难。原因是很难构建一个稳健的交叉验证(CV)策略,很多人只是将公共排行榜作为 验证集。他们训练神经网络数百个 epoch,而没有使用验证策略来过度拟合公共排行榜。我们的团队努力维持自己的 CV 策略,并在动荡中幸存下来。

你在 Kaggle 上的方法与你在日常工作中所做的方法有何不同?

Kaggle 竞赛与我的日常博士生研究非常不同。前者非常紧张,包含即时反馈,而后者是一个长期的过程。然而,我发现我从 Kaggle 竞赛中学到的新知识和方法论对我的博士生研究也非常有用。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Osamu_Akiyama.png

大槻大辅

www.kaggle.com/osciiart

大槻大辅,又名 OsciiArt,是一位 Kaggler,他的日常工作并不涉及数据科学。他是大阪大学医院的医生,也是竞赛大师。

你能告诉我们一些关于你自己的情况吗?

我是一名在京都大学医院工作的二年级住院医生。我在京都大学获得了生命科学硕士学位。在我为一家制药公司从事研发工作后,我转到了大阪大学医学院,并获得了日本行医执照。

我开始自学数据科学和 AI,因为我被 AlphaGo 震惊了。我开始在 Kaggle 上参与比赛,以便学习和测试我在数据科学和 AI 方面的技能。我的第一个比赛是 2017 年的 NOAA 渔业 Steller 海狮种群计数。我一直在 Kaggle 竞赛中参与,并且获得了三枚金牌。*

Kaggle 是否帮助你在职业生涯中取得进展?

因为我没有 受过信息科学的教育,所以我使用我在 Kaggle 上的结果在申请 AI 公司实习和申请成为 AI 实验室的短期学生时展示我的技能。作为一个医生,我从未在我的主要工作中使用过我的数据科学技能。然而,多亏了我在 Kaggle 上的结果,我有时有机会参与医学数据研究。

你最喜欢的比赛类型是什么,为什么?

我最喜欢的比赛类型是 医学数据竞赛。我喜欢尝试利用我的医学知识从医学数据中找到一些洞察。

你如何处理 Kaggle 竞赛?

我喜欢寻找 竞赛数据中大多数其他竞争者没有意识到的一个秘密特征,或者尝试针对竞赛数据特征定制的独特方法。实际上,这种方法在大多数情况下并不成功,但仍然很有趣去尝试。

告诉我们你参加的一个特别具有挑战性的比赛,以及你用来解决任务的洞察。

我想 提及 Freesound Audio Tagging 2019*,这是一个针对声音数据的多标签分类任务。训练数据由少量可靠标记的数据(干净数据)和大量不可靠标签的数据(噪声数据)组成。此外,精心整理的数据和噪声数据的数据分布存在差异。为了应对这一困难,我们采用了两种策略。第一种是多任务学习,其中在噪声数据上的训练被视为与干净数据不同的任务。第二种是伪标签(一种半监督学习),其中噪声数据被用从使用干净数据训练的模型中预测的标签重新标记。*

你是否使用其他竞赛平台?它们与 Kaggle 相比如何?

我使用 Signate (signate.jp/) 和 guruguru (*www.guruguru.science/)。这些是日本的数据科学竞赛平台。它们不像 Kaggle 那样规模大;这些平台上的比赛通常使用的数据集比 Kaggle 小,因此更容易参与。此外,有时还有一些与 Kaggle 上不同的有趣比赛。*

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Mikel_Bober-Irizar.png

米克尔·博伯-伊拉扎尔

www.kaggle.com/anokas

米克尔·博伯-伊拉扎尔,又名 Anokas,是一位比赛大师、笔记本和讨论大师,同时也是 ForecomAI 的机器学习科学家。他还是剑桥大学计算机科学的学生,也是 Kaggle 上最年轻的比赛大师。

你能告诉我们一些关于你的信息吗?

我是在 2016 年加入 Kaggle 的,当时我 14 岁,对我在做什么一无所知 – 我只是在网上读到了机器学习,感觉很有趣。我开始参加我的第一场比赛,通过复制论坛上其他人的公开代码并进行一些小的调整。在几场比赛中,我逐渐了解了事物是如何运作的,这激励我试图攀登排行榜 – 直到我开始取得良好的进展,最终在当年的 Avito Duplicate Ads 竞赛中获得了第二名。

从那时起,我参加了 75 场比赛,2018 年成为最年轻的比赛大师,也是第一位三冠大师。我后来在萨里大学担任访问研究员,现在我在剑桥大学学习计算机科学,在那里我也在机器学习和安全领域进行研究。

你最喜欢哪种类型的比赛?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我真的很喜欢那些有很多特征工程机会的比赛,以及那些有很多不同类型数据的比赛,这让你在解决问题的方法上可以非常具有创造性 – 这比那种每个人都要采取相同方法,你只是在争夺最后一位小数点的比赛有趣得多。

我并不认为我在方法上有特别的专长,但我喜欢尝试不同的事情。

请告诉我们你参加的一个特别具有挑战性的比赛,以及你使用了哪些见解来应对这项任务。

几年前,谷歌举办了一场竞赛,用于检测图像中的对象及其之间的关系(例如,“桌子上的椅子”)。其他团队花费了大量时间采用传统方法,训练大型神经网络来处理这些任务,而我没有这方面的知识或计算能力来竞争。我选择从不同的角度来解决这个问题,使用一些巧妙的启发式方法和树模型,最终在仅用几个小时的工作后获得了第七名。

Kaggle 是否帮助你在职业生涯中取得进步?

Kaggle 为我带来了很多机会,并且是一个真正优秀的社区,让我有机会了解它。我在参加的所有比赛中遇到了很多人,学到了很多东西。但 Kaggle 也是我最初进入机器学习领域的原因 – 我相信如果不是因为 Kaggle,我就不会在这个领域。所以,是的,它帮助了我很多。

在过去的比赛中,你犯过哪些错误?

很容易最终得到一个复杂的解决方案,你无法从头开始复制,因为你很可能会在最终解决方案中使用各种版本的代码和中间数据集。那么,如果你足够幸运赢得了比赛,向主办方交付可工作的代码可能会非常紧张!如果你表现良好,确定你的解决方案并清理你的代码是个好主意。

也很容易陷入这种情况:为不同的模型使用不同的验证集,或者不保留验证预测,这可能会使得比较它们或在进行比赛后期进行元学习变得困难。

你会推荐使用哪些特定的工具或库来进行数据分析或机器学习?

我真的很喜欢 XGBoost,它仍然倾向于在表格数据上击败神经网络(以及它的新近表亲 LightGBM)。SHAP 对于解释模型(即使是复杂的模型)非常好,这可以让你对下一步尝试什么有更多的洞察。

当人们参加比赛时,他们应该记住或做哪件事是最重要的?

我认为重要的是尽量避免陷入实现超复杂解决方案的困境,而是尝试逐步实现解决方案。

现在的比赛比我开始的时候难多了,所以看看别人的代码(很多人在比赛期间都会公开)并从中学习是个好主意。你可能还想考虑加入一个由其他 Kagglers 组成的团队:对我来说,团队比赛是最有趣的比赛,而且一直是一种极好的学习经历。

最后一点:大多数想法都不会成功——如果你想赢得比赛,你需要坚持不懈并不断实验!

Kaggle 无疑对前三位受访者丰富的生活和职业生涯产生了影响,他们才刚刚开始。以下我们将与两位现在在各自公司担任高级职位的 Kagglers 交谈,他们的长期而富有成效的旅程也得益于 Kaggle。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Dan_Becker.png

丹·贝克

www.kaggle.com/dansbecker

首先,我们有丹·贝克,他是 DataRobot 的笔记本大师和产品、决策智能副总裁。Kaggle 在丹的职业生涯中扮演了重要的角色。

你能告诉我们关于你自己的情况吗?

我第一次尝试使用机器学习是在 2000 年一个 3 人初创公司,我们试图使用神经网络来帮助零售商优化他们在 eBay 上设置的商品保留价格。我们根本不知道我们在做什么,我们彻底失败了。

到 2002 年,我确信机器学习永远不可能成功。我获得了经济学博士学位,并在美国政府担任经济学家。我想搬到科罗拉多州,但那里几乎没有寻找经济学博士的工作。所以我正在寻找一个不那么学术的资历。

在 2010 年,我看到了一篇关于Heritage Health Prize的报纸文章。这是一场早期的 Kaggle 竞赛,奖金高达 300 万美元。我仍然相信,像我作为经济学家所使用的简单模型,会比花哨的机器学习模型给出更好的预测。所以我开始参加比赛,认为在这个比赛中取得好成绩将是我在科罗拉多州找到一份有趣工作的必要凭证。我在那次比赛中的第一次提交并没有排在最后,但也很接近。当我看到我的模型被评分,然后看到其他人比我领先那么多时,我的心情沉重。我短暂地放弃了在比赛中取得好成绩的希望,但我不甘心连平均水平都达不到。

我花了所有的夜晚和周末时间来参加比赛,以爬升排行榜。我重新学习了机器学习,自从我第一次尝试以来,它已经进步了很多。我每天都会学习更多,上传一个新的模型。这花费了很多时间,但每天在排行榜上前进都是一种回报。当我的分数位于排行榜中间时,我认为继续工作可能会让我进入前 10%。所以我继续努力。很快我就进入了前 10%,心想我可能进入前 10 名竞争者。

当我处于前 10 名时,一家分析咨询公司联系我,问我是否愿意被雇佣并在他们的公司名下竞争,他们会用这个名字进行市场营销。我告诉他们,如果我能从科罗拉多州工作,我就愿意这么做。所以 Kaggle 竞赛帮助我实现了我的原始目标。

我们获得了第二名。第二名没有奖金,但自从那次 Kaggle 竞赛以来,我在职业生涯中所做的一切都得益于这次竞赛。这比我想象的还要成功。

Kaggle 还以其他方式帮助你在职业生涯中取得了哪些成就?

Kaggle 几乎完全塑造了我的职业生涯。我的第一份数据科学家工作是在有人从排行榜上招募我时开始的。在那之后,我在 Kaggle 工作。然后我在 DataRobot 工作,当时他们的招聘策略是雇佣在 Kaggle 竞赛中表现良好的人。然后我回到了 Kaggle,开始创建 Kaggle Learn,这是 Kaggle 的数据科学教育平台。这样的例子还有很多。我过去十年中每份工作都明显归因于我在 Kaggle 的最初成功。

当我从经济学转向数据科学时,我的 Kaggle 成就是我被雇佣的核心原因。现在我的职业生涯更深入了,我不太考虑投资组合…而且我很幸运,被招募的次数比我寻找工作的次数多。

你最喜欢的比赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我在这个社区里已经待了很长时间,但我在过去 7 或 8 年里并没有全身心地投入到一场比赛中。我喜欢新的比赛类型。例如,我第一次接触到深度学习是在 2013 年,当时是 Kaggle 第一次举办深度学习具有竞争力的比赛。那时还没有 Keras、TensorFlow、PyTorch 或今天存在的任何深度学习框架。社区中没有人真正知道如何进行深度学习,所以每个人都在第一次学习新事物。

Kaggle 还举办了一场对抗性建模比赛,其中一些人构建了试图稍微操纵图像以欺骗其他模型的模型。这非常实验性,我不知道他们是否还会再次举办类似的活动。但我真的很喜欢实验性的东西,当社区中的每个人都在一起在论坛上解决问题时。

你是如何应对 Kaggle 比赛的?这种方法与你在日常工作中所做的方法有何不同?

在最近几次比赛中,我专注于“我能为这次比赛构建哪些工具来自动化我在各个项目中的工作”?这并不特别成功,但这是一个有趣的挑战。这与我处理其他所有专业事务的方法非常不同。

在比赛之外,我非常喜欢分析和查看有趣主题的数据。我有时会说,作为数据科学家,我的优势就是我只是查看数据(而不是通过机器学习模型过滤的数据)。

我还花了很多时间思考我们如何从机器学习模型的预测到我们做出的决策。例如,如果一个机器学习模型预测在下一批货物到来之前,一家杂货店将卖出 1,000 个芒果,那么这家杂货店应该持有多少库存?有些人认为应该是 1,000 个…正好是你预测可以卖出的数量。这是错误的。

你需要考虑购买过多芒果导致浪费的成本与耗尽库存的成本之间的权衡。它们的保质期是多久?你能在下一批货物到来之前携带额外的库存吗?那里有很多优化工作要做,这是我日常工作中的一部分,而这些内容在 Kaggle 比赛中并没有体现出来。

告诉我们你参加的一个特别具有挑战性的比赛,以及你使用了哪些见解来应对这项任务。

我尝试构建一个 自动化的系统,用于对 Practice Fusion 糖尿病分类挑战进行连接和特征工程。我从中学到的最主要的事情是,如果你有超过几个文件,你仍然需要一个人员来查看数据并理解哪些特征工程是有意义的。

在你的经验中,不经验丰富的 Kagglers 通常忽略了什么?你现在知道的事情,你希望在你刚开始的时候就知道?

新参与者没有意识到 在 Kaggle 比赛中取得好成绩的门槛有多高。他们认为他们可以跳进来,以相当通用的方法进入前 50%…但这通常不是真的。我最惊讶的是,在集成之前提交时,使用不同模型的排行榜分数来分配权重的重要性。

在过去的比赛中,你犯过哪些错误?

我在多阶段比赛中多次搞砸了 最后时刻的提交细节 (结果最终排名最后或接近最后)。

你会推荐使用哪些特定的工具或库来进行数据分析或机器学习?

大部分都是标准的东西。

在 Kaggle 比赛之外,我个人喜欢使用 Altair 进行可视化…并且我写了很多 SQL。SQL 是为查看简单的聚合或趋势而设计的,而不是构建复杂模型,但我认为这更像是一个特性而不是缺陷。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/Jeong-Yoon_Lee.png

Jeong-Yoon Lee

www.kaggle.com/jeongyoonlee

最后,我们有 Jeong-Yoon Lee,他是 Netflix 研究团队中 Rankers 和搜索算法工程团队的多次获奖比赛大师和高级研究科学家。

你能告诉我们一些关于你的信息吗?

我叫 Jeong,是 Netflix 的高级研究科学家。我在 2011 年完成我的博士学业后,加入了一家分析咨询初创公司 Opera Solutions,并从那时起开始了 Kaggle。在那里,我遇到了热情的 Kaggle 竞争者,包括 Michael Jahrer,我们一起参加了 KDD 杯和 Kaggle 比赛。从那时起,即使离开公司后,我也继续作为竞争者和组织者参与比赛。最近,我在 Kaggle 上花的时间没有以前那么多,但仍然时不时地查看,以了解机器学习领域的最新工具和方法。

Kaggle 是否帮助你在职业生涯中取得进步?

极大地帮助了。首先,它提供了 机器学习的证书。许多招聘经理(当我还是面试者时)以及候选人(当我担任面试官时)都提到我的 Kaggle 记录引起了他们的注意。其次,它提供了机器学习最先进方法的培训。通过在不同领域超过 100 场比赛中的工作,我对几乎所有机器学习问题都比我同行更熟悉。第三,它提供了一个全球顶级数据科学家的网络。我在 Kaggle 遇到了许多有才华的数据科学家,并享受与他们一起工作。我翻译了 Abhishek Thakur 的书,与 Mario、Giba 和 Abhishek 一起在 KDD 上组织了一个讨论小组,现在正在面试 Luca 的书。;)

2012 年,我使用了由 Steffen Rendle 在 KDD Cup 2012 中引入的因子机,在我加入一家新公司一个月后,将预测性能提高了 30%,超过了现有的 SVM 模型。在我共同创立的一家初创公司中,我们的主要卖点是通过集成算法来 击败市场标准的线性回归。在 Uber,我引入了对抗性验证来解决机器学习管道中特征中的协变量偏移。

你最喜欢的竞赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我喜欢小型到 中型数据集的竞赛,这些竞赛大多是表格数据竞赛,因为我可以在任何时间任何地点快速迭代不同的方法。在我 2015 年在 Kaggle 的巅峰时期,我经常在飞机上或在照看孩子的间隙构建我的解决方案。我的三胞胎在 2014 年底出生,我当时在一家我共同创立的新公司工作。

我认为我没有任何特殊的建模技术,但我的专长更多在于竞赛管理,这包括招募团队成员、建立协作框架(例如,Git、S3、Messenger、Wiki、内部排行榜、交叉验证分割)、在整个竞赛中帮助团队有效工作等。所以,我并不是竞赛大师,但能够进入前十,是因为其他大师喜欢与我合作。

你是如何应对 Kaggle 竞赛的?这种应对方式与你在日常工作中所做的是否有所不同?

我试图建立一个管道,使其能够快速迭代和逐步改进。你尝试的方案越多,你在竞赛中取得好成绩的机会就越大。这个原则也适用于我的日常工作。虽然范围不同。在工作时,我们首先定义问题并确定数据,而在 Kaggle,这两者都是既定的,我们从 EDA 开始。

在你的经验中,没有经验的 Kagglers 通常忽略了什么?你现在知道的事情,你希望在你最初开始时就知道?

最近,我发现许多 用户只是简单地复制其他用户分享的 Notebook,并对其进行微调以获得更好的分数。最终重要的是学习,而非 Kaggle 排名或积分。我建议新的 Kagglers 花更多时间构建自己的解决方案。

当人们参加竞赛时,他们应该记住或做什么是最重要的?

这关乎学习,而非胜利。

你是否使用其他竞赛平台?它们与 Kaggle 相比如何?

我正在担任 Dacon AI 的顾问,这是一家 韩国机器学习竞赛平台公司。它始于 2018 年,至今已举办了 96 场竞赛。与 Kaggle 相比,它还处于早期阶段,但为韩国用户提供了类似的经验。

参加 Kaggle Days 和其他 Kaggle 聚会

与其他 Kagglers 建立联系(以及更容易被团队接受)的一个好方法就是简单地见面。聚会和会议一直是这样做的好方法,即使它们并不专门涉及 Kaggle 竞赛,因为演讲者会谈论他们在 Kaggle 上的经验,或者因为话题已经在 Kaggle 竞赛中处理过。例如,许多研究竞赛要求成功竞争者撰写关于他们经验的论文,这些论文可以在会议演讲中被展示或引用。

直到 2018 年之前,没有与 Kaggle 直接相关的特殊活动,当时由Maria ParyszPaweł Jankiewicz创立的公司 LogicAI 与 Kaggle 合作,在波兰华沙举办了首届 Kaggle Days 活动。他们聚集了超过 100 名参与者以及 8 位 Kaggle 大师级演讲者。

随后还举办了更多的 Kaggle Days 活动。以下是安排的活动,以及相关材料和演讲的链接:

从巴黎的第二场活动开始,各种城市举办了形式为聚会的较小规模活动(在 30 个不同地点举办了超过 50 场聚会)。参加大型活动或聚会是结识其他 Kagglers 和交朋友的好机会,这对职业发展或未来 Kaggle 竞赛的团队合作都有帮助。

实际上,其中一位作者就是通过这种方式找到了他们的下一份工作。

被发现和其他工作机会

在一段时间内,Kaggle 是一个雇主可以找到数据分析与机器学习建模罕见技能的热点。Kaggle 本身就在讨论论坛中提供了一个职位板,许多招聘人员四处游走,在排行榜上寻找可以联系的个人资料。公司本身也举办比赛以明确寻找候选人(例如,Facebook、英特尔和 Yelp 都为此目的安排了招聘竞赛)或者在他们看到在某些类型的问题上表现出色后方便地挑选出最佳竞争者(例如,在电信竞赛之后,保险公司 AXA 就是这样做的)。这一切的顶峰由《Wired》杂志对 Gilberto Titericz 的采访所标记,其中提到“排名靠前的解算者收到了大量的工作邀请” (www.wired.com/story/solve-these-tough-data-problems-and-watch-job-offers-roll-in/)。

最近,事情有所变化,许多 Kagglers 报告说,当你赢得比赛或取得好成绩时,你能期望的最好的结果是招聘人员几个月内的联系。让我们看看事情是如何变化的,以及为什么会这样。

现在,你很少会找到要求 Kaggle 经验的工作机会,因为公司通常要求在该领域(甚至更好的,在同一行业或知识领域)有先前经验,在数学学科方面有学术背景,或者来自谷歌、亚马逊或微软的认证。你的 Kaggle 存在仍然会有些影响,因为它将允许你:

  • 被监控 Kaggle 排名和比赛的招聘人员发现。

  • 被公司本身发现,因为许多经理和人力资源部门都会关注 Kaggle 个人资料。

  • 有一些证明你编码和机器学习能力的证据,这可能有助于公司选择你,可能不需要你进行任何进一步的测试。

  • 有一些与特定公司高度相关的特定经验,这些经验你无法通过其他方式获得,因为数据并不容易对每个人开放(例如,电信、欺诈检测或深度伪造,这些都是 Kaggle 竞赛的主题)。

尽管如此,你的结果和排名很少会被简单地考虑,因为很难区分那些实际上是由于你的技能而产生的部分,以及那些对公司招聘你不太感兴趣的、影响结果的其他因素(例如,你可以用于比赛的时间、硬件可用性或一些运气)。

你的 Kaggle 排名和结果在以下情况下更有可能被注意到:

  • 你在一场对公司特别重要的比赛中取得了好成绩。

  • 你在多个与公司感兴趣的主题相关的比赛中系统性地取得了好成绩,这是一个真正的能力的标志,意味着你并不是没有坚实基础就简单地给自己贴上“数据科学家”或“机器学习工程师”的标签。

  • 通过你在 Kaggle 的参与,你展示了你对数据分析的真正热情,以至于你愿意在空闲时间免费投入。这是一个积极的方面,但也可能成为双刃剑,除非你表明你认识到自己的价值,否则可能会带来较低的货币报价。

虽然它们可能单独不起作用,但你的 Kaggle 排名和结果可以作为区分因素。招聘人员和公司可能会使用 Kaggle 排名来制作潜在候选人的名单。最引人注目的是竞赛和笔记本排名(因此,它们在四个排名领域中也有更激烈的竞争和更多的特级大师),但有时他们也会关注特定竞赛的排名。当寻找某些罕见的专业技能(例如,在自然语言处理或计算机视觉中)时,更容易在需要你巧妙使用它们才能成功的竞赛中找到它们。

另一个在面试时的显著区别是。你可以引用你的竞争对手来展示你如何解决问题,如何编码解决方案,以及你如何与队友互动和协作。在这些场合,除了你在 Kaggle 获得的名次或奖牌,更重要的是谈论 Kaggle 竞赛的具体情况,例如它所指的行业,你必须处理的数据类型以及为什么它对你有吸引力,还要展示你在竞赛中的行动,通常使用在面试中常用的STAR 方法

STAR 方法

在 STAR 方法中,你应该根据情境任务行动结果的框架来组织你在竞赛中所做的事情。这种方法旨在让你更多地谈论行为而不是技术,从而更注重你的能力而不是你选择的算法的能力;任何人都可以使用相同的算法,但只有你能够成功地使用它。

这种方法主要适用于处理成功故事,但你也可以将其应用于不成功的故事,特别是对于你从失败中获得了重要见解的情况,这些见解阻止你以同样的方式再次失败。

要应用这种方法,你需要将你的故事分解为四个部分:

  • 情境:描述情境的背景和细节,以便面试官可以一目了然地了解问题和机会

  • 任务:描述你在该情境中的具体角色和责任,帮助界定你在技能和行为方面的个人贡献

  • 行动:解释你为了处理任务采取了哪些行动

  • 结果:展示你行动的结果以及整体结果

一些公司明确要求使用 STAR 方法(或其相关方法目标-影响-挑战-发现,其中更注重结果);而另一些公司虽然没有明确要求,但期望类似的方法。

最好的回答是那些符合你面试的公司价值观和目标。

由于仅仅报告你在比赛中获得的排名和奖牌可能不足以给面试官留下深刻印象,因此重新表述你在 Kaggle 比赛中的成功经验至关重要。这种方法无论是单独竞争还是团队竞争都适用;在后一种情况下,一个重要的描述方面是如何与其他队友互动并积极影响他们。让我们讨论一些你可以这样做的方法。

首先,你描述在比赛中出现的情况。这可能是初始阶段、实验阶段或最终总结阶段。为了使听众能够评估你的行为是否适合该情况,提供清晰的背景信息非常重要。请非常详细地解释情况以及为什么它需要你的注意和行动。

然后,你应该解释你承担的任务。例如,这可能包括清理数据、进行探索性分析、创建基准模型或持续改进你的解决方案。

接下来,你描述你是如何执行任务的。在这里,如果你能展示一篇 Medium 文章或一个 GitHub 项目来支持你的描述(正如我们在上一章中讨论的那样),将会非常有帮助。通过精心编写的文档和良好的编码系统地展示你的经验和能力,将加强你在面试官面前的价值主张。

最后,你必须解释获得的结果,这可能是有形的(例如,你如何协调在 Kaggle 上竞争的团队的工作)或量化的(例如,你的贡献对最终结果的影响有多大)。

摘要(以及一些告别的话)

在本章中,我们讨论了如何在 Kaggle 上竞争如何有助于提高你的职业前景。我们谈到了通过在比赛中组队以及参与与过去比赛相关的事件来建立联系,以及如何利用你在 Kaggle 上的经验来寻找一份新工作。我们讨论了基于我们的经验和其他 Kagglers 的经验,仅凭 Kaggle 上的成绩并不能保证你获得一个职位。然而,它们可以帮助你吸引招聘人员和人力资源部门的注意,并加强你在数据科学领域展示能力的方式(如果它们得到了我们在上一章中描述的精心构建的简历的支持)。

本章也标志着本书的结束。通过十四章,我们讨论了 Kaggle 比赛、数据集、笔记本和讨论。我们涵盖了机器学习和深度学习的技术主题(从评估指标到模拟比赛),目的是帮助你不仅在 Kaggle 上,而且在 Kaggle 之后都能取得更大的成就。

在 Kaggle 竞赛中参与十年,我们非常清楚,你可以在 Kaggle 上找到你可能需要知道的一切——但所有这些内容都分散在数百个竞赛和数千个笔记本、讨论和数据集中。在你需要的时候找到你需要的东西,对于任何刚开始在 Kaggle 上的人来说可能会是一项艰巨的任务。我们汇编了我们认为至关重要的、不可或缺的知识,以指导你通过你可能想要参加的所有竞赛。这就是为什么这本书不仅仅是一本严格意义上的数据科学书籍,而是一本专门关于 Kaggle 数据科学的书籍。

除了技术和实用提示之外,我们还希望传达,在过去的十年里,我们始终找到了将我们在 Kaggle 上的经验转化为积极经验的方法。你可以将这份作品当作一本描述我们穿越数据科学竞赛世界的无尽旅程的书来重新阅读。在获得所有大师头衔并排名世界第一时,你的 Kaggle 之旅并没有结束。实际上,它永远不会结束,因为你可以用无数种方式重新发明你参与竞赛和利用竞赛经验的方式。随着这本书的结束,你在 Kaggle 上的旅程才刚刚开始,我们祝愿你有一个漫长、丰富且硕果累累的经历——就像我们一样。祝您旅途愉快!

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作空间,每月与作者进行一次“问我任何问题”的会议:

packt.link/KaggleDiscord

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/kgl-bk/img/QR_Code40480600921811704671.png

【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 解决 `pip install citylearn` 的常见错误 当遇到 `pip install citylearn` 安装失败的情况时,可以尝试以下几种方法来解决问题。 #### 使用国内镜像源加速安装过程 有时由于网络原因可能导致连接超时等问题。可以通过指定清华大学的 PyPI 镜像源来进行安装: ```bash pip install citylearn -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` 为了使更改长期生效,可配置全局 Pip 设置指向该镜像地址[^2]: ```bash python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ``` #### 更新 Python 和 Pip 版本 确保使用的 Python 及其包管理工具处于最新版本有助于减少兼容性问题带来的麻烦。执行命令更新它们: ```bash python -m pip install --upgrade pip setuptools wheel ``` #### 创建虚拟环境再进行安装 创建一个新的虚拟环境并在此环境中重新尝试安装 CityLearn 库可能也会有所帮助。这能避免与其他已有的库发生冲突。 ```bash python -m venv myenv source myenv/bin/activate # Linux 或 macOS 用户 myenv\Scripts\activate # Windows 用户 pip install citylearn # 此处同样建议加上清华源参数 ``` #### 检查依赖项及其版本匹配情况 CityLearn 可能有特定版本的要求对于某些依赖库来说;因此查看官方文档确认所需的具体版本号,并手动调整这些依赖到合适的状态可能是必要的。 如果上述措施仍无法解决问题,则需进一步分析具体的报错信息以定位确切的原因所在。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值