逻辑回归实现分类计算(二)

在上一篇逻辑回归分类计算中,模型的准确率为0.1,准确率较差且在分类1的模型预测结果显示中效果极差。在网上查找了各种逻辑回归分类的代码分析。发现错误还是在梯度下降算法计算回归系数的上,导致模型预测的精确度不高。

所以本次更改梯度下降算法来进行新的预测。

损失函数为:

J(\Theta )=\frac{1}{2}\sum_{i=1}^{m}(x_{i}\Theta-y_{i})^{2}

对θ求导得到梯度:

J(\Theta)=2X^T(Xw-y)

更新回归系数:

\Theta_{k+1}=\Theta_k-\partial X^T(X\Theta_k-y)

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

数据处理结果为:

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

softmax=\frac{e^{z_{i}}}{\sum_i e^{z_{i}}}

为了使每个样本数据都能参加到训练中,采用交叉检验。本次实验用到了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和排名,不能确定是否通过考研。