计算回归准确性
现在已经建立了回归器,接下来最重要的就是如何评价回归器的拟合效果。在模型评价的相关内容中,用误差(error)表示实际值与模型预测值之间的差值。
准备工作
下面快速了解几个衡量回归器拟合效果的重要指标(metric)。回归器可以用许多不同的指标进行衡量,部分指标如下所示。
- 平均绝对误差(mean absolute error):
这是给定数据集的所有数据点的绝对误差平均值。
- 均方误差(mean squared error):
这是给定数据集的所有数据点的误差的平方的平均值。这是最流行的指标之一。
- 中位数绝对误差(median absolute error):
这是给定数据集的所有数据点的误差的中位数。这个指标的主要优点是可以消除异常值(outlier)的干扰。测试数据集中的单个坏点不会影响整个误差指标,均值误差指标会受到异常点的影响。
- 解释方差分(explained variance score):
这个分数用于衡量我们的模型对数据集波动的解释能力。如果得分1.0分,那么表明我们的模型是完美的。
- R方得分(R2 score):
这个指标读作“R方”,是指确定性相关系数,用于衡量模型对未知样本预测的效果。最好的得分是1.0,值也可以是负数。
详细步骤
scikit-learn里面有一个模块,提供了计算所有指标的功能。重新打开一个Python文件,然后输入以下代码:
import sklearn.metrics as sm
print "Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred), 2)
print "Mean squared error =", round(sm.mean_squared_error(y_test, y_ test_pred), 2)
print "Median absolute error =", round(sm.median_absolute_error(y_ test, y_test_pred), 2)
print "Explained variance score =", round(sm.explained_variance_ score(y_test, y_test_pred), 2)
print "R2 score =", round(sm.r2_score(y_test, y_test_pred), 2)
每个指标都描述得面面俱到是非常乏味的,因此只选择一两个指标来评估我们的模型。通常的做法是尽量保证均方误差最低,而且解释方差分最高。
保存模型数据
模型训练结束之后,如果能够把模型保存成文件,那么下次再使用的时候,只要简单地加载就可以了。
用程序保存模型的具体操作步骤如下。
(1) 在Python文件regressor.py中加入以下代码:
import cPickle as pickle
output_model_file = 'saved_model.pkl'
with open(output_model_file, 'w') as f:
pickle.dump(linear_regressor, f)
(2) 回归模型会保存在saved_model.pkl文件中。下面看看如何加载并使用它,代码如下所示:
with open(output_model_file, 'r') as f:
model_linregr = pickle.load(f)
y_test_pred_new = model_linregr.predict(X_test)
print "\nNew mean absolute error =", round(sm.mean_absolute_ error(y_test, y_test_pred_new), 2)
(3) 这里只是把回归模型从Pickle文件加载到model_linregr变量中。你可以将打印结果与前面的结果进行对比,确认模型与之前的一样。
创建岭回归器
线性回归的主要问题是对异常值敏感。在真实世界的数据收集过程中,经常会遇到错误的度量结果。而线性回归使用的普通最小二乘法,其目标是使平方误差最小化。这时,由于异常值误差的绝对值很大,因此会引起问题,从而破坏整个模型。
准备工作
先看图1-4。
右下角的两个数据点明显是异常值,但是这个模型需要拟合所有的数据点,因此导致整个模型都错了。仅凭直觉观察,我们就会觉得如图1-5的拟合结果更好。
普通最小二乘法在建模时会考虑每个数据点的影响,因此,最终模型就会像图1-4显示的直线那样。显然,我们发现这个模型不是最优的。为了避免这个问题,我们引入正则化项的系数作为阈值来消除异常值的影响。这个方法被称为岭回归。
详细步骤
接下来看看如何用Python建立岭回归器。
(1) 你可以从data_multi_variable.txt文件中加载数据。这个文件的每一行都包含多个数值。除了最后一个数值外,前面的所有数值构成输入特征向量。
(2) 把下面的代码加入regressor.py文件中。我们用一些参数初始化岭回归器:
ridge_regressor = linear_model.Ridge(alpha=0.01, fit_ intercept=True, max_iter=10000)
(3) alpha参数控制回归器的复杂程度。当alpha趋于0时,岭回归器就是用普通最小二乘法的线性回归器。因此,如果你希望模型对异常值不那么敏感,就需要设置一个较大的alpha值。这里把alpha值设置为0.01。
(4) 下面让我们来训练岭回归器。
ridge_regressor.fit(X_train, y_train)
y_test_pred_ridge = ridge_regressor.predict(X_test)
print "Mean absolute error =", round(sm.mean_absolute_error
(y_ test, y_test_pred_ridge), 2)
print "Mean squared error =", round(sm.mean_squared_error
(y_test, y_test_pred_ridge), 2)
print "Median absolute error =", round(sm.median_absolute_error
(y_ test, y_test_pred_ridge), 2)
print "Explain variance score =", round(sm.explained_variance_ score
(y_test, y_test_pred_ridge), 2)
print "R2 score =", round(sm.r2_score(y_test, y_test_pred_ridge), 2)
运行代码检查误差指标。可以用同样的数据建立一个线性回归器,并与岭回归器的结果进行比较,看看把正则化引入回归模型之后的效果如何。
创建多项式回归器
线性回归模型有一个主要的局限性,那就是它只能把输入数据拟合成直线,而多项式回归模型通过拟合多项式方程来克服这类问题,从而提高模型的准确性。
准备工作
先看图1-6。
从图1-6中可以看到,数据点本身的模式中带有自然的曲线,而线性模型是不能捕捉到这一点的。再来看看多项式模型的效果,如图1-7所示。
图1-7中的虚线表示线性回归模型,实线表示多项式回归模型。这个模型的曲率是由多项式的次数决定的。随着模型曲率的增加,模型变得更准确。但是,增加曲率的同时也增加了模型的复杂性,因此拟合速度会变慢。当我们对模型的准确性的理想追求与计算能力限制的残酷现实发生冲突时,就需要综合考虑了。
详细步骤
(1) 将下面的代码加入Python文件regressor.py中:
from sklearn.preprocessing import PolynomialFeatures
polynomial = PolynomialFeatures(degree=3)
(2) 上一行将曲线的多项式的次数的初始值设置为3。下面用数据点来计算多项式的参数:
X_train_transformed = polynomial.fit_transform(X_train)
其中,X_train_transformed表示多项式形式的输入,与线性回归模型是一样大的。
(3) 接下来用文件中的第一个数据点来检查多项式模型是否能够准确预测:
datapoint = [0.39,2.78,7.11]
poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(X_train_transformed, y_train)
print "\nLinear regression:", linear_regressor.predict(datapoint) [0]
print "\nPolynomial regression:", poly_linear_model.predict(poly_datapoint)[0]
多项式回归模型计算变量数据点的值恰好就是输入数据文件中的第一行数据值。再用线性回归模型测试一下,唯一的差别就是展示数据的形式。运行代码,可以看到下面的结果:
Linear regression: -11.0587294983
Polynomial regression: -10.9480782122
可以发现,多项式回归模型的预测值更接近实际的输出值。如果想要数据更接近实际输出值,就需要增加多项式的次数。
(4) 将多项式的次数加到10看看结果:
polynomial = PolynomialFeatures(degree=10)
可以看到下面的结果:
Polynomial regression: -8.20472183853
现在,你可以发现预测值与实际的输出值非常地接近。