《机器学习实战笔记》-逻辑回归-预测病马死亡率

注意:

        1.真实案例有缺失数据,文档中数据已对数据预处理:

                ①对数据属性进行预处理:

                        对缺失数据进行置0

                  ②对数据标签预处理:

                        对缺失标记的数据删除

        2.此案例未涉及使用图像展示回归线

        3.难点:

                ①对随机梯度下降的理解(随机梯度下降法会使训练次数增加,但梯度下降快)

                ②current[-1]代表数组中倒数第一个数字

        4.完整代码

import numpy as np
import random
"sigmoid函数"
def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))

"随机梯度下降法"
def stocGrandAscent1(dataMatrix,classLable,numItrt=150):

    '加载数据属性-标签-随机下降法循环次数'
    m,n=np.shape(dataMatrix)
    # 设置初始权重
    w=np.ones(n)
    for i in range(numItrt):
        # 随机获得数组下标
        dataIndex=list(range(m)) 'dataIndex = [0,1,2,3,4...,m]'
        for k in range(m):
            '变更学习率-随机下标-更新w-删除选到的下标'
            alpha=4/(1.0+i+k)+0.01
            # randIndex=int(range(m))
            randIndex = int(random.uniform(0, len(dataIndex)))
            w=w+alpha*(classLable[dataIndex[randIndex]]-sigmoid((dataMatrix[dataIndex[randIndex]]*w)))*dataMatrix[dataIndex[randIndex]]
            del (dataIndex[randIndex])
    return w

"预测分类"
def classifyVector(inX,w):
    p=sigmoid(sum(inX*w))
    if p>0.5:
        return 1.0
    else:
        return 0.0
"测试:训练集样本数据分类"
def horseTest():
    # 加载数据-训练数据(随机梯度下降法)-测试数据(计算预测分类函数)-输出错误率
    frTrain=open("horseColicTraining.txt")
    frTests=open("horseColicTest.txt")
    trainSet=[]
    trainLables=[]
    for line in frTrain.readlines():
        current=line.strip().split('\t')
        lineArr=[]
        # 每行的第1-len()-1个是属性将其加入当前行数组后添加置trainSet,最后一个是标签(current[-1]位置)
        for i in range(len(current)-1):
            lineArr.append(float(current[i]))
        trainSet.append(lineArr)
        trainLables.append(float(current[-1]))
    trainW=stocGrandAscent1(np.array(trainSet),trainLables,5000)
    errNum=0
    countNum=0.0
    for line in frTests.readlines():
        countNum+=1.0
        current = line.strip().split('\t')
        lineArr = []
        # 每行的第1-len()-1个是属性将其加入当前行数组后添加置trainSet,最后一个是标签(current[-1]位置)
        for i in range(len(current) - 1):
            lineArr.append(float(current[i]))
        if int(classifyVector(np.array(lineArr), trainW)) != int(current[-1]):
            errNum += 1
    errRate=(float(errNum)/countNum)*100
    print("错误率为:%.2f%%"%errRate)
if __name__ == '__main__':
    horseTest()



版权声明:本文为weixin_41831593原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。