前言:
本文所有代码均在阿里天池实验室运行,本机的jupyter notebook也可运行。除此之外,还需要导入numpy,matplotlib,sklearn,seaborn包。每期文章前面都会有环境搭建说明。文中的讲解知识点均是按照从上往下讲解,将一些平常未接触到的知识点先将清楚,再融合自己的想法去学习探索。
一、学习知识点概要
预备知识:
- 基本的python语法,例如import语句,传参知识
- 会基本的配置环境的命令,如:本章会利用到的seaborn包。会用pip install seaborn进行安装
- 会基本的画图指令(matplotlib)和数据操作(numpy)
- 一些基本的数据概念,测试集,训练集,特诊,准确率等等
本节知识:
- 逻辑回归的理论和实践知识
- 掌握seaborn函数的调用并运用到鸢尾花数据进行预测
- 本文主要研究逻辑回归在机器学习中的应用
二、学习内容
逻辑回归
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没有变化
解决办法: y_label = np.array([0,0,0,1,1,1])的值增加两个,可以是0和1
- 逻辑回归模型的fit函数传参需要注意顺序
解决办法: 上述代码改写成 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()
plt.scatter参数的详细说明:
第一个参数 x_fearures[:,0]传入为第一个坐标,x_fearures[:,1]传入为第二个坐标,c = y_label表示对应的y的值,s=50描述的是所标出的图像的大小,cmap = None表示图中小圈的颜色
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的矩阵。
实验证明:
我们将数据改成肉眼可以分辨清楚的数据,比如将上述的nx,ny从200,100分别下调至20,10。得到的结果会是和理论一样
3.2.2.2 np.c_([],[]):
用于两个数组合并,示例
3.2.2.3 np.predict_proba()
这是一个用于计算x到y之间预测准确率的函数,第一个表示正确的概率,第二个表示错误的概率,相加起来会是1
3.2.2.4 进行向量维度之间的转换
ravel函数用于将多维的矩阵转成一维的向量
reshape函数用于强制转换
代码:
## 基础函数库
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情况下不同的特征组合对于不同类别的花的散点分布,以及大概的区分能力。
- 利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况。
- 选取其前三个特征绘制三维散点图。
- 并且通过实验的方式证明为什么逻辑回归最好只是用于二分类,而对于多分类,逻辑回归得出的分类情况会下降。