加州房价篇 (三) : 模型的训练,评估和房价的预测

万事俱备!

运行本篇文章代码时必须先按顺序运行加州房价篇 (一) : 了解数据和加州房价篇 (二) : 处理数据中的所有代码

在正式开始之前,我们得先把我们的数据分成训练集(train set)和测试集(test set),因为要避免过度拟合(overfit),在中文里,矫枉过正的意思和过度拟合非常像,

打个比方,我现在在和女生甲谈恋爱,我问甲喜欢什么样的男生,甲说她喜欢短头发的男生,还说她喜欢听歌,喜欢吃辣,合计一百条规矩,我按照这些标准去要求自己,和甲处的很好,后来因为一些原因我和甲分手了,我又和女生乙谈恋爱,结果乙喜欢长头发的男生,喜欢写诗而不喜欢听歌,喜欢吃清淡的食物,这个时候我的处境就非常尴尬

从机器学习的角度来说,这个时候我在和女生谈恋爱这件事上,就过度拟合了,我应当是要让自己符合大部分女生的要求,我们的模型也应当是要对加州大部分地区都能做出预测,而不是只能预测我们同事收集过数据的地区

把数据分成训练集和测试集,就好比我在和甲谈恋爱时也和乙保持联系,那我的头发可能就不是短而是中等长度,我在学唱歌的同时也会学写诗,总而言之,能避免过度拟合

test_ratio=0.2 #打算把数据中%20的地区放入测试集
shuffled_indices = np.random.permutation(len(housing_complete)) # 打乱一下顺序
test_set_size = int(len(housing_complete) * test_ratio)
test_indices = shuffled_indices[:test_set_size] 
train_indices = shuffled_indices[test_set_size:]# 获得对应的下标
#一般来说,把完全处理好的特征集记作X,目标集记作y
X_train=housing_complete.iloc[train_indices]
X_test=housing_complete.iloc[test_indices]
y_train=housing_target.iloc[train_indices]
y_test=housing_target.iloc[test_indices]

看看是不是一一对应

len(housing_complete)

输出:20640

len(X_train)

输出:16512

len(X_test)

输出:4128

4128+16512=20640

选择,训练并评估模型

加州房价篇是入门篇,旨在让大家对机器学习的整个过程有一个全面的认识,广度和深度之间往往无法兼顾,模型的原理我在后面的篇章中会有详细的阐述

机器学习经过这么多年的发展,前人已经为我们准备好了许多久经磨砺,却又经久不衰的模型,比如随机森林(RandomForest)模型,我们拿来就能用

from sklearn.ensemble import RandomForestRegressor
forest_reg = RandomForestRegressor()
forest_reg.fit(X_train, y_train)#用训练集训练模型

利用测试集的前十个地区,我们来看看效果

forest_reg.predict(X_test[:10])

输出:
在这里插入图片描述

y_test[:10].values

输出:
在这里插入图片描述

嗯,除了第一个地区差距有点大之外,还不赖,不过我们就只能用肉眼来判断一个模型的好坏吗?

当然不是,现在一般用均方根误差(RMSE)来表示一个模型的好坏,感兴趣的朋友可以搜索均方根误差,看看具体的公式,简而言之,得出的数字越小,模型越好,数字越大,模型越差,我们来试试

from sklearn.metrics import mean_squared_error
test_predict=forest_reg.predict(X_test)
MSE=mean_squared_error(test_predict,y_test)
RMSE=np.sqrt(MSE)
RMSE

输出:
50729

y_test.describe()

输出:
加州房价篇 (三) : 模型的训练,评估和房价的预测_第1张图片

测试集的数据中,房价最大值有50万,最小值2万,而模型的误差在5万,这个结果只能说是一般

但是仔细想想,我们才读了三篇文章,就已经几乎能做到一整个拿着高薪的分析师团队耗费大量时间才能做到的事情,这正是机器学习的魅力所在

加州房价篇到此结束,下一个篇章:手写数字识别篇

对应源码(需下载后查看)

对应视频

原文章地址

转载请注明出处

你可能感兴趣的:(机器学习)