kaggle实战_4解决高维数据分类/回归问题--房价预测
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解决高维数据分类/回归问题--房价预测相关推荐
- bagging回归 波斯顿房价预测
#bagging回归 波斯顿房价预测from sklearn.datasets import load_bostonboston = load_boston()from sklearn.model_s ...
- pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测
微信公号:ilulaoshi / 个人网站:lulaoshi.info 本文将学习一下如何使用PyTorch创建一个前馈神经网络(或者叫做多层感知机,Multiple-Layer Perceptron ...
- Kaggle实战(一):泰坦尼克获救预测
1.数据集简介 此数据集一共有891条数据,数据内容如下,每列表示的意义如下: 乘客ID 是否幸存 舱位等级 姓名 性别 年龄 一同上船的兄弟姐妹 父母和小孩数目 船号 船价 船仓号 登录地点 Pas ...
- 第3章(3.11~3.16节)模型细节/Kaggle实战【深度学习基础】--动手学深度学习【Tensorflow2.0版本】
项目地址:https://github.com/TrickyGo/Dive-into-DL-TensorFlow2.0 UC 伯克利李沐的<动手学深度学习>开源书一经推出便广受好评.很多开 ...
- 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)
[深度学习]实战Kaggle竞赛之线性模型解决波士顿房价预测问题 文章目录 1 概述1.1 Competition Description1.2 Practice Skills 2 数据处理 3 训练 ...
- Kaggle实战:点击率预估
版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Python3.5 项目地址: chengstone/kaggle_cri ...
- Kaggle实战——点击率预估
<深度学习私房菜:跟着案例学Tensorflow>作者 版权声明:本文出自程世东的知乎,原创文章,转载请注明出处:Kaggle实战--点击率预估. 请安装TensorFlow1.0,Pyt ...
- 【数据分析与挖掘】基于LightGBM,XGBoost,逻辑回归的分类预测实战:英雄联盟数据(有数据集和代码)
机器学习-LightGBM 一.LightGBM的介绍与应用 1.1 LightGBM的介绍 1.2 LightGBM的应用 二.数据集来源 三.基于英雄联盟数据集的LightGBM分类实战 Step ...
- 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 ...
最新文章
- express 源码阅读(全)
- 【c++】8.map和vector容器查找、删除指定元素、emplace、insert
- 邮局-[IOI2000](四边形不等式)
- ueditor使用-图片上传正常,图片显示异常404
- java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
- 教育|俄罗斯天才少女200万年薪加入华为,22岁拿下世界编程冠军,同天队友也宣布加盟...
- java http 工具类_Java发送Http请求工具类
- android检查内存泄露工具,Android内存泄露检测 LeakCanary2.0(Kotlin版)的实现原理
- ORACLE 查询表空间使用情况
- JavaScript(JS)--基础2(基本语法、字面量和变量、标识符、强制类型转换)
- 手机开发APP整体界面设计工具之墨刀---没用过就知道它很牛掰
- 计算机更改刷新频率,电脑屏幕刷新率怎么调节?怎么更改电脑屏幕刷新率?
- 关于uc/os-ii在c51上的移植总结
- SDR HDR 动态范围
- C语言判断字符是否为数字 如果是输出yes 如果为字母 则大写转换小写 小写转换大写
- 本来面目——大教堂、集市,与作坊
- 信息化 vs 数字化
- 罗振宇2022年“时间的朋友·原来还能这么干”跨年演讲全文无删减整理,内容归纳总结提炼
- Win10激活提示“连接到internet激活windows”的最佳解决方法
- 如何选择产品经理课程?
热门文章
- 如何查找完全二叉树最后一层的最右边的结点
- 嵌入式操作系统内核原理和开发(开篇)
- linux mysql --help_深入理解mysql帮助命令(help)
- 新概念51单片机C语言教程纠错(3)
- 优化模型实验报告_BERT微调效果不佳?试试这种大规模预训练模型新范式
- mysql source导入_读取MySQL数据库中的数据【Python数据分析百例连载】
- cacti mysql-bin_Cacti环境搭建(LNMP环境)
- Python基础(注释/算数运算符/变量类型/拼接字符串)
- 数据结构:队列的了解与示例(CPU处理任务的时间)
- 【Spring】详解ContextLoaderListener和DispatcherServlet的区别