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

Statistics 编码风格的监督学习-特征选择(Scikit学习),statistics,machine-learning,feature-extraction,feature-selection,supervised-learning,Statistics,Machine Learning,Feature Extraction,Feature Selection,Supervised Learning,我正在研究是否有可能根据编码风格自动对学生代码进行评分。这包括避免重复代码、注释掉的代码、错误的变量命名等等 我们试图根据上学期的作文成绩(1-3分)进行学习,这很好地引导了监督学习。其基本思想是,我们从学生提交的材料中提取特征,并生成特征向量,然后使用scikit learn进行逻辑回归。我们还尝试了各种方法,包括在特征向量上运行PCA以降低维数 我们的分类器只是猜测最频繁的类,即分数为2。我相信这是因为我们的功能根本无法预测有监督学习算法只猜测主导类还有其他可能的原因吗?有没有办法防止这种情

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

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

我们的分类器只是猜测最频繁的类,即分数为2。我相信这是因为我们的功能根本无法预测有监督学习算法只猜测主导类还有其他可能的原因吗?有没有办法防止这种情况发生

因为我相信这是由于这些功能不是预测性的,有没有办法确定什么是“好”功能?(好,我指的是可辨别的或预测的)

注:作为一个附带实验,我们通过让读者对已经评分的作业评分,来测试过去的成绩有多一致。他们中只有55%的人对项目的作文评分相同(1-3)。这可能意味着这个数据集根本不可分类,因为人类甚至不能统一评分关于其他想法有什么建议吗?或者事实是否如此

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

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

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

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

找不到好的特性是非常令人畏惧的。停滞不前时,始终遵循你的直觉。如果一个人能完成一项任务,那么计算机也能。因为您的特性在评估任何给定代码时看起来都很温和,所以它们应该可以工作(假设它们使用得当)


摘要:特征的规范化应该解决这个问题。>/P>> P>只是一个想法——Andrew Ng教授了一个关于Coursera()的机器学习课程。学生在整个课堂上都会提交一些编程作业。我记得读到(尽管很不幸,我现在找不到这篇文章)有一些正在进行的研究试图将学生提交的编程作业集中在课堂上,直觉告诉我学生在作业中会犯一些常见的错误

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

  • 你想平衡你的目标课程(接近相等的1、2、3分)。您可以随机采样大小过大的类,引导采样大小过小的类,或者使用一种算法来解释不平衡的数据(不确定Python中是哪种算法)

  • 确保交叉验证以防止过度装配

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

    • 尝试所有属性组合,从其中一个开始
    • 或者尝试所有属性的组合,从它们开始
    • 或者随机尝试属性组合(或w遗传算法)
  • 选择交叉验证精度最高的属性组合


    您还可以获取属性列的乘积,以查看它们是否一起产生影响。

    +1。哇!这是一个多么好的问题/然而,答案将更多地由统计学而不是计算机科学来驱动。包括“统计学”作为标签。谢谢请在问题末尾澄清你的注意事项:“测试过去的成绩有多一致,并确定它们根本不一致”。根据什么保持一致?这听起来更像是线性回归(数值预测),而不是逻辑回归(分类任务)。使用线性回归,你会得到像1.2,1.8,1.5。。。而不是简单地标记“2”,这可能会给你一些见解。还要注意的是,线性模型(在线性和逻辑回归中)可能只是表示变量之间关系的一种不好的方法。因此,您还可以尝试其他方法,如使用超平面分割数据(SVM,可能使用非线性核)或计算概率(例如朴素贝叶斯)。顺便说一句,你使用什么功能(一些例子会很有帮助)。如果我理解你的意思,我认为我们实际上没有问题。至少在我们的项目范围内,我们只尝试从一个类中的一个特定项目中学习。因为我们的是如此具体,所以我们不需要像lin总数这样的标准化