《机器学习实战》之逻辑回归--基于Python3--02

Posted 华少的知识宝典

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《机器学习实战》之逻辑回归--基于Python3--02相关的知识,希望对你有一定的参考价值。

本文介绍了使用逻辑回归实现从疝气病症预测病马的死亡率。

逻  辑  回  归
1、
1、最终的分类函数    


使用Logistic回归方法进行分类并不需要做很多工作,所需做的只是把测试集上每个特征向量乘以最优化方法得来的回归系数,再将该乘积结果求和,最后输人到Sigmoid函数中即可。如果对应的Sigmoid值大于0.5就预测类别标签为1,否则为0。

《机器学习实战》之逻辑回归--基于Python3--02

"""函数说明: 最终的分类函数,根据前面更新计算好的回归系数和特征向量来计算sigmoid的值, 大于0.5返回1,否则返回0
Parameters: inX - 特征向量 weights - 根据梯度下降或者随机梯度下降, 计算的回归系数Returns: 返回0或者1"""def classifyVector(inX, weights): prob = sigmoid(sum(inX*weights)) if prob > 0.5: return 1.0 else: return 0.0

    


2、从疝气病症预测病马的死亡率   
《机器学习实战》之逻辑回归--基于Python3--02


这里比较简单,因为所有的算法都已经实现了,这里直接读取数据,然后调用就可以了。
"""函数说明: 打开测试数据集合训练数据集, 并对数据进行格式化处理
Parameters:Returns: errorRate - 分类错误率"""def colicTest(): frTrain = open('horseColicTraining.txt') frTest = open('horseColicTest.txt') trainingSet = []; trainingLabels = [] for line in frTrain.readlines(): currLine = line.strip().split(' ') lineArr = [] for i in range(21): # 获得 每行 的 前20个。前20个为 特征 lineArr.append(float(currLine[i])) trainingSet.append(lineArr) # 将每行数据的特征添加到矩阵 trainingLabels.append(float(currLine[21])) # 每行数据的第21个为 类别 # 使用改进后的 随机梯度下降算法 求得 在 此 数据集上的 最佳回归系数 trainWeights trainWeights = stocGradAscent1(np.array(trainingSet), trainingLabels, 1000) errorCount = 0 # 存储 分类错误的样本数 numTestVec = 0.0 # 存储 测试集 样本个数 # 读取测试数据集进行测试,并计算 分类错误的样本数 和 最终的错误率 for line in frTest.readlines(): numTestVec += 1.0 # 每一行都是一个样本,所以每读取一行,样本数加一 currLine = line.strip().split(' ') lineArr = [] for i in range(21): # 获得特征值 lineArr.append(float(currLine[i])) # 使用测试集进行测试 if int(classifyVector(np.array(lineArr), trainWeights)) != int(currLine[21]): # 如果测试得到的类别 不等于 实际的类别 errorCount += 1 # 分类错误样本数 +1 errorRate = (float(errorCount)/numTestVec) # 计算 错误率 print("the error rate of this test is: %f" % errorRate) return errorRate
"""函数说明:调用 colicTest() 10次并求结果的平均值
Parameters:returns:"""def multiTest(): numTests = 10; errorSum = 0.0 for k in range(numTests): errorSum += colicTest() print("after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))) if __name__ == '__main__': multiTest()

运行结果:

《机器学习实战》之逻辑回归--基于Python3--02

可以看到平均错误率为32.5%。实际上,这个效果并不差,因为有30%的数据缺失。当然,如果调整 colicTest里的迭代次数和 stocGradAscent1里的步长,平均错误率可以降到20%左右。


3、异常处理        


在运行程序时,可能会遇到报错:

这是 因为:numpy数组x中可能有绝对值比较大的负数,这样传给sigmoid函数时,分母np.exp(-x)会非常大,导致np.exp(-x)溢出。

解决办法:

1、不管它,这里对这个仿真没有什么影响。


2、对sigmoid函数实现的优化,使np.exp(-x)的值始终小于1。
import numpy as np
def sigmoid(inx): if inx >= 0: # 对sigmoid函数的优化,避免了出现极大的数据溢出 return 1.0 / (1 + np.exp(-inx)) else:        return np.exp(inx) / (1 + np.exp(inx))
但在numpy数组中,你不好直接判断np.array大于零或小于零,所以需要把数组里的数字取出来一个一个判断,计算后,再重新整合:
def sigmoid(x): x_ravel = x.ravel() # 将numpy数组展平 length = len(x_ravel) y = [] for index in range(length): if x_ravel[index] >= 0: y.append(1.0 / (1 + np.exp(-x_ravel[index]))) else: y.append(np.exp(x_ravel[index]) / (np.exp(x_ravel[index]) + 1))    return np.array(y).reshape(x.shape)


3、据说可以直接用这个公式代替(但我也没试过)。
def logistic_function(x): return .5 * (1 + np.tanh(.5 * x))


这里感谢博主 Dontla 提供的解决办法。我只是个搬运工,有问题的找他!博文地址:https://blog.csdn.net/Dontla/article/details/106565725

以上是关于《机器学习实战》之逻辑回归--基于Python3--02的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战之Logistic回归

阿旭机器学习实战33中文文本分类之情感分析--朴素贝叶斯KNN逻辑回归

Python机器学习实战

逻辑回归理解及代码实现

机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型

机器学习实战-逻辑回归