最近我开始自学机器学习,我遇到了一个数据集,这让我有点困惑。
数据集:数据集的主题是大学生(学生ID ==的“关键”特征),每个观察都是他们学期的总结(平均成绩、考试成绩和完成情况等)。再加上他们的一般课程相关数据(入学和奖学金状况、入学日期、课程代码等)。这些数据是匈牙利文的,但就这一问题而言,理解特征名称和值的含义并不重要。以下是一个观察的例子:

我的目标是:我想建立一个预测学生流失的模型。
问题:根据大学学期数,数据集包含每个学生一个或多个观测值,而且学生之间的观察期不一致,因为它是基于单个的注册日期。

在上面的例子中,你可以看到,1号学生有7个观察(=7个学期结束),并于2009.09.10开始他的课程(Képzés慢跑==的报名日期),而第二学生有3个观察,并于2008.09.12开始他的计划。
我想知道,我应该只使用一个观察(例如:最后完成的大学学期)每名学生,或它是否有意义使用所有的观察每名学生?
谢谢您的提前反馈!
(此外,我在论坛上是新手,所以如果你对我的问题的内容和形式有任何建设性的批评,请与我分享。)
发布于 2020-07-13 20:18:44
如果您了解SQL,那么我的方法可能会工作。我将把它分解成子查询,以使它更容易理解。我不知道你的专栏,所以这可能不是很好的翻译。
重点是让一个查询在特定的时间点识别所有活跃的学生。您选择的时间点是任意的,但是它必须有足够的时间转发到数据的末尾,这样您就可以建立一个前瞻性窗口来满足搅动与否。我把这叫做snapshot_date。在这个结果集中,没有学生在shapshot_date之前翻腾。
然后,将它加入到一个子查询中,该子查询使用该shapshot_date,并期待查询条件。这只返回那些在你决定的窗口内搅动的学生。如果他们在你窗外的未来搅动,对待他们就像他们没有搅动过一样。
返回活动学生列表的第一个查询可能仍然会返回每个学生的多行。您可以通过决定如何将这些行聚合为每个客户的一行来处理这一问题。最后,您可能会以这种方式为您的模型创建许多好的变量。我举了几个例子。
然后,您的SQL将类似于以下内容:
SELECT active_students.*,
case when student_churned is not null then 1 else 0 end as target_student_churn
FROM
(
SELECT Key,
DateDiff(snapshot_date, date_of_enrollment, "Days") as time_since_enrollment,
min(date_of_enrollment) as date_of_enrollment,
max(felev) as max_felev,
COUNT(DISTINCT course) as distinct_courses_taken,
...
FROM table
WHERE date_of_enrollment < snapshot_date
AND {student has not churned as of snapshot date}
GROUP BY Key
) as active_students
LEFT OUTER JOIN
(
SELECT Key
FROM table
WHERE {student churned within hard coded time period AFTER snapshot date}
GROUP BY Key
) as student_churned
ON active_students.Key = student_churned.Key;那么,如果您随机选择快照日期,您可能会想知道这如何解释时间的季节性。那么,只需更改snapshot_date并重复,同时继续将结果叠加在另一个结果上。将快照日期作为列将有助于您从每个结果集中提取“季节”。
现在,学生们可能会在最后的数据集中再次被重复。因此,在构建模型时,您希望确保学生的行落入相同的验证或保留数据集中。所以使用GroupKFold或类似的东西。我希望这能帮到你。
https://datascience.stackexchange.com/questions/77590
复制相似问题