数据的特征工程(数据特征工程常用方法)

数据的特征工程(数据特征工程常用方法)p 来源 DA 随想随笔 p strong 一 概述 strong u 机器学习 u 最基础的 5 个流程 分别是数据获取 数据预处理 特征工程 建模 测试和预测 上线与部署 如果用做菜来对比 数据获取就好比买菜 数据预处理就好比洗菜 特征工程就好比主菜辅料加工准备

大家好,我是讯享网,很高兴认识大家。



 <p> 来源:DA随想随笔</p> 

讯享网

讯享网<strong>一、 概述</strong></p> 

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

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

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

讯享网<strong>数据预处理</strong></p> 

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

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

常见的需要处理的问题有:</p> 

讯享网数据类型问题:数据中有的是文本格式,有的是数值格式,有的同样是时间序列但是格式不同。</p> 

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

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

<strong>特征工程</strong></p> 

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

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

讯享网常见的需要处理的问题有:</p> 

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

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

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

讯享网<strong>二、 常用功能</strong></p> 

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

讯享网</p> 

导入数据,这里以python自带的鸢尾花数据为例

加载数据集

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()

讯享网</p> 

<strong>数据预处理</strong></p> 

讯享网<strong>重复值处理</strong></p> 

</p> 

讯享网

重复值删除

data_iris = data_iris.drop_duplicates()


讯享网

</p> 

讯享网<strong>缺失值处理</strong></p> 

</p> 

讯享网

缺失值处理

查看缺失值

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())

</p> 

讯享网<strong>异常值处理</strong></p> 

</p> 

讯享网

异常值识别

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

from scipy import stats

计算IQR

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




找出异常值

标准差识别异常值,在几个标准差之外的数据定义为异常值

异常值处理

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

</p> 

讯享网<strong>分类变量编码</strong></p> 

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

讯享网</p> 

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()

讯享网</p> 

<strong>连续变量编码</strong></p> 

讯享网将连续变量离散化,使得其可以根据有区分效果。</p> 

</p> 

讯享网

二值化,大于阈值记为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()

</p> 

讯享网<strong>标准化</strong></p> 

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

讯享网</p> 

maxmin标准化

z标准化

讯享网</p> 

<strong>特征工程</strong></p> 

讯享网<strong>业务理解</strong></p> 

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

讯享网如果说数据预处理是对行数据进行操作,那么特征工程主要是对列进行操作。</p> 

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

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

<strong>特征选择-过滤法</strong></p> 

讯享网</p> 

方差过滤

如果一个特征的方差很小,说明数据都集中于一个范围中,没有什么差异性,甚至都是相同的值,该特征用处就不大

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()

</p> 

讯享网<strong>特征选择-嵌入法</strong></p> 

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

讯享网<strong>特征选择-包装法</strong></p> 

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

讯享网<strong>三、 总结</strong></p> 

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

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

审核编辑:汤梓红</p> 


小讯
上一篇 2025-05-12 21:39
下一篇 2025-05-09 14:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/167574.html