好消息是,由于之前的这些步骤,现在的事情比你想象的要简单得多。让我们先来训练一个线性回归模型,就像我们在前一章所做的那样:
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)
完成了!你现在有了一个线性回归模型。让我们使用训练集的样本来尝试一下:
>>> some_data = housing.iloc[:5]
>>> some_labels = housing_labels.iloc[:5]
>>> some_data_prepared = full_pipeline.transform(some_data)
>>> print("Predictions:\t", lin_reg.predict(some_data_prepared))
Predictions: [ 303104. 44800. 308928. 294208. 368704.]
>>> print("Labels:\t\t", list(some_labels))
Labels: [359400.0, 69700.0, 302100.0, 301300.0, 351900.0]
它是可以工作的,尽管预测并不完全准确(例如,第二次预测下降了50%以上!)让我们用Scikit-Learn的mean_squared_error函数来度量这个回归模型在整个训练集上的RMSE:
>>> from sklearn.metrics import mean_squared_error
>>> housing_predictions = lin_reg.predict(housing_prepared)
>>> lin_mse = mean_squared_error(housing_labels, housing_predictions)
>>> lin_rmse = np.sqrt(lin_mse)
>>> lin_rmse
68628.413493824875
好吧,这比什么都没有好,但显然不是一个好分数:大多数地区的median_housing_values在$120,000和$265,000之间,所以一个$68,628这样的标准预测错误是不太令人满意的。这是一个欠拟合训练数据的模型例子。当这种情况发生时,它可能意味着这些特性没有提供足够的信息来做出正确的预测,或者模型不够强大。正如我们在前一章中所看到的,修复不足的主要方法是选择一个更强大的模型,为训练算法提供更好的特性,或者减少对模型的约束。这个模型没有正规化,所以这排除了最后一个可能性。您可以尝试添加更多的特性(例如,人口日志),但是首先让我们尝试下用一个更复杂的模型来看看它是如何工作的。
让我们来训练一个DecisionTreeRegressor 。这是一个很强大的模型,能够在数据中找到复杂的非线性关系(决策树在第6章中给出了更详细的描述)。
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor()
tree_reg.fit(housing_prepared, housing_labels)
现在这个模型已经训练好了,让我们在训练集上进行评估:
>>> housing_predictions = tree_reg.predict(housing_prepared)
>>> tree_mse = mean_squared_error(housing_labels, housing_predictions)
>>> tree_rmse = np.sqrt(tree_mse)
>>> tree_rmse
0.0
what! ?没有错误吗?这个模型真的很完美吗?当然,更有可能的是,模型已经严重地过拟合训练数据。你怎么能确定呢?正如我们前面看到的,在准备启动一个您确信的模型之前,您不希望接触到测试集,因此,您需要只使用训练集的一部分进行训练,另一部分用于模型验证。