专栏首页小小挖掘机完整图解:特征工程最常用的四个业务场景演示

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

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

  • 阈值处理
  • 特征拼接、记录拼接
  • 多条记录中筛选包含特定值的记录
  • 取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)
img=np.atleast_2d(img)

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

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

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

特征拼接、记录拼接

这个是最常用的处理方法,特征 $ 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的时候也不会乱,对应不上。

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

np.vstack()

样本筛选

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

思路应该是:

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

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

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

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

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

np.where(trains==4)

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

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

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

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

Top N方法

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

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

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

import heapq
heapq.nlargest(2,list1,key=lambda item:item[1])
文章转载自公众号 Python与算法社区 , 作者 zhupc

本文分享自微信公众号 - 小小挖掘机(wAIsjwj)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 盘一盘NumPy (下)

    重塑 (reshape) 和打平 (ravel, flatten) 这两个操作仅仅只改变数组的维度

    石晓文
  • 推荐系统遇上深度学习(四十二)-使用图神经网络做基于会话的推荐

    现有基于会话的推荐,方法主要集中于循环神经网络和马尔可夫链,论文提出了现有方法的两个缺陷: 1)当一个会话中用户的行为数量十分有限时,这些方法难以获取准确的用户...

    石晓文
  • 干货!最全的AI速查表|神经网络,机器学习,深度学习

    这个速查表可以帮助你为你的任务找到合适的estimator,这个是工作中最困难的地方。流向图帮助你查找文档,estimator也能大致的帮助你更加好的理解你的问...

    石晓文
  • 完整图解:特征工程最常用的四个业务场景演示 | 文末留言送书

    对于矩阵的处理没有趁手的兵器可不行,python中比较强大的库numpy与pandas是最常用的两种。主要使用的函数有,np.vstack, np.hstack...

    double
  • RetentionScience:与Swym合作集成应用程序

    RetentionScience是基于人工智能的营销自动化平台,可为每个接触点的每个客户提供自定义体验。我们很高兴与Swym集成,此应用程序可以帮助用户通过愿望...

    AiTechYun
  • 分水岭 golang入坑系列

    第三式开篇语有些负面, 所以这里就不贴了。有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/conten...

    随机来个数
  • ​CODING 敏捷项目管理全新改版上线

    CODING 敏捷项目管理全新版本现已上线,新版本深度结合敏捷开发理念,完美支持 Scrum 迭代式增量开发过程,可根据团队需要设计独一无二的工作流,适应不同规...

    CODING研发管理系统
  • centos 部署spring boot应用

    Meet相识
  • 宝塔 Linux 面板新增一键部署源码扩展功能

    魏艾斯博客www.vpsss.net
  • 【开源】高颜值 & 功能强大的开源Markdown编辑器

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

    昱良

扫码关注云+社区

领取腾讯云代金券