最近,我一直在阅读有关机器学习的知识,逻辑回归是其中之一。阅读后,为了测试我的理解,我尝试了用Java实现LR。当我在逻辑或和逻辑与上对其进行测试时,它似乎可以工作。但是,当我在商标上尝试使用它来决定接受或拒绝的求职者时,它却无法学会对其进行分类。您能发现这段代码有什么问题吗?
public class LogisticRegression {
int featureLength;
ArrayList<Double> inputs = new ArrayList();
int targetOutput;
ArrayList<Double> weights = new ArrayList();
double bias;
static double learningRate = 0.1;
LogisticRegression(int fs) {
featureLength = fs;
for (int i = 0; i < featureLength; i++) {
weights.add(Math.random());
}
bias = Math.random();
}
double sigmoidFunction(double x) {
return 1.0 / (1.0 + Math.exp(-x));
}
double weightedSum() {
if (inputs.size() != featureLength) {
System.out.println("Error: input does not match feature length");
System.exit(0);
}
double sum = 0;
for (int i = 0; i < featureLength; i++) {
double inp = inputs.get(i);
double wh = weights.get(i);
sum += inp * wh;
}
sum += bias;
double out = sigmoidFunction(sum);
return out;
}
void learn() {
double inp, wh, out, gradient;
out = weightedSum();
for (int i = 0; i < featureLength; i++) {
inp = inputs.get(i);
wh = weights.get(i);
gradient = (out - (double) targetOutput) * inp;
wh -= learningRate * gradient;
weights.set(i, wh);
}
//update bias
gradient = (out - targetOutput) * 1;
bias -= learningRate * gradient;
}
我在MDN on JSON.parse上进行了测试
答案 0 :(得分:1)
您的Logistic回归问题称为欠拟合,这对于简单的机器学习模型来说是一个非常常见的问题。我的意思是该模型无法正确调整数据。发生这种情况的原因有很多:
模型很简单(或者数据集太复杂了)
您的权重未正确估算
第一个问题可以通过提高模型的容量/复杂度来解决(使用LR则不可能),或者选择更复杂的模型。 LR的一个问题是它只能正确处理线性可分离的数据,否则将无法给出正确的预测(例如XOR不能线性分离)。
要解决第二个问题,您可能想使用梯度下降以外的其他方法来计算权重值。虽然,如果要使用梯度下降,则必须调整一些超级参数。梯度下降是通过尝试找到损失/成本函数的整体最小值来进行的,这意味着它试图通过朝斜率最大的方向进行小步长来找到正确的答案。为了更好地估计权重,您可以降低学习率(这将需要更多的迭代)。您还可以更改权重的初始化类型,更好的起点意味着更快的收敛。最后,您可以更改损失函数。
希望有帮助!