使用sklearn进行数据挖掘-房价预测(6)—模型调优
使用sklearn进行数据挖掘系列文章:
- 1.使用sklearn进行数据挖掘-房价预测(1)
- 2.使用sklearn进行数据挖掘-房价预测(2)—划分测试集
- 3.使用sklearn进行数据挖掘-房价预测(3)—绘制数据的分布
- 4.使用sklearn进行数据挖掘-房价预测(4)—数据预处理
- 5.使用sklearn进行数据挖掘-房价预测(5)—训练模型
- 6.使用sklearn进行数据挖掘-房价预测(6)—模型调优
通过上一节的探索,我们会得到几个相对比较满意的模型,本节我们就对模型进行调优
网格搜索###
列举出参数组合,直到找到比较满意的参数组合,这是一种调优方法,当然如果手动选择并一一进行实验这是一个十分繁琐的工作,sklearn提供了GridSearch-网格搜索
方法,我们只需要将每一个参数的取值告诉它,网格搜索将使用交叉验证方法对所有情况进行验证,并返回结果最好的组合。
from sklearn.model_selection import GridSearchCV
param_grid = [
# 12 (3×4) 种超参数组合
{'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]}, #组合1
# 6 (2×3) 种
{'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},#组合2
]
forest_reg = RandomForestRegressor(random_state=42)
# 5折交叉验证,总共需要 (12+6)*5=90 次训练
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
scoring='neg_mean_squared_error')
grid_search.fit(housing_prepared, housing_labels)
Note:上面param_grid
中的字典key可不是随便起的,这些都是需要网格搜索的模型中的参数。另外当你不知道如何选取参数的时候可以按照10的平方取值或者从小到大的值。
- 1.看看上面的结果(可能是一个漫长的过程):
>>grid_search.best_params_
{'max_features': 8, 'n_estimators': 30}
- 2.再看一看最好的分类器
>>grid_search.best_estimator_
RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
max_features=8, max_leaf_nodes=None, min_impurity_split=1e-07,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=30, n_jobs=1,
oob_score=False, random_state=42, verbose=0, warm_start=False)
- 3.看一看得分
>>grid_search.best_score_
-2469578258.9821739
如果我们想看以下各个参数组合的情况呢?
cv_result = grid_search.cv_results_
cv_result是一个字典类型,记录了整个训练过程的数据
>>cv_result.keys(
['std_train_score',
'rank_test_score',
'split4_test_score',
'param_bootstrap',
'split2_train_score',
'param_n_estimators',
'std_score_time',
'split4_train_score',
'split2_test_score',
'mean_score_time',
'mean_fit_time',
'split3_train_score',
'split0_train_score',
'std_test_score',
'split1_train_score',
'split0_test_score',
'mean_test_score',
'param_max_features',
'params',
'std_fit_time',
'split3_test_score',
'mean_train_score',
'split1_test_score']
- 4.看一下组合的分值
>>for mean_score, params in zip(cv_result ["mean_test_score"], cv_result ["params"]):
print(np.sqrt(-mean_score), params)
(63825.047930176741, {'max_features': 2, 'n_estimators': 3})
(55643.842909084706, {'max_features': 2, 'n_estimators': 10})
(53380.65668593633, {'max_features': 2, 'n_estimators': 30})
(60959.138858487866, {'max_features': 4, 'n_estimators': 3})
(52740.584166652523, {'max_features': 4, 'n_estimators': 10})
(50374.142146147307, {'max_features': 4, 'n_estimators': 30})
(58661.2866461823, {'max_features': 6, 'n_estimators': 3})
(52009.973979776936, {'max_features': 6, 'n_estimators': 10})
(50154.117773684942, {'max_features': 6, 'n_estimators': 30})
(57865.361680144459, {'max_features': 8, 'n_estimators': 3})
(51730.075508665534, {'max_features': 8, 'n_estimators': 10})
(49694.851433344418, {'max_features': 8, 'n_estimators': 30})
(62874.407393096284, {'max_features': 2, 'n_estimators': 3, 'bootstrap': False})
(54561.939815728343, {'max_features': 2, 'n_estimators': 10, 'bootstrap': False})
(59416.646314497353, {'max_features': 3, 'n_estimators': 3, 'bootstrap': False})
(52660.245911032733, {'max_features': 3, 'n_estimators': 10, 'bootstrap': False})
(57490.016827879947, {'max_features': 4, 'n_estimators': 3, 'bootstrap': False})
(51093.905942805257, {'max_features': 4, 'n_estimators': 10, 'bootstrap': False})
上面正好有18种组合结果。在第四节的时候,我们自己定义了一个estimatorCombinedAttributesAdder
其中有一个参数add_bedrooms_per_room
我们也可以将其加入网格搜索中。
在测试集合上评估模型###
上面我们已经得到了我们最好的模型,那么模型到底如何呢?是骡子是马拉出来溜溜,测试集该上场了,
final_model = grid_search.best_estimator_
#去掉标签
X_test = strat_test_set.drop("median_house_value", axis=1)
y_test = strat_test_set["median_house_value"].copy()
#这个时候只需要transform
X_test_prepared = full_pipeline.transform(X_test)
final_predictions = final_model.predict(X_test_prepared)
#均方误差
final_mse = mean_squared_error(y_test, final_predictions)
final_rmse = np.sqrt(final_mse)
>>final_rmse
47766.003966433083
持久化模型###
模型已经建立好了,当下次再使用的时候,为了避免再次繁琐的训练过程,我们考虑将模型给存储
起来,python提供了pickle
方法,当然我们也可以使用sklearn提供的joblib
方法,这种方法相对更加的高效。
from sklearn.externals import joblib
#存储
joblib.dump(final_model,'best_model.pkl')
#加载
best_model = joblib.load('best_model.pkl')
#后续的使用....
总结###
至此,本系列的使用sklearn对房价进行预测的文章就此结束,本系列文章主要介绍了并实战了数据挖掘过程种的一些步骤、工具的使用方法及技巧。一路走来看似平坦实则为坑坑洼洼,还有很多需要完善的地方,如特征的组合、模型的选择等等。希望看完本系列之后能够让你对数据挖掘有更深的理解-(完)
使用sklearn进行数据挖掘-房价预测(6)—模型调优的更多相关文章
- 使用sklearn进行数据挖掘-房价预测(4)—数据预处理
在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...
- 使用sklearn进行数据挖掘-房价预测(1)
使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...
- 使用sklearn进行数据挖掘-房价预测(2)—划分测试集
使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...
- 使用sklearn进行数据挖掘-房价预测(3)—绘制数据的分布
使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...
- 使用sklearn进行数据挖掘-房价预测(5)—训练模型
使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...
- 深度学习模型调优方法(Deep Learning学习记录)
深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数.模型在训练集和测试集拟合效果.交叉验证.激活函数和优化算法的选择等. 那如何对我们自己的模型进行判断呢?——通过模型训练跑代码,我们可以 ...
- 基于sklearn的波士顿房价预测_线性回归学习笔记
> 以下内容是我在学习https://blog.csdn.net/mingxiaod/article/details/85938251 教程时遇到不懂的问题自己查询并理解的笔记,由于sklear ...
- tenorflow 模型调优
# Create the Timeline object, and write it to a json from tensorflow.python.client import timeline t ...
- 波士顿房价预测 - 最简单入门机器学习 - Jupyter
机器学习入门项目分享 - 波士顿房价预测 该分享源于Udacity机器学习进阶中的一个mini作业项目,用于入门非常合适,刨除了繁琐的部分,保留了最关键.基本的步骤,能够对机器学习基本流程有一个最清晰 ...
随机推荐
- [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)
接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...
- iOS连续dismiss几个ViewController的方法
原文链接:http://blog.csdn.net/longshihua/article/details/51282388 presentViewController是经常会用到的展现ViewCont ...
- CentOS 7安装squid代理服务器
Squid,一个高性能的代理缓存服务器,支持FTP.gopher.HTTP协议. Squid,一个缓存Internet 数据的软件,其接收用户的下载申请(作为代理服务器),并自动处理所下载的数据,并返 ...
- 关于 String 自我理解
String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...
- You Are the One DP
You Are the One Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- poj2823一道纯单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 32099 Accepted: 9526 ...
- bzoj1051(明星奶牛)
这道就是明星奶牛,A了一次又一次了,(⊙o⊙)-(⊙o⊙)- 去年pas就打了不下5次,就是强联通缩点,然后求出度为0的块 判断有多个的话就无解,一个就输出块的大小. #include<cstd ...
- JFrame的层次结构以及背景颜色设置问题
JFrame的层次结构: JFrame:窗体,也就是窗口的框架.默认为不可见.不透明的(可以使用isVisible和isOpaque来验证).创建窗口时,最后一步需要调用setVisible(true ...
- 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境
转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...
- Parallel.Invoke 并行的使用
Parallel类 在System.Threading.Tasks 命名空间下 下面有几个方法,这里讲一下Invoke的用法 下面我们定义几个方法方便测试 先自定义Response 防止并行的时候占 ...