《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第2章 基础篇 学习笔记(七)2.1.2.1线性回归器总结

目录

2.1.2.1线性回归器总结

0、引言

1、模型介绍

2、数据描述

(1)美国波士顿地区房价数据描述

(2)美国波士顿地区房价数据分割

(3)美国波士顿地区房价数据标准化处理

3、编程实践

4、性能测评

5、特点分析


2.1.2.1线性回归器总结

0、引言

回归问题和分类问题的区别在于:其待预测的目标是连续变量,比如:价格、降水量等等。这里不会对回归问题的应用场景进行横向扩展;而是只针对一个“美国波士顿地区房价预测”的经典回归问题进行分析,好让读者朋友对各种回归模型的性能与优缺点有一个深入的比较。

1、模型介绍

在“2.1.1.1线性分类器总结”节中,重点介绍了用于分类的线性模型。其中为了便于将原本在实数域上的计算结果映射到(0,1)区间,引入了逻辑斯蒂函数。而在线性回归问题中,由于预测目标直接是实数域上的数值,因此优化目标就更为简单,即最小化预测结果与真实值之间的差异。

当使用一组m个用于训练的特征向量X=<x^{1},x^{2},...,x^{m}>和其对应的回归目标y=<y^{1},y^{2},...,y^{m}>时,希望线性回归模型可以最小二乘预测的损失L(w,b)。如此一来,线性回归器的常见优化目标如式(13)所示。

\underset{w,b}{argmin}L(w,b)=\underset{w,b}{argmin}L(w,b)\sum_{m}^{k=1}(f(w,x,b)-y^{k})^{2}......(13)

同样,为了学习到决定模型的参数,即系数w截距b,仍然可以使用一种精确计算的解析算法和一种快速的随机梯度下降估计算法

备注:事实上,不管是随机梯度上升(SGA)还是随机梯度下降(SGD),都隶属于用梯度法迭代渐进估计参数的过程。梯度上升用于目标最大化,梯度下降用于目标最小化。在线性回归中,会接触优化目标最小化的方程。

2、数据描述

(1)美国波士顿地区房价数据描述

# 代码34:美国波士顿地区房价数据描述
# 从sklearn.datasets导入波士顿房价数据读取器。
from sklearn.datasets import load_boston

# 从读取房价数据存储在变量boston中。
boston = load_boston()
# 输出数据描述。
print(boston.DESCR)

本地输出:

.. _boston_dataset:

Boston house prices dataset
---------------------------

**Data Set Characteristics:**  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

    :Missing Attribute Values: None

    :Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980.   N.B. Various transformations are used in the table on
pages 244-261 of the latter.

The Boston house-price data has been used in many machine learning papers that address regression
problems.   
     
.. topic:: References

   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
   - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.

结论:总体而言,该数据共有506条美国波士顿地区房价的数据,每条数据包括对指定房屋的13项数值型特征描述和目标房价。另外,数据中没有缺失的属性/特征值,更加方便了后续的分析。

(2)美国波士顿地区房价数据分割

# 代码35:美国波士顿地区房价数据分割
# 从sklearn.model_selection导入数据分割器。
from sklearn.model_selection 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))

备注:原来的导入模型from sklearn.cross_validation import train_test_split的时候,提示错误:

from sklearn.cross_validation import train_test_split
ModuleNotFoundError: No module named 'sklearn.cross_validation'

需要替换cross_validation:

from sklearn.model_selection import train_test_split

本地输出:

The max target value is 50.0
The min target value is 5.0
The average target value is 22.532806324110677

结论:预测目标房价之间的差异较大,因此需要对特征以及目标值进行标准化处理。

备注:读者无需质疑将真实房价做标准化处理的做法。事实上,尽管在标准化之后,数据有了很大的变化。但是依然可以使用标准化器中的inverse_transform函数还原真实的结果;并且,对于预测的回归值也可以采用相同的做法进行还原。

(3)美国波士顿地区房价数据标准化处理

# 代码36:训练与测试数据标准化处理
# 从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.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1, 1))

备注:原来的会报错,是因为工具包版本更新造成的;故采用以下方法。

根据错误的提示相应的找出原来出错的两行代码:

y_train = ss_y.fit_transform(y_train)
y_test = ss_y.transform(y_test)

