导学问题

什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4)

逻辑回归与SVM的异同

逻辑回归和SVM都用来做分类,都是基于回归的概念

SVM的处理方法是只考虑 support vectors,也就是和分类最相关的少数点,去学习分类器

逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重,两者的根本目的都是一样的

svm侧重于超平面边缘的点,考虑局部(支持向量),而logistic回归侧重于所有点,考虑全局

逻辑回归与线性回归的不同

线性回归的输出是一个数值,而不是一个标签,不能直接解决二分类问题;

逻辑回归在线性回归的基础上,依托Sigmoid函数获取概率,通过概率划分解决二分类问题。

为什么LR需要归一化或者取对数,为什么LR把特征离散化后效果更好

归一化可以提高收敛速度,提高收敛的精度

特征离散化的优势有以下几点:

(1) 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

(2) 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

(3) 离散特征的增加和减少都很容易,易于模型的快速迭代;

(4) 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

(5) 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

(6) 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。

LR为什么用Sigmoid函数,这个函数有什么优缺点,为什么不用其他函数

The model of logistic regression, however, is based on quite different assumptions (about the relationship between dependent and independent variables) from those of linear regression. In particular the key differences between these two models can be seen in the following two features of logistic regression. First, the conditional distribution {\displaystyle y\mid x} y\mid x is a Bernoulli distribution rather than a Gaussian distribution, because the dependent variable is binary. Second, the predicted values are probabilities and are therefore restricted to (0,1) through the logistic distribution function because logistic regression predicts the probability of particular outcomes.

——Logistic regression

首先,在建模预测 Y|X,并认为 Y|X 服从bernoulli distribution,所以只需要知道 P(Y|X);其次需要一个线性模型,所以 P(Y|X) = f(wx)。接下来就只需要知道 f 是什么就行了。通过最大熵原理推出的这个 f,就是sigmoid。

一、介绍

逻辑回归(Logistic regression,简称LR),是一个分类模型,主要用于两分类问题(即输出只有两种,分别代表两个类别),并且广泛应用于各个领域之中。

逻辑回归模型的优劣势:

优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;

缺点:容易欠拟合,分类精度可能不高

线性回归的输出是一个数值,而不是一个标签,显然不能直接解决二分类问题。

一个最直观的办法就是设定一个阈值,比如0,如果预测的数值 y > 0 ,那么属于标签A,反之属于标签B,采用这种方法的模型又叫做感知机(Perceptron)。 ‘

另一种方法,不去直接预测标签,而是去预测标签为A概率。概率是一个[0,1]区间的连续数值,那输出的数值就是标签为A的概率。一般的如果标签为A的概率大于0.5,就认为它是A类,否则就是B类。这就是逻辑回归模型 (Logistics Regression)。

二、原理及公式推导

1. Sigmoid函数

Logistic函数(或称为Sigmoid函数),函数形式为:

对应函数图像为:

%matplotlib inline

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(-5,5,0.01)

y = 1/(1+np.exp(-x))

plt.plot(x,y)

plt.xlabel('z')

plt.ylabel('y')

plt.grid()

plt.show()

模型的值域刚好在[0,1]区间

2. 线性回归模型

线性回归的表达式:

线性回归对于给定的输入x,输出的是一个数值 y ,因此它是一个解决回归问题的模型。

为了消除掉后面的常数项b,我们可以令:

也就是说给x多加一项而且值恒为1,这样b就到了w里面去了,直线方程可以化简成为:

3. 逻辑回归模型

结合sigmoid函数,线性回归函数,把线性回归模型的输出作为sigmoid函数的输入

也就是将回归模型的预测值代入sigmoid函数求得概率,获取分类

最后就变成了逻辑回归模型:

假设已经训练好了一组权值,只要把我们需要预测的值代入到上面的方程,输出的y值就是这个标签为A的概率,我们就能够判断输入数据是属于哪个类别。实质上来说就是利用数据求解出对应的模型的特定的ω,从而得到一个针对于当前数据的特征逻辑回归模型。

逻辑回归从其原理上来说其实是实现了一个决策边界

