逻辑回归实现分类计算(二)
在上一篇逻辑回归分类计算中,模型的准确率为0.1,准确率较差且在分类1的模型预测结果显示中效果极差。在网上查找了各种逻辑回归分类的代码分析。发现错误还是在梯度下降算法计算回归系数的上,导致模型预测的精确度不高。
所以本次更改梯度下降算法来进行新的预测。
损失函数为:

对θ求导得到梯度:

更新回归系数:

同时也对因变量进行修改,不再对因变量处理成[-6,6]的线性数据。将因变量处理成分类变量,每一类形成一列新数据,数据列全为0和1,分别表示有无该类别。在数据中,增加一列为全为1的偏移变量。
数据处理结果为:

引申逻辑判别多分类函数softmax。

为了使每个样本数据都能参加到训练中,采用交叉检验。本次实验用到了K折交叉检验
K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。
代码就不再直接写在博客上了,有需要的可以在百度云下载:链接,提取码:1yx5
结果显示如下:

准确率能达到0.675.在梯度下降算法中,移动步长是固定的,更新移动步长为随机,查看模型准确率提升效果。
代码如下:
def RandomGradientDescent(dataMartrix, labelMat, numIter=500):
m,n = np.shape(dataMartrix)
weights = np.ones((n,1))
for j in range(numIter):
for k in range(m):
alpha = 10/(1.0+j+k)+0.01 #改进移动步长
h = sigmoid(dataMartrix[k] * weights)
error = h - labelMat[k] #计算样本误差
weights = weights - alpha * dataMartrix[k].T * error #更新回归系数
return weights.getA()
当然随机梯度下降算法的计算量也是比较大的,准确率会较固定梯度下降算法提高。由于该样本数据的分布不均(0的样本数量为273条,1的样本数量为127条)导致类别为1的判别效果较差。所以尝试增加类别为1的样本数据,观察样本判别结果。
将下面的代码放在数据读取之后和处理之前。
#增加样本数量
a = dataSet[dataSet.admit == 1]
dataSet = dataSet.append(a)
dataSet.index = range(len(dataSet))
运行结果如下:

增加一份全为1的样本数据后,准确率、召回率、F1调和平均值明显的提高。解决判别类型为1的效果较差问题。所以当增加样本数据效果不好时,考虑增加样本数据进行建模。
但该模型指标也不是特别高,所以模型效果并不是特别好,如上一篇文章结论所说,认为仅仅凭借成绩、GPA和排名,不能确定是否通过考研。