[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归多项式回归逻辑回归)

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归多项式回归逻辑回归)相关的知识,希望对你有一定的参考价值。

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

前一篇文章讲述了数据分析部分,主要普及网络数据分析的基本概念,讲述数据分析流程和相关技术,同时详细讲解Python提供的若干第三方数据分析库,包括Numpy、Pandas、Matplotlib、Sklearn等。本文介绍回归模型的原理知识,包括线性回归、多项式回归和逻辑回归,并详细介绍Python Sklearn机器学习库的LinearRegression和LogisticRegression算法及回归分析实例。进入基础文章,希望对您有所帮助。

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


监督学习(Supervised Learning)包括分类算法(Classification)和回归算法(Regression)两种,它们是根据类别标签分布的类型来定义的。回归算法用于连续型的数据预测,分类算法用于离散型的分布预测。回归算法作为统计学中最重要的工具之一,它通过建立一个回归方程用来预测目标值,并求解这个回归方程的回归系数。

一.回归

1.什么是回归

回归(Regression)最早是英国生物统计学家高尔顿和他的学生皮尔逊在研究父母和子女的身高遗传特性时提出的。1855年,他们在《遗传的身高向平均数方向的回归》中这样描述“子女的身高趋向于高于父母的身高的平均值,但一般不会超过父母的身高”,首次提出来回归的概念。现在的回归分析已经和这种趋势效应没有任何瓜葛了,它只是指源于高尔顿工作,用一个或多个自变量来预测因变量的数学方法。

在这里插入图片描述

图1是一个简单的回归模型,X坐标是质量,Y坐标是用户满意度,从图中可知,产品的质量越高其用户评价越好,这可以拟合一条直线来预测新产品的用户满意度。

在回归模型中,我们需要预测的变量叫做因变量,比如产品质量;选取用来解释因变量变化的变量叫做自变量,比如用户满意度。回归的目的就是建立一个回归方程来预测目标值,整个回归的求解过程就是求这个回归方程的回归系数。

简言之,回归最简单的定义就是:

  • 给出一个点集,构造一个函数来拟合这个点集,并且尽可能的让该点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条三次曲线,就被称为三次多项回归。

2.线性回归

首先,作者引用类似于斯坦福大学机器学习公开课线性回归的例子,给大家讲解线性回归的基础知识和应用,方便大家的理解。同时,作者强烈推荐大家学习原版Andrew Ng教授的斯坦福机器学习公开课,会让您非常受益。

在这里插入图片描述

假设存在表1的数据集,它是某企业的成本和利润数据集。数据集中2002年到2016年的数据集称为训练集,整个训练集共15个样本数据。重点是成本和利润两个变量,成本是输入变量或一个特征,利润是输出变量或目标变量,整个回归模型如图2所示。

在这里插入图片描述

现建立模型,x表示企业成本,y表示企业利润,h(Hypothesis)表示将输入变量映射到输出变量y的函数,对应一个因变量的线性回归(单变量线性回归)公式如下:

在这里插入图片描述

那么,现在要解决的问题是如何求解的两个参数和。我们的构想是选取的参数和使得函数尽可能接近y值,这里提出了求训练集(x,y)的平方误差函数(Squared Error Function)或最小二乘法。

在回归方程里,最小化误差平方和方法是求特征对应回归系数的最佳方法。误差是指预测y值和真实y值之间的差值,使用误差的简单累加将使得正差值和负差值相互抵消,所采用的平方误差(最小二乘法)如下:

在这里插入图片描述

在数学上,求解过程就转化为求一组值使上式取到最小值,最常见的求解方法是梯度下降法(Gradient Descent)。根据平方误差,定义该线性回归模型的损耗函数(Cost Function)为,公式如下:
在这里插入图片描述

选择适当的参数让其最小化min,即可实现拟合求解过程。通过上面的这个示例,我们就可以对线性回归模型进行如下定义:根据样本x和y的坐标,去预估函数h,寻求变量之间近似的函数关系。公式如下:

在这里插入图片描述

其中,n表示特征数目,表示每个训练样本的第i个特种值,当只有一个因变量x时,称为一元线性回归,类似于;而当多个因变量时,成为多元线性回归。我们的目的是使最小化,从而最好的将样本数据集进行拟合,更好地预测新的数据。

多项式回归或逻辑回归相关知识将在后面介绍。


二.线性回归分析

