逻辑斯蒂回归

关注公众号“轻松学编程”了解更多。

关键词】Logistics函数,最大似然估计,梯度下降法

1、Logistics回归的原理

利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。

训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理。

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。

1) 构造预测函数

Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于二分类问题(即输出只有两种)。首先需要先找到一个预测函数(h),显然,该函数的输出必须是两类值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

该函数形状为:

2)优缺点

  • 优点:实现简单,计算代价不高,速度很快

  • 缺点:分类精度可能不高

  • 适用场景:样本数据量极大的情况下

2、实战

sklearn.linear_model.LogisticRegression(solver=‘liblinear’)

solver参数的选择:

  • “liblinear”:小数量级的数据集
  • “lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
  • “sag”:极大的数据集

注意

以下命令都是在浏览器中输入。

cmd命令窗口输入:jupyter notebook

后打开浏览器输入网址http://localhost:8888/

1) 手写数字数据集的分类

使用KNN与Logistic回归两种方法

导包
  1. #导入数据load_digits()
  2. from matplotlib import pyplot as plt
  3. from sklearn.datasets import load_digits
获取数据
  1. digits = load_digits()
  2. #digits
  1. images = digits.images#表示的是真实的图片数据
  2. data = digits.data #样本特征数据
  3. target = digits.target #目标数据
  4. #images.shape返回的(1797,8,8)表示的是一共1717张像素为8*8的图片,
  5. #如果将每张图片作为特征样本,则一共有1717个样本数据。每一个样本数据
  6. #都是一个8*8的二维数据。
  7. #data是images可作为样本特征数据的一种形式。
  8. #images本身不可作为样本的特征数据。
  9. #原因是:特征数据都是二维形式存在的,行表示特征数据的个数,
  10. #列表示特征的不同分类。
  11. #而images是三维的需要进行扁平化处理成二维的才可作为特征数据。
  12. #而data就是images经过扁平化处理之后的数据值。

如果图像样本集中没有把图像扁平化处理成二维数据,那么需要自己手动处理,处理代码如下(本实例中已经有处理好的二维数据data)

  1. #对一个8*8的图片进行扁平化处理,通过循环逐一进行扁平化处理
  2. data_= images[0].ravel().reshape(1,-1)
  3. for i in range(1,images.shape[0]):
  4. data_=np.concatenate((data_,images[i].ravel().reshape(1,-1)))
  5. data_.shape
  6. #得到的data_和data是一样的的
创建模型,训练和预测
  1. from sklearn.model_selection import train_test_split
  2. from sklearn.linear_model import LogisticRegression
  3. from sklearn.neighbors import KNeighborsClassifier
拆分样本集
  1. X_train,X_test,y_train,y_test = train_test_split(data,target,
  2. test_size=0.2,
  3. random_state=1)
logistic 分类模型
  1. #创建模型对象
  2. logistic = LogisticRegression()
  1. #测试 训练模型花费的时间
  2. %time logistic.fit(X_train,y_train)

  1. #对训练后的模型进行评分
  2. logistic.score(X_test,y_test)

knn分类模型
  1. #创建模型
  2. knn = KNeighborsClassifier(n_neighbors=9)
  1. #测试 训练模型花费的时间
  2. %time knn.fit(X_train,y_train)

  1. #对训练后的模型进行评分
  2. knn.score(X_test,y_test)

2) 使用make_blobs产生数据集进行分类

导包使用datasets.make_blobs创建一系列点

Logistics模型

导包
  1. import numpy as np
  2. import pandas as pd
  3. from pandas import Series,DataFrame
  4. import matplotlib.pyplot as plt
  5. %matplotlib inline
  1. # make_blobs是一个函数,可以创建一个分类样本集
  2. from sklearn.datasets import make_blobs
  3. from sklearn.linear_model import LogisticRegression
创建分类样本集

设置三个中心点,随机创建150个点

  1. #参数1:样本个数
  2. #参数2:样本特征数
  3. #参数3:表示中心点(分类的类别数量)。一类样本数据会围绕中心点分布
  4. #返回值:样本集(特征数据和目标数据)
  5. X_train,y_train = make_blobs(n_samples=150,n_features=2,centers=3)
  6. #centers=[[2,6],[4,2],[6,5]],参数centers可以是具体的坐标点
