一 问题描述
Logistic回归常用于探索疾病的危险因素。从马各项症状指标预测马是否死亡,在规模较大的马场,这种方法能够及时有效对存活可能性大的马进行治疗。
二 数据准备
马病症数据集来自UCI(http://archive.ics.uci.edu/ml/datasets/Horse+Colic)。包含368个样本和28个特征。
样本中有30%的缺失值,用0填充。
三 算法原理
定义目标函数为
要求error的绝对值最小。
激活函数
当x=0时,Sigmoid函数值为0.5,随着x增大,函数值逼近1,随着x减小,函数值逼近0。为实现Logistic回归,我们在每一个特征上都乘上回归系数,然后将求和的结果带入Sigmoid函数,得到范围在0~1之间的取值,大于0.5是1类,小于0.5是0类。
三 模型建立
1. 随机梯度上升算法
输入训练数据集矩阵,标签和迭代次数,遍历每个样本,不断调整回归系数。
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n) #initialize to all ones
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
2. 分类器
输入为待分类样本和回归系数,计算sigmoid函数值,大于0.5为第1类,小于0.5为第0类。
def classifyVector(inX, weights):
prob = sigmoid(sum(inX*weights))
if prob > 0.5: return 1.0
else: return 0.0
3. 测试器
colicTest()函数中,先训练“horseColicTraining.txt”数据集中的数据得到回归系数,再遍历“horseColicTest.txt”测试集中每一个样本,调用分类器函数,得到分类结果,比较分类结果和实际结果,如果不同,错误数+1,遍历结束后,错误数/总样本数就是错误率。multiTest()函数调用colicTest()函数10次,并求平均错误率。
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[5]))
trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)
errorCount = 0; numTestVec = 0.0
for line in frTest.readlines():
numTestVec += 1.0
currLine = line.strip().split('\t')
lineArr =[]
for i in range(5):
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 average error rate is: %f" % (numTests, errorSum/float(numTests)))
四 总结
此次采用书上提供的Logistic回归算法,通过疝气病症预测病马的死亡率,由于对缺失的30%数据都用0代替,所以最后错误率不低于30%,预测结果比较差。于是借用之前已经处理过的Titanic数据集重新进行了训练和测试,最后结果比较理想。Titanic数据集测试结果如下。