Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Python 如何避免重新训练机器学习模型_Python_Machine Learning_Scikit Learn - Fatal编程技术网

Python 如何避免重新训练机器学习模型

Python 如何避免重新训练机器学习模型,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我是自学成才 我正在构建一个预测事件的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的状态,以便在输入新值(如

我是自学成才

我正在构建一个预测事件的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算法不是真正的“训练”——KNN是一种算法,这意味着“训练”相当于将训练数据存储在一个合适的结构中。因此,这个问题有两个不同的答案。我先试着回答KNN的问题

K近邻

对于KNN,添加新的训练数据相当于向结构中添加新的数据点。但是,
scikit-learn
似乎不提供任何此类功能。(这很合理——因为KNN显式地存储每个训练点,所以不能无限期地为其提供新的训练点。)

如果您没有使用很多培训点,那么一个简单的列表可能足以满足您的需要!在这种情况下,您可以完全跳过
sklearn
,只需将新数据点附加到列表中即可。要进行预测,请进行线性搜索,保存
k
最近邻,然后根据简单的“多数票”进行预测——如果五个邻居中有三个或更多是红色的,则返回红色,依此类推。但请记住,您添加的每个训练点都会减慢算法的速度

如果需要使用多个训练点,则需要使用更有效的结构进行最近邻搜索,例如。有一个K-D树实现应该可以工作。
query
方法允许您查找
k
最近邻。它将比列表更有效,但随着您添加更多的培训数据,它仍然会变得更慢

在线学习

对于你的问题,一个更一般的答案是你(自己都不知道)正在尝试做一件叫做“爱”的事情。在线学习算法允许您在单个训练点到达时使用它们,并在使用后丢弃它们。为了让这变得有意义,您需要存储的不是训练点本身(如KNN),而是一组参数,您可以对其进行优化


这意味着一些算法比其他算法更适合这种情况
sklearn
只提供了一些算法。这些都有一个
partial_fit
方法,允许您成批传递培训数据。带有
'hunge'
'log'
的损失可能是一个很好的起点

或者您只是想在安装后保存模型

joblib.dump(neigh, FName)
并在需要时加载

neigh = joblib.load(FName)
neigh.predict([[1.1]])

这似乎是基于与我不同的问题解释@用户3378649,你能澄清哪种解释是正确的吗?如果您只是想在应用程序结束前保存模型,并在应用程序再次启动时加载模型,那么这个答案很好。(但如果您想添加更多培训数据,我的仍然适用。)@enderle这应该是正确的答案!我有一个GO trainig数据集,我不想每次当用户点击“预测”底部时都重新训练模型。