【问题标题】:How to recommend future elective courses based on past course grades如何根据过去的课程成绩推荐未来的选修课
【发布时间】:2017-02-05 19:38:08
【问题描述】:

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

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

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

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

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

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

我有 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/extrasyr123.csv 和 yr1234.csv

【问题讨论】:

  • 你好:好主意!!,我认为你的数据应该以稍微不同的方式构造,首先我认为你的一个列应该是每个学生,然后是每个过去的课程我会打分。最后,我将建立一个基于回归的模型(GBM,随机森林)来预测他们在每门选修课中的得分。有了它,您可以构建一个预测结果的数据框,然后获得前 x 个科目,即学生将获得最好的成绩。我很乐意与此合作。听起来很有趣
  • 是的。我可以在 github 上与你分享数据。我以你告诉的确切方式拥有数据。我使用 R 语言中的传播函数沿列传播课程。第一列是 student_id。我将使用一些示例数据更新我的问题。请问您能否展示一些步骤来预测他们在前 x 门科目的每门选修课中将获得的分数?
  • @DerekCorcoran 我在问题中添加了示例数据集并链接到完整数据集。第 1 年、第 2 年和第 3 年用于训练,第 4 年用于预测。有一些缺失值。我用 MICE 填写了 1,2 和 3 年的数据。如果你正在研究它,请告诉我。感谢您的支持。
  • @MurkudharFichandia,刚刚看到你的回复,我会努力的。干杯

标签: r correlation decision-tree recommendation-engine


【解决方案1】:

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

读入你的数据

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 值,如果你也需要帮助,请告诉我

【讨论】:

  • @jenesaisquoi 您可能是对的,但他的所有数据将是 9 列,您认为 apply 还是其他方式会更好?
  • @jenesaisquoi 我正在寻找其他方法来获取每行的最大列的名称,但我不知道该怎么做,你能给我一个替代方案,以便我可以编辑我的答案吗?
  • @DerekCorcoran 我明白你做了什么。我们学习过去的所有课程并尝试预测未来的课程,但我不明白为什么只保留完整的案例?因为这意味着我们不会为该特定课程数据不完整的学生预测分数。也就是遗漏了很多学生。此外,我运行了您显示的代码,并且模型仅预测了完整案例的分数。我认为这是不希望的。你说如果我估算那些未来的课程很好吗?但是我该如何评估,因为有很多缺失值,我没有办法知道插补的错误率。请指导。
  • @DerekCorcoran 另外,which.max 找出前 5 门课程是行不通的,因为我认为上面的解决方案并不能预测每个学生,因为它只考虑完整的案例。因此,在列出前 5 名课程时。这将是有偏见的,并且不会知道真实结果,因为没有对所有学生的所有未来课程进行预测。我想我们需要对其进行估算并找到一种方法来评估哪种估算技术效果好且误差最小。
  • 将测试并通知您。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2016-03-24
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多