机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)

Logistic回归(三)从疝气病症状预测病马的死亡率(含数据集)

  • 准备
  • 准备数据:处理数据中的缺失值
  • 训练算法:使用优化算法,找到最佳系数
  • 测试算法:用Logistic回归进行分类

转载请注明作者和出处:https://blog.csdn.net/weixin_45814668
微信公众号:qiongjian0427
知乎:https://www.zhihu.com/people/qiongjian0427
Github:https://github.com/qiongjian/Machine-learning/
运行环境:anaconda—jupyter notebook
Python版本: Python3.x

准备

流程:
(1)收集数据:给定数据文件。
(2)准备数据:用python解析文本文件,并填充缺失值。
(3)分析数据:可视化并观察数据。
(4)训练算法:使用优化算法,找到最佳系数。
(5)测试算法:为了量化回归的效果,需要观察错误率,根据错误率决定是否退到训练阶段,通过改变迭代的次数和步长等参数来得到更好的回归系数。

数据包含了368个样本和28个特征。

疝气病是描述马胃肠痛的术语。这种病不一定源自马的肠胃问题,其他问题也可能引发马疝病。

该数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。

准备数据:处理数据中的缺失值

除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%的值是缺失的。

下面给出了一些可选的做法:

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

预处理数据阶段需要做两件事:
第一,所有的缺失值必须用一个实数值来替换,因为使用的NumPy数据类型不允许包含缺失值。这里选择实数0来替换所有缺失值,恰好能适用于Logistic回归。

回归系数的更新公式:

weights = weights + alpha * error * dataMatrix[randIndex] 

如果说dataMatrix的某特征对应值是0,那么该特征的系数将不做更新,即:

weights = weights

由于sigmoid(0)=0.5,即它对结果的预测不惧任何倾向性,因此不会对误差造成任何影响。

第二,如果在测试数据集中发现了一条数据的类别标记已经缺失,那么简单的做法就是将该条数据丢弃。

原始的数据集经过处理,保存为两个文件:
horseColicTest.txt,提取码:xq88。
horseColicTraining.txt,提取码:6nmh。

训练算法:使用优化算法,找到最佳系数

from numpy import *

def sigmoid(inX):
    return 1.0/(1+exp(-inX))

def stoGradAscent1(dataMatrix, classLabels, numIter = 150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range (numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 4 / (1.0 + j + i) + 0.01
            randIndex = int(random.uniform(0, len(dataIndex)))
            h = sigmoid(sum(dataMatrix[randIndex] * weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del (list(dataIndex)[randIndex])
    return weights

测试算法:用Logistic回归进行分类

def classifyVector(inX, weights):
    prob = sigmoid(sum(inX * weights))
    #大于0.5 返回 1;否则返回0
    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]))
    #使用改进后的随机梯度下降算法得到回归系数
    trainingWeights = stoGradAscent1(array(trainingSet), trainingLabels, 500)

    #统计测试集预测错误样本数量和样本总数
    errorCount = 0;
    numTestVec = 0.0
    for line in frTest.readlines():
        #循环一次,样本数加1
        numTestVec += 1.0
        currLine = line.strip().split('\t') #分割
        lineArr = []
        for i in range(21):
            lineArr.append(float(currLine[i]))
        
        # 利用分类预测函数对该样本进行预测,并与样本标签进行比较
        if int(classifyVector(array(lineArr), trainingWeights)) != int(currLine[21]):
            errorCount += 1
    #计算错误率
    errorRate = (float(errorCount) / numTestVec)
    print('the error rate of this test is : %f' % errorRate)
    return errorRate

#调用colicTest10次,求平均值
def multiTest():
    numTests = 10
    errorSum = 0.0
    for k in range(numTests):
        errorSum += colicTest()
    print('after %d iterations the average error rete is : %f ' % (numTests,errorSum / float(numTests)))

运行结果:
机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)_第1张图片
平均值为34%。因为数据集本身有30%的数据缺失,这个是不能避免的。

可以用梯度上升算一下,错误率会下降,不过我没算哦。

END.

你可能感兴趣的:(算法,python,机器学习,逻辑回归)