Note:由房价预测例子的学到,用Stacking的思维来汲取两种或者多种模型的优点

ipython的代码和数据集在我的GitHub中,链接在下面,下面的代码是在pycharm里运行的,差别不大。

#Step 1: 检视源数据集
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt
# 一般来说源数据的index那一栏没什么用,我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。
train_df = pd.read_csv('house price/input/train.csv', index_col=0)
test_df = pd.read_csv('house price/input/test.csv', index_col=0)
print(train_df.head())
#输出看一下,这时候大概心里可以有数,哪些地方需要人为的处理一下,以做到源数据更加好被process。# Step 2: 合并数据
# 这么做主要是为了用DF进行数据预处理的时候更加方便。等所有的需要的预处理进行完之后,我们再把他们分隔开。
# 首先,SalePrice作为我们的训练目标,只会出现在训练集中,不会在测试集中(要不然你测试什么?)。所以,我们先把SalePrice这一列给拿出来,不让它碍事儿。
# 我们先看一下SalePrice长什么样纸:
prices = pd.DataFrame({"price":train_df["SalePrice"], "log(price + 1)":np.log1p(train_df["SalePrice"])})
# prices.hist()
# plt.show()#%matplotlib inline 可以在Ipython编译器里直接使用,功能是可以内嵌绘图,并且可以省略掉plt.show()这一步。
# 可见,label本身并不平滑。为了我们分类器的学习更加准确,我们会首先把label给“平滑化”(正态化)
# 这一步很多人会miss掉,导致自己的结果总是达不到一定标准。
# 这里我们使用最有逼格的log1p, 也就是 log(x+1),避免了复值的问题。
# 记住哟,如果我们这里把数据都给平滑化了,那么最后算结果的时候,要记得把预测到的平滑数据给变回去。
# 按照“怎么来的怎么去”原则,log1p()就需要expm1(); 同理,log()就需要exp(), ... etc.
y_train = np.log1p(train_df.pop('SalePrice'))
all_df = pd.concat((train_df, test_df), axis=0)#然后我们把剩下的部分合并起来
print(all_df.shape)#all_df就是我们合在一起的DF
print(y_train.head())#而y_train则是SalePrice那一列经过运算后的# Step 3: 变量转化
# 类似『特征工程』。就是把不方便处理或者不unify的数据给统一了。
# 正确化变量属性
# 首先,我们注意到,MSSubClass 的值其实应该是一个category,
# 但是Pandas是不会懂这些事儿的。使用DF的时候,这类数字符号会被默认记成数字。
# 这种东西就很有误导性,我们需要把它变回成string
# print(all_df['MSSubClass'].dtypes)#默认记成数字
all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)#转成string
# print(all_df['MSSubClass'].value_counts())
# 把category的变量转变成numerical表达形式
# 当我们用numerical来表达categorical的时候,要注意,数字本身有大小的含义,所以乱用数字会给之后的模型学习带来麻烦。于是我们可以用One-Hot的方法来表达category。
# pandas自带的get_dummies方法,可以帮你一键做到One-Hot。
# print(pd.get_dummies(all_df['MSSubClass'], prefix='MSSubClass').head())
# 此刻MSSubClass被我们分成了12个column,每一个代表一个category。是就是1,不是就是0。
# 同理,我们把所有的category数据,都给One-Hot了
all_dummy_df = pd.get_dummies(all_df)
print(all_dummy_df.head())
# 处理好numerical变量
# 就算是numerical的变量,也还会有一些小问题。比如,有一些数据是缺失的:
# print(all_dummy_df.isnull().sum().sort_values(ascending=False).head(10))#可以看到,缺失最多的column是LotFrontage# 处理这些缺失的信息,得靠好好审题。一般来说,数据集的描述里会写的很清楚,这些缺失都代表着什么。当然,如果实在没有的话,也只能靠自己的『想当然』。。
# 在这里,我们用平均值来填满这些空缺。
mean_cols = all_dummy_df.mean()
# print(mean_cols.head(10))
all_dummy_df = all_dummy_df.fillna(mean_cols)#再次查看有没有缺失值
print(all_dummy_df.isnull().sum().sum())#输出0# 标准化numerical数据
# 这一步并不是必要,但是得看你想要用的分类器是什么。一般来说,regression的分类器都比较傲娇,最好是把源数据给放在一个标准分布内。不要让数据间的差距太大。
#
# 这里,我们当然不需要把One-Hot的那些0/1数据给标准化。我们的目标应该是那些本来就是numerical的数据:
#
# 先来看看 哪些是numerical的
numeric_cols = all_df.columns[all_df.dtypes != 'object']
# print(numeric_cols)# 计算标准分布:(X-X')/s
#
# 让我们的数据点更平滑,更便于计算。
#
# 注意:我们这里也是可以继续使用Log的,我只是给大家展示一下多种“使数据平滑”的办法。
numeric_col_means = all_dummy_df.loc[:, numeric_cols].mean()
numeric_col_std = all_dummy_df.loc[:, numeric_cols].std()
all_dummy_df.loc[:, numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means) / numeric_col_std# Step 4: 建立模型
# 把数据集分回 训练/测试集
dummy_train_df = all_dummy_df.loc[train_df.index]
dummy_test_df = all_dummy_df.loc[test_df.index]
# print(dummy_train_df.shape, dummy_test_df.shape)#看看训练集和测试集的大小# Ridge Regression
# 用Ridge Regression模型来跑一遍看看。(对于多因子的数据集,这种模型可以方便的把所有的var都无脑的放进去)
X_train = dummy_train_df.values
X_test = dummy_test_df.values#这一步不是很必要,只是把DF转化成Numpy Array,这跟Sklearn更加配
# 用Sklearn自带的cross validation方法来测试模型
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=10, scoring='neg_mean_squared_error'))test_scores.append(np.mean(test_score))
# 存下所有的CV值,看看哪个alpha值更好(也就是『调参数』)
# plt.plot(alphas, test_scores)
# plt.title("Alpha vs CV Error")
# plt.show()#可见,大概alpha=10~20的时候,可以把score达到0.135左右# Random Forest
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=5, scoring='neg_mean_squared_error'))test_scores.append(np.mean(test_score))
# # plt.plot(max_features, test_scores)
# plt.title("Max Features vs CV Error")
# plt.show()#用RF的最优值达到了0.137左右# Step 5: Ensemble
# 这里我们用一个Stacking的思维来汲取两种或者多种模型的优点
#
# 首先,我们把最好的parameter拿出来,做成我们最终的model
ridge = Ridge(alpha=15)
rf = RandomForestRegressor(n_estimators=500, max_features=.3)
ridge.fit(X_train, y_train)
rf.fit(X_train, y_train)
# print(rf.fit(X_train, y_train))# 上面提到了,因为最前面我们给label做了个log(1+x), 于是这里我们需要把predit的值给exp回去,并且减掉那个"1"
#
# 所以就是我们的expm1()函数。
y_ridge = np.expm1(ridge.predict(X_test))
y_rf = np.expm1(rf.predict(X_test))# 一个正经的Ensemble是把这群model的预测结果作为新的input,再做一次预测。这里我们简单的方法,就是直接『平均化』。
y_final = (y_ridge + y_rf) / 2# Step 6: 提交结果
submission_df = pd.DataFrame(data= {'Id' : test_df.index, 'SalePrice': y_final})
print(submission_df.head(10))

