Task02 sklearn逻辑回归Demo

一、学习内容概括

通过一个小例子,掌握逻辑回归的sklearn函数调用使用。

学习地址、参考资料:

1.阿里云天池-AI训练营机器学习:https://tianchi.aliyun.com/specials/promotion/aicampml?invite_channel=1&accounttraceid=7df048c2ce194081b514fd2c8e9a3f00cqmm

2.Sklearn中文文档:http://www.scikitlearn.com.cn/

3.Matplotlib.pyplot:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot

4.Numpy手册:https://numpy.org/doc/stable/index.html

二、具体学习内容

1 库函数导入

## 基础函数库
import numpy as np ## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns## 导入逻辑回归模型函数
from sklearn.linear_model import LogisticRegression

scikit-learn 是一个开源的机器学习库。它支持监督学习和无监督学习。它还提供了用于模型拟合,数据预处理,模型选择和评估以及许多其他实用程序的各种工具。

监督学习下有很多线性模型,逻辑回归就是一种,该模型利用逻辑函数将单次试验的可能结果输出为概率,用来解决分类问题。scikit-learn 中逻辑回归在LogisticRegression类中实现了二分类(binary)、一对多分类(one-vs-rest)及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化,scikit-learn的逻辑回归在默认情况下使用L2正则化。

2 模型训练

## Demo演示LogisticRegression分类## 构造数据集
x_features = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])#6x2
y_label = np.array([0, 0, 0, 1, 1, 1])## 调用逻辑回归模型
lr_clf = LogisticRegression()## 用逻辑回归模型拟合构造的数据集
lr_clf = lr_clf.fit(x_features, y_label) 

因为本次训练只是一个小练习,所以不需要加载一些标准数据集,自己构建一个简单的数据集就行了,输入变量x_features是6x2的矩阵,标记信息y_label是两个离散值0、1,意思是我们训练这6个样本,分成2类分别是0和1,拟合出一个估计器(在这里就是一个训练好的逻辑回归模型),再用这估计器去预测未知样本所属的类别。

在sklearn中,分类的估计器是一个python对象,因为都封装好了,所以我们把估计器当成一个黑箱去操作就行了。我们先调用逻辑回归模型把估计器实例化并命名为lr_clf ,lr_clf调用fit方法,输入是训练集,以此来拟合数据完成学习,把习得的估计器更新给lr_clf。

3 模型参数查看

## 其拟合方程为 y=w0+w1*x1+w2*x2
## 查看其对应模型的w
print('the weight of Logistic Regression:',lr_clf.coef_)## 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:',lr_clf.intercept_)
运行结果:
the weight of Logistic Regression: [[0.73455784 0.69539712]]
the intercept(w0) of Logistic Regression: [-0.13139986]

sklearn线性模型中,目标值y是输入变量x的线性组合,如果是预测值,那有:,在整个模块中定义向量 作为coef_,定义 作为intercept_。我们的输入变量x_features是6x2的矩阵,表示我们有6个样本,每个样本都有2个属性,所以我们的假设函数有2个未知项x1、x2,2个参数w1、w2:

4 数据和模型可视化

4.1 可视化构造的数据样本点

## 可视化构造的数据样本点
plt.figure()
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()

4.1.1 scatter()函数:绘制散点图

matplotlib.pyplot.scatter:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter

相关代码:plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')

语法:matplotlib.pyplot.scatter(x,y,c = None,s = None,cmap = None,...)

x,y表示平面点的位置,可以用数组形式表示,x表示点的横坐标,y表示对应点的纵坐标。x_features[:,0] 是array([-1, -2, -3, 1, 2, 3]),x_features[:,1] 是array([-2, -1, -2, 3, 1, 2])。

c表示每一个点的颜色的标记值,可以用数组形式表示。这里c并不是设置点的颜色,只是会给这个点分配一个标记值,可搭配其他项一起使用,比如cmap项可以把颜色的指示值映射到具体颜色上去。这里c=y_label=array([0, 0, 0, 1, 1, 1]),表示对应的前三个点是一种颜色,后三个点是一种颜色。如果不设置c值,默认所有点是一个颜色。

