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

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

  • 阈值处理

  • 特征拼接、记录拼接

  • 多条记录中筛选包含特定值的记录

  • 取top N的值

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

阈值处理

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

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

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

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)

640?wx_fmt=png

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

640?wx_fmt=png

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

#二值化	
img2=np.where(img>160,255,0)	
cv2.imwrite("binary.jpg",img2)

640?wx_fmt=png

特征拼接、记录拼接

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

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

labels=np.atleast_2d([random.randint(0,4) for i in range(img.shape[1])]).reshape([-1,1])
trains=np.hstack((img,labels))

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

640?wx_fmt=png

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

 np.vstack()

640?wx_fmt=png

样本筛选

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

思路应该是:

  • 定位label==4的分别在第几行,或者说index等于多少,获取这样一列数组

  • 根据得到的index数据,分别从matrix中取出。

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

np.where(trains[:,-1]==4)

640?wx_fmt=png

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

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

 np.where(trains==4)

640?wx_fmt=png

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

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

import pandas as pd	
df=pd.DataFrame(trains)	
results=df.loc[np.where(trains[:,-1]==4)]

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

640?wx_fmt=png

Top N方法

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

list1={"numpy":8,"pandas":7,"python":6}	
sorted(list1.items(),key=lambda item:item[1])[-2:]

640?wx_fmt=png

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

import heapq	
heapq.nlargest(2,list1,key=lambda item:item[1])


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值