从零实现Logistic Regression时Cost Function未下降问题排查求助
我尝试从零实现逻辑回归,但损失函数(Cost Function)并未呈现持续下降趋势,反而上下波动。损失函数数组为:J_all = [0.6931471785599453,0.7013523852395079,1.0799382321159159,1.4184962890456663,1.2090967630312366,1.3564457452734269,1.2571265595127734,1.2870719263130037,1.306411844446772,1.229356753355045,1.3446092043800832,1.1813483789340946,1.372813359239384,1.1431300497707213,1.391357334040078,1.1143844952172193,1.4016419750913938, ...]
以下是我的实现代码:
def logistic_regression(X, Y, iterations, learning_rate): X = X.to_numpy() Y = Y.to_numpy() m = X.shape[0] n = X.shape[1] print(X.shape) print(Y.shape) print(m, n, sep = " ") W = np.zeros(n) B = 0 print(W.shape) J_all = [] for i in range(iterations): print(W) print(B) Z = (np.dot(X, W)) + B print(Z.shape) F = sigmoid(Z) print(F.shape) print(Z) print(F) epsilon = 1e-9 # Small epsilon value to avoid division by zero E = np.sum(Y * np.log(F + epsilon) + (1 - Y) * np.log(1 - F + epsilon)) print(E) J = (-(1/m)) * E print(J) DW = np.dot(X.T, (F - Y)) DB = (F - Y) W = W - (learning_rate/m) * (DW) B = B - (learning_rate/m) * np.sum(DB) J_all.append(J) return J_all, W, B
学习率过大:损失函数上下波动最常见的原因是学习率过高,参数更新时会在最优值附近来回震荡,无法收敛。建议逐步缩小学习率,比如从
0.1调整到0.01、0.001,找到能让损失平稳下降的数值。缺失特征归一化:逻辑回归对特征尺度敏感,如果输入特征的数值范围差异悬殊(比如一个特征是0-1,另一个是0-1000),会导致梯度更新不稳定,引发损失波动。需要对特征做标准化处理:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X.to_numpy()) # 适配原代码的转numpy操作梯度计算验证:虽然代码中梯度公式逻辑正确,但可以用小批量数据手动验证梯度是否准确,或者对比sklearn官方实现的梯度方向,排除计算错误。
迭代次数不足:若调整学习率后仍有波动,可能是迭代次数不够,模型还未收敛到平稳阶段。可以适当增大
iterations的值,观察损失函数后期是否趋于稳定。冗余打印优化:循环内的大量
print语句会拖慢训练速度,也不利于观察整体趋势,建议移除或仅在调试时保留。
内容的提问来源于stack exchange,提问作者harsh bijwe