绘制分类样本图
  1. plt.scatter(X_train[:,0],X_train[:,1],c=y_train)

创建logistic分类模型
  1. logistic = LogisticRegression()
训练模型
  1. logistic.fit(X_train,y_train)
获取坐标系所有点作为测试数据
  1. #将整个坐标系中的所有点获取,作为分类测试数据
  2. xmin,xmax = X_train[:,0].min()-0.5,X_train[:,0].max()+0.5
  3. ymin,ymax = X_train[:,1].min()-0.5,X_train[:,1].max()+0.5
  4. x = np.linspace(xmin,xmax,300)
  5. y = np.linspace(ymin,ymax,300)
  6. xx,yy = np.meshgrid(x,y)
  7. X_test = np.c_[xx.ravel(),yy.ravel()]
模型预测
  1. #获得分类测试结果
  2. y_ = logistic.predict(X_test)
绘制分类边界图
  1. from matplotlib.colors import ListedColormap
  2. cmap = ListedColormap(['r','g','b'])


logistic模型绘制的分类边界是一条直线。

Knn模型

  1. #导入knn模型包
  2. from sklearn.neighbors import KNeighborsClassifier
  3. #创建模型并训练
  4. knn = KNeighborsClassifier(n_neighbors=5)
  5. knn.fit(X_train,y_train)
  6. #获取模型预测的数据
  7. y1_ = knn.predict(X_test)
  1. #绘制分类边界图
  2. plt.scatter(X_test[:,0],X_test[:,1],c=y1_,cmap=cmap)
  3. plt.scatter(X_train[:,0],X_train[:,1],c=y_train)

knn模型绘制的分类边界是一条曲线,预测结果更加精准。

结论

KNN和Logistic对比:
KNN:时间和空间复杂度高。准确率高。
Logistic:时间复杂度和空间复杂度低,准确率低于KNN 。

3)预测年收入是否大于50K美元

读取adult.txt文件,并使用逻辑斯底回归算法训练模型,根据种族、职业、工作时长来预测一个人的性别 。

  1. #导包
  2. import numpy as np
  3. import pandas as pd
  4. from pandas import Series,DataFrame
  5. import matplotlib.pyplot as plt
  6. %matplotlib inline
  7. #读取数据
  8. data= pd.read_csv('./adults.txt')
  9. data
  1. #提取特征数据
  2. features=data[['race','occupation','hours_per_week']]
  3. features.head()

  1. #提取目标数据
  2. target=data['sex']
  3. target.head()

  1. #‘race’这一列里的数据是字符串,
  2. #需要映射替换成数字才能参与模型训练的运算
  3. #获取种族类型数量
  4. r_unique=features['race'].unique()
  5. r_unique_size=r_unique.size
  6. #创建对角矩阵
  7. dm=np.eye(r_unique_size)
  8. #定义一个映射函数
  9. def trans(r):
  10. index=np.argwhere(r==r_unique)[0][0]
  11. return dm[index]
  12. #映射
  13. features['race']=features['race'].map(trans)
  1. #‘occupation’职业也一样,需要映射替换成数字
  2. o_unique=features['occupation'].unique()
  3. o_unique_size=o_unique.size
  4. #创建对角矩阵
  5. dm=np.eye(o_unique_size)
  6. #定义一个映射函数
  7. def trans(o):
  8. index=np.argwhere(o==o_unique)[0][0]
  9. return dm[index]
  10. #映射
  11. features['occupation']=features['occupation'].map(trans)
  1. features.head()

  1. #‘race’里面的每一个数组拆分成n列然后再合并
  2. race=features['race'][0]
  3. for item in features['race'][1:]:
  4. race=np.concatenate((race,item))
  1. race=race.reshape(-1,r_unique_size)
  2. race

  1. #‘occupation’里面的每一个数组拆分成n列然后再合并
  2. occupation=features['occupation'][0]
  3. for item in features['occupation'][1:]:
  4. occupation=np.concatenate((occupation,item))
  1. occupation=occupation.reshape(-1,o_unique_size)
  2. occupation

  1. hours=features['hours_per_week'].values.reshape(-1,1)
  2. hours

  1. #把三个特征数据合并成二维数组
  2. train=np.hstack((race,occupation,hours))
  3. train

  1. #对最后一列进行归一化处理
  2. train[:,-1:] = train[:,-1:]/train[:,-1:].sum()
  3. train[:,-1:]

  1. #导入模型包
  2. from sklearn.linear_model import LogisticRegression
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.model_selection import train_test_split
  1. #把样本集数据拆分成训练数据和测试数据
  2. x_train,x_test,y_train,y_test=train_test_split(train,target,
  3. test_size=0.2,
  4. random_state=1)
