这里给出的就是按照参数给出的数值属性进行转换。
接下来开始定义Pipeline,我们只需要在构造方法中传入我们需要的顺序即可。比如num_pipeline,在构造函数中传入我们需要执行的函数、Imputer()、CombineAttributesAdders()、StandardScaler(),同样方法可对其他的流水线进行了定义。
每一条子流水线都是从选择器转换器开始,然后挑出所需属性(数值或者分类),生成的DataFrame再转换为numpy数组就可以进行训练了。
至此,针对算法的数据准备基本到此告一段落。
六、选择和训练模型
在这个阶段,应该做的就是选择一个合适的模型,训练该模型,并评估预测的质量了。
首先可以尝试选择一个线性回归模型。
代码怎么用,这里不解释了,看代码就知道了。这里通过fit()函数后,lin_reg就是我们通过训练集得出的第一个训练模型,接下来可以通过predict来进行预测。我们可以通过训练集的一些数据进行:
我们从总数据中选出五个数据进行测试,虽然测试结果不尽如人意,但是系统可以工作了,这个还是很让人兴奋的!
那么,怎么评估算法的性能呢?我们使用RMSE。
从之前的数据中,大多地区的房价中位数在12万美元到26万美元之间,我们的预测基本与之相差6万8的误差,说明我们的系统对数据拟合存在严重不足。当这种情况发生时,可能是由于特征信息不能提供足够的信息让我们做出更好的预测还有就是算法不够强大。因此到了这一步,你就有两种选择,一个是需要更多新属性来支持算法,还有一个就是选择更强大的模型或者减少模型约束(当然,我们选择的线性模型没有什么约束,谈不上这一点…)。
我们用更强大的算法试试!
用决策树模型,试试效果:
我擦,RMSE最后的结果竟然为0?!完美的算法?of course not!
很大程度上,不存在完美的算法,应该是数据严重过拟合了。。。用K折交叉验证的方式,能够还原算法的本来面貌。
交叉验证,说白了就是将训练集科学分成K份,每次选择1份做验证集,其他为训练集,分别训练K次,选出性能最好的模型作为最后的模型:
这里从cross_val_score的参数中可以发现,第一个参数是模型,第二个参数是训练集,第三个参数是标签,第四个参数是选择打分类型,第五个参数是选择那个K,最后得出的score就是一个K大小的数组,每个里面放着一次的得分。
从结果上看,平均得分在69549,上下浮动2000左右。
我们再看看线性回归模型:
线性回归跑分是69088,比决策树稍差。
我们最后再看看随机森林模型。