机器学习之python---Python实现逻辑回归
(LogisticRegression)
⼀. 逻辑回归
在前⾯讲述的回归模型中,处理的因变量都是数值型区间变量,建⽴的模型描述是因变量的期望与⾃变量之间的线性关系。⽐如常见的线性回归模型:
⽽在采⽤回归模型分析实际问题中,所研究的变量往往不全是区间变量⽽是顺序变量或属性变量,⽐如⼆项分布问题。通过分析年龄、性别、体质指数、平均⾎压、疾病指数等指标,判断⼀个⼈是否换糖尿病,Y=0表⽰未患病,Y=1表⽰患病,这⾥的响应变量是⼀个两点(0-1)分布变量,它就不能⽤h函数连续的值来预测因变量Y(只能取0或1)。
总之,线性回归模型通常是处理因变量是连续变量的问题,如果因变量是定性变量,线性回归模型就不再适⽤了,需采⽤逻辑回归模型解决。
逻辑回归(Logistic Regression)是⽤于处理因变量为分类变量的回归问题,常见的是⼆分类或⼆项分布问题,也可以处理多分类问题,它实际上是属于⼀种分类⽅法。
⼆分类问题的概率与⾃变量之间的关系图形往往是⼀个S型曲线,如图所⽰,采⽤的Sigmoid函数实现。
这⾥我们将该函数定义如下:
函数的定义域为全体实数,值域在[0,1]之间,x轴在0点对应的结果为0.5。当x取值⾜够⼤的时候,可以看成0或1两类问题,⼤于0.5可以认为是1类问题,反之是0类问题,⽽刚好是0.5,则可以划分⾄0类或1类。对于0-1型变量,y=1的概率分布公式定义如下:
y=0的概率分布公式定义如下:
其离散型随机变量期望值公式如下:
采⽤线性模型进⾏分析,其公式变换如下:
⽽实际应⽤中,概率p与因变量往往是⾮线性的,为了解决该类问题,我们引⼊了logit变换,使得logit(p)与⾃变量之
间存在线性相关的关系,逻辑回归模型定义如下:
通过推导,概率p变换如下,这与Sigmoid函数相符,也体现了概率p与因变量之间的⾮线性关系。以0.5为界限,预测p⼤于0.5时,我们判断此时y更可能为1,否则y为0。
得到所需的Sigmoid函数后,接下来只需要和前⾯的线性回归⼀样,拟合出该式中n个参数θ即可。test17_05.py为绘制Sigmoid曲线,输出上图所⽰。
import matplotlib.pyplot as plt
import numpy as np
def Sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
x= np.arange(-10, 10, 0.1)
h = Sigmoid(x) #Sigmoid函数
plt.plot(x, h)
plt.axvline(0.0, color='k') #坐标轴上加⼀条竖直的线(0位置)
plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')
plt.axhline(y=0.5, ls='dotted', color='k')
plt.ylim(-0.1, 1.1) #y轴范围
plt.show()
由于篇幅有限,逻辑回归构造损失函数J函数,求解最⼩J函数及回归参数θ的⽅法就不在叙述,原理和前⾯⼩节⼀样,请读者下去深⼊研究。
⼆. LogisticRegression回归算法
LogisticRegression回归模型在Sklearn.linear_model⼦类下,调⽤sklearn逻辑回归算法步骤⽐较简单,即:
(1) 导⼊模型。调⽤逻辑回归LogisticRegression()函数。
(2) fit()训练。调⽤fit(x,y)的⽅法来训练模型,其中x为数据的属性,y为所属类型。
(3) predict()预测。利⽤训练得到的模型对数据集进⾏预测,返回预测结果。
代码如下:
from sklearn.linear_model import LogisticRegression #导⼊逻辑回归模型
clf = LogisticRegression()
print clf
clf.fit(train_feature,label)
predict['label'] = clf.predict(predict_feature)
输出结果如下:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
其中,参数penalty表⽰惩罚项(L1、L2值可选。L1向量中各元素绝对值的和,作⽤是产⽣少量的特征,
⽽其他特征都是0,常⽤于特征选择;L2向量中各个元素平⽅之和再开根号,作⽤是选择较多的特征,使他们都趋近于0。); C值的⽬标函数约束条件:w||1<C,默认值是0,C值越⼩,则正则化强度越⼤。
三. 分析鸢尾花数据集
下⾯将结合Scikit-learn官⽹的逻辑回归模型分析鸢尾花⽰例,给⼤家进⾏详细讲解及拓展。由于该数据集分类标签划分为3类(0类、1类、2类),很好的适⽤于逻辑回归模型。
1. 鸢尾花数据集
在Sklearn机器学习包中,集成了各种各样的数据集,包括前⾯的糖尿病数据集,这⾥引⼊的是鸢尾花卉(Iris)数据集,它是很常⽤的⼀个数据集。鸢尾花有三个亚属,分别是⼭鸢尾(Iris-setosa)、变⾊鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。
该数据集⼀共包含4个特征变量,1个类别变量。共有150个样本,iris是鸢尾植物,这⾥存储了其萼⽚和花瓣的长宽,共4个属性,鸢尾植物分三类。如表17.2所⽰:
iris⾥有两个属性iris.data,iris.target。data是⼀个矩阵,每⼀列代表了萼⽚或花瓣的长宽,⼀共4列,每⼀列代表某个被测量的鸢尾植物,⼀共采样了150条记录。
from sklearn.datasets import load_iris #导⼊数据集iris
iris = load_iris() #载⼊数据集
print iris.data
输出如下所⽰:
[[ 5.1 3.5 1.4 0.2]
[ 4.9 3. 1.4 0.2]
[ 4.7 3.2 1.3 0.2]
[ 4.6 3.1 1.5 0.2]
....
[ 6.7 3. 5.2 2.3]
[ 6.3 2.5 5. 1.9]
[ 6.5 3. 5.2 2. ]
[ 6.2 3.4 5.4 2.3]
[ 5.9 3. 5.1 1.8]]
target是⼀个数组,存储了data中每条记录属于哪⼀类鸢尾植物,所以数组的长度是150,数组元素的值因为共有3类鸢尾植物,所以不同值只有3个。种类为⼭鸢尾、杂⾊鸢尾、维吉尼亚鸢尾。
print iris.target #输出真实标签
print len(iris.target) #150个样本每个样本4个特征
print iris.data.shape
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
150
(150L, 4L)
从输出结果可以看到,类标共分为三类,前⾯50个类标位0,中间50个类标位1,后⾯为2。下⾯给详细介绍使⽤决策树进⾏对这个数据集进⾏测试的代码。
2. 散点图绘制
下列代码主要是载⼊鸢尾花数据集,包括数据data和标签target,然后获取其中两列数据或两个特征,核⼼代码为:X = [x[0] for x in DD],获取的值赋值给X变量,最后调⽤scatter()函数绘制散点图。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris #导⼊数据集iris
#载⼊数据集
iris = load_iris()
print iris.data #输出数据集
print iris.target #输出真实标签
#获取花卉两列数据集
DD = iris.data
X = [x[0] for x in DD]
print X
Y = [x[1] for x in DD]
print Y
#plt.scatter(X, Y, c=iris.target, marker='x')
plt.scatter(X[:50], Y[:50], color='red', marker='o', label='setosa') #前50个样本
plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor') #中间50个
plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica') #后50个样本
plt.legend(loc=2) #左上⾓
plt.show()
绘制散点图如图所⽰:
3. 逻辑回归分析
从图中可以看出,数据集线性可分的,可以划分为3类,分别对应三种类型的鸢尾花,下⾯采⽤逻辑回归对其进⾏分类预测。前⾯使⽤X= [x[0] for x in DD]获取第⼀列数据,Y=[x[1] for x in DD]获取第⼆列数据,这⾥采⽤另⼀种⽅法,iris.data[:, :2]获取其中两列数据(两个特征),完整代码如下:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
#载⼊数据集
iris = load_iris()
X = X = iris.data[:, :2] #获取花卉两列数据集
Y = iris.target
#逻辑回归模型
lr = LogisticRegression(C=1e5)
lr.fit(X,Y)
#meshgrid函数⽣成两个⽹格矩阵
h = .02
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
#pcolormesh函数将xx,yy两个⽹格矩阵和对应的预测结果Z绘制在图⽚上
Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(8,6))
plt.pcolormesh(xx, yy, Z, Paired)
#绘制散点图
plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')
plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')
plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.legend(loc=2)
plt.show()
下⾯作者对导⼊数据集后的代码进⾏详细讲解。
lr = LogisticRegression(C=1e5)
lr.fit(X,Y)
初始化逻辑回归模型并进⾏训练,C=1e5表⽰⽬标函数。
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
正则化的回归分析xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
获取的鸢尾花两列数据,对应为花萼长度和花萼宽度,每个点的坐标就是(x,y)。先取X⼆维数组的第⼀列(长度)的最⼩值、最⼤值和步长h(设置为0.02)⽣成数组,再取X⼆维数组的第⼆列(宽度)的最⼩值、最⼤值和步长h⽣成数组,最后⽤meshgrid函数⽣成两个⽹格矩阵xx和yy,如下所⽰:
[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
...,
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]]
[[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ]
[ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]
...,
[ 4.88 4.88 4.88 ..., 4.88 4.88 4.88]
[ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]
Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
调⽤ravel()函数将xx和yy的两个矩阵转变成⼀维数组,由于两个矩阵⼤⼩相等,因此两个⼀维数组⼤⼩也相等。np.c_[xx.ravel(), yy.ravel()]是获取矩阵,即:
xx.ravel()
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
yy.ravel()
[ 1.5 1.5 1.5 ..., 4.9 4.9 4.9]
np.c_[xx.ravel(), yy.ravel()]
[[ 3.8 1.5 ]
[ 3.82 1.5 ]
[ 3.84 1.5 ]
...,
[ 8.36 4.9 ]
[ 8.38 4.9 ]
[ 8.4 4.9 ]]
总结下:上述操作是把第⼀列花萼长度数据按h取等分作为⾏,并复制多⾏得到xx⽹格矩阵;再把第⼆列花萼宽度数据按h取等分,作为列,并复制多列得到yy⽹格矩阵;最后将xx和yy矩阵都变成两个⼀维数组,调⽤np.c_[]函数组合成⼀个⼆维数组进⾏预测。
调⽤predict()函数进⾏预测,预测结果赋值给Z。即:
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
[1 1 1 ..., 2 2 2]
size: 39501
Z = Z.reshape(xx.shape)
调⽤reshape()函数修改形状,将其Z转换为两个特征(长度和宽度),则39501个数据转换为171*231的矩阵。Z = Z.reshape(xx.shape)输出如下:
[[1 1 1 ..., 2 2 2]
[1 1 1 ..., 2 2 2]
[0 1 1 ..., 2 2 2]
...,
[0 0 0 ..., 2 2 2]
[0 0 0 ..., 2 2 2]
[0 0 0 ..., 2 2 2]]
plt.pcolormesh(xx, yy, Z, Paired)
调⽤pcolormesh()函数将xx、yy两个⽹格矩阵和对应的预测结果Z绘制在图⽚上,可以发现输出为三个颜⾊区块,分布表⽰分类的三类区域。Paired表⽰绘图样式选择Paired主题。输出的区域如下图所⽰:
plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')
调⽤scatter()绘制散点图,第⼀个参数为第⼀列数据(长度),第⼆个参数为第⼆列数据(宽度),第三、四个参数为设置点的颜⾊为红⾊,款式为圆圈,最后标记为setosa。
输出如下图所⽰,经过逻辑回归后划分为三个区域,左上⾓部分为红⾊的圆点,对应setosa鸢尾花;右上⾓部分为绿⾊⽅块,对应virginica 鸢尾花;中间下部分为蓝⾊星形,对应versicolor鸢尾花。散点图为各数据点真实的花类型,划分的三个区域为数据点预测的花类型,预测的分类结果与训练数据的真实结果结果基本⼀致,部分鸢尾花出现交叉。
回归算法作为统计学中最重要的⼯具之⼀,它通过建⽴⼀个回归⽅程⽤来预测⽬标值,并求解这个回归⽅程的回归系数。本篇⽂章详细讲解了逻辑回归模型的原理知识,结合Sklearn机器学习库的LogisticRegression算法分析了鸢尾花分类情况。————————————————
blog.csdn/Eastmount/article/details/77920470?utm_medium=distribute.pc_-ase&depth_1-utm_source=distribute.pc_-ase 逻辑回归LogisticRegression分析鸢尾花数据
blog.csdn/c369624808/article/details/78474104?utm_medium=distribute.pc_-ase&depth_1-utm_source=distribute.pc_-ase 机器学习之路——logistic回归python实现
blog.csdn/Trisyp/article/details/89318333?utm_medium=distribute.pc_-ase&depth_1-utm_source=distribute.pc_-ase Python实现逻辑回归(LogisticRegression)完整过程
blog.csdn/google19890102/article/details/26074827?utm_medium=distribute.-ase&depth_1-utm_source=distribute.-ase 简单易学的机器学习算法——线性回归(1)
blog.csdn/hohaizx/article/details/81013985?utm_medium=distribute.-task-blog-baidujs-2 训练集、测试集、验证集与模型选择
blog.csdn/u014248127/article/details/78875013 机器学习模型训练测试完整步骤
www.cbedai/ ⼈⼯智能⽹校
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论