s表示点大小。

cmap设置点的颜色,可以用注册的颜色表名表示。注意仅当c是浮点数数组时才使用cmap。默认值就是viridis(matplotlib.pyplot.viridis)所以本条代码去掉cmap也会得到一样的颜色,可以改成其他值如summer、winter、hot、cool试试效果,更多的颜色:https://matplotlib.org/examples/color/colormaps_reference.html。

4.2 可视化决策边界

# 可视化决策边界
plt.figure()
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')nx, ny = 200, 100
#获取当前轴的极限。如x轴:left, right = plt.xlim()
#x_min = -3,3, x_max = 3.3;y_min = -2.25, y_max = 3.25
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
#linspace(x_min, x_max, nx)返回一个numpy数组,包含了从x_min到x_max等间隔的nx个值
#meshgrid()从坐标向量返回网格点坐标矩阵。
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))#ravel()调用它的数组展平变为一维数组
#c_()生成一个新矩阵,把x_grid.ravel()变为新矩阵的第一列,y_grid.ravel()变为新矩阵的第二列,最终shape为(nx*ny,0)
#如此,生成了一个20000行,2列的测试集
#predict_proba()函数进行数据预测
z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])
z_proba = z_proba[:, 1].reshape(x_grid.shape)#绘制边界线
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')plt.show()

4.2.1 meshgrid()函数:从坐标向量到坐标网格矩阵

numpy.meshgrid()函数:https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html

详解meshgrid()函数参考资料:https://blog.csdn.net/lllxxq141592654/article/details/81532855

相关代码:x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))

语法:X,Y=np.meshgrid(x,y),输入:x,y是两组一维数组,输出:X,Y是坐标矩阵

概念比较抽象,直接代入例子。上文的代码中,x表示横轴上[-3.3,3.3]等间隔的nx个点,y表示纵轴上[-2.25,3.25]等间隔的ny个点。我们可以动手画出x轴、y轴上的间隔点,然后我们把x轴上的间隔点沿竖直方向发射直线,y轴上的间隔点横向发射直线,这些直线一交叉就形成一张网格。竖向直线有nx条,横向直线有ny条,处在这些直线交叉的点就叫做网格点,共有nx乘ny个,注意不包括坐标轴上的点,坐标轴上的点并不是交叉点!所有这些网格点的横坐标从上到下,从左到右排列,形成一个坐标矩阵记为X,X就有ny行nx列,X形状为(ny,nx)。同理,所有网格点的纵坐标也形成一个坐标矩阵记为Y,Y形状也是(ny,nx)。网格大概的样子如参考资料里的这张图,绿色的点就是所有网格点,但注意它并不是按轴的左右极限均匀划分的,所以我们只需要从这张图里知道网格坐标矩阵的点是什么样子的就行:

4.2.2 predict_proba()函数

详解predict_proba()和predict()参考资料:http://sofasofa.io/forum_main_post.php?postid=1000600

相关代码:z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])

函数的输入np.c_[x_grid.ravel(), y_grid.ravel()]是nx*ny行2列的矩阵,作为测试集。输出z_proba也是nx*ny行2列,每一行代表预测该行样本的标签为0或为1的概率,2列是因为我们的标签总共分两类,第一列代表预测本行样本的标签是0的概率,第二列代表预测本行样本的标签是1的概率,每行的两列概率值相加必须为1。

z_proba[:, 1]意思是预测所有的测试集样本的标签为1的概率组成的一维数组,共有nx*ny个值,所以形状是1行nx*ny列。

z_proba = z_proba[:, 1].reshape(x_grid.shape)。根据4.2.1的分析,坐标矩阵的形状是(ny,nx),即x_grid.shape是(ny,nx),z_proba是由1行nx*ny列的一维数组重塑为ny行nx列的二维数组。

4.2.3 contour()函数 

matplotlib.pyplot.contour:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.contour.html#matplotlib.pyplot.contour