线性回归是数据挖掘中基础的算法之一,其核心思想是求解一组因变量和自变量之间的方程,得到回归函数,同时误差项通常使用最小二乘法进行计算。在本书常用的Sklaern机器学习包中将调用Linear_model子类的LinearRegression类进行线性回归模型计算。

1.LinearRegression

LinearRegression回归模型在Sklearn.linear_model子类下,主要是调用fit(x,y)函数来训练模型,其中x为数据的属性,y为所属类型。sklearn中引用回归模型的代码如下:

from sklearn import linear_model          #导入线性模型  
regr = linear_model.LinearRegression()    #使用线性回归  
print(regr)

输出函数的构造方法如下:

LinearRegression(copy_X=True,   
		fit_intercept=True,   
        n_jobs=1,   
        normalize=False) 

其中参数说明如下:

  • copy_X:布尔型,默认为True。是否对X复制,如果选择False,则直接对原始数据进行覆盖,即经过中心化、标准化后,把新数据覆盖到原数据上。
  • fit_intercept:布尔型,默认为True。是否对训练数据进行中心化,如果是True表示对输入的训练数据进行中心化处理,如果是False则输入数据已经中心化处理,后面的过程不再进行中心化处理。
  • n_jobs:整型,默认为1。计算时设置的任务个数,如果设置为-1表示使用所有的CPU。该参数对于目标个数大于1且规模足够大的问题有加速作用。
  • normalize:布尔型,默认为False。是否对数据进行标准化处理。

LinearRegression类主要包括如下方法:

在这里插入图片描述

  • fit(X,y[,n_jobs])
    对训练集X,y进行训练,分析模型参数,填充数据集。其中X为特征,y为标记或类属性。
  • predict(X)
    使用训练得到的估计器或模型对输入的X数据集进行预测,返回结果为预测值。数据集X通常划分为训练集和测试集。
  • decision_function(X)
    使用训练得到的估计器或模型对数据集X进行预测。它与predict(X)区别在于该方法包含了对输入数据的类型检查和当前对象是否存在coef_属性的检查,更安全。
  • score(X, y[,]samples_weight)
    返回对于以X为samples、y为target的预测效果评分。
  • get_params([deep])
    获取该估计器(Estimator)的参数。
  • **set_params(params)
    设置该估计器(Estimator)的参数。
  • coef_
    存放LinearRegression模型的回归系数。
  • intercept_
    存放LinearRegression模型的回归截距。

现在对前面的企业成本和利润数据集进行线性回归实验。完整代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import linear_model     #导入线性模型
import matplotlib.pyplot as plt       
import numpy as np

#X表示企业成本 Y表示企业利润
X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
print('数据集X: ', X)
print('数据集Y: ', Y)

#回归训练
clf = linear_model.LinearRegression() 
clf.fit(X, Y)

#预测结果
X2 = [[400], [750], [950]]
Y2 = clf.predict(X2)
print(Y2)
res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
print('预测成本1200元的利润:$%.1f' % res) 

#绘制线性回归图形
plt.plot(X, Y, 'ks')                 #绘制训练数据集散点图
plt.plot(X2, Y2, 'g-')               #绘制预测数据集直线
plt.show()

调用sklearn包中的LinearRegression()回归函数,fit(X,Y)载入数据集进行训练,然后通过predict(X2)预测数据集X2的利润,并将预测结果绘制成直线,(X,Y)数据集绘制成散点图,如图3所示。

在这里插入图片描述

同时调用代码预测2017年企业成本为1200元的利润为575.1元。注意,线性模型的回归系数会保存在coef_变量中,截距保存在intercept_变量中。clf.score(X, Y) 是一个评分函数,返回一个小于1的得分。评分过程的代码如下:

print('系数', clf.coef_)
print('截距', clf.intercept_)
print('评分函数', clf.score(X, Y))

'''
系数 [[ 0.62402912]]
截距 [-173.70433885]
评分函数 0.911831188777
'''

在这里插入图片描述

该直线对应的回归函数为:y = 0.62402912 * x - 173.70433885,则X2[1]=400这个点预测的利润值为75.9,而X1中成本为400元对应的真实利润是80元,预测是基本准确的。


2.线性回归预测糖尿病

(1).糖尿病数据集
Sklearn机器学习包提供了糖尿病数据集(Diabetes Dataset),该数据集主要包括442行数据,10个特征值,分别是:年龄(Age)、性别(Sex)、体质指数(Body mass index)、平均血压(Average Blood Pressure)、S1~S6一年后疾病级数指标。预测指标为Target,它表示一年后患疾病的定量指标。原网址的描述如图4所示:

在这里插入图片描述

下面代码进行简单的调用及数据规模的测试。

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import datasets
diabetes = datasets.load_diabetes()                           #载入数据  
print(diabetes.data)                                          #数据  
print(diabetes.target)                                        #类标  
print('总行数: ', len(diabetes.data), len(diabetes.target))         
print('特征数: ', len(diabetes.data[0]))                      #每行数据集维数  
print('数据类型: ', diabetes.data.shape)                     
print(type(diabetes.data), type(diabetes.target))     

调用load_diabetes()函数载入糖尿病数据集,然后输出其数据data和类标target。输出总行数442行,特征数共10个,类型为(442L, 10L)。其输出如下所示:

[[ 0.03807591  0.05068012  0.06169621 ..., -0.00259226  0.01990842 
  -0.01764613] 
 [-0.00188202 -0.04464164 -0.05147406 ..., -0.03949338 -0.06832974 
  -0.09220405] 
  ... 
 [-0.04547248 -0.04464164 -0.0730303  ..., -0.03949338 -0.00421986 
   0.00306441]] 
[ 151.   75.  141.  206.  135.   97.  138.   63.  110.  310.  101. 
  ... 
64.   48.  178.  104.  132.  220.   57.] 
总行数:  442 442 
特征数:  10 
数据类型:  (442L, 10L) 
<type 'numpy.ndarray'> <type 'numpy.ndarray'>         

(2).代码实现
现在我们将糖尿病数据集划分为训练集和测试集,整个数据集共442行,我们取前422行数据用来线性回归模型训练,后20行数据用来预测。其中取预测数据的代码为diabetes_x_temp[-20:],表示从后20行开始取值,直到数组结束,共取值20个数。

整个数据集共10个特征值,为了方便可视化画图我们只获取其中一个特征进行实验,这也可以绘制图形,而真实分析中,通常经过降维处理再绘制图形。这里获取第3个特征,对应代码为:diabetes_x_temp = diabetes.data[:, np.newaxis, 2]。完整代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import datasets  
import matplotlib.pyplot as plt  
from sklearn import linear_model
import numpy as np  

#数据集划分
diabetes = datasets.load_diabetes()                #载入数据  
diabetes_x_temp = diabetes.data[:, np.newaxis, 2]  #获取其中一个特征  
diabetes_x_train = diabetes_x_temp[:-20]           #训练样本  
diabetes_x_test = diabetes_x_temp[-20:]            #测试样本 后20行  
diabetes_y_train = diabetes.target[:-20]           #训练标记  
diabetes_y_test = diabetes.target[-20:]            #预测对比标记

#回归训练及预测  
clf = linear_model.LinearRegression()  
clf.fit(diabetes_x_train, diabetes_y_train)        #训练数据集  
pre = clf.predict(diabetes_x_test)

#绘图  
plt.title(u'LinearRegression Diabetes')            #标题  
plt.xlabel(u'Attributes')                          #x轴坐标  
plt.ylabel(u'Measure of disease')                  #y轴坐标    
plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black')  #散点图   
plt.plot(diabetes_x_test, pre, color='blue', linewidth = 2)     #预测直线
plt.show()          

输出结果如图5所示,每个点表示真实的值,而直线表示预测的结果。

在这里插入图片描述


(3).代码优化
下面代码增加了几个优化措施,包括增加了斜率、 截距的计算,可视化绘图增加了散点到线性方程的距离线,增加了保存图片设置像素代码等。这些优化都更好地帮助我们分析真实的数据集。

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import datasets
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

#第一步 数据集划分
d = datasets.load_diabetes()  #数据 10*442
x = d.data
x_one = x[:,np.newaxis, 2]    #获取一个特征 第3列数据
y = d.target                  #获取的正确结果
x_train = x_one[:-42]         #训练集X [  0:400]
x_test = x_one[-42:]          #预测集X [401:442]
y_train = y[:-42]             #训练集Y [  0:400]
y_test = y[-42:]              #预测集Y [401:442]

#第二步 线性回归实现
clf = linear_model.LinearRegression()
print(clf)
clf.fit(x_train, y_train)
pre = clf.predict(x_test)
print('预测结果', pre)
print('真实结果', y_test)
   
#第三步 评价结果
cost = np.mean(y_test-pre)**2   #2次方
print('平方和计算:', cost)
print('系数', clf.coef_) 
print('截距', clf.intercept_)  
print('方差', clf.score(x_test, y_test))

