《机器学习实战》之逻辑回归--基于Python3--02
Posted 华少的知识宝典
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《机器学习实战》之逻辑回归--基于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
"""
函数说明: 打开测试数据集合训练数据集, 并对数据进行格式化处理
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()
运行结果:
解决办法:
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))
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)
def logistic_function(x):
return .5 * (1 + np.tanh(.5 * x))
这里感谢博主 Dontla 提供的解决办法。我只是个搬运工,有问题的找他!
博文地址:https://blog.csdn.net/Dontla/article/details/106565725
以上是关于《机器学习实战》之逻辑回归--基于Python3--02的主要内容,如果未能解决你的问题,请参考以下文章
阿旭机器学习实战33中文文本分类之情感分析--朴素贝叶斯KNN逻辑回归