使用估值神器
Using the Estimator in a Real-World Program
前言叨B叨
大家上周末剁手开心哇? 来来来, 为了更开心得剁手认真学习.
本章包含以下内容:
1. 用新的数据来估价
2. 用新的数据来训练分类器
3. 然后呢?
正文
1.用新的数据来估
现在我们已经训练和测试了我们的模型,让我们正式将其投入使用。打开make_predictions.py。在我们过这个例子的时候,你会注意到,即使这个文件包含估计房屋价值所需的所有逻辑,实际的代码也只有几行。这是因为所有的逻辑都已经由机器学习算法创建并保存在我们的模型中了。我们只需要加载模型,传入数据并运行。
from sklearn.externals import joblib
# Load the model we trained previously
model = joblib.load('trained_house_classifier_model.pkl')
首先,我们加载之前训练过的梯度增强模型。我们只是调用joblib.load并传入文件名。接下来,我们列出了我们想要评估的特定房屋的所有属性。
# For the house we want to value, we need to provide the features in the exact same
# arrangement as our training data set.
house_to_value = [
# House features
2006, # year_built
1, # stories
4, # num_bedrooms
3, # full_bathrooms
0, # half_bathrooms
2200, # livable_sqft
2350, # total_sqft
...
True, # has_central_heating
True, # has_central_cooling
# Garage type: Choose only one
0, # attached
0, # detached
1, # none
# City: Choose only one
0, # Amystad
1, # Brownport
0, # Chadstad
0, # Clarkberg
...
0, # West Gregoryview
0, # West Lydia
0 # West Terrence
]
# scikit-learn assumes you want to predict the values for lots of houses at once, so it expects an array.
# We just want to look at a single house, so it will be the only item in our array.
homes_to_value = [
house_to_value
]
我们需要按照与我们用来训练模型的训练数据完全相同的顺序创建一个具有相同特征的数组。这意味着这里的数据需要反映我们所做的任何特征工程(feature engineering )变更。所以我们删除的字段和我们用one-hot编码添加的字段在这里反映出来。我已经提前定义了2006年建造的一个假想房屋的所有参数,包括它的基本特征,车库的类型以及它所在的城市。接下来,我们需要创建一系列的房屋值。 Scikit-learn假定你想要一次对多个项目进行预测,所以它期望一系列的房屋价值。
由于我们现在只想给一个房子估价,所以我们只创建了一组值house_to_value,然后放入这个homes_to_value数组。为了预测数据,我们调用model.predict并传入特征数组。
# Run the model and make a prediction for each house in the homes_to_value array
predicted_home_values = model.predict(homes_to_value)
# Since we are only predicting the price of one house, just look at the first prediction returned
predicted_value = predicted_home_values[0]
print("This house has an estimated value of ${:,.2f}".format(predicted_value))
结果是一个包含每个房屋的价格预测的数组。由于我们刚刚只传入了一个房子的信息,所以只需要拿第一个索引的值然后打印。
对于这个房子,它预测587,000美元的价格。但是,让我们看看如果我们改变一些特征值会发生什么。
现在让我们来回顾一下2006年到1973年建成的一年。现在让我们重新运行它,看看如何改变价值。右键单击运行,现在我们可以看到价值下降到$ 454,000。看起来房子龄很重要。现在如果我们改变一些其他的属性呢?如果我们说这个房子有一个附加的车库,现在让我们重新运行它,看看如何改变价值。现在价值达到了49万美元。
那城市呢?让我们改变房子的城市,重新运行。现在房子的价值大幅下降到386,000美元。看起来地理位置很重要。您可以尝试自己调整这些值,看看它是如何影响最终价格的。现在我们有一个完整的工作体系。如果我们用一个很好的用户界面来替换这个脚本,我们会有一个非常酷的真实产品。
2.用新的数据来训练分类器
我们刚刚完成了建立和使用机器学习模型。恭喜!但请记住,我们的机器学习模型只与我们所使用的数据匹配。由于房价总是在变化,随着市场的变化,这个模型很快就会过时。所以当底层数据发生变化时,我们需要重新训练模型。我们可以使用之前使用的trainmodel.py文件重新训练我们的模型。我们只需要提供一个更新的数据集与更近的房屋销售数据。
让我们来看看。首先,我们在用原始数据集训练估计器时得到的准确性结果。测试集的错误是$ 59,000左右。让我们看看当我们用更新的数据集重新训练模型时会发生什么。现在,让我们改变我们正在使用的数据集。我们只需要更新我们正在加载的数据文件的名称。我提供了第二个数据文件叫做ml_house_data_set_updated.csv。这个数据集已经更新了房价。让我们重新运行脚本,看看我们用这个数据集得到的结果。执行了这个数据集,测试错误就更高了。大概是63,000美元。如果我们回头看,以前只有59,000美元。这是一个约4000美元的错误增加。
在现实世界的系统中,对天气或交通等频繁变化的事物进行建模,通常会建立一个自动化的训练流程然后定期运行,如每天或每周。这使得系统随着数据的变化而保持最新。但在更换旧模型之前,检查新模型的准确性是非常重要的。
有时训练数据变化很大,以至于旧的模型不再有效。您的自动化训练过程应检查新模型的错误率,并提醒您在新模型执行得有问题的时候进行干预。
3.然后呢?
我建议大家尝试使用自己的数据覆盖的概念。 之后,您可以尝试使用本课程中使用的梯度增强算法之外的不同机器学习算法。 支持向量回归机是另一个可以在scikit-learn中进行实验的流行算法。 如果您将机器学习用于解决大规模问题,则可以尝试xgboost库。 Xgboost是Python和其他几种编程语言的附加库,它提供了梯度提升的快速实现,可以在多台计算机上分布。 最后,无论您使用哪种编程语言,本课程中的所有基本概念都适用于任何机器学习库或工具包。
Amazon AWS和Microsoft Azure等云服务提供商现在提供机器学习工具,可以让您在云中构建模型。
结语
自此, 机器学习与人工智能基础:价值估算就全部讲完, 之后我会物色更多的相关教程, 敬请期待!
你的 关注-收藏-转发 是我继续分享的动力!