使用 Duolingo 数据遗忘曲线

数据挖掘 scikit-学习
2022-02-24 16:18:06

我正在尝试使用开源的Duolingo 数据来复制遗忘曲线以获得乐趣。问题是我的发现没有任何意义,即等待的时间越长,召回值就越高。有人有任何指示吗?

# make our plot outputs appear and be stored within the notebook.
%matplotlib inline 

import matplotlib.pyplot as plt # import matplotlib for scatterplot, use the alias plt
import numpy as np # import the numpy package with alias np
import pandas as pd
from scipy.optimize import curve_fit

df = pd.read_csv('learning_traces.13m.csv') # Load Duolingo data
df = df[(df['history_seen'] == 1) & (df['session_seen'] == 1)] # Seen only once before
df = df.sort_values('delta') # sort by: time (in seconds) since the last lesson/practice that included this word/lexeme
df['delta'] = df['delta'] / 60.0 # Seconds to minutes
minInMonth = 44640

def func(x, a):
    return np.exp2(-x / a)

xdata = df['delta']
ydata = df['p_recall']

plt.scatter(xdata, ydata)

popt, pcov = curve_fit(func, xdata, ydata)
print(popt) # Show the result
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')

期待: 期待

现实 现实

滚动平均值 滚动平均值

1个回答

我认为你面临的最重要的问题是你试图拟合一个在 0 和 1 之间有点不规则翻转的函数,就好像它是一个平滑函数一样。我的数学直觉说这在数值上是不稳定的。

要创建更平滑的函数,您可以计算 y 数据的运行平均值并将其与相应的时间数据进行对比。它应该随着您在较长时间内忘记的更多而下降,并且应该易于绘制以展示您的直觉。

它有滞后/历史,因为最初的成功会被记住。您的拟合函数将是积分:

0Xex/adx=aaeX/a

其中将是遗忘率的估计量。a

其他问题可能在时域中(只需将时间单位保留为秒),或者您正在混合时间尺度/样本尺度。

您的期望图和现实图都应涵盖 x 轴上的完整时间范围,以使它们具有更好的可比性。也许您无论如何都应该丢弃具有异常大时间增量值的数据,因为它们可能会干扰计算和绘图。如果我没记错的话,您的参考资料中的程序会删除 > 9 个月和 < 45 分钟的数据。

另一个可能干扰的领域问题是数据混合了易于记忆的单词和难以记忆的单词,例如“cat”在许多语言中比“butterfly”更容易记住(尽管这也可能在很多测量中取平均值)数据)。