如何避免重新训练机器学习模型
How do I avoid re-training machine learning models
这里自学。
我正在构建一个预测事件的 Web 应用程序。
让我们考虑一下这个简单的例子。
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([[1.1]]))
我怎样才能保持 neigh
的状态,这样当我输入一个像 neigh.predict([[1.2]])
这样的新值时,我不需要重新训练模型。是否有任何好的做法或提示开始解决问题?
出于几个原因,您选择了一个有点令人困惑的示例。首先,当您说 neigh.predict([[1.2]])
时,您并没有添加新的训练点,您只是在进行新的预测,因此根本不需要任何更改。其次,KNN 算法并不是真正的 "trained"——KNN 是一种 instance-based 算法,这意味着 "training" 相当于将训练数据存储在合适的结构中。结果,这个问题有两个不同的答案。我会先尝试回答KNN问题。
K 个最近的邻居
对于KNN,添加新的训练数据相当于将新的数据点附加到结构中。但是,scikit-learn
似乎没有提供任何此类功能。 (这很合理——因为 KNN 显式存储 每个 训练点,你不能无限期地继续给它新的训练点。)
如果您没有使用很多训练点,一个简单的列表可能就足以满足您的需求!在这种情况下,您可以完全跳过 sklearn
,而只需将新数据点添加到您的列表中。要进行预测,请进行线性搜索,保存 k
个最近的邻居,然后根据简单的 "majority vote" 进行预测——如果在五个邻居中,三个或更多是红色,则 return红色等等。但请记住,您添加的每个训练点都会减慢算法。
如果您需要使用许多训练点,您将需要使用更有效的结构来进行最近邻搜索,例如 K-D Tree. There's a scipy
K-D 树实现应该可以工作。 query
方法允许您找到 k
个最近的邻居。它将比列表更有效,但随着您添加更多训练数据,它仍然会变慢。
在线学习
对您的问题的更笼统的回答是,您(自己并不知道)正在尝试做一些叫做 online learning 的事情。在线学习算法允许您在单个训练点到达时使用它们,并在使用后丢弃它们。为了使这一点有意义,您需要存储的不是训练点本身(如在 KNN 中),而是一组您优化的参数。
这意味着某些算法比其他算法更适合于此。 sklearn
只提供了一些算法 capable of online learning. These all have a partial_fit
method that will allow you to pass training data in batches. The SKDClassifier
,'hinge'
或 'log'
损失可能是一个很好的起点。
或者您可能只想在拟合后保存您的模型
joblib.dump(neigh, FName)
并在需要时加载它
neigh = joblib.load(FName)
neigh.predict([[1.1]])
这里自学。
我正在构建一个预测事件的 Web 应用程序。
让我们考虑一下这个简单的例子。
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([[1.1]]))
我怎样才能保持 neigh
的状态,这样当我输入一个像 neigh.predict([[1.2]])
这样的新值时,我不需要重新训练模型。是否有任何好的做法或提示开始解决问题?
出于几个原因,您选择了一个有点令人困惑的示例。首先,当您说 neigh.predict([[1.2]])
时,您并没有添加新的训练点,您只是在进行新的预测,因此根本不需要任何更改。其次,KNN 算法并不是真正的 "trained"——KNN 是一种 instance-based 算法,这意味着 "training" 相当于将训练数据存储在合适的结构中。结果,这个问题有两个不同的答案。我会先尝试回答KNN问题。
K 个最近的邻居
对于KNN,添加新的训练数据相当于将新的数据点附加到结构中。但是,scikit-learn
似乎没有提供任何此类功能。 (这很合理——因为 KNN 显式存储 每个 训练点,你不能无限期地继续给它新的训练点。)
如果您没有使用很多训练点,一个简单的列表可能就足以满足您的需求!在这种情况下,您可以完全跳过 sklearn
,而只需将新数据点添加到您的列表中。要进行预测,请进行线性搜索,保存 k
个最近的邻居,然后根据简单的 "majority vote" 进行预测——如果在五个邻居中,三个或更多是红色,则 return红色等等。但请记住,您添加的每个训练点都会减慢算法。
如果您需要使用许多训练点,您将需要使用更有效的结构来进行最近邻搜索,例如 K-D Tree. There's a scipy
K-D 树实现应该可以工作。 query
方法允许您找到 k
个最近的邻居。它将比列表更有效,但随着您添加更多训练数据,它仍然会变慢。
在线学习
对您的问题的更笼统的回答是,您(自己并不知道)正在尝试做一些叫做 online learning 的事情。在线学习算法允许您在单个训练点到达时使用它们,并在使用后丢弃它们。为了使这一点有意义,您需要存储的不是训练点本身(如在 KNN 中),而是一组您优化的参数。
这意味着某些算法比其他算法更适合于此。 sklearn
只提供了一些算法 capable of online learning. These all have a partial_fit
method that will allow you to pass training data in batches. The SKDClassifier
,'hinge'
或 'log'
损失可能是一个很好的起点。
或者您可能只想在拟合后保存您的模型
joblib.dump(neigh, FName)
并在需要时加载它
neigh = joblib.load(FName)
neigh.predict([[1.1]])