《机器学习实战》学习笔记八:Logistics回归应用(预测病马死亡率)

学习了Logistics回归的理论,并且改进了梯度上升算法之后,这一节将算法应用到实例中去,即使用Logistics回归从疝气病症来预测病马的死亡率的问题。

1 问题背景

现有一个数据集中包含368个样本和28个特征。该数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。另外需要说明的是,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%的值是缺失的。下面将首先介绍如何处理数据集中的数据缺失问题,然后再利用Logistic回归和随机梯度上升算法来预测病马的生死。

2 准备数据

在给定的数据集中,有一些样本存在数据缺失,但是剩下的数据还有一定的利用价值,下面给出了一些可以采用的处理数据的办法:

  • 使用可用特征的均值来填补缺失值;
  • 使用特殊值来填补缺失值,如-1;
  • 忽略有缺失值的样本;
  • 使用相似样本的均值添补缺失值;
  • 使用另外的机器学习算法预测缺失值。

对数据集进行预处理需要做两件事:一,如果缺失值是特征,用一个实数值来替换,在这里我们选择0来替换缺失值;二是如果缺失值是类标签,那么将这条数据丢弃,因为很难找到合适的值来替换。

3 算法实现

def classifyVector(inX,weights): #对Sigmoid值的处理
    prob = sigmoid(sum(inX*weights))
    if prob >0.5: return 1.0
    else :return 0.0

def colicTest():
    frTrain = open('horseColicTraining.txt')
    frTest = open('horseColicTest.txt')
    trainingSet = [];trainingLabels = []
    for line in frTrain.readlines(): #导入训练集
        currLine = line.strip().split('\t')
        lineArr = []
        for i in range(21):
            lineArr.append(float(currLine[i]))
        trainingSet.append(lineArr)
        trainingLabels.append(float(currLine[21]))
    trainWeights = stocGradAscent1(array(trainingSet),trainingLabels,500) #计算回归系数
    errorCount = 0;numTestVec = 0.0
    for line in frTest.readlines():#导入测试集
        numTestVec+=1.0
        currLine = line.strip().split('\t')
        lineArr = []
        for i in range(21):
            lineArr.append(float(currLine[i]))
        if int(classifyVector(array(lineArr),trainWeights))!=int(currLine[21]):#分类并统计错误次数
            errorCount += 1
    errorRate =(float(errorCount)/numTestVec) #计算错误率
    print('the error rate of this test is :%f'%errorRate)
    return errorRate

def multiTest():#设置迭代次数,计算平均错误率
    numTests = 10;errorSum = 0.0
    for k in range(numTests):
        errorSum += colicTest()
    print("after %d iterations the avearge error rate is :%f"% (numTests,errorSum/float(numTests)))

这里有三个函数,第一个是classifyVector( ),它的作用是计算Sigmoid值,如果Sigmoid值大于0.5则返回1,否则返回0。
第二个函数是colicTest( ),在这个函数中,首先导入训练集,计算回归系数向量,然后导入测试集,分类并计算分类错误率。
第三个函数是multiTest( ),在这个函数中,给定迭代次数,然后计算迭代过程中的平均错误率。

总结

Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。
随机梯度上升算法与梯度上升算法的效果相当,但占用更少的计算资源。此外,随机梯度上升是一个在线算法,它可以在新数据到来时就完成参数更新,而不需要重新读取整个数据集来进行批处理运算。
机器学习的一个重要问题就是如何处理缺失数据。这个问题没有标准答案,取决于实际应用中的需求。

你可能感兴趣的:(python,机器学习,《机器学习实战》学记笔记)