使用sklearn进行数据挖掘系列文章:

在前几节,我们先对数据进行了解,然后又详细介绍了数据集划分的方法,为了帮助我们更好的了解数据,又绘制了数据的分布图,之后对数据进行了预处理(数值类型和标签类型特征的处理)。上面这些步骤都是一些基础工作,本节将介绍选择和构建机器学习模型。

在测试集上面训练模型###

经验告诉我们,在使用机器学习算法的时候,一开始先选用简单的模型,撸一个baseline是一个很好的习惯。所以我们先尝试使用线性回归模型,先使用几个样本尝试以下该分类器:

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing_prepared,housing_labels)
some_data = housing.iloc[:5]
some_labels = housing_labels.iloc[:5]
some_data_preared = full_pipeline.transform(some_data)
print 'prediction:',lin_reg.predict(some_data_preared)
print 'labels:',some_labels.values
>>
prediction: [ 210644.60459286 317768.80697211 210956.43331178 59218.9888684 189747.55849879]
labels: [ 286600. 340600. 196900. 46300. 254500.]

不错,看来我们之前的一些预处理工作和分类器都能正常运行。那么我们该如何衡量我们的算法的好坏呢?

,sklearn提供了root mean squared error,RMSE作为评价指标:

from sklearn.metrics import mean_squared_error #

housing_predictions = lin_reg.predict(housing_prepared)
lin_mse = mean_squared_error(housing_labels,housing_predictions)
lin_rmse = np.sqrt(lin_mse) #平方根
print lin_rmse
>>
68628.1981985

从第一节housing.describe()中我们知道median_housing_values的范围为14W-50W ,着也意味着分类器欠拟合训练数据,我们需要做的是找一个能力更加强大的分类器或者减少对模型的约束。尝试以下非线性回归模型DecisionTreeRegressor,回归决策树能够找出复杂的非线性关系,下面是代码

from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor()
tree_reg.fit(housing_prepared,housing_labels) housing_predictions = tree_reg.predict(housing_prepared)
tree_mse = mean_squared_error(housing_labels,housing_predictions)
tree_rmse = np.sqrt(tree_mse)
>>print tree_rmse
0.0

误差竟然为0,实际上可能发生了严重的过拟合。那么问题来了,我们该如何分析结果到底是欠拟合还是过拟合呢?下面就引入了交叉验证

交叉验证###

由于目前我们的测试集是不能动的,因为还没到确定最终的模型。我们可以把训练集再划分为训练集和测试集两部分。我们可以使用前面提到的train_test_split方法,不过强大的sklearn还提供了K-fold交叉验证方法:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg,housing_prepared,\
housing_labels,scoring='neg_mean_squared_error',cv=10)
rmse_scores = np.sqrt(-scores)

上面这段代码将训练集随机的分为10份,在9份上面训练,在剩下的一份上面测试。

>>rmse_scores
array([ 69080.4167045 , 67652.35297369, 70592.30099278, 67905.0445584 ,
71256.61551091, 74264.47020443, 70141.37468916, 71525.02444872,
76283.57397045, 69691.77150094])
>>rmse_scores.mean()
70839.294555398083
>>rmse_scores.std()
2564.0079357717691

note:sklearn提供的交叉验证方法希望得到一个较大的值(越大越好),这个和损失函数正好相反(越小越好),所以使用的是-score

看到了上面的结果,发现决策是的效果其实很一般,甚至还没有线性回归的结果好(增加了3K)。

现在看以下线性回归的交叉验证值

lin_scores = cross_val_score(lin_reg,housing_prepared,\
housing_labels,scoring='neg_mean_squared_error',cv=10)
lin_rmse_scores = np.sqrt(-lin_scores)
>>lin_rmse_scores
array([ 66782.73843989, 66960.118071 , 70347.95244419, 74739.57052552,
68031.13388938, 71193.84183426, 64969.63056405, 68281.61137997,
71552.91566558, 67665.10082067])
>>lin_rmse_scores.mean()
69052.461363450828
>>lin_rmse_scores.std()
2731.6740017983493

使用随机森林(RandomForestRegression)

