Python 3.x 培训程序

Python 3.x 培训程序,python-3.x,scikit-learn,theano,Python 3.x,Scikit Learn,Theano,我注意到,sklearn.linear\u model.sgdclassizer为线性模型实现了梯度下降,因此可以说该类将拟合过程(SGD)和模型(线性模型)组合在一个类中 然而,SGD并不是线性模型固有的,线性_模型可以使用许多其他具有特定pro的优化(内存使用、收敛速度、局部最优避免*,…)进行训练。可以说,这种优化技术实现了如何迭代训练数据,是在线还是离线,应用更新的特征维度以及何时停止(可能基于验证集的错误函数) 特别是,我使用theano实现了一个模型,并将其包装在fit/predic

我注意到,
sklearn.linear\u model.sgdclassizer
为线性模型实现了梯度下降,因此可以说该类将拟合过程(SGD)和模型(线性模型)组合在一个类中

然而,SGD并不是线性模型固有的,线性_模型可以使用许多其他具有特定pro的优化(内存使用、收敛速度、局部最优避免*,…)进行训练。可以说,这种优化技术实现了如何迭代训练数据,是在线还是离线,应用更新的特征维度以及何时停止(可能基于验证集的错误函数)

特别是,我使用theano实现了一个模型,并将其包装在fit/predict界面中。Theano很酷,因为它允许定义一个对一个样本或一组样本应用梯度下降的可调用函数,以及一个对验证集返回错误的可调用函数。但这种冷静并不是theano固有的,更多的模型可以简单地定义一个更新和错误评估函数,然后由不同的迭代和停止策略使用该函数进行拟合

theano示例通常使用minibatch,minibatch代码被复制粘贴或重新实现了很多,只需稍作调整即可轻松解决。所以我希望sklearn实现一些东西,您可以使用一些参数和可调用的更新/错误来初始化它,以适应“任何模型”。或者可能有一些很好的实践是如何自己做到这一点的(特别是w.r.t.装配工的界面)

在sklearn中是否有类似的东西,即不定义模型的装配工

*在线性模型和l2代价函数的特殊情况下,局部最优解当然不存在,但仍然存在

编辑

很公平,这需要一个建议。我对这两个类进行了编码,它们不是100%干净的,但它们给出了我的意思:

导入numpy
类随机更新():
定义初始(自我、模型、更新、n个时代、n个数据点、错误=无、测试分数=无):
self.update=更新
self.n_epochs=n_epochs
self.n_数据_点=n_数据_点
self.error=错误
self.model=model
如果self.error为None且test_分数为None:
raise VALUERROR('如果应使用测试组(值:%s),则必须指定错误参数。'%test_分数)
self.do_test=测试分数不是无
self.n\u train\u samples=int(n\u数据点-测试分数),如果self.do\u测试其他n个数据点
如果自检:
self.test\u range=numpy.arange(self.n\u train\u样本,n\u数据点)
self.n_测试样本=int(n_数据点*测试分数)
self.train\u range=numpy.arange(0,self.n\u train\u样本)
def-fit(自我):
如果self.do_测试:self.test_错误=[]
self.train_错误=[]
self.mean_cost_value=[]
对于范围内的历元(self.n_历元):
顺序=numpy.random.permutation(self.n\u train\u样本)
平均成本值=0
对于范围内的i(self.n\u train\u样本):
平均成本值+=自我更新([订单[i]])
self.mean\u cost\u values.append(mean\u cost\u value/self.n\u data\u points)
如果self.error不是None:
self.train\u errors.append(self.error(self.train\u范围))
如果自检:
self.test\u errors.append(self.error(self.test\u范围))
回归自回归模型
从数学导入单元
类MinibatchStochasticUpdate(随机更新):
定义初始(自我、模型、更新、n个时代、n个数据点、错误、批量大小、耐心=5000、耐心增加=2、,
改进阈值=0.995,验证频率=无,验证分数=0.1,测试分数=无):
super()。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.update=更新
self.n_epochs=n_epochs
self.n_数据_点=n_数据_点
self.model=model
self.batch\u size=批次大小
忍耐
self.patience\u increase=耐心增加
自我改进\阈值=改进\阈值
self.n_validation_samples=int(n_数据点*验证点)
self.validation\u range=numpy.arange(self.n\u train\u样本,self.n\u train\u样本+self.n\u validation\u样本)
self.n_train_batches=int(ceil(n_数据点/批次大小))
self.n\u train\u batches=int(ceil(self.n\u train\u样本/self.batch\u大小))
self.train\u批次\u范围=[
numpy.arange(小批量索引*自批量大小,最小值((小批量索引+1)*自批量大小,自批量样本))
适用于范围内的小批量索引(self.n\u train\u批次)
]
self.validation\u frequency=min(self.n\u train\u batches,patience/2),如果验证\u frequency不是其他验证\u frequency
def-fit(自我):
self.best\u validation\u error=numpy.inf
最佳参数=无
迭代=0
对于范围内的历元(self.n_历元):
对于范围内的小批量索引(self.n\u train\u批次):
self.update(self.train\u batch\u范围[小批量索引])
如果(iter+1)%self.validation\u频率==0:
当前验证错误=self.error(self.validation错误)
如果当前验证错误若迭代—若你们想选择最好的模型—你们可以尝试迭代所有可能的estim