GitEval — 预测你的 GitHub 个人资料的质量

news2024/9/9 0:52:04

使用机器学习来预测你是否擅长编码

可直接在橱窗里购买,或者到文末领取优惠后购买:

如果你曾经申请过技术职位,你可能已经向公司发送了你的 GitHub 个人资料链接。此个人资料中的信息可以很好地表明你的编码能力以及是否适合团队。所有这些信息的缺点是招聘人员可能需要很长时间才能评估它。为了节省时间,机器学习可能用于自动评估你的编码能力。

在这里插入图片描述

在本文中,我们将引导你完成构建此类模型的过程。我们讨论了如何从 GitHub 收集数据并使用这些数据创建模型特征。为了建立一些直觉,我们探索了数据集中的关系。最后,我们比较和解释了两种 ML 算法——决策树和随机森林。你可以在「GitHub」1上找到此分析的代码。

数据收集和特征工程

从你的代码存储库到你关注的其他程序员,你的 GitHub 个人资料中有很多公开可用的信息。我们构建了一个网络抓取工具,从 230 位用户的个人资料中收集了部分数据。例如,你将在任何用户的概览页面上看到与图 1 类似的贡献列表。当用户编写新代码并将其保存到他们的代码存储库 (repos) 之一时,他们就做出了贡献。

图 1:GitHub 贡献

通过抓取这些数据,我们最终得到了去年每天的贡献数量列表。为了能够在模型中使用这些数据,我们首先需要进行一些特征工程。我们可以通过几种方式做到这一点。例如,我们可以计算去年的贡献总数(n_cont)。我们还可以计算自上次贡献以来的天数(last_cont)。这些贡献只是我们可以用来创建模型特征的 GitHub 个人资料的一个方面。

图 2:GitHub 侧边栏

图 2 显示了用户侧边栏中的一些信息。从中,我们可以获取关注者的数量、关注数以及用户已加星标的存储库数量(stars)。这些已经是数字,因此无需进行特征工程。最后,我们还根据组织信息 ( org_flag ) 创建一个标志,该标志将指示用户是否属于某个组织。

最后一组特征来自用户的存储库。在图 3 中,我们可以看到一些代码存储库的示例。我们收集了用户创建的存储库总数 ( repos )。我们还收集了每个存储库中使用的编码语言。由此,我们计算出所有用户存储库中使用的不同编码语言的数量 ( n_lang )。

图 3:GitHub 存储库

表 1 总结了创建的所有模型特征。除了stab_contfoll_ratiocont_repo_ratio,我们在上面讨论了所有这些特征。还有其他信息/特征来源可以创建。我们将自己限制在这一组,因为它们相当简单,数据很容易抓取。希望这些特征至少与编码能力相关,使我们能够做出准确的预测。具体来说,我们将尝试使用它们来预测 0 到 5 之间的评级。

表 1:模型特征列表

此评分是通过取两个独立评分的平均值得出的。重要的是,评分者不受上述功能中包含的信息的限制。例如,评分者可以打开存储库中的文件并阅读实际编写的代码。在浏览个人资料后,每个评分者都会根据用户的编码能力给出评分,从 0 到 5(5 为最佳)。两个评分的平均值作为最终评分/目标变量。

数据探索

在深入建模之前,探索模型特征是个好主意。我们这样做是为了建立直觉并了解哪些特征能够很好地预测评分。图 4 中可以看到一个潜在的良好预测器示例。在这里,我们可视化了评分和n_cont之间的关系。请注意,随着用户的总贡献增加,用户的评分也趋于增加。

图 4:评分与贡献散点图

此时,你应该问问自己,这种关系是否合理。没有或很少做出贡献的用户在过去一年中不会做太多编码。做出大量贡献的用户会做很多编码。这似乎合乎逻辑——你编码越多,你的编码能力就越强。我们的模型有望利用这种关系进行预测。

另一方面,你可以看到评级与加星标的存储库数量(Stars)之间的关系。在这种情况下,似乎没有任何模式。也许这是因为你不必进行任何编码即可为其他用户的存储库加星标。也就是说,星星不会告诉我们你的编码能力。从这个分析来看,我们不应该期望星星成为我们模型中的一个重要特征。

图 5:评分与星级散点图