from sklearn.ensemble import RandomForestRegressor
forest_reg = RandomForestRegressor()
forest_reg.fit(housing_prepared, housing_labels)
housing_predictions = forest_reg.predict(housing_prepared)
forest_mse = mean_squared_error(housing_labels, housing_predictions)
forest_rmse = np.sqrt(forest_mse)
print forest_rmse #22180.0543101
forest_scores = cross_val_score(forest_reg, housing_prepared, housing_labels,
scoring="neg_mean_squared_error", cv=10)
forest_rmse_scores = np.sqrt(-forest_scores)
>>forest_rmse_scores
array([ 52036.18016789, 51138.17643755, 54179.12437821, 53870.89837397,
52413.73419948, 55299.52908533, 51322.32440328, 50743.46362248,
55491.68139413, 52746.07818231])
>>forest_rmse_scores.mean() #结果大于22180。说明训练集存在过拟合
52924.119024463616
>>forest_rmse_scores.std()
1621.653495429834

上面列举了使用线性回归、决策树回归和随机森林回归的方法。可以看的出随机森林的效果最好,如果你想还可以继续尝试其他的算法比如SVR、神经网络等,找出效果较好的模型。

使用sklearn进行数据挖掘-房价预测(5)—训练模型的更多相关文章

  1. 使用sklearn进行数据挖掘-房价预测(4)—数据预处理

    在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...

  2. 使用sklearn进行数据挖掘-房价预测(6)—模型调优

    通过上一节的探索,我们会得到几个相对比较满意的模型,本节我们就对模型进行调优 网格搜索 列举出参数组合,直到找到比较满意的参数组合,这是一种调优方法,当然如果手动选择并一一进行实验这是一个十分繁琐的工 ...

  3. 使用sklearn进行数据挖掘-房价预测(1)

    使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...

  4. 使用sklearn进行数据挖掘-房价预测(2)—划分测试集

    使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...

  5. 使用sklearn进行数据挖掘-房价预测(3)—绘制数据的分布

    使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...

  6. 基于sklearn的波士顿房价预测_线性回归学习笔记

    > 以下内容是我在学习https://blog.csdn.net/mingxiaod/article/details/85938251 教程时遇到不懂的问题自己查询并理解的笔记,由于sklear ...

  7. 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示

    第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...

  8. 转载:使用sklearn进行数据挖掘

    目录 1 使用sklearn进行数据挖掘 1.1 数据挖掘的步骤 1.2 数据初貌 1.3 关键技术2 并行处理 2.1 整体并行处理 2.2 部分并行处理3 流水线处理4 自动化调参5 持久化6 回 ...

  9. 使用sklearn进行数据挖掘

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

随机推荐

  1. C 返回函数与闭包的考虑

    #include <stdio.h> typedef int (*fun)(); fun closure(int i) { int squ() { return i*i; } return ...

  2. electron 写入注册表 实现开机自启动

    windows平台 首先先明确:开机自启动写入注册表的位置,在KEY_CURRENT_USER\Software\\Microsoft\\Windows\\CurrentVersion\\Run 打开 ...

  3. 主要讲下hack的兼容用法,比较浅,哈哈

    hack是主要来处理IE的兼容,不同的IE,不同的兼容方式 /*   属性前缀法(即类内部Hack):       *color:#000; *号对IE6,IE7都生效   +color:#555; ...

  4. 07-从零玩转JavaWeb-对象内存分析

    上篇看了关于数组的内存分析,接下来看一下对象的内存分析 假定有如下类:  第一步会把Person的字节码放到方法区   执行main方法,把main方法的栈帧放到栈当中   Person zly = ...

  5. 笔记-windbg及时调试

    当程序在测试或者老化的时候很有用,只要程序有异常抛出,就能启用windbg调试,这样就能及时的保存现场. 程序崩溃时,windows系统会调用系统默认调试器,其设置在注册表 HKEY_LOCAL_MA ...

  6. 使用bower init创建bower.json文件

    使用bower init 可以快速创建bower.json文件 bower init 回答一系列问题后就可以了,其中大部分问题可以按enter跳过.

  7. SE6 不定参数和默认参数详解和使用细节

    在SE5以前我们通常通过arguments类数组对象来引用不定形参,SE6则使用了一种叫做不定参数的写法,比起隐式的arguments要直观的多. 不定参数使用...参数名来指定一个不定参数,参数名指 ...

  8. IIS下自定义错误页面配置的两种方式(亲测可行)--IIS服务器

    网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页) ...

  9. Lua函数以及闭合函数的理解

    Lua函数以及闭合函数的理解 来源 http://blog.csdn.net/mydad353193052/article/details/48731467 词法域和第一类型 在C/C++,C#或者J ...

  10. C++获取本机IP等信息

    运行环境:VS2008,win7,代码来源于MSDN,相关函数可以查看MSDN中的函数定义.. 代码如下: #include <winsock2.h> #include <ws2tc ...