在模型训练完成之后,我们获得了一组n维的权重向量w跟偏差 b。 对于权重向量w,它的每一个维度的值,代表了这个维度的特征对于最终分类结果的贡献大小。假如这个维度是正,说明这个特征对于结果是有正向的贡献,那么它的值越大,说明这个特征对于分类为正起到的作用越重要。 对于偏差b (Bias),一定程度代表了正负两个类别的判定的容易程度。假如b是0,那么正负类别是均匀的。如果b大于0,说明它更容易被分为正类,反之亦然。 根据逻辑回归里的权重向量在每个特征上面的大小,就能够对于每个特征的重要程度有一个量化的清楚的认识,这就是为什么说逻辑回归模型有着很强的解释性的原因。

4. 损失函数及推导

损失函数就是用来衡量模型的输出与真实输出的差别

假设只有两个标签1和0。我们把采集到的任何一组样本看做一个事件的话,那么这个事件发生的概率假设为p。我们的模型y的值等于标签为1的概率也就是p。

把单个样本看做一个事件,那么这个事件发生的概率就是:

等价于(当y=1,结果是p;当y=0,结果是1-p):

如果我们采集到了一组数据一共N个,这个合成在一起的合事件发生的总概率就是将每一个样本发生的概率相乘,即采集到这组样本的概率:

两边取对数得:

这个 F(w) 函数又叫做它的损失函数。这里的损失函数的值等于事件发生的总概率,我们希望它越大越好。但是跟损失的含义有点儿违背,因此也可以在前面取个负号。

三、Demo实践

魔术方法:

阿里云镜像源: !pip install pyodps -i "https://mirrors.aliyun.com/pypi/simple/"

Jupyter等实现matplotlib出图:%matplotlib inline

Step1:库函数导入

## 基础函数库

import numpy as np

## 导入画图库

import matplotlib.pyplot as plt

import seaborn as sns

## 导入逻辑回归模型函数

from sklearn.linear_model import LogisticRegression

Step2:训练模型

## 构造数据集

x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])

y_label = np.array([0, 0, 0, 1, 1, 1])

## 调用逻辑回归模型

lr_clf = LogisticRegression()

## 用逻辑回归模型拟合构造的数据集

lr_clf = lr_clf.fit(x_fearures, y_label) #其拟合方程为 y=w0+w1*x1+w2*x2

Step3:模型参数查看

##查看其对应模型的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.73462087 0.6947908]]

##the intercept(w0) of Logistic Regression:[-0.03643213]

Step4:数据和模型可视化

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

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

Step5:模型预测

##在训练集和测试集上分布利用训练好的模型进行预测

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)

##TheNewpoint1predictclass:

##[0]

##TheNewpoint2predictclass:

##[1]

##TheNewpoint1predictProbabilityofeachclass:

##[[0.69567724 0.30432276]]

##TheNewpoint2predictProbabilityofeachclass:

##[[0.11983936 0.88016064]]

四、基于鸢尾花(iris)数据集的逻辑回归分类实践

Step1:函数库导入

## 基础函数库

import numpy as np

import pandas as pd

## 绘图函数库

import matplotlib.pyplot as plt

import seaborn as sns

Step2:数据读取/载入

from sklearn.datasets import load_iris

data = load_iris() #得到数据特征

iris_target = data.target #得到数据对应的标签

iris_features = pd.DataFrame(data=data.data, columns=data.feature_names) #利用Pandas转化为DataFrame格式

print(data)

Step3:数据信息简单查看

##利用.info()查看数据的整体信息

iris_features.info()

##进行简单的数据查看

iris_features.head()

iris_features.tail()

##其对应的类别标签为,其中0,1,2分别代表'setosa','versicolor','virginica'三种不同花的类别

iris_target

##利用value_counts函数查看每个类别数量

pd.Series(iris_target).value_counts()

##对于特征进行一些统计描述

iris_features.describe()

Step4:可视化描述

## 合并标签和特征信息

iris_all = iris_features.copy() ##进行浅拷贝,防止对于原始数据的修改

iris_all['target'] = iris_target

## 特征与标签组合的散点可视化

sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')

plt.show()

for col in iris_features.columns:

sns.boxplot(x='target', y=col, saturation=0.5,

palette='pastel', data=iris_all)

plt.title(col)

plt.show()

# 选取其前三个特征绘制三维散点图

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,8))

ax = fig.add_subplot(111, projection='3d')

iris_all_class0 = iris_all[iris_all['target']==0].values

iris_all_class1 = iris_all[iris_all['target']==1].values

iris_all_class2 = iris_all[iris_all['target']==2].values

# 'setosa'(0), 'versicolor'(1), 'virginica'(2)

ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa')

ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor')

ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica')

plt.legend()

plt.show()

Step5:利用 逻辑回归模型 在二分类上 进行训练和预测

##为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。

from sklearn.model_selection import train_test_split

##选择其类别为0和1的样本(不包括类别为2的样本)

iris_features_part=iris_features.iloc[:100]

iris_target_part=iris_target[:100]

##测试集大小为20%,80%/20%分

x_train,x_test,y_train,y_test=train_test_split(iris_features_part,iris_target_part,test_size=0.2,random_state=2020)

##从sklearn中导入逻辑回归模型

from sklearn.linear_model import LogisticRegression

##定义逻辑回归模型

clf=LogisticRegression(random_state=0,solver='lbfgs')

##在训练集上训练逻辑回归模型

clf.fit(x_train,y_train)

##在训练集上训练逻辑回归模型

clf.fit(x_train,y_train)

##查看其对应的w

print('the weight of Logistic Regression:',clf.coef_)

##查看其对应的w0

print('the intercept(w0) of Logistic Regression:',clf.intercept_)

##在训练集和测试集上分布利用训练好的模型进行预测

train_predict=clf.predict(x_train)

test_predict=clf.predict(x_test)

from sklearn import metrics

##利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果

print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))

print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))

##查看混淆矩阵(预测值和真实值的各类情况统计矩阵)

confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test)

print('The confusion matrix result:\n',confusion_matrix_result)

##利用热力图对于结果进行可视化

plt.figure(figsize=(8,6))

sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues')

plt.xlabel('Predictedlabels')

plt.ylabel('Truelabels')

plt.show()

Step6:利用 逻辑回归模型 在三分类(多分类)上 进行训练和预测

##测试集大小为20%,80%/20%分

x_train,x_test,y_train,y_test=train_test_split(iris_features,iris_target,test_size=0.2,random_state=2020)

##定义逻辑回归模型

clf=LogisticRegression(random_state=0,solver='lbfgs')

##在训练集上训练逻辑回归模型

clf.fit(x_train,y_train)

# 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=0, solver='lbfgs', tol=0.0001,

# verbose=0, warm_start=False)

##查看其对应的w

print('the weight of Logistic Regression:\n',clf.coef_)

##查看其对应的w0

print('the intercept(w0) of Logistic Regression:\n',clf.intercept_)

##由于这个是3分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类

##在训练集和测试集上分布利用训练好的模型进行预测

train_predict=clf.predict(x_train)

test_predict=clf.predict(x_test)

##由于逻辑回归模型是概率预测模型(前文介绍的p=p(y=1|x,\theta)),所有我们可以利用predict_proba函数预测其概率

train_predict_proba=clf.predict_proba(x_train)

test_predict_proba=clf.predict_proba(x_test)

print('The test predict Probability of each class:\n',test_predict_proba)

##其中第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。

##利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果

print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))

print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))

##查看混淆矩阵

confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test)

print('The confusion matrix result:\n',confusion_matrix_result)

##利用热力图对于结果进行可视化

plt.figure(figsize=(8,6))

sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues')

plt.xlabel('Predicted labels')

plt.ylabel('True labels')

plt.show()

##The confusion matrix result:

##[[10 0 0]

##[0 8 2]