logistic模型
  1. #创建logistic模型对象
  2. logistic=LogisticRegression()
  3. #训练模型
  4. logistic.fit(x_train,y_train)
  5. #对模型进行评分
  6. logistic.score(x_test,y_test)

  1. #检测logistic模型训练花费的时间
  2. %time logistic.fit(x_train,y_train)

knn模型
  1. knn=KNeighborsClassifier(n_neighbors=99)
  2. knn.fit(x_train,y_train)
  3. #对模型进行评分
  4. knn.score(x_test,y_test)

  1. #检测knn模型训练花费的时间
  2. %time knn.fit(x_train,y_train)

4)从疝气病症预测病马的死亡率

  1. #导入归一化函数处理包
  2. from sklearn.preprocessing import MinMaxScaler,StandardScaler,Normalizer
  3. #读取数据
  4. train = pd.read_csv('./data/horseColicTraining.txt',
  5. sep='\t',header=None)
  6. test = pd.read_csv('./data/horseColicTest.txt',
  7. sep='\t',header=None)
  8. #训练集的特征数据和目标数据
  9. X_train = train.values[:,:21]
  10. y_train = train[21]
  11. #测试集的特征数据和目标数据
  12. X_test = test.values[:,:21]
  13. y_test = test[21]
  14. #使用函数Normalizer()进行归一化处理
  15. X_test1 = Normalizer().fit_transform(X_test)
  16. X_train1 = Normalizer().fit_transform(X_train)
  17. #创建knn模型
  18. knn = KNeighborsClassifier()
  19. #训练模型并评分
  20. knn.fit(X_train1,y_train).score(X_test1,y_test)


使用MinMaxScaler()对特征数据进行归一化

  1. X_train2 = MinMaxScaler().fit_transform(X_train)
  2. X_test2 = MinMaxScaler().fit_transform(X_test)
  3. #训练模型并评分
  4. knn.fit(X_train2,y_train).score(X_test2,y_test)

使用StandardScaler()对特征数据进行归一化

  1. X_train3 = StandardScaler().fit_transform(X_train)
  2. X_test3 = StandardScaler().fit_transform(X_test)
  3. #训练模型并评分
  4. knn.fit(X_train3,y_train).score(X_test3,y_test)

使用logistic模型

  1. #创建logistic模型对象
  2. logistic = LogisticRegression(C=3)
  3. #训练模型并评分
  4. logistic.fit(X_train1,y_train).score(X_test1,y_test)

结论:

从评分可以看出在这个例子中logistic模型评分较高,使用这个模型较好。

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python机器学习实现逻辑斯蒂回归的更多相关文章

  1. 【转】机器学习笔记之(3)——Logistic回归(逻辑斯蒂回归)

    原文链接:https://blog.csdn.net/gwplovekimi/article/details/80288964 本博文为逻辑斯特回归的学习笔记.由于仅仅是学习笔记,水平有限,还望广大读 ...

  2. 机器学习之LinearRegression与Logistic Regression逻辑斯蒂回归(三)

    一 评价尺度 sklearn包含四种评价尺度 1 均方差(mean-squared-error) 2 平均绝对值误差(mean_absolute_error) 3 可释方差得分(explained_v ...

  3. spark机器学习从0到1逻辑斯蒂回归之(四)

      逻辑斯蒂回归 一.概念 逻辑斯蒂回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型.logistic回归的因变量可以是二分类的,也可以是多分类的.logis ...

  4. [置顶] 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3

    转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9113681 最近在看Ng的机器学习公开课,Ng的讲法循循善诱,感觉提高了不少 ...

  5. 【分类器】感知机+线性回归+逻辑斯蒂回归+softmax回归

    一.感知机     详细参考:https://blog.csdn.net/wodeai1235/article/details/54755735 1.模型和图像: 2.数学定义推导和优化: 3.流程 ...

  6. 【项目实战】pytorch实现逻辑斯蒂回归

    视频指导:https://www.bilibili.com/video/BV1Y7411d7Ys?p=6 一些数据集 在pytorch框架下,里面面有配套的数据集,pytorch里面有一个torchv ...

  7. [转]逻辑斯蒂回归 via python

    # -*- coding:UTF-8 -*-import numpydef loadDataSet(): return dataMat,labelMat def sigmoid(inX): retur ...

  8. 逻辑斯蒂回归(Logistic Regression)

    逻辑回归名字比较古怪,看上去是回归,却是一个简单的二分类模型. 逻辑回归的模型是如下形式: 其中x是features,θ是feature的权重,σ是sigmoid函数.将θ0视为θ0*x0(x0取值为 ...

  9. 逻辑斯蒂回归VS决策树VS随机森林

    LR 与SVM 不同 1.logistic regression适合需要得到一个分类概率的场景,SVM则没有分类概率 2.LR其实同样可以使用kernel,但是LR没有support vector在计 ...

随机推荐

  1. Hibernate4.3 HQL查询

    HQL:Hibernate专属语言,可以跨数据库 一.基本查询 1 public void testQuery(){ 2 Session session = HibernateUtils.getSes ...

  2. Go 指针相关

    Go指针 Go语言中的指针非常简单,没有偏移和运算,只需要记住两个符号.&取变量地址与*根据地址取值. 以下是一个简单的示例: package main import ( "fmt& ...

  3. 无所不能的Embedding 2. FastText词向量&文本分类

    Fasttext是FaceBook开源的文本分类和词向量训练库.最初看其他教程看的我十分迷惑,咋的一会ngram是字符一会ngram又变成了单词,最后发现其实是两个模型,一个是文本分类模型[Ref2] ...

  4. sprintf_s() 、sprintf()和printf()区别和用法

    转载:https://blog.csdn.net/qq_35608277/article/details/80878802 int sprintf_s(char *buffer,size_t size ...

  5. 【总结】Oracle数据库 查看表空间和增加表空间

    一.Oracle查看 表空间 的名称及其大小 查看 表空间的名称及其大小的SQL语句: select t1.tablespace_name,round(sum(bytes/(1024*1024)),0 ...

  6. 一个故事看懂AI神经网络工作原理

    我是一个AI神经元 我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇. 之所以叫这个名字,是因为我的工作有点像人类身体中的神经元. 人体中的神经元可以传递生物信号,给它输入一个信号,它经 ...

  7. lua 1.1 源码阅读总结

    GC 1. 怎么回收的lua 中所有已经分配的数据都会用一些指令的数据结构来记录,当需要回收时,先遍历当前栈内所有 object,把 ref 标志位打上 1,遍历符号表(这部分不能回收),反符号表中的 ...

  8. 测试AAA

    程序计数器(线程私有) 程序计数器(Program Counter Register),也有称作为 PC 寄存器.保存的是程序当 前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当 ...

  9. 【找规律】ARC 066D Xor Sum AtCoder - 2272

    题目大意 给出一个整数\(n\),已知\(0\le u,v\le n\),求满足\(a\ xor\ b=u\)且\(a+b=v\)的\(a.b\)对数 样例1输入 3 样例1输出 5 /* u=0,v ...

  10. Monolog - Logging for PHP

    github地址:https://github.com/Seldaek/monolog 使用 Monolog 安装 核心概念 日志级别 配置一个日志服务 为记录添加额外的数据 使用通道 自定义日志格式 ...