如何根据过去的课程成绩推荐未来的选修课

How to recommend future elective courses based on past course grades

我有 16 门课程的 150 名学生的成绩(或分数)。

我想使用决策树作为我的第一个模型来推荐学生在未来的选修课中表现良好的课程。有17门选修课可供选择。

未来课程的数据包含从 60% 到 85% 的高缺失值,因为每个学生只能 select 17 门可用课程中的 5 门选修课。但在过去一年的 16 门课程中没有缺失数据。

我认为推荐的一种方法是使用过去的课程和未来的选修课之间的相关性。因此,如果学生在以数学为重点的课程中表现出色,系统或模型会推荐一门更偏向于数学的选修课。但问题是数据太稀疏,无法进行估算。

所有课程都与计算机科学相关。我考虑将课程按类别分组,例如:以数学为重点、以编程为重点、网络或商业等。

但是 我不明白如何使用决策树来解决这个问题。如何创建目标或 class 字段。我猜这个过程需要 2 个步骤,一个是找到课程之间的相关性,另一个是保存它们。第二次用它来与过去的课程进行比较

我有 3 个字段(第一列是课程,第二列是分数,第三列是成绩)。

课程指的是课程名称(标称字段)

分数指的是1到100(数值字段)

成绩指的是A到F(序数字段)

分数和成绩高度相关,因为成绩主要根据分数计算。例如:分数(70 以上)导致 A 级,60-69 之间的分数导致 B 级。这是一个加分点,因为我可以根据分数和成绩创建一个决策树,看看哪个推荐得好。

所有课程都与过去的课程有一定的相似度。但是我不知道当数据太稀疏时计算相关性以至于插补可能会失去原始数据的本质。

任何关于如何解决这个问题的想法或想法都将受到赞赏!

我了解决策树及其变体。但是我面临的问题是如何逐步解决问题。我认为没有目标字段来应用决策树。

我将制作其他 2 个模型以及人工神经网络和支持向量机,最后比较哪个模型做得最好。

In below dataset, 
F27.. means Yr1 course, 
F28.. means Yr2 
F29.. means Yr3 and 
F20.. means Yr4

数据集格式 - 1

Student_id,F27SA,F27PX,F27IS,F27SB,F27CS,F28IN,F28DA,F28PL,F28SD,F28DM,F29AI,F29FA,F29SO,F29PD,F29OC,F29FB,F20DL,F20BC,F20GP,F20MA,F20MC,F20RO,F20RS,F20DP,F20DV
    55,48,39,56,52,56,52,72,69,83,63,37,79,67,67,66,88,NA,NA,58,NA,73,NA,87,NA,NA
    68,87,74,70,88,57,47,58,64,49,67,59,62,65,65,83,62,NA,NA,62,85,NA,NA,NA,47,NA
    70,82,77,79,97,56,41,62,76,41,61,53,75,66,66,79,76,NA,NA,62,84,NA,NA,NA,40,NA
    99,88,79,75,81,45,68,47,57,68,52,66,61,64,64,58,51,60,75,84,NA,NA,71,80,NA,NA
    100,80,91,69,70,35,68,58,50,55,48,49,66,45,45,59,78,62,63,NA,NA,NA,NA,80,NA,NA
    101,95,76,70,98,74,56,70,73,55,85,62,61,73,73,73,77,NA,NA,NA,NA,NA,NA,NA,68,NA
    103,83,77,58,60,67,50,54,60,44,45,43,37,53,53,53,50,NA,41,37,62,22,48,NA,NA,NA
    105,87,68,78,96,67,57,85,77,76,88,75,67,50,50,74,79,62,59,82,91,56,NA,NA,NA,NA
    106,82,82,71,77,52,65,66,45,45,56,73,75,75,75,41,66,66,69,59,NA,NA,69,71,NA,NA
    107,84,75,77,93,64,61,77,53,47,63,60,54,64,64,82,70,59,75,NA,NA,59,NA,NA,60,NA
    108,80,61,52,57,67,60,40,59,58,75,17,19,40,40,21,6,NA,NA,NA,NA,NA,NA,NA,NA,NA

数据集格式 - 2

Student_id,Course_code,Grades
55,F27SA,48
68,F27SA,87
70,F27SA,82
99,F27SA,88
100,F27SA,80
101,F27SA,95
103,F27SA,83
105,F27SA,87
106,F27SA,82
107,F27SA,84
108,F27SA,80
109,F27SA,85

完整数据集可在以下位置找到:https://github.com/MURL1DHAR/Dissertation_Project/tree/master/extras yr123.csv 和 yr1234.csv

这只是如何开始,使用循环和/或应用你应该能够得到你的结果,如果你需要更多帮助,请告诉我:

读入你的数据

Subjects <- read.csv("~/Downloads/yr1234.csv")

library(caret)

训练和预测主题 F20DL

df1<- Subjects[,1:18]
#Get only the complete cases
df1 <- df1[complete.cases(df1),]

您实际上可以将数据归因于 NA 的 df1,但我认为您不想对这些数据执行此操作

拟合随机森林模型
Fit1 <- train(x = df1[,2:17], y = df1[,18], method = "rpart1SE", na.action = na.pass)

现在你向新生预测你想预测他们在 F20DL 中的分数

Subjects$pred_F20DL<- predict(Fit1, Subjects)

拟合并预测 "F20BC"

df2<- Subjects[,c(1:17,19)]
df2 <- df2[complete.cases(df2),]

Fit2 <- train(x = df2[,2:17], y = df2[,18], method = "rpart1SE", na.action = na.pass)

Subjects$pred_F20BC<- predict(Fit2, Subjects)

按预测值对受试者排序

此循环将按预测值对每个向量进行排序。显然,这仅适用于在上面的拟合模型中建模的 2 个主题,但是如果您有更多预测值,则必须添加列并且不仅在循环中包含第 27 列和第 28 列

Recomendations <- list()

for(i in 1:nrow(Subjects)){
  Recomendations[[i]] <- colnames(sort(Subjects[i,c(27:28)], decreasing = TRUE))
}

Recomendations <- do.call("rbind", Recomendations)

Recomendations <- cbind(Subjects$Student_id, Recomendations)

colnames(Recomendations) <- c("Student_id", "Recomendation1", "Recomendation2")

head(Recomendations)

     Student_id Recomendation1 Recomendation2
[1,] "55"       "pred_F20BC"   "pred_F20DL"  
[2,] "68"       "pred_F20DL"   "pred_F20BC"  
[3,] "70"       "pred_F20DL"   "pred_F20BC"  
[4,] "99"       "pred_F20DL"   "pred_F20BC"  
[5,] "100"      "pred_F20DL"   "pred_F20BC"  
[6,] "101"      "pred_F20DL"   "pred_F20BC"

我还可以获得一个循环来自动执行所有模型,然后程序应用以获得最高的 X 值,如果您也需要帮助,请告诉我