##[0 2 8]]

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

  1. sklearn逻辑回归参数设置_【机器学习笔记】:逻辑回归实战练习(二)

    作者:xiaoyu 微信公众号:Python数据科学 知乎:python数据分析师 前言 前几篇介绍了逻辑回归在机器学习中的重要性:5个原因告诉你:为什么在成为数据科学家之前,"逻辑回归&q ...

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

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

  3. 机器学习:基于逻辑回归对航空公司乘客满意度的因素分析

    机器学习:基于逻辑回归对航空公司乘客满意度的因素分析 作者:i阿极 作者简介:数据分析领域优质创作者.多项比赛获奖者:博主个人首页

  4. 【机器学习笔记14】softmax多分类模型【下篇】从零开始自己实现softmax多分类器(含具体代码与示例数据集)

    文章目录 推荐阅读 前言 关于代码 第一部分 Softmax分类器相关公式与步骤 相关公式 梯度下降步骤 数据集获取 从零开始实现softmax多分类器 导入数据 初始框架 step1:将label向 ...

  5. 李弘毅机器学习笔记:第五章—分类

    李弘毅机器学习笔记:第五章-分类 例子(神奇宝贝属性预测) 分类概念 神奇宝贝的属性(水.电.草)预测 回归模型 vs 概率模型 回归模型 其他模型(理想替代品) 概率模型实现原理 盒子抽球概率举例 ...

  6. ML之RF:利用Pipeline(客户年龄/职业/婚姻/教育/违约/余额/住房等)预测客户是否购买该银行的产品二分类(预测、推理)

    ML之RF:利用Pipeline(客户年龄/职业/婚姻/教育/违约/余额/住房等)预测客户是否购买该银行的产品二分类(预测.推理) 目录 利用Pipeline(客户年龄/职业/婚姻/教育/违约/余额/ ...

  7. python决策树预测_决策树案例:基于python的商品购买能力预测系统

    数据分析入门与实战  公众号: weic2c http://www.cnblogs.com/baiboy/p/ml3.html 目录 1 决策树/判定树(decision tree) 2 构造决策树的 ...

  8. python 时间序列prophet 模型分析_手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)...

    原标题:手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码) 作者:ANKIT CHOUDHARY:翻译:王雨桐:校对:丁楠雅: 本文约3000字,建议阅读12分钟. 本文将通过 ...

  9. python逻辑与界面分离_一种数据与逻辑分离的Python单元测试工具

    一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...

最新文章

  1. 拆解一个舵机组成的机器人
  2. 信号槽绑定时出现未有匹配的connect()函数
  3. Week06-接口、内部类
  4. 2017 3月21日,下午
  5. oracle 自定义函数 返回一个表类型
  6. HDU 4334 5-sum
  7. android 朋友圈弹出框,Android popupwidown 实现朋友圈评论弹窗显示在软键盘上面
  8. fpga与海思BT1120调试问题记录
  9. python 聚类 客户细分_KMeans聚类:商城客户细分数据
  10. Thingworx 调用外部接口
  11. k8s对外攻击面总结
  12. k8s UAT改环境
  13. x64dbg零基础使用教程
  14. IOS 命令行安装备忘
  15. 【ReID】局部特征
  16. 有哪些操作简单能将PDF转成图片的工具?
  17. 那些一个字使劲儿堆的汉字你都认识吗 - 收集
  18. 词霸天下---202 词根【-tribut- = -tribu-给 】
  19. i春秋2020新春公益赛 GYCTF有关SQL注入题复现
  20. Fcitx──小企鹅输入法

热门文章

  1. FIL最新消息 Lotus是什么?与 FIL什么关系
  2. 【滤波器】2. 有源滤波器概述
  3. win10配置gitee和github
  4. java graphics 渐变色_使用BufferedImage进行渐变色操作
  5. fiddler抓包以及连接不上网解决方案
  6. Faster RER-CNN 论文笔记
  7. 腾讯云mysql如何设置远程访问_腾讯云主机 MySQL 远程访问配置方法
  8. 在c语言中 char型数据在内存中的存储形式是,在c语言中char型数据在内存中的存储形式是什么?...
  9. “感动阿里”的技术小二刘畅:善良的事情,我身边很多人都在做
  10. 已解决:Downloading https://ultralytics.com/assets/Arial.ttf to .......ubuntu18.4-YOLOv5报错[01]