8

Я изучаю, можно ли автоматизировать оценку кода ученика на основе стиля кодирования. Это включает в себя такие вещи, как избежание дублирования кода, прокомментированный код, плохое имя переменных и многое другое.Управленческое обучение по стилю кодирования - выбор функции (Scikit Learn)

Мы стараемся учиться на основе оценок состава прошлого семестра (от 1-3), что прекрасно ведет к контролируемому обучению. Основная идея заключается в том, что мы извлекаем функции из представлений учащегося и создаем feature_vector, а затем запускаем его через логистическую регрессию, используя scikit-learn. Мы также пробовали различные вещи, включая запуск PCA на векторах функций, чтобы уменьшить размерность.

Наш классификатор просто угадывает самый частый класс, который составляет 2 балла. Я считаю, что это потому, что наши функции просто НЕ прогностичны. Есть ли другая возможная причина для контролируемого алгоритма обучения, чтобы угадать только доминирующий класс? Есть ли способ предотвратить это?

Как я считаю, из-за особенностей, которые не являются прогностическими, есть ли способ определить, что такое «хорошая» функция? (И, кстати, я имею в виду дискриминационный или прогностический).

Примечание: в качестве побочного эксперимента мы проверили, насколько последовательными были оценки прошлых лет, с оценками, которые уже были оценены читателями. Только 55% из них дали тот же показатель состава (1-3) для проектов. Это может означать, что этот набор данных просто не классифицируется, потому что люди не могут даже оценивать последовательно. Любые советы по другим идеям? Или действительно ли это так?

Особенности включают в себя: Количество строк повторяющегося кода, средней длины функции, числа 1 переменных символов, число строк, которые включают в себя закомментированными код, максимальная длина строки, количество неиспользованных импорта, неиспользуемые переменные, неиспользуемые параметры. Еще несколько ... Мы визуализировали все наши функции и обнаружили, что, хотя среднее значение коррелирует со счетом, вариация действительно большая (не многообещающая).

Редактировать: Сфера применения нашего проекта: мы пытаемся учиться только в одном конкретном проекте (с учетом кода скелета) в одном классе. Нам пока не нужно обобщать.

+1

+1. Вау! что вопрос/ – Yavar

+0

Однако ответ будет больше обусловлен статистикой здесь, а не информатикой. – Yavar

+0

Включена «статистика» в качестве тега. Благодаря! – stogers

ответ

1

Просто мысль - Andrew Ng преподает курс машинного обучения на Coursera (https://www.coursera.org/course/ml). Существует несколько программных заданий, которые студенты представляют в классе. Я помню, что читал (хотя, к сожалению, не могу найти статью сейчас), что проводилось некоторое исследование, которое пыталось сгруппировать участвующие в программе задания программирования из класса, с интуицией, что есть общие ошибки, которые учащиеся делают в заданиях.

Не уверен, что это поможет вам, но, возможно, рассмотрение этого вопроса как неподконтрольной проблемы обучения может иметь больше смысла (например, просто поиск сходства в разных образцах кода с интуицией, что образцы кода, которые являются похожими, должны получать аналогичную оценку).

+0

Спасибо! Определенно рассматривая этот путь. Я считаю, что следующая статья, на которую вы ссылаетесь? Http: //people.csail.mit.edu/zp/moocshop2013/paper_16.pdf Мой профессор также указал нам в этом направлении, поэтому я думаю, что это может быть наш следующий подход! – stogers

1

Особенности включают в себя: Количество строк повторяющегося кода, средней длины функции, числа 1 переменных символов, число строк, которые включают в себя закомментированными код, максимальная длина строки, количество неиспользованных импорта, неиспользуемые переменные, неиспользуемые параметры. Еще несколько ..

Вы пробовали нормализовать функции? Кажется, что вы хотите обучить нейронную сеть, которая может классифицировать любой данный код в категорию. Теперь, потому что разные коды будут говорить, различное количество строк дублированного кода и различное количество неиспользуемых переменных, но могут быть одинаково плохими. По этой причине вам необходимо нормализовать параметры, например, общие строки «полезного» кода.

Неспособность найти хорошие функции очень сложна. Когда вы стагнируете, всегда следуйте своей интуиции. Если человек может выполнить задачу, так же может и компьютер. Поскольку ваши функции выглядят довольно скромно для оценки любого кода, они должны работать (учитывая, что они используются должным образом).

Реферат: Нормализация функций должна решить проблему.

+0

Если я понимаю, что вы говорите, я не думаю, что у нас на самом деле проблема. По крайней мере, для сферы нашего проекта мы стараемся учиться только из одного проекта в одном классе. Поскольку наша специфика настолько специфична, нам не нужно нормализовать что-то вроде общего количества строк в проекте. (Извините, я не упоминал об этом в вопросе). – stogers

+0

Хорошо. В этом случае, похоже, данная проблема трудно решить линейной моделью. Как вы пробовали какую-либо нелинейную модель, скажем, SVM с нелинейным ядром или GMM? – hrs

0
  1. Вы хотите сбалансировать свои целевые классы (близкое к количеству число 1,2,3 баллов). Вы можете случайным образом выбирать классы по размеру, классы выборочного набора под размеру или использовать алгоритм, который учитывает несбалансированные данные (не уверен, что в Python).

  2. Убедитесь, что вы кросс-проверки для предотвращения чрезмерного облегающие

  3. Есть несколько способов, чтобы выяснить, какие атрибуты являются важными:

    • попробовать все комбинации атрибутов, начиная с одного из них
    • или попробовать все комбинации признаков, начиная с ними всеми
    • или пытаться приписать комбинации в произвольном порядке (или ш генетического алгоритма)

Выберите комбинацию атрибутов с наивысшей точностью с перекрестной проверкой.

Вы также можете взять произведение столбцов атрибутов, чтобы увидеть, создают ли они эффект вместе.