相关代码:plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')

语法:contour([X, Y,] Z, [levels], ...)

X,Y为等长的一维数组,表示坐标点的位置

Z为二维数组,表示平面点(Xi,Yi)映射的函数值。在我们代码里,这个函数值z_proba代表的是每一个预测样本点的标签为1的概率值。

[levels]为int或其他,确定轮廓线/区域的数量和位置。这里设置0.5是因为我们逻辑回归把大于等于0.5的和小于0.5的分成不同类。

4.3 可视化预测新样本

### 可视化预测新样本plt.figure()
## new point 1
x_features_new1 = np.array([[0, -1]])
plt.scatter(x_features_new1[:,0],x_features_new1[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))## new point 2
x_features_new2 = np.array([[1, 2]])
plt.scatter(x_features_new2[:,0],x_features_new2[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 2',xy=(1,2),xytext=(-1.5,2.5),color='red',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))## 训练样本
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')# 可视化决策边界
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')plt.show()

4.3.1 annotate()函数:用文本text注释点xy

matplotlib.pyplot.annotate:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.annotate.html#matplotlib.pyplot.annotate

相关代码:plt.annotate(text='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))

语法:matplotlib.pyplot.annotate(text,xy,xytext,color,arrowprops,...)

text表示注释文本。

xy表示要注释的点坐标(x,y)。

xytext表示放置文本的位置。

color表示注释点颜色。

arrowprops表示在位置xy和xytext之间绘制箭头,dict字典形式。键arrowstyle='-|>'表示箭头样式head_length = 0.4,head_width = 0.2,键connectionstyle='arc3'表示连接方式,连线的弧度= 0.0,键color='red'表示箭头颜色是红色。

5 模型预测

## 在训练集和测试集上分布利用训练好的模型进行预测
y_label_new1_predict = lr_clf.predict(x_features_new1)
y_label_new2_predict = lr_clf.predict(x_features_new2)print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)## 由于逻辑回归模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)),所有我们可以利用 predict_proba 函数预测其概率
y_label_new1_predict_proba = lr_clf.predict_proba(x_features_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_features_new2)print('The New point 1 predict Probability of each class:\n',y_label_new1_predict_proba)
print('The New point 2 predict Probability of each class:\n',y_label_new2_predict_proba)
运行结果:
The New point 1 predict class:[0]
The New point 2 predict class:[1]
The New point 1 predict Probability of each class:[[0.69567724 0.30432276]]
The New point 2 predict Probability of each class:[[0.11983936 0.88016064]]

训练好的回归模型将x_features_new1预测为了类别0(判别面左下侧),x_features_new2预测为了类别1(判别面右上侧)。其训练得到的逻辑回归模型的概率为0.5的判别面为上图中蓝色的线。

三、学习问题和解决方法记录

Q:通过跟敲代码,发现自己对python、numpy的语法很多都不熟,基础不扎实,像是x_features[:,0]这样的形式都不知道该如何解释。

A:经过查询,这属于numpy数组切片知识。在敲代码的时候遇到不理解的矩阵、向量其实可以多打印看看生成的到底是什么,这样更容易消化语法知识。

四、学习总结

虽然这次只是写一个很小的例子,但是也从中看到自己基础面不好的问题,以后要多敲代码夯实基础。另外,我发现“遇到问题、查询、理解”的过程其实不慢,但当想整理下来整个思考过程,想自己给自己说明白并不容易,而且在整理过程中还会不经意发现一些隐藏的细节问题,总之,我认为学习不能止步于“感觉自己懂了”,而是应该更进一步“自己给自己讲明白”,如果能达到“给别人讲明白”就更好了。

Task02sklearn逻辑回归Demo相关推荐

  1. 【机器学习】逻辑回归(LogisticRegression)原理与实战

    文章目录 前言 一.什么是逻辑回归 1.1 逻辑回归基础概念 1.2 逻辑回归核心概念 二.逻辑回归Demo 2.1 数据准备 2.2 创建逻辑回归分类器 2.3 分类器预测 三.逻辑回归实战 3.1 ...

  2. mllib逻辑回归 spark_Spark Mllib中逻辑回归

    1相关参数设置 <1> setMaxIter():设置最大迭代次数 <2> setRegParam(): 设置正则项的参数,控制损失函数与惩罚项的比例,防止整个训练过程过拟合, ...

  3. Sparkmllib scala逻辑回归

    logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域.例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等.以胃癌病 ...

  4. 李宏毅机器学习课程5~~~分类:逻辑回归

    Function Set 不同的w,b来确定不同的函数,这样就组成了函数集合,不同的w,b可以来表达不同的分布函数. Good of a Function 变换表达形式 两个Bernoulli dis ...

  5. 推荐系统(4)-逻辑回归LR、POLY2、FM、FFM

    逻辑回归LR.POLY2.FM.FFM 1.逻辑回归LR 2.辛普森悖论 3.POLY2 4.FM-2010 5.FFM 6.GBDT+LR-2014 7.LS-PLM-2017 <深度学习/推 ...

  6. 机器学习笔记I: 基于逻辑回归的分类预测

    逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,并且广泛应用于各个领域之中.虽然现在深度学习相 ...

  7. 机器学习笔记-基于逻辑回归的分类预测

    天池学习笔记:AI训练营机器学习-阿里云天池 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有&quo ...

  8. python逻辑回归训练预测_[Python] 机器学习笔记 基于逻辑回归的分类预测

    导学问题 什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4) 逻辑回归与SVM的异同 逻辑回归和SVM都用来做分类,都是基于回归的概念 SVM的处理方法是只考虑 support ...

  9. 学习笔记1:线性回归和逻辑回归、AUC

    复习笔记1--线性回归和逻辑回归 文章目录 复习笔记1--线性回归和逻辑回归 一.机器学习基本概念 1.1 什么是模型 1.2 极大似然估计 1.3为啥使用梯度下降法求解 1.4 梯度下降法本质 1. ...

最新文章

  1. lisp 线性标注自动避让_CAD局部放大图如何标注对应的尺寸,才能保持尺寸值不变...
  2. CF #371 (Div. 2) C、map标记
  3. 医药电商为何发展不起来?
  4. G-SYNC技术是什么
  5. 基于react antd的新的tag和Badge的组合使用
  6. java RSA加密生成license,用CPU序列号生成机器码
  7. esxi6.7封装nvme驱动
  8. 【Linux】Ubuntu18.04深度学习环境配置+Google+TIM+搜狗输入法等安装方法
  9. RecyclerView实现横向滚动
  10. 树莓派RaspBerryPi上使用3g模块
  11. zencart模板修改的地方
  12. 自写七言绝句三首,外加离职学习 ——彩虹国秘书长
  13. python与redis数据库交互中zadd、zincrby的那些坑:(error) ERR value is not a valid float
  14. SAP的萨班斯法案SOA解决方案
  15. 线性代数和微积分 1.1微分方程概述
  16. Allegro贴片元件封装制作
  17. Markdown入门学习小结
  18. 计算机科学领域专业,计算机科学与技术专业主要包括哪些领域?
  19. java 淘口令_淘口令解析丶Java教程网-IT开发者们的技术天堂
  20. mysql升级后乱码_mysql 升级引起的乱码问题,今天终于解决了。。。。

热门文章

  1. python 爬虫 抓取网站img图片
  2. 做 ML 有关的工作,需要哪些技能?
  3. 生成突变体(实际问题)
  4. Frenet坐标系相关知识系统学习
  5. 什么是神经元网络控制?,什么是神经网络控制?
  6. 摩根大通的最新指南——将AI应用于算法交易
  7. 颠覆腾讯一统全球社交网络的潜力应用
  8. 谁在搭建互联网世界之外的局域网?
  9. 服务器桌面显示计算机网络连接,阴阳师桌面版连接不上服务器怎么办 连接不上服务器解决办法...
  10. 关于SAP EWM看着一篇就够了(一)