0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据预处理和特征工程的常用功能

新机器视觉 来源:DA随想随笔 2024-01-25 11:26 次阅读

来源:DA随想随笔

一、 概述

机器学习最基础的5个流程,分别是数据获取,数据预处理,特征工程,建模、测试和预测,上线与部署。

如果用做菜来对比,数据获取就好比买菜,数据预处理就好比洗菜,特征工程就好比主菜辅料加工准备,建模就好比炒菜,上线部署就好比摆盘上菜。

由此可见,数据预处理和特征工程在整个机器学习应用工作中,占据了极其重要的地位。要是菜没洗干净,食材没加工好,大厨手艺再高也做不出好吃的菜。

数据预处理

数据预处理主要是从数据角度和业务角度两方面入手,从获取的数据中查缺补漏,修正不准确的数据,剔除不适用的数据。

数据预处理的主要目的就是让数据符合模型需求,能正确表达业务意义。

常见的需要处理的问题有:

数据类型问题:数据中有的是文本格式,有的是数值格式,有的同样是时间序列但是格式不同。

数据质量问题:数据存在重复值,异常值,缺失值,数据量纲不统一有的数据取值在(0,1)之间有的取值是百万级的,样本分布存在偏态有某几类样本量极大。

业务表达问题:有些数据从值上看符合一般逻辑,但是落在具体业务场景中,就会存在问题,因此要结合业务意义,剔除不符合要求的样本数据。

特征工程

特征工程主要是对原始数据进行加工、组合、转换、产生新的变量,使其更能代表预测模型的潜在问题。同时还可以通过特征工程,挑选和提取一些更有价值的特征,剔除一些对模型性能影响不大的特征,从而降低模型计算的复杂度。

特征工程的主要目的是降低模型计算成本,提高模型精度。

常见的需要处理的问题有:

相关性分析:特征与特征之间相关性强,说明具有多重共线性,可以将几个特征组合成一个新特征,实现降维;特征与目标之间的相关性强,说明特征对目标的解释性好,是可用的特征,反之,说明特征对目标没什么影响,则可以剔除该特征。

特征构造:基于原始特征,进行组合,转换,加工,生成新的特征,使得其更具有对目标的解释性。

特征降维:讲一些解释性弱的特征,业务意义不强的特征剔除,降低模型运算复杂度,提高性能。

二、 常用功能

接下来以python为例,介绍在数据预处理和特征工程过程中常用的一些方法。

# 导入数据,这里以python自带的鸢尾花数据为例
from sklearn import datasets
import pandas as pd  
import numpy as np
# 加载数据集
data = datasets.load_iris()
X = data.data   # 特征值
y = data.target   # 目标值
data_iris=pd.DataFrame(X)
data_iris['target']=pd.DataFrame(y)
data_iris=data_iris.rename(columns={0:'F1',1:'F2',2:'F3',3:'F4','target':'target'})
data_iris.head()

数据预处理

重复值处理

# 重复值删除
data_iris = data_iris.drop_duplicates()

缺失值处理

# 缺失值处理
## 查看缺失值
data_iris.isnull().sum()
## 缺失值删除
### 删除含有缺失值的行  
data_iris = data_iris.dropna()  


### 删除含有缺失值的列  
data_iris = data_iris.dropna(axis=1)


##缺失值填补
### 用指定数值填充缺失值 ,如0
data_iris = data_iris.fillna(0)
### 用均值、中位数、众数填补
data_iris = data_iris.fillna(data_iris.mean())

异常值处理

# 异常值识别
## 分位数识别异常值,将上下四分位数之外的都定义为异常值


from scipy import stats  


### 计算IQR  
Q1 = data_iris.quantile(0.25)  
Q3 = data_iris.quantile(0.75)  
IQR = Q3 - Q1  


### 找出异常值  
lower_bound = Q1 - 1.5 * IQR  
upper_bound = Q3 + 1.5 * IQR  
outliers = data_iris[(data_iris < lower_bound) | (data_iris > upper_bound)]


