机器学习实战python3 Logistic Regression

代码及数据:https://github.com/zle1992/MachineLearningInAction

logistic regression

优点:计算代价不高,易于理解实现,线性模型的一种。

缺点:容易欠拟合,分类精度不高。但是可以用于预测概率。

适用数据范围:数值型和标称型。

准备数据:

1 def loadDataSet():
2     dataMat,labelMat = [],[]
3     with open(filename,"r") as  fr:  #open file
4         for line in fr.readlines():
5             lineArr = line.split() #split each line
6             dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])  #创建2维list
7             labelMat.append(int(lineArr[2]))
8     return dataMat,labelMat

1  基于Logistic回归和Sigmoid函数的分类

Sigmoid函数:

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

2基于最优化方法的最佳回归系数确定

梯度上升法:

梯度上升法的伪代码如下:
每个回归系数初始化为1
重复R次:
计算整个数据集的梯度
使用alpha x gradient更新回归系数的向量
返回回归系数

代码:

 1 def sigmoid(inX):
 2     return 1.0/(1+np.exp(-inX))
 3
 4 def gradAscent(dataMat,labelMat):
 5     dataMatrix = np.mat(dataMat)  #translate list to matrix
 6     labelMatrix = np.mat(labelMat).transpose() #转置
 7     m,n = np.shape(dataMatrix) #100 rows  3 coulums
 8     alpha = 0.001 #步长 or 学习率
 9     maxCyclse = 500
10     weight = np.ones((n,1)) #初始值随机更好吧
11     #weight = np.random.rand(n,1)
12     for k in range(maxCyclse):
13         h = sigmoid(dataMatrix * weight) # h 是向量
14         error = (labelMatrix - h)  #error 向量
15         weight = weight + alpha * dataMatrix.transpose() *error  #更新
16      #   print(k,"  ",weight)
17     return weight

3分析数据:画出决策边界

 1 def plotfit(wei):
 2     import matplotlib.pyplot as plt
 3     weight = np.array(wei) #???????? #return array
 4     dataMat ,labelMat = loadDataSet()
 5     dataArr = np.array(dataMat)
 6     n = np.shape(dataArr)[0]  #row
 7     fig = plt.figure()   #plot
 8     ax = fig.add_subplot(111)
 9     ax.scatter(dataArr[:,1],dataArr[:,2],s =50, c = np.array(labelMat)+5) #散点图 #参考KNN 的画图
10     x = np.arange(-3.0,3.0,0.1)   #画拟合图像
11     y = (-weight[0] - weight[1] *x ) / weight[2]
12     ax.plot(x,y)
13     plt.xlabel("x1")
14     plt.ylabel("x2")
15     plt.show()

4训练算法:随机梯度上升

伪代码:
所有回归系数初始化为1
对数据集中每个样本
计算该样本的梯度
使用alpha x gradient更新回归系数值
返回回归系数值

原始梯度上升计算数据集的梯度,涉及的是矩阵运算。h,error都是向量

随机梯度算法计算的是数据集中每个样本的梯度,s计算量减小,h,error都是数值

1 ef stocGradAscent0(dataMatrix,labelMatrix):
2     m,n = np.shape(dataMatrix)
3     alpha = 0.1
4     weight = np.ones(n)
5     for i in range(m):
6         h = sigmoid(sum(dataMatrix * weight))
7         error = labelMatrix[i] - h
8         weight = weight + alpha * error * dataMatrix[i]
9     return weight

上面的算法是固定的步长,固定的步长,不稳定,会产生震荡,所以下面的算法采用不固定的步长。

距离目标值远的时候,步长大,距离目标值近的时候,步长小。

 1 def stocGradAscent1(dataMat,labelMat,numIter = 150):
 2     dataMatrix = np.mat(dataMat)  #translate list to matrix
 3     labelMatrix = np.mat(labelMat).transpose() #转置
 4     m,n = np.shape(dataMat)
 5     alpha = 0.1
 6     weight = np.ones(n) #float
 7     #weight = np.random.rand(n)
 8     for j in range(numIter):
 9         dataIndex = list(range(m)) #range 没有del 这个函数  所以转成list  del 见本函数倒数第二行
10         for i in range(m):
11             alpha = 4/(1.0 +j + i) + 0.01
12             randIndex = int(np.random.uniform(0,len(dataIndex))) #random.uniform(0,5) 生成0-5之间的随机数
13             #生成随机的样本来更新权重。
14             h = sigmoid(sum(dataMat[randIndex] * weight))
15             error = labelMat[randIndex] - h
16             weight = weight + alpha * error * np.array(dataMat[randIndex])  #!!!!一定要转成array才行
17             #dataMat[randIndex] 原来是list  list *2 是在原来的基础上长度变为原来2倍,
18             del(dataIndex[randIndex]) #从随机list中删除这个
19     return weight

5从病气病症预测病马的死亡率

 1 def classifyVector(inX,weight):  #输入测试带测试的向量 返回类别
 2     prob = sigmoid(sum(inX * weight))
 3     if prob > 0.5 :
 4         return 1.0
 5     else: return 0.0
 6 def colicTest():
 7     trainingSet ,trainingSetlabels =[],[]
 8     with open("horseColicTraining.txt") as frTrain:
 9         for lines in frTrain.readlines():