kaggle实战_4解决高维数据分类/回归问题--房价预测相关推荐

  1. bagging回归 波斯顿房价预测

    #bagging回归 波斯顿房价预测from sklearn.datasets import load_bostonboston = load_boston()from sklearn.model_s ...

  2. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测

    微信公号:ilulaoshi / 个人网站:lulaoshi.info 本文将学习一下如何使用PyTorch创建一个前馈神经网络(或者叫做多层感知机,Multiple-Layer Perceptron ...

  3. Kaggle实战(一):泰坦尼克获救预测

    1.数据集简介 此数据集一共有891条数据,数据内容如下,每列表示的意义如下: 乘客ID 是否幸存 舱位等级 姓名 性别 年龄 一同上船的兄弟姐妹 父母和小孩数目 船号 船价 船仓号 登录地点 Pas ...

  4. 第3章(3.11~3.16节)模型细节/Kaggle实战【深度学习基础】--动手学深度学习【Tensorflow2.0版本】

    项目地址:https://github.com/TrickyGo/Dive-into-DL-TensorFlow2.0 UC 伯克利李沐的<动手学深度学习>开源书一经推出便广受好评.很多开 ...

  5. 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)

    [深度学习]实战Kaggle竞赛之线性模型解决波士顿房价预测问题 文章目录 1 概述1.1 Competition Description1.2 Practice Skills 2 数据处理 3 训练 ...

  6. Kaggle实战:点击率预估

    版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Python3.5 项目地址: chengstone/kaggle_cri ...

  7. Kaggle实战——点击率预估

    <深度学习私房菜:跟着案例学Tensorflow>作者 版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Pyt ...

  8. 【数据分析与挖掘】基于LightGBM,XGBoost,逻辑回归的分类预测实战:英雄联盟数据(有数据集和代码)

    机器学习-LightGBM 一.LightGBM的介绍与应用 1.1 LightGBM的介绍 1.2 LightGBM的应用 二.数据集来源 三.基于英雄联盟数据集的LightGBM分类实战 Step ...

  9. Python机器学习实战与kaggle实战

    https://mlnote.wordpress.com/2015/12/16/python%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%B7%B5 ...

