【2】监督学习--2--回归

三、回归分析

回归:统计学分析数据的方法,目的在于了解两个或多个变数间是否相关、 研究其相关方向与强度,并建立数学模型以便观察特定变数来预测研究者感兴 趣的变数。回归分析可以帮助人们了解在自变量变化时因变量的变化量。一般 来说,通过回归分析我们可以由给出的自变量估计因变量的条件期望。

Sklearn vs. 回归

Sklearn提供的回归函数主要被封装在两个子模块中,分别是 sklearn.linear_model和sklearn.preprocessing。

sklearn.linear_modlel封装的是一些线性函数,线性回归函数包括有:

  • 普通线性回归函数( LinearRegression )
  • 岭回归(Ridge)
  • Lasso(Lasso)

非线性回归函数,如多项式回归(PolynomialFeatures)则通过 sklearn.preprocessing子模块进行调用

回归应用

回归方法适合对一些带有时序信息的数据进行预测或者趋势拟合,常用在 金融及其他涉及时间序列分析的领域:

  • 股票趋势预测
  • 交通流量预测

线性回归

线性回归(Linear Regression)

是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分 析方法。

线性回归利用称为线性回归方程的最小平方函数对一个或多个自 变量和因变量之间关系进行建模。这种函数是一个或多个称为回 归系数的模型参数的线性组合。只有一个自变量的情况称为简单 回归,大于一个自变量情况的叫做多元回归。

线性回归:使用形如y=wTx+b 的线性模型拟合数据输入和输出之 间的映射关系的。

线性回归的实际用途

线性回归有很多实际的用途,分为以下两类:

  1. 如果目标是预测或者映射,线性回归可以用来对观测数据集的y和X 的值拟合出一个预测模型。当完成这样一个模型以后,对于一个新增的X值, 在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个 y值。
  2. 给定一个变量y和一些变量X , ⋯ ,𝑋,这些变量有可能与y相关,回归分析可以用来量化y与X之间相关性的强度,评估出与y不相关的Xj,并识别出哪些子集包含了关于y的冗余信息。

线性回归的应用

背景:与房价密切相关的除了单位的房价,还有房屋的尺寸。我们可以根 据已知的房屋成交价和房屋的尺寸进行线性回归,继而可以对已知房屋尺 寸,而未知房屋成交价格的实例进行成交价格的预测

目标:对房屋成交信息建立回归方程,并依据回归方程对房屋价格进行预测 技术路线:sklearn.linear_model.LinearRegression

实例数据

为了方便展示,成交信息只使用 了房屋的面积以及对应的成交价格。 其中:

  • 房屋面积单位为平方英尺(ft2)房
  • 屋成交价格单位为万

可行性分析

  • 简单而直观的方式是通过数据的可视化直接观察房屋成交价格与房 屋尺寸间是否存在线性关系。
  • 对于本实验的数据来说,散点图就可以很好的将其在二维平面中进 行可视化表示。

右图为数据的散点图,其中横坐 标为房屋面积,纵坐标为房屋的成 交价格。可以看出,靠近坐标左下 角部分的点,表示房屋尺寸较小的 房子,其对应的房屋成交价格也相 对较低。同样的,靠近坐标右上部 分的点对应于大尺寸高价格的房 屋。从总体来看,房屋的面积和成 交价格基本成正比。

实验过程

使用算法:线性回归 实现步骤:

  1. 建立工程并导入sklearn包
  2. 加载训练数据,建立回归方程
  3. 可视化处理

    import matplotlib.pyplot as plt import numpy as np from sklearn import linear_model

    读取数据集

    datasets_X = [] datasets_Y = [] fr = open(‘prices.txt’,‘r’) lines = fr.readlines() for line in lines: items = line.strip().split(‘,’) datasets_X.append(int(items[0])) datasets_Y.append(int(items[1]))

    length = len(datasets_X) datasets_X = np.array(datasets_X).reshape([length,1]) datasets_Y = np.array(datasets_Y)

    minX = min(datasets_X) maxX = max(datasets_X) X = np.arange(minX,maxX).reshape([-1,1])

    linear = linear_model.LinearRegression() linear.fit(datasets_X, datasets_Y)

    调用sklearn.linear_model.LinearRegression()所需参数: fit_intercept : 布尔型参数,表示是否计算该模型截距。可选参数。 normalize : 布尔型参数,若为True,则X在回归前进行归一化。可选参数。默认值为False。 copy_X : 布尔型参数,若为True,则X将被复制;否则将被覆盖。可选参数。默认值为True。 n_jobs : 整型参数,表示用于计算的作业数量;若为-1,则用所有的CPU。可选参数。默认值为1。


    线性回归fit函数用于拟合输入输出数据,调用形式为linear.fit(X,y, sample_weight=None): X : X为训练向量; y : y为相对于X的目标向量; sample_weight : 分配给各个样本的权重数组,一般不需要使用,可省略。

    图像中显示

    plt.scatter(datasets_X, datasets_Y, color = ‘red’) plt.plot(X, linear.predict(X), color = ‘blue’) plt.xlabel(‘Area’) plt.ylabel(‘Price’) plt.show()

多项式回归

  • 多项式回归(Polynomial Regression)是研究一个因变量与一 个或多个自变量间多项式的回归分析方法。如果自变量只有一个 时,称为一元多项式回归;如果自变量有多个时,称为多元多项 式回归。
  • 一元m次多项式回归方程为:
  • 二元二次多项式回归方程为:

  • 在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但 是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归。 多项式回归的最大优点就是可以通过增加x的高次项对实测点进行逼近,直至满意为止。

  • 事实上,多项式回归可以处理相当一类非线性问题,它在回归分析 中占有重要的地位,因为任一函数都可以分段用多项式来逼近。