10             currtline = lines.strip().split(‘\t‘)  # strip()remove the last string(‘/n‘) in everyline
11             linearr = [] #每行临时保存str 转换float的list
12             for i in range(21):   #将读进来的每行的前21个str 转换为float
13                 linearr.append(float(currtline[i]))
14             trainingSet.append(linearr)  #tianset 是2维的list
15             trainingSetlabels.append(float(currtline[21]))#第22个是类别
16     trainWeights = stocGradAscent1(trainingSet,trainingSetlabels,500)
17     errorCount = 0
18     numTestVec = 0.0
19     with open("horseColicTest.txt") as frTrain:
20         for lines in frTrain.readlines():
21             numTestVec += 1.0
22             currtline = lines.strip().split(‘\t‘)  # strip()remove the last string(‘/n‘) in everyline
23             linearr = []  #测试集的每一行
24             for i in range(21):
25                 linearr.append(float(currtline[i]))#转换为float
26             if int(classifyVector(np.array(linearr),trainWeights)) != int(currtline[21]) :
27                 errorCount += 1  #输入带分类的向量,输出类别,类别不对,errorCount ++
28             errorRate = float(errorCount)/numTestVec
29             print("the error rate of this test is : %f"%errorRate)
30     return errorRate
31 def multiTest(): #所有测试集的错误率
32     numTests = 10
33     errorSum = 0.0
34     for k in range(numTests):
35         errorSum +=colicTest()
36     print("after %d iterations the average error rate is : %f" %(numTests,errorSum/float(numTests)))

主函数:

1 if __name__ == ‘__main__‘:
2     filename = "testSet.txt"
3     dataMat,labelMat = loadDataSet()
4     #weight = gradAscent(dataMat,labelMat)
5     weight = stocGradAscent1(dataMat,labelMat)
6     print(weight)
7     plotfit(weight)#画分类图像在小数据集上
8     multiTest() #真实数据集上测试
时间: 2024-10-05 21:46:23

机器学习实战python3 Logistic Regression的相关文章

《机器学习实战》Logistic回归算法(1)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

机器学习实战python3 K近邻(KNN)算法实现

台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python3 写一遍.python3 与python2 不同的地方会在程序中标出. 代码及数据:https://github.com/zle1992/MachineLearningInAction/tree/master/ch2 k-近邻算法优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高

机器学习实战之Logistic回归

Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. LR 正则化 3.1 L1 正则化 3.2 L2 正则化 3.3 L1正则化和L2正则化的区别 4. RL 损失函数求解 4.1 基于对数似然损失函数 4.2 基于极大似然估计 二. 梯度下降法 1. 梯度 2. 梯度下降的直观解释 3. 梯度下降的详细算法 3.1 梯度下降法的代数方式描述 3.2

机器学习实战:Logistic回归

第一眼看到逻辑回归(Logistic Regression)这个词时,脑海中没有任何概念,读了几页后,发现这非常类似于神经网络中单个神经元的分类方法. 书中逻辑回归的思想是用一个超平面将数据集分为两部分,这两部分分别位于超平面的两边,且属于两个不同类别(和SVM的想法有些相似),如下图: 因此,一般的逻辑回归只能处理两分类问题,同时两个类别必须是线性可分的.对于线性不可分问题,在SVM中,可以使用核函数升维的方式解决,不过那都是后话了.还是先看看逻辑回归吧. 一.Sigmoid函数 了解神经网络

机器学习实战精读--------logistic回归

Logistic回归的主要目的:寻找一个非线性函数sigmod最佳的拟合参数 拟合.插值和逼近是数值分析的三大工具 回归:对一直公式的位置参数进行估计 拟合:把平面上的一些系列点,用一条光滑曲线连接起来 logistic主要思想:根据现有数据对分类边界线建立回归公式.以此进行分类 sigmoid函数:在神经网络中它是所谓的激励函数.当输入大于0时,输出趋向于1,输入小于0时,输出趋向0,输入为0时,输出为0.5 梯度上升:要找到某个函数的最大值,最好的方法是沿着该函数的梯度方向探寻 收敛:随着迭

机器学习基石(10)--Logistic Regression

如果我们想要知道的并不是绝对的是或者非,我们只想知道在是非发生的概率(只想知道概率,不想知道结果)是多少的时候: 虽然我们想要知道左边的完美数据,但是在实际生活中,我们只有右边的数据,也就是一些确定的结果,不可能有概率值这个事情让我们知道.而右边的数据可以看成是有噪声的不完美的数据. 怎么解决这样的问题呢? 有一种叫做sigmoid的函数可以满足这些要求. 这个函数(logistic function)可以把任何数转化成0到1之间的值.那么logistics regression的Ein怎么衡量

机器学习实战python3 决策树ID3

代码及数据:https://github.com/zle1992/MachineLearningInAction 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型和标称型. 创建分支的伪代码函数createBranch()如下所示:检测数据集中的每个子项是否属于同一分类:if so return 类标签; Else 寻找划分数据集的最好特征 划分数据集 创建分支节点 for 每个划分的子集 调用函

机器学习实战 logistic回归

logistic回归 梯度上升法 import numpy as np """ function: 加载数据 parameter: 无 returns: dataMat - 数据集 labelMat - 标签集 """ def loadDataSet(): dataMat = []#数据集 labelMat = []#标签集 fr = open('testSet.txt') for line in fr.readlines(): lineArr

机器学习实战四(Logistic Regression)

机器学习实战四(Logistic Regression) 这一章会初次接触最优化算法,在日常生活中应用很广泛.这里我们会用到基本的梯度上升法,以及改进的随机梯度上升法. Logistic回归 优点:计算代价不高,易于理解和实现 缺点:容易欠拟合,分裂精度可能不高 原理:根据现有数据堆分类边界线建立回归公式,依次进行分类. 这里的回归其实就是最佳拟合的意思. 1.基于Logistic回归和Sigmoid函数的分类. 我们需要一个这样的函数:接受所有的输入,然后预测出类别.例如,如果只有两类,则输出