回归问题与分类问题的区别在于:期待预测的目标是连续变量,比如:价格、降水量等等。与前面的介绍方式不同,这里不会对回归的应用场景进行横向扩展;而是只针对一个“美国波士顿地区房价预测”的经典回归问题进行分析,好让读者朋友对各种回归模型的性能与优缺点有一个深入的比较。
前面介绍过分类的线性模型。其中为了便于将原本在实数域上的计算结果映射到(0,1)区间,引入了逻辑斯蒂函数。而在线性回归问题中,由于预测目标直接是实数域上的数值,因此优化目标就更为简单,即最小化预测结果与真实值之间的差异。
当使用一组m个用于训练的特征向量X=
数据描述可由下述代码获得:
# 从sklearn.datasets导入波士顿房价数据读取器。
from sklearn.datasets import load_boston
# 从读取房价数据存储在变量boston中。
boston = load_boston()
# 输出数据描述。
print boston.DESCR
Boston House Prices dataset
# 从sklearn.cross_validation导入数据分割器。
from sklearn.cross_validation import train_test_split
# 导入numpy并重命名为np。
import numpy as np
X = boston.data
y = boston.target
# 随机采样25%的数据构建测试样本,其余作为训练样本。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)
# 分析回归目标值的差异。
print "The max target value is", np.max(boston.target)
print "The min target value is", np.min(boston.target)
print "The average target value is", np.mean(boston.target)
The max target value is 50.0
# 从sklearn.preprocessing导入数据标准化模块。
from sklearn.preprocessing import StandardScaler
# 分别初始化对特征和目标值的标准化器。
ss_X = StandardScaler()
ss_y = StandardScaler()
# 分别对训练和测试数据的特征以及目标值进行标准化处理。
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_y.fit_transform(y_train)
y_test = ss_y.transform(y_test)
这里先使用最为简单的线性回归模型LinerRegression和SGDRegression分别对波士顿房价数据进行训练学习以及预测,如下图所示:
# 从sklearn.linear_model导入LinearRegression。
from sklearn.linear_model import LinearRegression
# 使用默认配置初始化线性回归器LinearRegression。
lr = LinearRegression()
# 使用训练数据进行参数估计。
lr.fit(X_train, y_train)
# 对测试数据进行回归预测。
lr_y_predict = lr.predict(X_test)
# 从sklearn.linear_model导入SGDRegressor。
from sklearn.linear_model import SGDRegressor
# 使用默认配置初始化线性回归器SGDRegressor。
sgdr = SGDRegressor()
# 使用训练数据进行参数估计。
sgdr.fit(X_train, y_train)
# 对测试数据进行回归预测。
sgdr_y_predict = sgdr.predict(X_test)
不同于类别预测,我们不能苛求回归预测的数值结果要严格地与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以通过多种测评函数进行评价。其中最为直观的评价指标包括,平均绝对误差(MAE)以及均方误差(MSE),因为这也是线性回归模型所要优化的目标。MAE与MSE具体公式请自行查阅。
其中SStot代表测试数据真实值的方式(内部差异);SSres代表回归值与真实值之间的平方差异(回归差异)。所以在统计含义上,R-squared用来衡量模型回归结果的波动可被真实值验证的百分比,也暗示了模型在数值回归方面的能力。
下面的代码展示了如何使用Sklearn自带的上述三种回归评价模块,同时还介绍了调取R-squared评价函数的两种方式。
# 使用LinearRegression模型自带的评估模块,并输出评估结果。
print 'The value of default measurement of LinearRegression is', lr.score(X_test, y_test)
# 从sklearn.metrics依次导入r2_score、mean_squared_error以及mean_absoluate_error用于回归性能的评估。
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
# 使用r2_score模块,并输出评估结果。
print 'The value of R-squared of LinearRegression is', r2_score(y_test, lr_y_predict)
# 使用mean_squared_error模块,并输出评估结果。
print 'The mean squared error of LinearRegression is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict))
# 使用mean_absolute_error模块,并输出评估结果。
print 'The mean absoluate error of LinearRegression is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict))
The value of default measurement of LinearRegression is 0.6763403831
The mean absoluate error of LinearRegression is 3.5261239964
# 使用SGDRegressor模型自带的评估模块,并输出评估结果。
print 'The value of default measurement of SGDRegressor is', sgdr.score(X_test, y_test)
# 使用r2_score模块,并输出评估结果。
print 'The value of R-squared of SGDRegressor is', r2_score(y_test, sgdr_y_predict)
# 使用mean_squared_error模块,并输出评估结果。
print 'The mean squared error of SGDRegressor is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(sgdr_y_predict))
# 使用mean_absolute_error模块,并输出评估结果。
print 'The mean absoluate error of SGDRegressor is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(sgdr_y_predict))
The value of default measurement of SGDRegressor is 0.659853975749
上述代码的输出说明:我们知道两种调用R-squared的方式等价的。后续有关回归模型的评价,我们都会采用第一种方式,即回归模型自带的评估模块来完成性能的评估。另外,也可以看出三种评价方式R-squared、MSE以及MAE在具体评估结果上不同,但是在评价总体优劣程度的趋势上是一致的。
虽然,使用随机梯度下降估计参数的方法SGDRegression在性能表现上不及使用解析方法的LinerRegression;但是如果面对训练数据规模十分庞大的任务,随机梯度法不论是在分类还是回归问题上都表现得十分高效,可以在不损失过多性能的前提下,节省大量计算时间。参考Sklearn官网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。
特点分析:线性回归期是最为简单、易用的回归模型。正是因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据中的各个特征与回归目标之间,绝大多数不能保证严格的线性关系。这一点,在决策树中已经提过。尽管如此,在不清楚特征之间关系的前提下,我们仍然可以使用线性回归模型作为大多数科学试验的基线系统。