问题出现在上面的两行代码中,例如数据格式为[1, 2, 3, 4]就会出错,如果把这行数据转换成[[1], [2], [3], [4]]就不会出错了。所以要对上面导致出错的两行代码做出修改:

y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1,1))

3、编程实践

使用最为简单的线性回归模型LinearRegressionSGDRegressor分别对波士顿房价数据进行训练学习以及预测。

# 代码37:使用线性回归模型LinearRegression和SGDRegressor分别对美国波士顿地区房价进行预测
# 从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)

4、性能测评

不同于类别预测,不能苛求回归预测的数值结果要严格地与真实值相同。一般情况下,希望衡量预测值与真实值之间的差距。因此,可以通过多种测评函数进行评价。其中最为直观的评价指标包括,平均绝对误差(Mean Absolute Error,MAE)以及均方误差(Mean Squared Error,MSE),因为这也是线性回归模型所要优化的目标。

假设测试数据共有m个目标数值y=<y^{1},y^{2},...,y^{m}>,并且记\overline{y}为回归模型的预测结果,那么具体计算MAE的步骤如式(14)与式(15)所示。

SS_{abs}=\sum_{i=1}^{m}\left | y^{i}-\overline{y} \right |......(14)

MAE=\frac{SS_{abs}}{m}......(15)

而MSE的计算方法如式(16)和式(17)所示。

SS_{tot}=\sum_{i=1}^{m}(y^{i}-\overline{y})^{2}......(16)

MSE=\frac{SS_{tot}}{m}......(17)

然而,差值的绝对值或者平方,都会随着不同的预测问题而变化巨大,欠缺在不同问题中的可比性。因此,要考虑到测评指标需要具备某些统计学含义。类似于分类问题评价中的准确性指标,回归问题也有R-squared这样的评价方式,既考量了回归值与真实值的差异,同时也兼顾了问题本身真实值的变动。假设f(x^{i})代表回归模型根据特征向量x^{i}的预测值,那么R-squared具体的计算如式(18)与式(19)所示。

SS_{res}=\sum_{i=1}^{m}(y^{i}-f(x^{i}))^{2}......(18)

R^{2}=1-\frac{SS_{res}}{SS_{tot}}......(19)

其中SS_{tot}代表测试数据真实值的方差(内部差异);SS_{res}代表回归值与真实值之间的平方差异(回归差异)。所以在统计含义上,R-squared用来衡量模型回归结果的波动可被真实值验证的百分比,也暗示了模型在数值回归方面的能力。

使用Scikit-learn自带的上述三种回归评价模块,同时还介绍了调取R-squared评价函数的两种方式。

# 代码38:使用三种回归评价机制以及两种调用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_absolute_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_absolute_error of LinearRegression is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict)))

# 使用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_absolute_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 LinearRegression is 0.675795501452948
The value of R-squared of LinearRegression is 0.675795501452948
The mean_squared_error of LinearRegression is 25.139236520353457
The mean_absolute_error of LinearRegression is 3.5325325437053983
The value of default measurement of SGDRegressor is 0.6669255972327817
The value of R-squared of SGDRegressor is 0.6669255972327817
The mean_squared_error of SGDRegressor is 25.827020376231328
The mean_absolute_error of SGDRegressor is 3.4954844266236647

结论:两种调用R-squared的方式等价的。后续有关回归模型的评价,都会采用第一种方式,即回归模型自带的评估模块来完成性能的评估。另外,也可以看出尽管三种评价方式R-squared、MSE以及MAE在具体评估结果上不同,但是在评价总体优劣程度的趋势上是一致的。

虽然,使用随机梯度下降估计参数的方法SGDRegressor在性能表现上不及使用解析方法的LinerRegression;但是如果面对训练数据规模十分庞大的任务,随机梯度法不论是在分类还是回归问题上都表现得十分高效,可以在不损失过多性能的前提下,节省大量计算时间。请读者在今后的使用中,根据预测任务的数据规模,参考图2-8选择合适的模型。根据Scikit-learn官网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第2章 基础篇 学习笔记(七)2.1.2.1线性回归器总结_第1张图片

5、特点分析

线性回归器是最为简单、易用的回归模型。正是因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据中的各个特征与回归目标之间,绝大多数不能保证严格的线性关系。尽管如此,在不清楚特征之间关系的前提下,仍然可以使用线性回归模型作为大多数科学试验的基线系统。

你可能感兴趣的:(Python机器学习及实践)