## 标准差识别异常值,在几个标准差之外的数据定义为异常值 
z_scores = (data_iris - data_iris.mean()) / data_iris.std()  
outliers_z = z_scores[abs(z_scores) > 3]


# 异常值处理
# 异常值处理方式很多,如直接删除或用均值替代等,其与缺失值处理方式基本一致,就不再额外赘述。

分类变量编码

让不可计算的分类变量转化为可计算的数值或者矩阵

# label编码,将分类变量转化成数值形式
from sklearn.preprocessing import LabelEncoder
data_iris.iloc[:,-1] = LabelEncoder().fit_transform(data_iris.iloc[:,-1])
# onehot编码,创建虚拟变量,将分类变量转化成01矩阵
from sklearn.preprocessing import OneHotEncoder
X = data_iris.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()

连续变量编码

将连续变量离散化,使得其可以根据有区分效果。

# 二值化,大于阈值记为1,小于阈值记为0
from sklearn.preprocessing import Binarizer
X = data_iris.iloc[:,0].values.reshape(-1,1)               #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold=30).fit_transform(X)
#transformer
# 分箱
from sklearn.preprocessing import KBinsDiscretizer
X = data_iris.iloc[:,0].values.reshape(-1,1) 
# n_bins设置要分几箱,默认为5;encode设置编码方式,默认onehot;
# strategy设置分箱方法,默认为quantile等位分箱(每箱样本数量相同),uniform等宽分箱,每个箱的上下限差值相同,kmeans聚类分箱
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
#查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()

标准化

消除变量的量纲,使得特征变量的值都收敛于同一个范围。

# maxmin标准化
from sklearn.preprocessing import MinMaxScaler
#实现归一化
scaler = MinMaxScaler()                             
scaler = scaler.fit(data_iris)                           
result = scaler.transform(data_iris)                     


# z标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()                           
scaler = scaler.fit(data_iris) 
result = scaler.transform(data_iris)

特征工程

业务理解

通过数据预处理,数据逻辑上的错误基本已经消除。但这是否就代表着可以建模了呢?当然不是,这里还需要对特征进行处理。

如果说数据预处理是对行数据进行操作,那么特征工程主要是对列进行操作。

而这其中,最重要的一步,是对特征的业务理解。如,某一个数据集有几列分别为地区,天气,降水量,空气湿度,用户年龄。

如果现在是要对天气情况进行分析,那么很明显,用户年龄这个特征字段对这个目标是没有用处的。因此从业务理解的角度考虑,首先就可以剔除一些没有错,但没有用的特征变量。

特征选择-过滤法

# 方差过滤
## 如果一个特征的方差很小,说明数据都集中于一个范围中,没有什么差异性,甚至都是相同的值,该特征用处就不大
from sklearn.feature_selection import VarianceThreshold
#获取删除不合格特征之后的新特征矩阵
X = VairanceThreshold().fit_transform(data_iris) 
# 相关性过滤
## 如果特征与标签之间没有相关性,则可以剔除该特征,如果特征与特征之间相关性很强,则可以将特征组合,实现降维
## 这里以卡方过滤为例,常见的还有F检验,互信息等
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# k表示需要保留的特征个数
X_kafang = SelectKBest(chi2, k=3).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
## 至于k怎么取值,一方面是可以根据业务实际需要取,也可以通过学习曲线取学习曲线中最高点对应的k值
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(3,0,-1):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,data_iris['target'],cv=5).mean()
    score.append(once)
plt.plot(range(3,0,-1),score)
plt.show()

特征选择-嵌入法

将特征嵌入模型,让算法同时进行特征选择和模型训练,然后输出特征的权重参数值,通过排序选择有用的特征,这里没有一个统一的标准去判断权重参数达到什么标准可以剔除。且不同算法对参数读取的函数也略有不同,因此对本方法就不具体举例了。

特征选择-包装法

