PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试;
数据集字段解释:
其实现在回过头来看,前三个特征应该都是挖掘后的组合特征,比如RM,通常在原始数据中会分为多个特征:一楼房间、二楼房间、厨房、卧室个数、地下室房间等等,这里应该是为了教学简单化了;
MEDV为我们要预测的值,属于回归问题,另外数据集不大(不到500个数据点),小数据集上的回归问题,现在的我初步考虑会用SVM,稍后让我们看看当时的选择;
注意点:
1、如果数据在多个csv中(比如很多销售项目中,销售数据和店铺数据是分开两个csv的,类似数据库的两张表),这里一般要连接起来;2、训练数据和测试数据连接起来,这是为了后续的数据处理的一致,否则训练模型时会有问题(比如用训练数据训练的模型,预测测试数据时报错维度不一致);3、观察下数据量,数据量对于后续选择算法、可视化方法等有比较大的影响,所以一般会看一下;4、pandas内存优化,这一点项目中目前没有,但是我最近的项目有用到,简单说一下,通过对特征字段的数据类型向下转换(比如int64转为int8)降低对内存的使用,这里很重要,数据量大时很容易撑爆个人电脑的内存存储;
上代码:
1#载入波士顿房屋的数据集2data=pd.read_csv('housing.csv')3prices=data['MEDV']4features=data.drop('MEDV',axis=1)5#完成67print"Bostonhousingdatasethas{}datapointswith{}variableseach.".format(*data.shape)
tep2分析数据
加载数据后,不要直接就急匆匆的上各种处理手段,加各种模型,先慢一点,对数据进行一个初步的了解,了解其各个特征的统计值、分布情况、与目标特征的关系,最好进行可视化,这样会看到很多意料之外的东西;
基础统计运算
统计运算用于了解某个特征的整体取值情况,它的最大最小值,平均值中位数,百分位数等等,这些都是最简单的对一个字段进行了解的手段;
比如这个问题中的三个特征:
上述这三个点,同样可以通过可视化的方式来验证,事实上也应该去验证而不是只靠主观猜想,有些情况下,主观感觉与客观事实是完全相反的,这里要注意;
为了验证模型的好坏,通常的做法是进行cv,即交叉验证,基本思路是将数据平均划分N块,取其中N-1块训练,并对另外1块做预测,并比对预测结果与实际结果,这个过程反复N次直到每一块都作为验证数据使用过;
1#提示:导入train_test_split2fromsklearn.model_selectionimporttrain_test_split3X_train,X_test,y_train,y_test=train_test_split(features,prices,test_size=0.2,random_state=RANDOM_STATE)4printX_train.shape5printX_test.shape6printy_train.shape7printy_test.shape
这里主要是根据问题来定义,比如分类问题用的最多的是准确率(精确率、召回率也有使用,具体看业务场景中更重视什么),回归问题用RMSE(均方误差)等等,实际项目中根据业务特点经常会有需要去自定义评价函数的时候,这里就比较灵活;
1fromsklearn.model_selectionimportKFold,GridSearchCV2fromsklearn.treeimportDecisionTreeRegressor3fromsklearn.metricsimportmake_scorer45deffit_model(X,y):6"""基于输入数据[X,y],利于网格搜索找到最优的决策树模型"""7cross_validator=KFold()8regressor=DecisionTreeRegressor()9params={'max_depth':[1,2,3,4,5,6,7,8,9,10]}10scoring_fnc=make_scorer(performance_metric)1112grid=GridSearchCV(estimator=regressor,param_grid=params,scoring=scoring_fnc,cv=cross_validator)1314#基于输入数据[X,y],进行网格搜索15grid=grid.fit(X,y)16#返回网格搜索后的最优模型17returngrid.best_estimator_
可以看到当时项目中选择的是决策树模型,现在看,树模型在这种小数据集上其实是比较容易过拟合的,因此可以考虑用SVM代替,你也可以试试哈,我估计是SVM效果最好;
学习曲线
通过绘制分析学习曲线,可以对模型当前状态有一个基本了解,如下图: