我有一个cntk模型,它接受与点击和其他信息相关的功能,并预测将来是否会点击某些内容。然而,使用随机森林中的相同功能可以正常工作,cntk对所有这些进行分类1.为什么会发生这种情况?是否需要进行参数调整?功能有不同的规模。 我的列车行动如下:
BrainScriptNetworkBuilder = [
inputD = $inputD$
labelD = $labelD$
#hidden1 = $hidden1$
model(features) = {
w0 = ParameterTensor{(1 : 2), initValueScale=10}; b0 = ParameterTensor{1, initValueScale=10};
h1 = w0*features + b0; #hidden layer
z = Sigmoid (h1)
}.z
features = Input(inputD)
labels = Input(labelD)
z = model(features)
#now that we have output, find error
err = SquareError (labels, z)
lr = Logistic (labels, z)
output = z
criterionNodes = (err)
evaluationNodes = (err)
outputNodes = (z)
]
SGD = [
epochSize = 4 #learn
minibatchSize = 1 #learn
maxEpochs = 1000 #learn
learningRatesPerSample = 1
numMBsToShowResult = 10000
firstMBsToShowResult = 10
]
答案 0 :(得分:1)
除了KeD所说的,随机森林不关心特征的实际值,只关心它们的相对顺序。
与树不同,神经网络对特征的实际值敏感(而不仅仅是它们的相对顺序)。
您的输入可能包含一些值非常大的功能。你应该重新编码它们。这样做有不同的方案。一种可能性是从每个特征中减去平均值并将其缩放到-1,1或除以它的标准偏差。正特征的另一种可能性是诸如f =>之类的变换。日志(1 + F)。您也可以使用批量规范化层。
答案 1 :(得分:1)
由于您的功能具有不同的比例,我建议您对功能进行规范化。你提到过,cntk将所有输入分类为1.我假设当你预测使用训练模型时会发生这种情况。但是,培训期间会发生什么?你能在图表上绘制训练+测试错误的图表(cntk现在支持TensorBoard)吗?这会给你一些关于你的模型是否过度拟合的指示。此外,作为一方,我建议增加模型的学习能力(最有可能的是,通过增加隐藏层数)来学习更好的数据分发。
答案 2 :(得分:0)
似乎学习率太高,请尝试learningRatesPerSample = 0.001