8

我正在研究是否可以根据编码风格自动对学生的代码进行评分。这包括避免重复代码、注释掉代码、变量命名错误等。

我们正在尝试根据过去学期的作文分数(范围从 1-3)来学习,这很好地导致了监督学习。基本思想是我们从学生提交的内容中提取特征,并制作一个特征向量,然后使用 scikit-learn 通过逻辑回归运行它。我们还尝试了各种方法,包括在特征向量上运行 PCA 以降低维度。

我们的分类器只是猜测最频繁的类别,得分为 2。我相信这是因为我们的特征根本无法以任何方式进行预测。有没有其他可能的原因让监督学习算法只猜测主导类?有什么办法可以防止这种情况发生吗?

我认为这是由于功能无法预测,有没有办法确定什么是“好”功能?(好的,我的意思是可区分的或预测的)。

注意:作为一项附带实验,我们通过让读者对已经评分的作业进行评分来测试过去成绩的一致性。他们中只有 55% 的项目给出了相同的作文分数(1-3)。这可能意味着该数据集根本无法分类,因为人类甚至无法始终如一地评分。关于其他想法的任何提示?或者事实是否如此?

功能包括:重复代码行数、平均函数长度、1 个字符变量的数量、包含注释掉代码的行数、最大行长度、未使用的导入计数、未使用的变量、未使用的参数。还有一些……我们可视化了所有特征,发现虽然平均值与分数相关,但变化确实很大(没有希望)。

编辑:我们项目的范围:我们只是试图从一个类中的一个特定项目(给出骨架代码)中学习。我们还不需要一概而论。

4

3 回答 3

1

只是一个想法 - Andrew Ng 在 Coursera ( https://www.coursera.org/course/ml )上教授机器学习课程。学生在课堂上提交了几项编程作业。我记得读过(虽然很遗憾我现在找不到这篇文章),有一些正在进行的研究试图将学生提交的课程中的编程作业聚集在一起,直觉上学生在作业中犯了一些常见的错误。

不确定这是否对您有帮助,但也许将其视为无监督学习问题可能更有意义(例如,只是在不同代码样本中寻找相似之处,直觉相似的代码样本应该获得相似的分数)。

于 2013-11-20T15:19:54.050 回答
1

功能包括:重复代码行数、平均函数长度、1 个字符变量的数量、包含注释掉代码的行数、最大行长度、未使用的导入计数、未使用的变量、未使用的参数。还有几个。。

您是否尝试过规范化功能?您似乎想要训练一个能够将任何给定代码分类到一个类别的神经网络。现在因为不同的代码会说,不同数量的重复代码行和不同数量的未使用变量,但可能同样糟糕。因此,您需要通过“有用”代码的总行数来规范化参数。

找不到好的功能是非常令人生畏的。当停滞不前时,请始终遵循您的直觉。如果一个人可以完成一项任务,那么一台计算机也可以。由于您的功能在评估任何给定代码时看起来相当适中,因此它们应该可以工作(假设它们使用得当)。

总结:特征归一化应该可以解决问题。

于 2013-11-19T12:07:15.730 回答
0
  1. 您想要平衡您的目标类别(1、2、3 的分数接近相等)。您可以随机抽样过大的类,引导抽样过小的类,或使用一种算法来解释不平衡的数据(不确定 Python 中的哪一种)。

  2. 确保您进行交叉验证以防止过度拟合

  3. 有几种方法可以确定哪些属性很重要:

    • 尝试所有属性组合,从其中一个开始
    • 或尝试所有属性组合,从它们全部开始
    • 或随机尝试属性组合(或 w 遗传算法)

选择具有最高交叉验证准确度的属性组合。

也可以取属性列的乘积,看它们是否共同产生影响。

于 2014-12-03T08:59:14.337 回答