Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何根据过去的课程成绩推荐未来的选修课_R_Correlation_Decision Tree_Recommendation Engine - Fatal编程技术网

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

R 如何根据过去的课程成绩推荐未来的选修课,r,correlation,decision-tree,recommendation-engine,R,Correlation,Decision Tree,Recommendation Engine,我有16门课程150名学生的成绩(或分数) 我想使用决策树作为我推荐课程的第一个模型,在这些课程中,学生们将在未来的选修课中表现出色。有17门选修课可供选择 未来课程的数据包含60%到85%的高缺失值,因为每个学生只能从17门可用课程中选择5门选修课程。但在过去16年的课程中并没有缺失数据 我认为推荐的一种方法是利用过去课程和未来选修课程之间的相关性。因此,如果一个学生在一门以数学为中心的课程中表现出色,系统或模型会推荐一门更注重数学的选修课。但问题是数据太少,无法进行插补 所有课程都与计算机科

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

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

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

我认为推荐的一种方法是利用过去课程和未来选修课程之间的相关性。因此,如果一个学生在一门以数学为中心的课程中表现出色,系统或模型会推荐一门更注重数学的选修课。但问题是数据太少,无法进行插补

所有课程都与计算机科学相关。我想把课程分为以下几类:数学类、编程类、网络类或商务类

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

我有3个领域(第一栏的课程,第二栏的分数和第三栏的成绩)

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

标记参考1至100(数字字段)

等级指A至F(序号字段)

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

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

对于如何解决这个问题的任何想法或想法,我们都将不胜感激

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

我将制作另外两个模型以及人工神经网络和支持向量机,最后比较哪一个模型做得最好

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

完整数据集可在以下网址找到:yr123.csv和yr1234.csv

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

读入你的数据
主题你好:好主意!!,我认为你的数据应该以一种稍微不同的方式来组织,首先我认为你的一个专栏应该是每个学生,然后是我将在其中打分的过去每门课程的一个专栏。最后,我将建立一个基于回归的模型(GBM,随机森林)来预测他们在每门选修课上的分数。有了它,你就可以建立一个预测结果的数据框架,然后得到前十名的受试者,而学生会得到他们最好的分数。我很乐意与您合作。听起来很有趣。我可以在github中与您共享数据。我拥有的数据与您告知的工作方式完全相同。我使用R语言中的扩展函数沿列扩展课程。第一列是学生id。我将用一些样本数据更新我的问题。如果你能告诉我一些步骤,如何预测他们在每门选修课上对前十名科目的分数?@DerekCorran我在问题中添加了样本数据集,并链接到完整数据集。第1、2和3年用于培训,第4年用于预测。缺少一些值。我用老鼠填了1、2和3年的表格。请让我知道你是否在工作。感谢您的支持,非常感谢。@MurkudharFichandia,刚刚看到您的回复,我将继续努力。Cheers@jenesaisquoi你可能是对的,但是他的所有数据都是9列,你认为应用还是其他更好?@jenesaisquoi我在寻找其他方法来获得每行的最大列的名称,我不知道如何做到这一点,你能给我一个替代方案,让我可以编辑我的答案吗?@DerekCorran我知道你做了什么。我们学习了过去的所有课程,并试图预测未来的课程,但我不明白为什么只保留完整的案例?因为这意味着我们无法预测学生在该特定课程中的分数,因为数据不完整。也就是说,遗漏了许多学生。另外,我运行了你展示的代码,我发现模型只预测了完整案例的分数。我认为这是不可取的。你说如果我把这些未来的课程算进去是好的?但是我如何评估呢?因为有很多缺失值,我没有办法知道插补的错误率。请指导。@derekcorran,which.max找出前五名课程是行不通的,因为我认为上面的解决方案不能预测每个学生,因为它只考虑完整的案例。因此,当列出前五名课程时。这将是有偏见的,真实的结果将无法得知,因为没有对所有学生的未来课程进行预测。我想我们需要对其进行插补,并找到一种方法来评估哪种插补技术在误差最小的情况下运行良好。我们将测试并让您知道。非常感谢:)
Subjects <- read.csv("~/Downloads/yr1234.csv")

library(caret)
df1<- Subjects[,1:18]
#Get only the complete cases
df1 <- df1[complete.cases(df1),]
Fit1 <- train(x = df1[,2:17], y = df1[,18], method = "rpart1SE", na.action = na.pass)
Subjects$pred_F20DL<- predict(Fit1, Subjects)
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)
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"