use*_*649 2 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]]))
Run Code Online (Sandbox Code Playgroud)
neigh当我输入新值时,如何保持状态,就像neigh.predict([[1.2]])我不需要重新训练模型一样.有没有好的做法,或暗示开始解决问题?
出于几个原因,你选择了一个有点混乱的例子.首先,当你说neigh.predict([[1.2]]),你没有添加新的训练点时,你只是在做一个新的预测,所以根本不需要任何改变.其次,KNN算法并未真正"训练" - KNN是基于实例的算法,这意味着"训练"相当于将训练数据存储在合适的结构中.因此,这个问题有两个不同的答案.我会先尝试回答KNN问题.
K最近的邻居
对于KNN,添加新的训练数据相当于将新数据点附加到结构.但是,似乎scikit-learn没有提供任何此类功能.(这是合理的 - 因为KNN明确存储了每个训练点,你不能无限期地继续给它新的训练点.)
如果您没有使用许多培训点,那么简单的列表可能足以满足您的需求!在这种情况下,您可以sklearn完全跳过,只需将新数据点附加到列表中即可.要进行预测,请进行线性搜索,保存k最近邻居,然后根据简单的"多数投票"进行预测 - 如果五个邻居中有三个或更多是红色,则返回红色,依此类推.但请记住,您添加的每个训练点都会降低算法速度.
如果您需要使用许多训练点,您将需要使用更有效的结构进行最近邻搜索,例如KD树.有一个scipy应该工作的KD Tree实现.该query方法允许您查找k最近的邻居.它比列表更有效,但随着您添加更多训练数据,它仍然会变慢.
在线学习
对你的问题更一般的回答是,你(自己不知道)尝试做一些叫做在线学习的事情.在线学习算法允许您在到达时使用各个训练点,并在使用后将其丢弃.为此,您需要不是存储训练点本身(如KNN中),而是存储您优化的一组参数.
这意味着某些算法比其他算法更适合这种算法.sklearn提供了一些能够在线学习的算法.这些都有一个partial_fit方法,允许您批量传递训练数据.在SKDClassifier用'hinge'或'log'损失可能是一个很好的起点.
或者您可能只是想在安装后保存您的模型
joblib.dump(neigh, FName)
Run Code Online (Sandbox Code Playgroud)
并在需要时加载它
neigh = joblib.load(FName)
neigh.predict([[1.1]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1258 次 |
| 最近记录: |