另一个可能很重要的特征是组织标志。我们可以预期,属于某个组织的用户会成为更好的程序员。特别是,如果他们属于像谷歌开源社区2这样的组织。在下面的箱线图中,我们可以看到,属于某个组织的用户的评分确实往往更高。没有组织的平均评分为 1.8,而用户属于某个组织时的平均评分为 3.4。这种差异表明org_flag可能是一个很好的预测指标。

图 6:评级与组织标志箱线图

我们应该记住,这些特征并不是孤立存在的。看起来具有预测性的特征,当它们与其他特征一起包含在模型中时,可能并不那么重要。这是由于特征本身之间的关系。例如,在图 7 中,我们可以看到贡献更多的用户更有可能成为某个组织的一部分。具体来说,贡献 500 次或更多的用户中有 70% 是某个组织的成员。而贡献少于 500 次的用户中,这一比例仅为 20%。

图 7:评级与贡献组织散点图

假设我们只使用org_flag 创建一个模型。从上面的分析来看,组织中的人员可能会获得更高的预测评级。我们可以通过在模型中添加n_cont 来改善这些预测。同样,贡献较大的人员可能会获得更高的评级。但是,许多贡献较大的用户都是组织的一部分。这意味着他们可能已经获得了高评级,因此包括n_cont可能不会像我们想象的那样改善这些预测。最终,n_cont的重要性实际上取决于它比org_flag提供的信息多多少。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决策树

考虑到我们的探索性数据分析,现在是时候进行建模了。我们将从创建一个简单的决策树开始。为此,我们首先拆分数据集并使用 200 行训练决策树。我们将剩余的 30 行保留为测试集。决策树是使用基尼不纯度测量创建的,以确定每个节点的最佳分割。我们还限制树在每个叶节点中至少有 10 个样本。你可以在图 9 中看到整个决策树。

要了解这棵树的工作原理,让我们从根节点开始。如果用户满足第一行中的规则(即至少做出了 105 次贡献),我们就会沿着树的右箭头向下移动。如果不满足规则,我们就会沿着左箭头向下移动。我们继续检查规则并沿着箭头移动,直到到达叶节点。例如,如果用户做出了 900 次贡献并拥有 90 名关注者,我们最终会到达用红色圈出的叶节点。17 位用户最终进入了这个桶,他们的评分为 4.603。

图 9:决策树

下一步是使用此模型对测试集进行预测。为了评估此模型,我们应该将实际评分与这些预测进行比较。一种方法是使用图 8 中的散点图。如果模型完美,则所有点都会落在红线上(即实际 = 预测)。黑色虚线距离红线一个单位。这意味着与实际评分相比,只有 2 个预测的差异大于 1。总体而言,该模型在测试集上的 MSE 为 0.3077。

图 8:决策树实际评分与预测评分

随机森林

决策树通常被认为是一个简单的 ML 模型。让我们看看是否可以使用更复杂的方法——随机森林来提高这种准确性。具体来说,我们使用一个有 100 棵树的随机森林。每棵树的最大深度限制为 4。与决策树一样,你可以在图 10 中看到实际评分与预测评分的图。

我们再次发现 2 个预测的误差超过 1 个单位。就 MSE 而言,似乎确实有所改善。测试集上的 MSE 为 0.2691,比决策树低 12.5%。在决定使用哪种最终模型时,应权衡准确度的提高与使用更复杂模型的缺点。

图 10:随机森林实际评分与预测评分

其中一个缺点是,我们无法像解释决策树那样解释随机森林。换句话说,我们无法像图 9 那样简单地可视化整个模型。这意味着我们对模型如何进行预测的理解会更差。要解释模型,我们必须使用额外的技术,例如特征重要性分数。

在图 11 中,我们可以看到随机森林的特征重要性得分。一般来说,特征重要性越高,该特征在进行预测时就越有用。我们可以看到,n_cont是迄今为止最有用的,其次是reposfollowers。我们可以看到stars不是很重要。这与我们的探索性分析一致。不一致的是org_flag是最不重要的。当与其他特征一起包含时,似乎这个特征并不像我们预期的那么重要。

图 11:随机森林特征重要性

思考和未来工作

任何模型都有一些需要解决的弱点。我们应该尝试理解的一个方面是,为什么n_cont比其他任何特征都重要得多。查看图 12,当你第一次打开某人的个人资料时,贡献会立即引起你的注意。这可能会对评分者的决策过程产生影响。换句话说,他们可能比他们想要的更依赖贡献。

