前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >完整图解:特征工程最常用的四个业务场景演示

完整图解:特征工程最常用的四个业务场景演示

作者头像
石晓文
发布2019-09-17 11:21:11
1.1K0
发布2019-09-17 11:21:11
举报
文章被收录于专栏:小小挖掘机

数据检测、筛选、处理是特征工程中比较常用的手段,常见的场景最终都可以归类为矩阵的处理,对矩阵的处理往往会涉及到

  • 阈值处理
  • 特征拼接、记录拼接
  • 多条记录中筛选包含特定值的记录
  • 取top N的值

对于矩阵的处理没有趁手的兵器可不行,python中比较强大的库numpy与pandas是最常用的两种。主要使用的函数有,np.vstack, np.hstack, np.where, df.loc, heapq.nlargest。这几个方法的应用已经基本上满足矩阵处理的大部分需求。本文将引入四个业务场景来介绍以上矩阵处理方法。

阈值处理

以单通道图片的提高背景亮度为例,把小于100的灰度值都设置为200。

使用opencv接口读取一张图片的灰度图

使用opencv接口读取一张图片的灰度图

代码语言:javascript
复制
import cv2
import matplotlib.pyplot as plt#约定俗成的写法plt

img = cv2.imread("timg.jpeg",0)
img=cv2.resize(img,(300,300))
cv2.imwrite("im.jpg",img)
代码语言:javascript
复制
img=np.atleast_2d(img)

img1=img.copy()
img1[np.where(img<100)]=200
cv2.imwrite("enhanced.jpg",img1)

二值化常用于目标检测,轮廓提取,或者其他应用

代码语言:javascript
复制
#二值化
img2=np.where(img>160,255,0)
cv2.imwrite("binary.jpg",img2)

特征拼接、记录拼接

这个是最常用的处理方法,特征 $ X$ 与label $ Y$ 经常是分开存储的,在使用数据集之前经常需要shuffle操作,为了避免特征与Label混乱需要先拼接起来再shuffle。

以上文读取的图片特征数据作为例子,假设有300个样本,每个样本的特征维度为300,人工制造300个label用来做拼接工作。

代码语言:javascript
复制
labels=np.atleast_2d([random.randint(0,4) for i in range(img.shape[1])]).reshape([-1,1])
代码语言:javascript
复制
trains=np.hstack((img,labels))

这样的话,特征就与标签拼接到一起,shuffle的时候也不会乱,对应不上。

不仅可以水平拼接,numpy也提供了垂直拼接。这个函数经常用于,数据集扩充的时候,使用数组循环遍历一条条的加载到数据集比较麻烦,使用numpy提供的vstack方法会很方便的拼接到一起。

代码语言:javascript
复制
np.vstack()

样本筛选

样本的筛选一般是挑选满足条件的行记录定位,再索引。引入一个场景,以 特征拼接、记录拼接生成的数据为例,统计label==4的样本有多少个?

思路应该是:

  • 定位label==4的分别在第几行,或者说index等于多少,获取这样一列数组
  • 根据得到的index数据,分别从matrix中取出。

np.where函数能够得到满足条件的index.

代码语言:javascript
复制
np.where(trains[:,-1]==4)

从输出来看可以看到,第0行,7行,...299行的label等于4.

当然不仅仅可以用于一维的索引查找,二维矩阵依然能够定位特定值的位置。

代码语言:javascript
复制
np.where(trains==4)

可以看到返回了两个独立的数组,很明显第一个数组是坐标$X$,第二个数组是坐标$Y$。这样就能在二维空间中对某个特定值定位到具体的位置。

既然已经得到label等于4的行索引,那么就可以遍历行索引得到样本。除了遍历数组以外pandas提供了超级方便的接口。

代码语言:javascript
复制
import pandas as pd
df=pd.DataFrame(trains)
results=df.loc[np.where(trains[:,-1]==4)]

pandas中的loc接口,可以根据给定的行索引直接获取行数据。

Top N方法

假设有下面一组字典集合,该集合是统计文本词的频率,我想找出文本中词频率的前两名的单词是什么?

代码语言:javascript
复制
list1={"numpy":8,"pandas":7,"python":6}
sorted(list1.items(),key=lambda item:item[1])[-2:]

不得不说可读性比较差,这里郭哥提供了一个非常简单的库。

代码语言:javascript
复制
import heapq
heapq.nlargest(2,list1,key=lambda item:item[1])
文章转载自公众号 Python与算法社区 , 作者 zhupc
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 阈值处理
  • 特征拼接、记录拼接
  • 样本筛选
  • Top N方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档