python机器学习《基于逻辑回归的预测分类》

Python
359
0
0
2023-03-12

前言:

    本文所有代码均在阿里天池实验室运行,本机的jupyter notebook也可运行。除此之外,还需要导入numpy,matplotlib,sklearn,seaborn包。每期文章前面都会有环境搭建说明。文中的讲解知识点均是按照从上往下讲解,将一些平常未接触到的知识点先将清楚,再融合自己的想法去学习探索。

一、学习知识点概要

预备知识:

  1. 基本的python语法,例如import语句,传参知识
  2. 会基本的配置环境的命令,如:本章会利用到的seaborn包。会用pip install seaborn进行安装
  3. 会基本的画图指令(matplotlib)和数据操作(numpy)
  4. 一些基本的数据概念,测试集,训练集,特诊,准确率等等

本节知识:

  1. 逻辑回归的理论和实践知识
  2. 掌握seaborn函数的调用并运用到鸢尾花数据进行预测
  3. 本文主要研究逻辑回归在机器学习中的应用

二、学习内容

逻辑回归

2.1 逻辑回归的介绍

逻辑回归(Logistic regression)是一个分类模型,不是回归模型。并且广泛运用再各个领域,虽然在深度学习中相对更火,但由于其独特的优势,被广泛运用于各个领域中。

对于逻辑回归而言,最为突出的两点就是模型简单和模型的可解释性强。

逻辑回归模型的优劣势:

  • 优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;
  • 缺点:容易欠拟合,分类精度可能不高

2.2 逻辑回归的应用

2.2.1 医学

逻辑回归模型广泛运用在各个领域,包括机器学习,大多数医学领域和社会科学。例如,最初由Boyd等人开发的创伤和损伤严重度评分(TRISS)被广泛运用于预测受伤患者的死亡率,使用逻辑回归基于观察到的患者特征(年龄,性别,体重指数,各种血液检查的结果等)分析预测发生特定疾病(例如糖尿病,冠心病)的风险。

2.2.2 商业市场

逻辑回归模型也用于预测在给定的过程中,系统或产品的故障可能性,还用于市场营销应用程序,例如预测客户购买产品或中止订购的倾向等。在经济学中它可以用来预测一个人选择进入劳动市场的可能性,而商业应用则可以用来预测房主拖欠抵押贷款的可能性。

2.2.3 其他延申

条件随机字段是逻辑回归到顺序数据的扩展,用于自然语言处理。逻辑回归模型现在同样是很多分类算法的基础组件,比如 分类任务中基于GBDT算法+LR逻辑回归的信用卡交易反欺诈,CTR(点击通过率)预估等,其好处在于输出值自然地落在0和1之间,并且有概率意义。模型清晰。有对应的概率学理论基础。它拟合出来的参数就代表了每一个特征对结果的影响。也是一个理解数据的好工具。但同时由于其本质是一个线性的分类器,所以不能应对较为复杂的情况。很多时候我们也会拿逻辑回归模型去做一些任务尝试的基线

三、学习问题与解答

3.1 遇到的bug:

  • 数据集x增加,y没有变化

img

 解决办法: y_label = np.array([0,0,0,1,1,1])的值增加两个,可以是0和1
  • 逻辑回归模型的fit函数传参需要注意顺序

img

 解决办法: 上述代码改写成 lr_clf = lr_clf.fit(x_features,y_abel)

3.2 学习中测试:

3.2.1可视化构造数据样本点

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

img

plt.scatter参数的详细说明:

第一个参数 x_fearures[:,0]传入为第一个坐标,x_fearures[:,1]传入为第二个坐标,c = y_label表示对应的y的值,s=50描述的是所标出的图像的大小,cmap = None表示图中小圈的颜色

img

 3.2.2 可视化决策边界

3.2.2.1 np.meshgrid():

x_min ,y_min分别表示-3.3,和3.3即为最小值和最大值 np.linspace(x_min,x_max,nx)函数,把所在区间分成了nx份 np.meshgrid()函数用于将两个向量,转换成两个维度相同的矩阵,假如x向量为1行五列的向量,y向量为四行一列的向量,此函数可以得到两个行数为4,列数为5的矩阵。

实验证明:

img

img

我们将数据改成肉眼可以分辨清楚的数据,比如将上述的nx,ny从200,100分别下调至20,10。得到的结果会是和理论一样

img

img

img

 3.2.2.2 np.c_([],[]):

用于两个数组合并,示例

img

3.2.2.3 np.predict_proba()

这是一个用于计算x到y之间预测准确率的函数,第一个表示正确的概率,第二个表示错误的概率,相加起来会是1

img

3.2.2.4 进行向量维度之间的转换

ravel函数用于将多维的矩阵转成一维的向量

img

 reshape函数用于强制转换

img

代码:

##  基础函数库
import numpy as np 

## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns

## 导入逻辑回归模型函数
from sklearn.linear_model import LogisticRegression

##Demo演示LogisticRegression分类

## 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2],[4,4],[5,5]])
y_label = np.array([0, 0, 0, 1, 1, 1,1,1])



## 调用逻辑回归模型
lr_clf = LogisticRegression()

## 用逻辑回归模型拟合构造的数据集
lr_clf = lr_clf.fit(x_fearures ,y_label) #其拟合方程为 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_)

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

# 可视化决策边界
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')

nx, ny = 200, 100
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))

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()

### 可视化预测新样本

plt.figure()
## new point 1
x_fearures_new1 = np.array([[0, -1]])
plt.scatter(x_fearures_new1[:,0],x_fearures_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_fearures_new2 = np.array([[1, 2]])
plt.scatter(x_fearures_new2[:,0],x_fearures_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_fearures[:,0],x_fearures[:,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()

## 在训练集和测试集上分别利用训练好的模型进行预测
y_label_new1_predict = lr_clf.predict(x_fearures_new1)
y_label_new2_predict = lr_clf.predict(x_fearures_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_fearures_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_fearures_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)

四、学习思考与总结

    在本文开始之前,已经有对逻辑回归模型有一定的了解,发现仅仅是了解单独会如何使用spss软件进行逻辑回归太过于简陋,通过这次的学习:

  • 已经学会用python绘制混淆矩阵的热力图来检验实验的准确性。
  • 运用python绘制2D情况下不同的特征组合对于不同类别的花的散点分布,以及大概的区分能力。
  • 利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况。
  • 选取其前三个特征绘制三维散点图。
  • 并且通过实验的方式证明为什么逻辑回归最好只是用于二分类,而对于多分类,逻辑回归得出的分类情况会下降。