请问做logistic死亡预测模型,数据量共8万,按7:3分为训练集和验证集,卡方检验显示p值小于0.05,基线资料有差异怎么办?
#改进的随机梯度上升算法
def stocGradAscent1(dataMatIn, classLabels, numIter=150):
#迭代次数若未给定,则默认迭代150次
dataMatrix = array(dataMatIn)
m,n = shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
# alpha每次迭代时需要调整
alpha = 4/(1.0+j+i)+0.0001
#随机选取样本更新回归系数
# uniform() 方法将随机生成下一个实数,它在[0,len(dataIndex)]范围内
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h #计算误差
weights = weights + alpha * error * dataMatrix[randIndex]
# 删除已使用的样本
del(dataIndex[randIndex])
return weights
上面的改进版随机梯度上升算法,我们修改了两处代码。
第一处改进为 alpha 的值。alpha 在每次迭代的时候都会调整,这回缓解上面波动图的数据波动或者高频波动。另外,虽然 alpha 会随着迭代次数不断减少,但永远不会减小到 0,因为我们在计算公式中添加了一个常数项。
这里利用随机梯度下降解释这样优化alpha的原因:
在最开始时梯度较大,步长alpha可以比较大,但梯度是呈现逐渐减小趋势的,这时离最优值也越来越近,步长alpha也要随之减小。如果下降速率很大,在接近最优点时,梯度乘以了一个数值比较大的alpha,就会出现下图这类情况。
例如从点1直接跳到了点2,开始震荡,上述迭代次数与回归系数关系图中的较大震荡产生的原因,而上述对步长alpha的优化即可避免这类情况,虽然举例用的是梯度下降,但梯度上升和梯度下降的原理是一致的。
第二处修改为 randIndex 更新,这里通过随机选取样本拉来更新回归系数。这种方法将减少周期性的波动。这种方法每次随机从列表中选出一个值,然后从列表中删掉该值(再进行下一次迭代)。
拟合结果:
拟合出和第一种差不多的效果,但使用的计算量更少,主要是因为随机机制避免周期性波动;stocGradAscent1()收敛更快。这次仅对数据集做了m(m=100)次遍历,而之前的方法是500次。