线性回归,应用广泛、原理相对简单。主要分为单变量线性回归和多元线性回归。单变量线性回归是在两个变量之间建立类似线性方程的拟合模型,以一个变量去预测另一个变量。
1. 用于回归的线性模型
对于回归问题,线性模型预测的一般公式如下:ŷ = w[0] * x[0] + w[1] * x[1] + … + w[p] * x[p] + b
这里 x[0] 到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的参数,ŷ 是模型的预测结果。
对于单一特征的数据集,公式如下:ŷ = w[0] * x[0] + b,这就是高中数学里的直线方程。这里 w[0] 是斜率,b 是 y 轴偏移。对于有更多特征的数据集,w 包含沿每个特征坐标轴的斜率。或者,你也可以将预测的响应值看作输入特征的加权求和,权重由 w 的元素给出(可以取负值)。
2. 线性回归(又名普通最小二乘法)线性回归,或者普通最小二乘法(ordinary least squares,OLS),是回归问题最简单也最经典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
单变量线性回归
案例:波士顿房屋价格的拟合与预测
from sklearn.datasets import load_boston #从sklearn数据集库导入boston数据
import matplotlib.pyplot as plt #导入matplotlib库
import numpy as np #导入numpy库
import pandas as pd #导入pandas库
boston=load_boston() #从读取的房价数据存储在boston变量中
boston.keys() #打印boston包含元素
boston.feature_names #打印boston变量名
Boston房屋价格数据集中data即为特征变量,target为目标变量。选取data中的RM,target是MEDV变量进行单变量线性回归。
###选取RM作为特征变量
bos = pd.DataFrame(boston.data) #将data转换为DataFrame格式以方便展示
bos[5].head() #data的第6列数据为RM
###选取MEDV作为目标变量
bos_target = pd.DataFrame(boston.target) #将target转换为DataFrame格式以方便展示
bos_target.head()
绘制房屋价格、每个房屋的房间数量的散点图,由散点图可以看出房屋价格、每个房屋的房间数量存在一定的线性变化趋势,即每个房屋的房间数量越多、房屋价格越高。
import matplotlib.font_manager as fm #导入matplotlib中的文字管理库
X = bos.iloc[:,5:6] #选取data中的RM变量
y =bos_target #设定target为y
#定义自定义字体,文件名是系统中文字体
myfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
plt.scatter(X, y)
plt.xlabel(u'房屋平均房间数', fontproperties=myfont) #x轴标签设定文字为中文msyh格式
plt.ylabel(u'房屋价格', fontproperties=myfont) #y轴标签设定文字为中文msyh格式
plt.title(u'RM与MEDV的关系', fontproperties=myfont) #标题
plt.show()
数据集划分
from sklearn.model_selection import train_test_split #导入数据划分包
#以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)
模型求解与预测
from sklearn.linear_model import LinearRegression #使用LinearRegression库
lr=LinearRegression() #设定回归算法
lr.fit(X_train,y_train) #使用训练数据进行参数求解
#求解截距项为:',lr.intercept_
#'求解系数为:',lr.coef_
y_hat = lr.predict(X_test) #对测试集的预测
y_hat[0:9] #打印前10个预测值
模型评估
在求得测试集y的预测值y_hat基础上,可以对模型进行评价。首先将得到的测试集中y_test与其对应的y_hat采用图形展示。
plt.figure(figsize=(10,6)) #设置图片尺寸
t = np.arange(len(X_test)) #创建t变量
#绘制y_test曲线
plt.plot(t, y_test, 'r', linewidth=2, label='y_test')
#绘制y_test曲线
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat')
plt.legend() #设置图例
plt.show()
图形显示,测试集中房屋价格(MEDV)的预测值基本较好地拟合了真实值y_test的变化趋势。采用评估指标拟合优度R^2、MAE、RMSE对预测效果进行评价。单变量线性回归的评价方法,比如R方,还有均方误差或者均方根误差。
from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test))
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat))
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat))
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat))
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))
多变量线性回归
多元线性回归引入正则化、岭回归、Lasso回归等。
#多变量线性回归
from sklearn.datasets import load_boston #从sklearn数据集库导入boston数据
import matplotlib.pyplot as plt #导入matplotlib库
import numpy as np #导入numpy库
import pandas as pd #导入pandas库
boston=load_boston() #从读取的房价数据存储在boston变量中
bos = pd.DataFrame(boston.data) #将data转换为DataFrame格式以方便展示
###选取MEDV作为目标变量
bos_target = pd.DataFrame(boston.target) #将target转换为DataFrame格式以方便展示
###多变量的数据可视化散点图
bos.hist(xlabelsize=12,ylabelsize=12,figsize=(12,7)) #调整直方图尺寸
plt.show()
from sklearn.model_selection import train_test_split #导入数据划分包
X=bos.iloc[:,0:-1]
y=bos.MEDV
#以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)
from sklearn.linear_model import LinearRegression #使用LinearRegression库
lr=LinearRegression() #设定回归算法
lr.fit(X_train,y_train) #使用训练数据进行参数求解
#'求解截距项为:'
lr.intercept_
#'求解系数为:'
lr.coef_
根据求出的参数对测试集进行预测
y_hat = lr.predict(X_test) #对测试集的预测
y_hat[0:9] #打印前10个预测值
plt.figure(figsize=(10,6)) #设置图片尺寸
t = np.arange(len(X_test)) #创建t变量
#绘制y_test曲线
plt.plot(t, y_test, 'r', linewidth=2, label='y_test')
#绘制y_test曲线
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat')
plt.legend() #设置图例
plt.show()
对预测结果进行评价,采用评估指标拟合优度R^2、MAE、MSE、RMSE对预测效果进行评价
from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test))
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat))
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat))
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat))
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))