#第四步 绘图
plt.plot(x_test, y_test, 'k.')      #散点图
plt.plot(x_test, pre, 'g-')        #预测回归直线
#绘制点到直线距离
for idx, m in enumerate(x_test):
    plt.plot([m, m],[y_test[idx], pre[idx]], 'r-')

plt.savefig('blog12-01.png', dpi=300) #保存图片
plt.show()      

绘制的图形如图6所示。

在这里插入图片描述

输出结果如下:

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
预测结果 [ 196.51241167  109.98667708  121.31742804  245.95568858  204.75295782
  270.67732703   75.99442421  241.8354155   104.83633574  141.91879342
  126.46776938  208.8732309   234.62493762  152.21947611  159.42995399
  161.49009053  229.47459628  221.23405012  129.55797419  100.71606266
  118.22722323  168.70056841  227.41445974  115.13701842  163.55022706
  114.10695016  120.28735977  158.39988572  237.71514243  121.31742804
   98.65592612  123.37756458  205.78302609   95.56572131  154.27961264
  130.58804246   82.17483382  171.79077322  137.79852034  137.79852034
  190.33200206   83.20490209]
真实结果 [ 175.   93.  168.  275.  293.  281.   72.  140.  189.  181.  209.  136.
  261.  113.  131.  174.  257.   55.   84.   42.  146.  212.  233.   91.
  111.  152.  120.   67.  310.   94.  183.   66.  173.   72.   49.   64.
   48.  178.  104.  132.  220.   57.]

平方和计算: 83.192340827
系数 [ 955.70303385]
截距 153.000183957
方差 0.427204267067

其中cost = np.mean(y_test-pre)**2表示计算预测结果和真实结果之间的平方和,为83.192340827,根据系数和截距得出其方程为:y = 955.70303385 * x + 153.000183957。


三.多项式回归分析

1.基础概念

线性回归研究的是一个目标变量和一个自变量之间的回归问题,但有时候在很多实际问题中,影响目标变量的自变量往往不止一个,而是多个,比如绵羊的产毛量这一变量同时受到绵羊体重、胸围、体长等多个变量的影响,因此需要设计一个目标变量与多个自变量间的回归分析,即多元回归分析。由于线性回归并不适用于所有的数据,我们需要建立曲线来适应我们的数据,现实世界中的曲线关系很多都是增加多项式实现的,比如一个二次函数模型:

在这里插入图片描述

再或者一个三次函数模型:

在这里插入图片描述

这两个模型我们绘制的图形如下所示:

在这里插入图片描述

多项式回归(Polynomial Regression)是研究一个因变量与一个或多个自变量间多项式的回归分析方法。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归。17.3小节主要讲解一元多次的多项式回归分析,一元m次多项式方程如下:

在这里插入图片描述

其方程的求解过程希望读者下来自行学习,接下来作者主要讲解Python如何代码实现多项式回归分析的。


2.PolynomialFeatures

Python的多项式回归需要导入sklearn.preprocessing子类中PolynomialFeatures类实现。PolynomialFeatures对应的函数原型如下:

class sklearn.preprocessing.PolynomialFeatures(degree=2, 
		interaction_only=False, 
		include_bias=True)

PolynomialFeatures类在Sklearn官网给出的解释是:专门产生多项式的模型或类,并且多项式包含的是相互影响的特征集。共有三个参数,degree表示多项式阶数,一般默认值是2;interaction_only如果值是true(默认是False),则会产生相互影响的特征集;include_bias表示是否包含偏差列。

PolynomialFeatures类通过实例化一个多项式,建立等差数列矩阵,然后进行训练和预测,最后绘制相关图形,接下来与前面的一元线性回归分析进行对比试验。


3.多项式回归预测成本和利润

本小节主要讲解多项式回归分析实例,分析的数据集是表17.1提供的企业成本和利润数据集。下面直接给出线性回归和多项式回归分析对比的完整代码和详细注释。

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn.linear_model import LinearRegression     
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt       
import numpy as np

#X表示企业成本 Y表示企业利润
X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900][Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-MeansBIRCH树状聚类MeanShift)

[Python从零到壹] 四十二.图像处理基础篇之图像金字塔向上取样和向下取样

[Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图

[Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图

[Python从零到壹] 六十二.图像识别及经典案例篇之基于均值漂移算法和分水岭算法的图像分割

[Python从零到壹] 六十二.图像识别及经典案例篇之基于均值漂移算法和分水岭算法的图像分割