图12:Github概览页面

评分也可能以其他方式产生偏差。例如,如果评分者考虑用户的个人资料图片,则可能会引入种族/性别偏见。为了解决这个问题,我们需要提出一个客观的评分系统。它应该只考虑与编码能力直接相关的信息,并且信息应该更统一地呈现。

实际上,不同公司或团队的评级系统可能有所不同。对于给定的用户,数据工程团队可以给数据科学团队完全不同的评级。这是因为每个团队所需的技能不同。换句话说,评级将反映用户在特定团队中的表现,而不是他们总体上的编码能力。

在这里插入图片描述

围绕特征工程还有很多工作可以做。到目前为止,我们使用的特征实际上只是与编码能力有关。做出很多贡献并不能让你成为一名优秀的程序员。只是优秀的程序员往往会做出很多贡献。我们应该尝试从实际编写的代码中创建特征。例如,我们可以确定用户是否使用了单元测试、使用了一致的命名约定或是否正确注释了他们的代码。

总体而言,似乎可以使用机器学习来预测编码能力。使用一种相当简单的方法,我们可以做出与实际评分一致的预测。希望这将为未来更好的模型奠定基础。

我们提到了性别/种族偏见。机器学习中的这种偏见比许多人意识到的更常见。一个例子是亚马逊使用的系统没有以性别中立的方式对求职者的简历进行评级。我们在文章《[[什么是算法公平性]]》中讨论这个问题以及其他一些有偏见的算法:

旨在理解和防止机器学习模型偏见的领域的介绍

AI 进阶:企业项目实战3

参考


「AI秘籍」系列课程:

  • 人工智能应用数学基础
  • 人工智能Python基础
  • 人工智能基础核心知识
  • 人工智能BI核心知识
  • 人工智能CV核心知识

  1. Github, https://github.com/hivandu/public_articles/tree/main/src/git-eval ↩︎

  2. Google Github, https://github.com/google ↩︎

  3. AI 进阶:企业项目实战, https://www.sanjieke.cn/course/detail/sjk/8005780 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【全国大学生电子设计竞赛】2024年C题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

Opencv画出红底白字标准中文显示框

链接:https://pan.baidu.com/s/1iEJKpqt-z_5yBJdenUABbA 提取码:uoox 先把这个文件拿了,这个文件是一个ttf的字体,用于显示中文。 核心代码👑 def cv2AddChineseText(self, img_ori, text, p1, box_color, textColo…

【JavaScript】函数声明和函数表达式的区别

文章目录 一、函数声明1. 定义方式2. 作用域提升(Hoisting)3. 块级作用域 二、函数表达式1. 定义方式2. 作用域提升(Hoisting)3. 自引用 三、其他区别1. 函数名2. 可读性和代码组织3. 使用场景 四、总结函数声明函数表达式 在Java…

昇思MindSpore学习入门-自动混合精度

