CNTK分类模型Classifies all 1
CNTK classification model Classifies all 1
我有一个 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
]
学习率好像偏高了,试试learningRatesPerSample = 0.001
除了KeD所说的,随机森林不关心特征的实际值,只关心它们的相对顺序。
与树不同,神经网络对特征的实际值很敏感(而不仅仅是它们的相对顺序)。
您的输入可能包含一些具有非常大值的特征。您可能应该重新编码它们。有不同的方案可以做到这一点。一种可能性是从每个特征中减去平均值并将其缩放为 -1,1 或除以它的标准差。正特征的另一种可能性是转换,例如 f => log(1+f)。您还可以使用批量归一化层。
由于您的特征具有不同的尺度,我建议您将特征归一化。你提到,cntk 将所有输入分类为 1。我假设它发生在你使用训练有素的模型进行预测时。但是,训练期间会发生什么?能否在图上画出训练+测试误差图(cntk现在支持TensorBoard了)?这会给您一些指示,表明您的模型是否过度拟合。此外,另一方面,我建议增加模型的学习能力(很可能是通过增加隐藏层的数量)来学习更好的数据分布。
我有一个 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
]
学习率好像偏高了,试试learningRatesPerSample = 0.001
除了KeD所说的,随机森林不关心特征的实际值,只关心它们的相对顺序。
与树不同,神经网络对特征的实际值很敏感(而不仅仅是它们的相对顺序)。
您的输入可能包含一些具有非常大值的特征。您可能应该重新编码它们。有不同的方案可以做到这一点。一种可能性是从每个特征中减去平均值并将其缩放为 -1,1 或除以它的标准差。正特征的另一种可能性是转换,例如 f => log(1+f)。您还可以使用批量归一化层。
由于您的特征具有不同的尺度,我建议您将特征归一化。你提到,cntk 将所有输入分类为 1。我假设它发生在你使用训练有素的模型进行预测时。但是,训练期间会发生什么?能否在图上画出训练+测试误差图(cntk现在支持TensorBoard了)?这会给您一些指示,表明您的模型是否过度拟合。此外,另一方面,我建议增加模型的学习能力(很可能是通过增加隐藏层的数量)来学习更好的数据分布。