最新文章

  1. express 源码阅读(全)
  2. 【c++】8.map和vector容器查找、删除指定元素、emplace、insert
  3. 邮局-[IOI2000](四边形不等式)
  4. ueditor使用-图片上传正常,图片显示异常404
  5. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
  6. 教育|俄罗斯天才少女200万年薪加入华为,22岁拿下世界编程冠军,同天队友也宣布加盟...
  7. java http 工具类_Java发送Http请求工具类
  8. android检查内存泄露工具,Android内存泄露检测 LeakCanary2.0(Kotlin版)的实现原理
  9. ORACLE 查询表空间使用情况
  10. JavaScript(JS)--基础2(基本语法、字面量和变量、标识符、强制类型转换)
  11. 手机开发APP整体界面设计工具之墨刀---没用过就知道它很牛掰
  12. 计算机更改刷新频率,电脑屏幕刷新率怎么调节?怎么更改电脑屏幕刷新率?
  13. 关于uc/os-ii在c51上的移植总结
  14. SDR HDR 动态范围
  15. C语言判断字符是否为数字 如果是输出yes 如果为字母 则大写转换小写 小写转换大写
  16. 本来面目——大教堂、集市,与作坊
  17. 信息化 vs 数字化
  18. 罗振宇2022年“时间的朋友·原来还能这么干”跨年演讲全文无删减整理,内容归纳总结提炼
  19. Win10激活提示“连接到internet激活windows”的最佳解决方法
  20. 如何选择产品经理课程?

热门文章

  1. 如何查找完全二叉树最后一层的最右边的结点
  2. 嵌入式操作系统内核原理和开发(开篇)
  3. linux mysql --help_深入理解mysql帮助命令(help)
  4. 新概念51单片机C语言教程纠错(3)
  5. 优化模型实验报告_BERT微调效果不佳?试试这种大规模预训练模型新范式
  6. mysql source导入_读取MySQL数据库中的数据【Python数据分析百例连载】
  7. cacti mysql-bin_Cacti环境搭建(LNMP环境)
  8. Python基础(注释/算数运算符/变量类型/拼接字符串)
  9. 数据结构:队列的了解与示例(CPU处理任务的时间)
  10. 【Spring】详解ContextLoaderListener和DispatcherServlet的区别