混合精度(Mix Precision)训练是指在训练时,对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中,部分运算对数值精度不敏感,此时使用较低精度可以达到明显的加速效果(如conv、matmul等&am…

Android 10.0 Launcher3仿ios的folder文件夹widget功能实现一

1.前言 在10.0的系统ROM开发中,在进行一些系统Launcher3定制功能开发中,需要实现folder文件夹widget的功能,由于launcher3 默认不支持folder跨行显示,所以就需要借助自定义的widget小部件功能来实现相关功能,接下来分析实现相关功能 2.Launcher3仿ios的folder文件夹widge…

【保姆级教程】免费域名注册 Cloudflare 域名解析 Ngnix端口转发

前段时间,带大家搞了两台云服务器: 玩转云服务:Oracle Cloud甲骨文永久免费云服务器注册及配置指南玩转云服务:手把手带你薅一台腾讯云服务器,公网 IP 基于这两台云服务器,我们玩转了很多有趣的开源项目&…

ElasticSearch(八)— 聚集查询1

一、总概 聚集查询(Aggregation)提供了针对多条文档的统计运算功能,它不是针对文档本身内容的检索,而是要将它们聚合到一起运算某些方面的特征值。 聚集查询与 SQL 语言中的聚集函数非常像,聚集函数在 Elasticsearch 中相当于是聚集查询的一…

掌控数据流的智能仪表板:Redpanda Console

Redpanda Console: 一站式管理,让数据流尽在掌控之中。- 精选真开源,释放新价值。 概览 Redpanda Console,是一款创新的Web界面工具,专为简化Kafka和Redpanda数据流的监控与管理而设计。它以用户友好的交互方式&#…

浏览器用户文件夹详解 - Favicons(二)

1. 引言 上一篇文章我们深入探讨了Chromium用户文件夹中的Bookmarks文件,了解了它的JSON结构以及如何解析和修改书签数据。 在本文中,我们将继续探索Chromium用户文件夹中的另一个重要文件:Favicons。Favicons,也就是我们常说的网站图标,是浏览器中不可或缺的一部分。它们不仅…

RK3568笔记四十七:PWM 子系统

若该文为原创文章,转载请注明原文出处。 pwm 子系统功能单一,很少单独使用,一般用于控制显示屏的背光、控制无源蜂鸣器、伺服电机、电压调节等等。 一、PWM介绍 PWM(Pulse width modulation),脉冲宽度调制。在内核中 PWM 驱动较简…

并发编程工具集——并发容器-下(二十五)

List List 里面只有一个实现类就是 CopyOnWriteArrayList。CopyOnWrite,写的时候会将共享变量新复制一份出来,读操作完全无锁;适合读多写少的场景,写操作会复制数组,在新的数组中操作实现原理:CopyOnWriteA…

备考软考高级系统架构设计师,需要买哪些资料?

距离2024下半年软考高级系统架构设计师考试仅剩三个月!时间紧迫,单单啃书已经不够了,毕竟是软考高级科目,难度不是那些初、中级可以比拟的。要想短时间速通架构考试,学会抓重点真的很重要,45分说多不多说少…

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP(Real-Time Streaming Protocol)RTMP(Real-Time Messaging Protocol)主要差异 什么是流式传输?流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

C++ //练习 16.2 编写并测试你自己版本的compare函数。

C Primer(第5版) 练习 16.2 练习 16.2 编写并测试你自己版本的compare函数。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*********************************************************************…

PyTorch深度学习快速入门(下)

PyTorch深度学习快速入门(下) 一、现有网络模型的使用及修改(一)背景知识(二)修改网络模型的三种方法 二、网络模型的保存与加载(一)保存网络模型的两种方法(二&#xff…

阿里云 服务器安装rabbit

现在我们去服务器安装一个rabbit 进入home 创建一个rabbit文件夹 /home/rabbit vim deployRabbit.sh 脚本内容 #!/bin/bash docker run -d \ --name dev.rabbit \ --network dev-net \ -p 15672:15672 \ -v ./data:/var/lib/rabbitmq \ --hostname dev.rabbit \ rabbitmq:…

css3 红色阴影边框紧急提醒呼吸灯特效

效果截图 代码 <!DOCTYPE html> <html><head><title>红色呼吸灯紧急特效</title><style>keyframes alarm {0% {box-shadow: 0 0 30px #ff0000;}50% {box-shadow: 0 0 60px #ff0000, inset 0 0 60px #ff0000;}100% {box-shadow: 0 0 30px …

八、【Python】基础 - 【Python while 循环全解析】:掌握无限循环的艺术

&#x1f4a1;&#x1f4da;【Python while 循环全解析】&#xff1a;掌握无限循环的艺术&#x1f4da;&#x1f4a1; 目录 1.基本语法 2.示例 3.注意事项 4.嵌套循环与循环控制语句 5.示例&#xff1a;使用 break 和 continue 6.示例&#xff1a;计数器 7.示例&#xf…

Web:Url 编码 -13

URL编码概述 HTTP协议只支持iso8859-1字符集。 而此字符集中只有英文数字常见符号。 所以HTTP原生是无法传输非iso8859-1字符的。 为了解决这个问题&#xff0c;提出了一种称之为URL编码的解决方案。 URL编解码详解 将非iso8859-1字符&#xff0c;进行转换 先将字符按照指定码表…

时间序列分析方法之 -- 自回归移动平均模型(Autoregressive Moving Average, ARMA)原理及Python代码示例

目录 原理 适用情况 Python 示例代码 结论 原理 自回归移动平均模型&#xff08;Autoregressive Moving Average, ARMA&#xff09;是一种结合了自回归&#xff08;AR&#xff09;模型和移动平均&#xff08;MA&#xff09;模型的时间序列分析模型。它适用于描述和预测平稳…