机器学习与人工智能基础:价值估算(第六章-抠腚)

编写我们的估值系统

Coding Our System

前言叨B叨

务实的同学们, 终于到了coding阶段了, 打开示例代码一起开干吧.
本章共有以下几节:

  1. 准备特征值
  2. 训练和测试数据
  3. 训练价值评估
  4. 用平均绝对误差来测量精度

正文

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美元。这告诉我们,我们的模型仍然适用于从未见过的房子,但不如训练数据预测的那么好。这两个数字的差异告诉我们很多关于模型工作的情况。

结语

下一章将会讲解如何提升我们的系统, 欢迎关注.

你的 关注-收藏-转发 是我继续分享的动力!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容