编码风格的监督学习 - 特征选择(Scikit Learn)

Posted

技术标签:

【中文标题】编码风格的监督学习 - 特征选择(Scikit Learn)【英文标题】:Supervised Learning on Coding Style - Feature Selection (Scikit Learn) 【发布时间】:2013-12-01 05:30:44 【问题描述】:

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

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

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

我认为这是由于特征不具有预测性,有没有办法确定什么是“好”特征?(我所说的好,是指可区分或可预测的)。

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

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

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

【问题讨论】:

+1。哇!什么问题/ 但是答案将更多地由这里的统计而不是计算机科学驱动。 包含“统计”作为标签。谢谢! 请在问题的末尾澄清您的注释:“测试了过去的成绩有多一致,并确定它们根本不是”。根据什么一致?你是怎么测试的? 这听起来更像是线性回归(数值预测)而不是逻辑回归(分类任务)。使用线性回归,您将获得 1.2、1.8、1.5 等数字,而不是简单地标记“2”,这可能会给您一些见解。另请注意,线性模型(在线性回归和逻辑回归中)可能只是表示变量之间关系的不好方法。因此,您还可以尝试其他方法,例如使用超平面(SVM,可能使用非线性内核)分割数据或计算概率(例如朴素贝叶斯)。顺便说一句,您使用什么功能(一些示例会有所帮助)。 【参考方案1】:

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

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

【讨论】:

谢谢!绝对考虑这条路。我相信以下是您所指的论文?people.csail.mit.edu/zp/moocshop2013/paper_16.pdf我的教授也向我们指出了那个方向,所以我认为这可能是我们的下一个方法!【参考方案2】:

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

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

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

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

【讨论】:

如果我明白你在说什么,我认为我们实际上并没有遇到问题。至少在我们项目的范围内,我们只是试图从一个课程中的一个特定项目中学习。由于我们的非常具体,因此我们不需要通过项目中的总行数之类的东西进行标准化。 (对不起,我没有在问题中提到这一点)。 好的。在这种情况下,看起来给定的问题很难通过线性模型来解决。你是如何尝试任何非线性模型的,比如带有非线性内核的 SVM 或 GMM?【参考方案3】:

    您希望平衡目标班级(1、2、3 的分数接近相等)。您可以随机抽样过大的类,引导抽样过小的类,或使用一种算法来解决不平衡数据(不确定 Python 中的哪一种)。

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

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

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

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

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

【讨论】:

以上是关于编码风格的监督学习 - 特征选择(Scikit Learn)的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn交叉验证及其用于參数选择模型选择特征选择的样例

[机器学习与scikit-learn-44]:特征工程-特征提取(编码)-3-权重向量编码以及代码示例

[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量

『cs231n』无监督学习

自监督学习:自编码器

scikit 中的特征选择学习多个变量和数千个特征