Ich untersuche, ob es möglich ist, die Bewertung von Studentencode basierend auf dem Codierungsstil zu automatisieren. Dies beinhaltet Dinge wie die Vermeidung von doppeltem Code, auskommentiertem Code, schlechter Benennung von Variablen und mehr.
Wir versuchen zu lernen, basierend auf den Kompositionsnoten des vergangenen Semesters (von 1-3), was gut zu betreutem Lernen führt. Die Grundidee ist, dass wir Features aus den Einreichungen eines Schülers extrahieren und einen feature_vector erstellen und ihn dann mithilfe von scikit-learn durch die logistische Regression führen. Wir haben auch verschiedene Dinge ausprobiert, einschließlich der Ausführung von PCA auf den Merkmalsvektoren, um die Dimensionalität zu reduzieren.
Unser Klassifikator erraten einfach die häufigste Klasse, was eine Punktzahl von zwei ist. Ich glaube, dass das daran liegt, dass unsere Funktionen in keiner Weise vorhersagbar sind. Gibt es einen anderen möglichen Grund für einen überwachten Lernalgorithmus, nur die dominante Klasse zu erraten? Gibt es eine Möglichkeit, dies zu verhindern?
Wie ich glaube, liegt es daran, dass die Merkmale nicht vorhersagbar sind, gibt es einen Weg, um zu bestimmen, was ein "gutes" Merkmal wäre? (Und gut, ich meine diskriminierbar oder vorhersagbar).
Hinweis: Als Nebenexperiment haben wir getestet, wie konsistent die vergangenen Noten waren, indem die Leser bereits benotete Aufgaben bewerten konnten. Nur 55% von ihnen gaben die gleiche Kompositionsnote (1-3) für die Projekte. Dies könnte bedeuten, dass dieser Datensatz einfach nicht klassifizierbar ist, weil Menschen nicht einmal konsistent klassifizieren können. Irgendwelche Tipps zu anderen Ideen? Oder ob das tatsächlich der Fall ist?
Zu den Features gehören: Anzahl der Zeilen doppelten Codes, durchschnittliche Funktionslänge, Anzahl der 1-Zeichen-Variablen, Anzahl der Zeilen, die auskommentierten Code enthalten, maximale Zeilenlänge, Anzahl nicht verwendeter Importe, nicht verwendete Variablen , unbenutzte Parameter. Ein paar mehr ... Wir haben alle unsere Funktionen visualisiert und festgestellt, dass, während der Durchschnitt mit der Punktzahl korreliert ist, die Variation wirklich groß ist (nicht vielversprechend).
Bearbeiten: Umfang unseres Projekts: Wir versuchen nur, von einem bestimmten Projekt (mit vorgegebenem Skelett-Code) in einer Klasse zu lernen. Wir müssen noch nicht verallgemeinern.
Nur ein Gedanke - Andrew Ng unterrichtet einen Machine Learning Kurs auf Coursera ( Ссылка ). Es gibt mehrere Programmieraufgaben, die Schüler während des Kurses einreichen. Ich erinnere mich daran, gelesen zu haben (obwohl ich den Artikel leider nicht finden kann), dass es einige laufende Forschungen gab, die versuchten, von Studenten eingereichte Programmieraufgaben aus der Klasse zusammenzufassen, mit der Intuition, dass es häufige Fehler gibt, die Schüler bei den Aufgaben machen / p>
Nicht sicher, ob dies Ihnen hilft, aber es könnte sinnvoller sein, dies als unüberwachtes Lernproblem zu behandeln (z. B. nur nach Ähnlichkeiten in verschiedenen Codebeispielen mit der Intuition, dass ähnliche Codebeispiele eine ähnliche Punktzahl erhalten) .
Zu den Features gehören: Anzahl der Zeilen doppelten Codes, durchschnittliche Funktionslänge, Anzahl der 1-Zeichen-Variablen, Anzahl der Zeilen, die auskommentierten Code enthalten, maximale Zeilenlänge, Anzahl nicht verwendeter Importe, nicht verwendete Variablen, nicht verwendete Parameter. Ein paar mehr ..
Haben Sie versucht, die Features zu normalisieren? Es scheint, dass Sie ein neurales Netzwerk trainieren wollen, das in der Lage ist, jeden gegebenen Code in eine Kategorie einzuteilen. Nun, weil verschiedene Codes sagen werden, unterschiedliche Anzahl von Zeilen doppelten Code und unterschiedliche Anzahl von nicht verwendeten Variablen, aber möglicherweise gleich schlecht. Aus diesem Grund müssen Sie Ihre Parameter normalisieren, indem Sie beispielsweise ganze Zeilen mit "nützlichem" Code eingeben.
Es ist sehr entmutigend, keine guten Eigenschaften zu finden. Wenn Sie stagnieren, folgen Sie immer Ihrer Intuition. Wenn ein Mensch eine Aufgabe erledigen kann, kann das auch ein Computer tun. Da Ihre Funktionen für die Bewertung eines gegebenen Codes ziemlich bescheiden aussehen, sollten sie funktionieren (vorausgesetzt, sie werden ordnungsgemäß verwendet).
Zusammenfassung: Die Normalisierung von Features sollte das Problem lösen.
Sie möchten Ihre Zielklassen ausbalancieren (eine nahezu identische Anzahl von 1,2,3 Punkten). Sie können nach dem Zufallsprinzip übergroße Klassen, Bootstrap Beispiel untergroßen Klassen oder verwenden Sie einen Algorithmus, der für unsymmetrische Daten berücksichtigt (nicht sicher, was in Python tun).
Stellen Sie sicher, dass Sie eine Kreuzvalidierung durchführen, um eine Überanpassung zu vermeiden.
Es gibt einige Möglichkeiten, herauszufinden, welche Attribute wichtig sind:
Wählen Sie die Attributkombination mit der höchsten validierten Genauigkeit aus.
Sie können auch das Produkt der Attributspalten verwenden, um zu sehen, ob sie zusammen einen Effekt verursachen.