应用背景:我们在前面已经根据已知的房屋成交价和房屋的尺寸进行了线 性回归,继而可以对已知房屋尺寸,而未知房屋成交价格的实例进行了成 交价格的预测,但是在实际的应用中这样的拟合往往不够好,因此我们在 此对该数据集进行多项式回归。

目标:对房屋成交信息建立多项式回归方程,并依据回归方程对房屋价格进 行预测

技术路线:sklearn.preprocessing.PolynomialFeatures

实例数据

成交信息包括房屋的面积以及对 应的成交价格: * 房屋面积单位为平方英尺(ft2) * 房屋成交价格单位为万

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures


# 读取数据集
datasets_X = []
datasets_Y = []
fr = open('prices.txt','r')
lines = fr.readlines()
for line in lines:
    items = line.strip().split(',')
    datasets_X.append(int(items[0]))
    datasets_Y.append(int(items[1]))

length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length,1])
datasets_Y = np.array(datasets_Y)

minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])

poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(datasets_X)
lin_reg_2 = linear_model.LinearRegression()
lin_reg_2.fit(X_poly, datasets_Y)

sklearn中多项式回归: 这里的多项式回归实际上是先将变量X处理成多项式特征,然后使用线性模型学
习多项式特征的参数,以达到多项式回归的目的。 例如:X = [x1, x2]
1.使用PolynomialFeatures构造X的二次多项式特征X_Poly:
X_Poly = [x1, x2, x1x2, x2*x2, x1*x1]
 2.使用linear_model学习X_Poly和y之间的映射关系,即参数:
w1x1 + w2x2 +w3x1x2 +w4x1x1+w5x2x2 = y

degree=2表示建立datasets_X的二 次多项式特征X_poly。然后创建线 性回归,使用线性模型学习X_poly 和datasets_Y之间的映射关系(即 参数)。

# 图像中显示
plt.scatter(datasets_X, datasets_Y, color = 'red')
plt.plot(X, lin_reg_2.predict(poly_reg.fit_transform(X)), color = 'blue')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()

岭回归

解决传统的基于最小二乘的线性回归法缺乏稳定性。

。。。公式略

岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计回归方 法 是一种改良的最小二乘估计法,对某些数据的拟合要强于最小二乘法。 在sklearn库中,可以使用sklearn.linear_model.Ridge调用岭回归模型,其 主要参数有:

  • alpha:正则化因子,对应于损失函数中
  • fit_intercept:表示是否计算截距
  • solver:设置计算参数的方法,可选参数‘auto’、‘svd’、‘sag’等

交通流量预测实例

数据介绍:

交通流量预测实例 数据为某路口的交通流量监测数据,记录全年小时级别的车流量。

实验目的:

根据已有的数据创建多项式特征,使用岭回归模型代替一般的线性模型,对 车流量的信息进行多项式回归。

技术路线:sklearn.linear_model.Ridgefrom sklearn.preprocessing.PolynomialFeatures

1.建立工程,导入sklearn相关工具包

>> import numpy as np
>>> from sklearn.linear_model import Ridge #通过sklearn.linermodel加载岭回归方法
>>> from sklearn import cross_validation #加载交叉验证模块,加载matplotilib模块
>>> import matplotlib.pyplot as plt
>>> from sklearn.preprocessing import PolynomialFeatures #通过。。加载。。。用于创建多项式特征,如ab、a2、b2

2.数据加载:

data=np.genfromtxt('data.txt') #使用numpy的方法从txt文件中加载数据 >>> plt.plot(data[:,4]) #使用plt展示车流量信息,如右图

3.数据处理:

ata[:,:4]
#X用于保存0-3维数据,即属性
>>> y=data[:,4]
#y用于保存第4维数据,即车流量
>>> poly=PolynomialFeatures(6) #用于创建最高次数6次方的的多项式特征,多次试验后决定采用6次 >>> X=poly.fit_transform(X)
#X为创建的多项式特征

4.划分训练集和测试集:

>>> train_set_X, test_set_X , train_set_y, test_set_y = cross_validation.train_test_split(X,y,test_size=0.3,
                                      random_state=0)
#将所有数据划分为训练集和测试集,test_size表示测试集的比例, #random_state是随机数种子

5.创建回归器,并进行训练:

>>> clf=Ridge(alpha=1.0,fit_intercept = True) #接下来我们创建岭回归实例
>>> clf.fit(train_set_X,train_set_y) #调用fit函数使用训练集训练回归器
>>> clf.score(test_set_X,test_set_Y) #利用测试集计算回归曲线的拟合优度,clf.score返回值为0.7375 #拟合优度,用于评价拟合好坏,最大为1,无最小值,当对所有输入都输 出同一个值时,拟合优度为0。
  1. 画出拟合曲线:

    start=200 #接下来我们画一段200到300范围内的拟合曲线 >>> end=300 >>> y_pre=clf.predict(X) #是调用predict函数的拟合值 >>> time=np.arange(start,end) >>> plt.plot(time,y[start:end],‘b’, label=“real”) >>> plt.plot(time,y_pre[start:end],‘r’, label=‘predict’) #展示真实数据(蓝色)以及拟合的曲线(红色) >>> plt.legend(loc=‘upper left’) #设置图例的位置 >>> plt.show()

分析结论:预测值和实际值的走势大致相同

个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学