Python机器学习及实践——基础篇8(LinerR和SGD)

Posted Lenskit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python机器学习及实践——基础篇8(LinerR和SGD)相关的知识,希望对你有一定的参考价值。

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

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

    当使用一组m个用于训练的特征向量X=<x1,x2…xm>和其对应的回归目标y=<y1,y2…ym>时,我们希望线性回归模型可以最小二乘预测的损失L(w,b),具体公式可自行查询。为了学习到决定模型的参数,即系数w和截距b,仍然可以使用一种精确计算的解析算法和一种快速的随机梯度下降估计算法。

    数据描述可由下述代码获得:

# 从sklearn.datasets导入波士顿房价数据读取器。
from sklearn.datasets import load_boston
# 从读取房价数据存储在变量boston中。
boston = load_boston()
# 输出数据描述。
print boston.DESCR
Boston House Prices dataset
Notes

------

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.
http://archive.ics.uci.edu/ml/datasets/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.  
**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.
   - many more! (see http://archive.ics.uci.edu/ml/datasets/Housing)
    我们节选了部分有价值的用于数据描述的输出。总体而言,该数据共有506条美国波士顿地区房价的数据,每条数据包括对指定房屋的13项数值型特征描述和目标房价。另外,数据中没有缺失的特征值,更加方便了后续的分析。要注意的是,后面的多篇博客中使用的模型都将使用这个数据集。
# 从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
The min target value is 5.0
The average target value is 22.5328063241
在上述对数据的初步查验中发现,预测目标房价之间的差异较大,因此需要对特征以及目标值进行标准版处理,代码如下所示:
# 从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具体公式请自行查阅。
    差值的绝对值或者平方,都会随着不同的预测问题而变化巨大,欠缺在不同问题中的可比性。因此,我们要考虑到测评指标需要具备某些统计学含义。类似于分类问题评价中的准确性指标,回归问题也有R-squared这样的评价方式,既考量了回归值与真实值的差异,同时也兼顾了问题本身真实值的变动。
    假设f(x)代表回归模型根据特征向量x的预测值,那么R-squared具体的计算如下式:

    

    其中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 value of R-squared of LinearRegression is 0.6763403831
The mean squared error of LinearRegression is 25.0969856921

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
The value of R-squared of SGDRegressor is 0.659853975749
The mean squared error of SGDRegressor is 26.3753630607
The mean absoluate error of SGDRegressor is 3.55075990424

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

    虽然,使用随机梯度下降估计参数的方法SGDRegression在性能表现上不及使用解析方法的LinerRegression;但是如果面对训练数据规模十分庞大的任务,随机梯度法不论是在分类还是回归问题上都表现得十分高效,可以在不损失过多性能的前提下,节省大量计算时间。参考Sklearn官网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。

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




以上是关于Python机器学习及实践——基础篇8(LinerR和SGD)的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习及实践——基础篇4(朴素贝叶斯)

Python机器学习及实践——基础篇11(回归树)

Python机器学习及实践——基础篇12(集成模型)

Python机器学习及实践——基础篇6(决策树)

Python机器学习及实践——基础篇10(K近邻回归)

Python机器学习及实践——基础篇7(分类集成模型)