(接”西安房价在下个月内什么地方最值得买?——上篇“)
解决问题的思路
- 爬取数据(安居网、链家网、房天下)
- 清洗数据
- 选择对价格影响最大的特征
- 运用机器学习算法和房价数据信息,对下个月的房价进行一个预测
- 算出每个区域的增长率并排序
第四步:运用机器学习算法和房价数据信息,对下个月的房价进行一个预测
4.1 怎么建立一个模型(这是我讲解时用到的ppt,见我的房价ppt)
4.2 岭回归模型
建立的步骤:
用Sklearn自带的cross validation方法来测试模型
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
#以10为底,从10的-3次方到10的2次方,生成50个等比数列
alphas = np.logspace(-3, 2, 50)
test_scores = []
for alpha in alphas:
clf = Ridge(alpha)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=25, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
存下所有的CV值,看看哪个alpha值更好(也就是『调参数』)
在2-20改变了很多的深度(cv),最终结果显示cv=20时,错误率低于0.4460
【梯度下降法的过程】:
4.3 构建随机森林模型
from sklearn.ensemble import RandomForestRegressor
max_features = [.1, .3, .5, .7, .9, .99]
test_scores = []
for max_feat in max_features:
clf = RandomForestRegressor(n_estimators=200, max_features=max_feat)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=20, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
cv=20时,错误率最多在0.406多一点。 先调参到这里,因为跑随机森林速度太慢.
4.3 两个模型的融合
这里我们汲取前面两种或者多种模型的优点。按照上面我们调参的结果,先做成我们最终的model。其实还可以再用boosting,bagging和XGBOOST再跑一下。由于调参实在太慢了,原理差不多,所以这里不再赘述。要是追求准确率的话,用XGBOOST是错误率最低的。
ridge = Ridge(alpha=20)
rf = RandomForestRegressor(n_estimators=200, max_features=.1)
ridge.fit(X_train, y_train)
rf.fit(X_train, y_train)
y_ridge = np.expm1(ridge.predict(X_test1))
y_rf = np.expm1(rf.predict(X_test1))
y_final = (y_ridge + y_rf) / 2
正规的Ensemble是把前一个model的预测结果作为新的input,再做一次预测。这里我简单化,用了两个模型的平均结果,得出了我们的最终结果:y_final。
来看一下最终结果的数据:(最终的结果数据保存在“特征选择与预测/房价预测的结果.csv”中)
第五步:算出每个区域的增长率并排序
5.1 对预测值进行处理
按照每个地区的不同对第四步得出的结论进行分组,并且求出每一组的平均数,保存数据在“计算增长率并得出最终的结果/房价预测按地区平均.csv”中。数据长这个样子:
地区1-13分别对应什么,在Tags说明文件中有详细的描述,此处不再赘述。
5.2 对已获取的值进行处理
将已获取的楼盘信息全部merge在一起,按照地区分类,并算出平均值,保存在“特征选择与预测/楼盘历史均价.csv”中。处理代码为“特征选择与预测/楼盘历史均价.ipynb”。数据长这个样子:
5.3 计算增长率
计算增长率用5.1和5.2的数据,用预测数据减去历史数据再除以历史数据,算出每个地区的增长率。保存在increase中。
increase_rate['increase_rate']=(increase_rate['mean']-increase_rate['average'])/increase_rate['average']
increase数据如下图所示:
需要说明一点,13,8区由于数据不完整,所以未能得到结果。
5.4 与房天下的数据对比,得出最终的结论
前面第一步我们爬取了房天下的统计数据,我将它们按照区域划分后求了平均值,从大到小排序后得出的数据如下图:
【结论】:
由于我在分析数据时,将户县、临潼等地都归为西安周边了,导致“西安周边”数据量比别的类别多,差异也大,所以我分析的“西安周边”为第一名不是很准确。综合我的结果和房天下的结果,长安区、城东、西安周边的临潼,浐灞和城北,应该是下个月最值得买房子的几个地区。
总结
花了两个礼拜的时间做完这一系列,自己觉得还是很有成就感的。前面没有接触过整个的流程,尤其是特征选择那块,我觉得自己做的还是不够好。
第一个礼拜爬数据,清洗就用了四天。数据爬下来真的很乱很脏。清洗很难抉择到底是要删除数据还是要补缺空值,补哪些值?都是很难做决定的。第二个礼拜进行了特征的选择和模型的融合。特征的选择花了四天,我觉得难点就在于选什么,标准是什么,你的特征怎么处理。这块我自己觉得做的还不够好,只是实现了一些皮毛。后面模型的融合调了sklearn机器学习的库,没有自己写算法(还需要多多磨练才能自己写= =)我也觉得挺遗憾的。
数据准确率不高我不是很在意,因为数据量太少了,不到两千条,不像kaggle给那么多数据,还是洗干净的,简直完美,所以才会要求准确率吧。
最后要做一个【声明】:此次的代码与数据皆不外传,也请勿转载我的博客。感兴趣的小伙伴私我或留言:920399454(备注:csdn房价)。如果有什么好的想法欢迎跟我讨论,如果我有写得不恰当的地方也欢迎指出。感谢您阅读到这里,笔芯~
memoryjdch编辑于2017.8.5