编写我们的估值系统
前言叨B叨
务实的同学们, 终于到了coding阶段了, 打开示例代码一起开干吧.
本章共有以下几节:
- 准备特征值
- 训练和测试数据
- 训练价值评估
- 用平均绝对误差来测量精度
正文
1. 准备特征值
有了前面一系列的只是准备,现在我们可以编写机器学习系统了。让我们打开train_model pt1.py。在第一行,我们使用pandas的read_csv方法来加载数据集。
import pandas as pd
#Load the data set
df = pd.read_csv("ml_house_data_set.csv")
加载数据完毕之后,我们的第一项任务就是做必要的特征工程(feature engineering)。
我们想从数据集中删除四个地址字段,因为它们对我们不起作用。门牌号、单元号、街道名和邮政编码。我们可以利用del命令从数据表中删除列。
# Remove the fields from the data set that we don't want to include in our model
del df['house_number']
del df['unit_number']
del df['street_name']
del df['zip_code']
我们还需要应用one-hot编码来处理车库类型和城市名这两个特征。幸运的是,pandas有一个get_dummies函数能做这个事(惊不惊喜,意不意外)。我们所要做的就是告诉它要编码哪些字段。
# Replace categorical data with one-hot encoded data
features_df = pd.get_dummies(df, columns=['garage_type', 'city'])
下一步,我们将从我们的特征值中删除销售价格一栏,因为我们不想让机器学习模型看到输入数据中的销售价格。
# Remove the sale price from the feature data
del features_df['sale_price']
最后,我们将创建x和y数组。记住,X是输入特性的标准名称,y是预期输出的标准名称。X阵列将我们特征数据框架的内容。唯一不同的是,我们会调用as_matrix功能确保数据是numpy矩阵数据类型而不是pandas数据框架。y数组将是我们原始数据集的销售价格列。我们也会用as_matrix函数转换为numpy矩阵数据类型。
# Create the X and y arrays
X = features_df.as_matrix()
y = df['sale_price'].as_matrix()
漂亮! 现在我们已经准备好了机器学习系统所需要的的特征值了。
2. 训练和测试数据
这会让我们打开train_model pt2.py看下。在训练机器学习模型时,我们一般要对数据集做两件事。首先对数据进行随机排序,然后将数据分割成一个训练数据集和一个测试数据集。因为乱序数据和将数据分为训练和测试组是一个常见的操作,psykit-learning提供了一个内置的乱序功能。
# Split the data set in a training set (70%) and a test set (30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
这个命令将把我们的所有数据随机乱序,然后把它分成两组。测试大小参数设置为0.3,意思是要保留70%的数据进行训练,并拿出30%的数据进行测试。
70/30是很经典的分法。将数据分成测试和训练组使得测试数据在机器学习系统中暂时不可见,一直到我们准备用它来验证模型的准确性。如果我们用模型以前见过的训练数据来验证它的准确性,那就没什么意义了。
通过使用模型以前从未见过的数据来证明该模型实际上学会了预测房价的一般规则,而且并不是记住以前所见过的某个特定房屋的价格而给出答案。
3. 训练价值评估
打开train_model pt3.py。让我们创建和训练我们的机器学习模型。我们要用scikit-learning的梯度回归(Gradient-Boosting)。创建梯度回归模型的代码只有一行。
model = ensemble.GradientBoostingRegressor()
这就是所谓的梯度回归,因为我们使用的是梯度回归算法来建立值预测模型。价值预测的另一个名称是回归。我们还需要设置一些超参数(hyper-parameters)来控制梯度回归模型的运行。
这个模型有很多超参数。一开始使用一些通过合理的猜测的参数,但稍后我们将学习如何调整这些参数,以获得最好的结果。
# Fit regression model
model = ensemble.GradientBoostingRegressor(
n_estimators=1000,
learning_rate=0.1,
max_depth=6,
min_samples_leaf=9,
max_features=0.1,
loss='huber'
)
- n_estimators设置将要构建多少个决策树。更高的数字通常会使模型更精确,但同时也增加了运行模型所需的时间。这里我们先从1000开始。
- learning_rate控制每个附加决策树对总体预测的影响。当n_estimators设置高时,低比率的learning_rate通常导致更高的精度。让我们从0.1开始,作为合理的默认值。
- max_depth控制每个决策树可以多少层。我们将从6开始,这意味着模型中的每个决策树都可以达到6层。
- min_samples_leaf控制一个值必须出现在我们的训练集的决策树中多少次,才拿来来做决定。我们把它设为9。举个栗子🌰,至少有9所房子必须表现出相同的特点,然后才认为它有足够的意义,才会围绕它建立一个决策树。这有助于防止单个离群值对模型的影响太大。
- max_features是在我们的模型中,我们每次随机选择特征的百分比, 用来作为创建决策树分支的依据。
0.1应该还不错。 - loss参数控制scikit-learn如何计算模型误差率或学习成本。huber(胡贝尔)函数做得很好,而且不怎么受数据集中离群值的影响。
接下来,我们告诉模型来使用我们的训练数据集,通过调用scikit-learn的fit函数对训练模型。这只是一行代码。
model.fit(X_train, y_train)
一个好的scikit-learn特征,能够通过所提供的接口应用于各种不同的监督学习模型。唯一的区别是不同的模型有不同的超参数集。
这样就可以很容易地对不同类型的机器学习模型进行实验,以找到最适合的应用程序的模型。最后,我们要用scikit-learn的joblib.dump功能来保存我们的训练机器学习模型后生成的文件。您只需指定模型和文件名,并将其保存到文件中。
# Save the trained model to a file so we can use it in other programs
joblib.dump(model, 'trained_house_classifier_model.pkl')
这个文件以后可以用来在不同程序中预测房价。现在,我们运行下这个程序,看看我们的模型是否正确运行。每个人的机器不一样,可能需要几分钟的训练才能完成。
当训练完毕之后,trained_house_classifier_model.pkl文件会在左侧列表显示。
4. 用平均绝对误差来测量精度
在训练机器学习模型之后,下一步是测量模型执行的好坏。让我们打开train_model pt4.py。为了检验模型预测的准确性,我们将使用一种称为平均绝对误差的度量方法(mean absolute error)。平均绝对误差检查我们模型所做的每一个预测,它给了我们所有预测的平均误差。scikit-learn提供了一个简单的平均绝对误差函数,我们可以这样做。
# Find the error rate on the training set
mse = mean_absolute_error(y_train, model.predict(X_train))
print("Training Set Mean Absolute Error: %.4f" % mse)
我们传y值进去,也就是训练数据集对应的正确答案。然后调用model.predict X-我们的训练特征值。
这将使用我们的训练模型来对训练数据集中的每个条目生成一个预测。scikit-learn比较预测的答案,告诉我们有多接近真实值。
现在让我们对测试数据集进行完全相同的计算。
# Find the error rate on the test set
mse = mean_absolute_error(y_test, model.predict(X_test))
print("Test Set Mean Absolute Error: %.4f" % mse)
这里唯一的区别是确保传入测试数据而不是训练数据。让我们运行后看下结果。
Training Set Mean Absolute Error: 48727.0015
Test Set Mean Absolute Error: 59225.1333
对于训练集,平均绝对误差为48727美元。这意味着我们的模型能够预测我们培训数据集中每个房子的价值在实际价格的48000以内。
考虑到我们模型中的各种各样的房子,那这个结果就相当不错了。对于测试集,平均绝对误差略高于59225美元。这告诉我们,我们的模型仍然适用于从未见过的房子,但不如训练数据预测的那么好。这两个数字的差异告诉我们很多关于模型工作的情况。
结语
下一章将会讲解如何提升我们的系统, 欢迎关注.
你的 关注-收藏-转发 是我继续分享的动力!