通过引入一个函数,来帮助算法在模型训练时自主选择特征,不需要人工判断参数值。该方法相对复杂,本文也不做举例。

三、 总结

本文简单介绍了数据分析过程中,数据预处理和特征工程的相关基础内容,并进行了一些举例。但其实这两部分内容远不是这么简单,在实际操作中,所遇到的问题更加复杂,且可应用的方法也非常多,本文所介绍的都是最基础的方法,便于理解其用途。

可以说数据分析结果好不好,很大程度取决于数据预处理和特征工程做的好不好。本文相对粗浅,感兴趣的朋友,可以再深入研究。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130562
  • 数据集
    +关注

    关注

    4

    文章

    1178

    浏览量

    24351
  • 数据预处理
    +关注

    关注

    1

    文章

    16

    浏览量

    2719

原文标题:算法基础-数据预处理和特征工程

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    转:Keil的使用方法 - 常用功能(二)

    的链接(微信点击阅读原文),Keil使用方法(汇总):http://blog.csdn.net/ybhuangfugui/article/details/51647893 今天总结关于工程目标(配置)选项的常用功能,不会总结每一个功能
    发表于 06-13 10:42

    allegro软件常用功能操作汇总

    allegro软件常用功能操作汇总文章部分截图:点击下载
    发表于 04-30 16:00

    请问预处理有哪些常用功能分别如何使用?

    预处理有哪些常用功能,分别如何使用? 温馨提示: 请从以下链接中的帖子学习相关内容并进行回答,其他地方得到的答案不能作为标准答案,仅能做为补充说明,七天之内答案不可见,答题的童鞋有七天时间修改
    发表于 05-21 09:17

    Python数据预处理方法

    机器学习-Python实践Day3(特征工程--数据预处理2)
    发表于 06-03 15:55

    数据探索与数据预处理

    目录1数据探索与数据预处理21.1 赛题回顾21.2 数据探索性分析与异常值处理21.3 相关性分析52
    发表于 07-12 08:37

    c语言预处理命令以什么开头

    全面了吧。#define和#include是最常用预处理,单片机程序不用其他预处理也完全可行。所以初学者并不深究预处理的应用。我也只是初学者而已,但是发现
    发表于 07-20 07:00

    数据预处理故障信息获取

    数据预处理故障信息获取1.目前,常用的故障诊断参数有电流、电压、功率、转矩、磁通、温度、振动等物理量。其中定子电流信号相对于其它参数受环境等外界影响最小,也因为电流传感器安装方便而最容易获取,因此
    发表于 09-06 08:43

    工业蒸汽量预测的数据预处理知识有哪些

    工业蒸汽量预测的数据预处理知识有哪些?工业蒸汽量预测的特征工程有哪些?
    发表于 10-22 06:32

    变频器的常用功能

    变频器的常用功能
    发表于 08-23 10:48 86次下载

    AltiumDesigner设计常用功能键大全

    Altium Designer 设计常用功能键大全
    发表于 07-03 15:19 0次下载

    Keil的使用方法 - 常用功能(二)

    Keil的使用方法 - 常用功能(二)
    的头像 发表于 04-07 14:55 2999次阅读
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(二)

    Keil的使用方法 - 常用功能(一)

    Keil的使用方法 - 常用功能(一)
    的头像 发表于 04-07 14:51 8193次阅读
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(一)

    机器学习的特征预处理问题讨论

    本文我们来讨论特征预处理的相关问题。主要包括特征的归一化和标准化,异常特征样本清洗与样本数据不平衡问题的
    的头像 发表于 03-15 17:14 726次阅读

    allegro常用功能介绍

    allegro常用功能介绍
    发表于 01-10 11:53 0次下载

    机器学习算法学习之特征工程1

    特征工程是机器学习过程中的关键步骤,涉及将原始数据转换为机器学习算法可以有效使用的格式。在本篇博客文章中,我们介绍了各种特征工程技术,包括
    的头像 发表于 04-19 11:38 551次阅读
    机器学习算法学习之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>1