首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Pandas 数据预处理

通常我们在抓取了数据之后,在对数据进行机器学习等分析之前,因为可能存在丢失项、或者要进行文字映射为数字的原因,往往都需要对数据进行必要的预处理。

数据预处理是个很繁琐的过程,幸好有 Pandas 这个强大的工具,这篇小文将展示如何使用 Pandas 对数据进行预处理的,并将处理好的数据用 PyTorch 进行线性回归预测:根据房源信息的 13 个特征值来估算房价。

从文件读取数据

因为我们的数据源为 csv 文件,所以可以使用 read_csv 函数读入 dataframe:

read_csv 有 sep 参数,当分隔符不为逗号时,可用 sep 参数指定。

如果你的数据是字典列表,则可以使用 pd.DataFrame() 实例化,比如:

去掉无关列

当数据中存在无关列时,我们需要去掉这些列,使用 drop 方法:

drop 方法接收一个 column_name 列表;axis=1 表示是第二个维度,即列方向 (聪明的你肯定知道行方向是 axis=0 了);inplace 这个参数在很多 dataframe 的方法里面都有,表示直接应用在 dataframe 变量上,而不是重新拷贝一份,比如:

补全 nan 数据

查看哪些 column 含有 nan 空数据 (这是因为抓取时出错了或是网页本身就没有提供, 这种情况并不少见), 需要补全;否则在训练模型时会产生奇怪的问题。 (!! 非常重要 !!)

对存在 nan 的列进行补全, 使用 fillna 方法:

去除离群点

有些数据可能是人为手误或者是没太多参考价值的,比如 3 平方米建筑面积的房子、或是每平米 500000 元的房子,可以用 describe 方法查出,然后剔除掉:

行筛选有很多方式,可以参考官方文档 https://pandas.pydata.org/pandas-docs/stable/indexing.html,最简单的就是下面这种 boolean indexing:

新增列

有些时候我们需要根据现有信息新增加一个列,比如,在 building_name 这列里,有房源距离地铁几号线多远的信息,我们截取出地铁几号线的信息,作为新的一列,在 series 上使用 apply 方法:

apply 接收的参数是一个函数名。

字符串数字映射

因为神经网络只认数字不认文字,所以我们还需要将字符串映射为数字,思路就是先 groupby 得到某列的所有分类,然后生成 分类 和 id 的 dataframe 充当映射字典,最后再用 apply 方法应用到原先的 dataframe 中,如:

依次处理:

最后处理下 year 这列 (建筑年代) ,转换为楼龄,因为有些房源没有提供该项,默认填了 0,所以需要做下范围截断,假设最老的楼龄为 40 年 (很少会有 1978 年的房子拿出来卖吧...)。

分离特征值和目标

现在我们得到了比较干净的数据了,接下来就可以分离特征值和目录,用来做训练了:

scaling

对目标值进行缩放,原先为 xxxxx 元,现在设置为 xx.xxx 千元:

其实是应该对特征值做 scaling,训练时可以收敛较快。参考 Ng 的机器学习课程中 Feature scaling 小节:

生成训练数据集和测试数据集

简单地取前 5000 条数据为训练数据, 后面的数据为测试数据,使用 as_matrix 方法转换为 numpy.ndarray 形式:

PyTorch 模型和训练数据转换

numpy.ndarray -> Tensor -> Variable -> cuda

不用 GPU 的话可以将最后的 .cuda() 去掉。

线性模型

简单的两层 hidden layer 的线性模型:

损失函数和优化器

训练

可以看到 loss 在逐渐减少, 并且可见 预测值分布 在逐渐靠近真实值。

( 之前曾因为 year 那一列的 nan 没有处理,结果训练过程中所有的 prediction 都是同一个值,浪费了好多时间去调整模型,最后才发现是数据本身的问题!)

测试集验证

可以看到跟训练集时差距不大, 甚至更好。

数据:https://raw.githubusercontent.com/jackhuntcn/notebooks/master/esf.csv

notebook:https://github.com/jackhuntcn/notebooks/blob/master/esf-pandas-pytorch.ipynb

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G0XL4K00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券