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

时间:2017-02-05 19:38:08

标签: r correlation decision-tree recommendation-engine

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

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

未来课程的数据包括60%至85%的高缺失值,因为每个学生只能从17门课程中选择5门选修课程。但是在过去的16年级课程中没有丢失的数据。

我认为推荐的一种方法是使用过去的课程和未来的选修课程之间的相关性。因此,如果一个学生在以数学为重点的课程中表现很好,那么该系统或模型将推荐一个更加数学化的选修课程。但问题是数据太少而且无法正常工作。

所有课程都与计算机科学相关。我想过按以下类别分类课程:数学专注,或专注于编程或网络或商业等。

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

我有3个字段(第一列中的课程,第二列中的标记和第3列中的成绩)。

课程是指课程名称(名义字段)

标记指的是1到100(数字字段)

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

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

所有课程都与过去的课程相关,相差几个百分点。但是我不知道在数据如此稀疏时计算相关性,输入可能会失去原始数据的本质。

对如何解决这个问题的任何想法或想法表示赞赏!

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

我将制作其他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

1 个答案:

答案 0 :(得分:2)

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

读入您的数据

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

library(caret)

训练和预测主题F20DL

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

您实际上可以将数据归入df1用于NA,但我认为您不希望使用此数据执行此操作

适合随机森林模型
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值,如果您需要帮助我也知道