机器学习实战机器学习特征工程最全解读

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

如果我们对特征工程(featureengineering)做一个定义,那它指的是:利用领域知识和现有数据,创造出新的特征,用于机器学习算法;可以手动(manual)或自动(automated)。

在业界有一个很流行的说法:

这是因为,在数据建模上,「理想状态」和「真实场景」是有差别的,很多时候原始数据并不是规矩干净含义明确充分的形态:

而特征工程处理,相当于对数据做一个梳理,结合业务提取有意义的信息,以干净整齐地形态进行组织:

特征工程有着非常重要的意义:

我们这里用最简单和常用的Titanic数据集给大家讲解。

Titanic数据集可以通过seaborn工具库直接加载,如下代码所示:

importpandasaspdimportnumpyasnpimportseabornassnsdf_titanic=sns.load_dataset('titanic')其中数据集的数据字段描述如下图所示:

数据可以分为「结构化数据」和「非结构化数据」,比如在互联网领域,大部分存储在数据库内的表格态业务数据,都是结构化数据;而文本、语音、图像视频等就属于非结构化数据。

对于我们记录到的数据,我们通常又可以以「定量数据」和「定性数据」对齐进行区分,其中:

如下图是两类数据示例以及它们常见的处理分析方法的总结:

实际数据挖掘或者建模之前,我们会有「数据预处理」环节,对原始态的数据进行数据清洗等操作处理。因为现实世界中数据大体上都是不完整、不一致的「脏数据」,无法直接进行数据挖掘,或者挖掘结果差强人意。

「脏数据」产生的主要成因包括:

数据清洗过程包括数据对齐、缺失值处理、异常值处理、数据转化等数据处理方法,如下图所示:

下面我们注意对上述提到的处理方法做一个讲解。

数据缺失是真实数据中常见的问题,因为种种原因我们采集到的数据并不一定是完整的,我们有一些缺失值的常见处理方式:

具体的处理方式可以展开成下图:

下面回到我们的Titanic数据集,我们演示一下各种方法:

我们先对数据集的缺失值情况做一个了解(汇总分布):

df_titanic.isnull().sum()survived0pclass0sex0age177sibsp0parch0fare0embarked2class0who0adult_male0deck688embark_town2alive0alone0(1)删除最直接粗暴的处理是剔除缺失值,即将存在遗漏信息属性值的对象(字段,样本/记录)删除,从而得到一个完备的信息表。优缺点如下:

在我们当前Titanic的案例中,embark_town字段有2个空值,考虑删除缺失处理下。

第2大类是我们可以通过一些方法去填充缺失值。比如基于统计方法、模型方法、结合业务的方法等进行填充。

根据业务知识来进行人工手动填充。

将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用unknown填充。一般作为临时填充或中间过程。

代码实现

df_titanic['embark_town'].fillna('unknown',inplace=True)③统计量填充若缺失率较低,可以根据数据分布的情况进行填充。常用填充统计量如下:

中位数填充——fare:缺失值较多,使用中位数填充

df_titanic['fare'].fillna(df_titanic['fare'].median(),inplace=True)众数填充——embarked:只有两个缺失值,使用众数填充

df_titanic['embarked'].isnull().sum()#执行结果:2df_titanic['embarked'].fillna(df_titanic['embarked'].mode(),inplace=True)df_titanic['embarked'].value_counts()#执行结果:#S64同类均值填充

age:根据sex、pclass和who分组,如果落在相同的组别里,就用这个组别的均值或中位数填充。

如果其他无缺失字段丰富,我们也可以借助于模型进行建模预测填充,将待填充字段作为Label,没有缺失的数据作为训练数据,建立分类/回归模型,对待填充的缺失字段进行预测并进行填充。

最近距离邻法(KNN)

回归(Regression)

我们以Titanic案例中的age字段为例,讲解一下:

还可以用插值法对数据填充,细分一下包括线性插值、多重插补、热平台插补、拉格朗日插值、牛顿插值等。

线性插值法

使用插值法可以计算缺失值的估计值,所谓的插值法就是通过两点(x0,y0),(x1,y1)估计中间点的值。假设y=f(x)是一条直线,通过已知的两点来计算函数f(x),然后只要知道x就能求出y,以此方法来估计缺失值。

.interpolate(method='linear',axis)方法将通过linear插值使用沿着给定axis的值替换NaN值,这个差值也就是前后或者上下的中间值

df_titanic['fare'].interpolate(method='linear',axis=0)同时,也可用行值插入

df_titanic['fare'].interpolate(method='linear',axis=1)多重插补(MultipleImputation)

多重插补方法分为三个步骤:

有另外一种非常有意思的填充方式,叫做「哑变量填充」,在变量为离散型,且不同值较少的情况下可以采用,以Titanic数据为例:

以下为参考代码示例:

sex_list=['MALE','FEMALE',np.NaN,'FEMALE','FEMALE',np.NaN,'MALE']df=pd.DataFrame({'SEX':sex_list})display(df)df.fillna('NA',inplace=True)df=pd.get_dummies(df['SEX'],prefix='IS_SEX')display(df)#原始数据SEX0MALE1FEMALE2NaN3FEMALE4FEMALE5NaN6MALE#填充后IS_SEX_FEMALEIS_SEX_MALEIS_SEX_NA001011002001310041005001601当特征值缺失超过80%以上,建议删除【或加入「是」「否」标记位信息】,容易影响模型效果

df_titanic.drop(["deck"],axis=1)2.3异常值处理数据质量也会很大程度影响机器学习应用效果,数据的错误值或异常值可能会造成测量误差或异常系统条件的结果,给模型学习带来很大的问题。实际我们很多时候会有异常值检测与处理环节,下面给大家做一个梳理。

通常用户用某个统计分布对数据点进行建模,再以假定的模型,根据点的分布来确定是否异常。

如通过分析统计数据的散度情况,即数据变异指标,对数据的分布情况有所了解,进而通过数据变异指标来发现数据中的异常点数据。

常用的数据变异指标有极差、四分位数间距、均差、标准差、变异系数等等,如变异指标的值大表示变异大、散布广;值小表示离差小,较密集。

如果数据近似正态分布,在3σ原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。

箱型图判断异常值的方法以四分位数和四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。

我们也可以基于模型对异常值检测,基本思路是先建立一个数据模型,那些同模型不能完美拟合的对象就视作异常。

优点:有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能非常有效。

缺点:对于多元数据,可用的选择少一些,并且对于高维数据,这些检测可能性很差。

我们还有基于距离的方法可以用于异常检测。这类方法基于下面这个假设:如果一个数据对象和大多数点距离都很远,那这个对象就是异常。通过定义对象之间的临近性度量,根据距离判断异常对象是否远离其他对象,主要使用的距离度量方法有绝对距离(曼哈顿距离)、欧氏距离和马氏距离等方法。

一个很直接的异常检测思路是基于分布密度来做,具体为:考察当前点周围密度,局部异常点/离群点的局部密度显著低于大部分近邻点。这类方法适用于非均匀的数据集。

我们可以基于聚类的方法进行异常检测,远离cluster的样本更可能是异常值。

不过该方法会受到聚类cluster个数k的影响,一种策略是对于不同的簇个数重复该分析;另一种方法是找出大量小簇,其想法是:

同样的,我们也有基于近邻度的思路来做异常检测,我们认为异常点远离大部分的点。这种方法比统计学方法更一般、更容易使用,因为确定数据集的有意义的邻近性度量比确定它的统计分布更容易。一个对象的异常点得分由到它的K-最近邻的距离给定,所以异常点得分对K的取值高度敏感:

为了使该方案对于K的选取更具有鲁棒性,可以使用K个最近邻的平均距离。

在数据处理阶段将离群点作为影响数据质量的异常点考虑,而不是作为通常所说的异常检测目标点,一般采用较为简单直观的方法,结合箱线图和MAD的统计方法判断变量的离群点。如下为绘制散点图根据分布直接判断。

对异常值处理,需要具体情况具体分析,异常值处理方法常用的有以下几种:

前序的数据预处理过程能保证我们拿到干净整齐准确的数据,但这些数据未必对于建模是最有效的,下一步我们通常会进行特征构建,结合业务场景产生衍生变量来提升数据表达能力和模型建模效果。

统计特征是一类非常有效的特征,尤其在时序问题场景中,以下为统计特征构建的一些思考维度和方法:

回到Titanic数据集,我们来看看结合业务理解,我们可以做哪些新特征:

年龄处理

我们对年龄age字段进行进一步处理,考虑到不同的年龄段对应的人群可能获救概率不同,我们根据年龄值分成不同区间段,对应到child、young、midlife、old等

defage_bin(x):ifx<=18:return'child'elifx<=30:return'young'elifx<=55:return'midlife'else:return'old'df_titanic['age_bin']=df_titanic['age'].map(age_bin)df_titanic['age_bin'].unique()执行结果:array(['young','midlife','child','old'],dtype=object)抽取「称呼」特征

我们在name字段里,可以看到各种不同的称呼,如「Mr」「Master」「Dr」等,这些称呼体现了乘客的身份等信息,我们可以对其做抽取构建新的特征。

#提取称呼df_titanic['title']=df_titanic['name'].map(lambdax:x.split(',')[1].split('.')[0].strip())df_titanic['title'].value_counts()执行结果如下:

Mr757Miss260Mrs197Master61Rev8Dr8Col4Ms2Major2Mlle2Dona1Sir1Capt1Don1Lady1Mme1theCountess1Jonkheer1我们做一个简单的「称呼」统计

#对称呼细分,是官员,还是皇室,还是女士、先生、小姐df_titanic['title'].unique()执行结果:

array(['Mr','Mrs','Miss','Master','Don','Rev','Dr','Mme','Ms','Major','Lady','Sir','Mlle','Col','Capt','theCountess','Jonkheer','Dona'],dtype=object)下面我们对这些「称呼」「称谓」做一个规范化统一。

title_dictionary={"Mr":"Mr","Mrs":"Mrs","Miss":"Miss","Master":"Master","Don":"Royalty","Rev":"Officer","Dr":"Officer","Mme":"Mrs","Ms":"Mrs","Major":"Officer","Lady":"Royalty","Sir":"Royalty","Mlle":"Miss","Col":"Officer","Capt":"Officer","theCountess":"Royalty","Jonkheer":"Royalty","Dona":'Mrs'}df_titanic['title']=df_titanic['title'].map(title_dictionary)df_titanic['title'].value_counts()执行结果如下:

Mr757Miss262Mrs201Master61Officer23Royalty5抽取家庭规模

在Titanic上,有的成员之间有亲属关系,考虑到家族大小对于最终是否获救也有影响,我们可以构建一个family_size的特征,用于表征家庭规模。

df_titanic['family_size']=df_titanic['sibsp']+df_titanic['parch']+1df_titanic['family_size'].head()执行结果如下:

02122132413.2周期值在电商等场景下,数据有一定的周期规律,我们可以提取一些周期值作为有效信息。

时序周期的一些考虑维度如下:

数据分桶,是对连续值属性处理的一种常用方法,它指的是我们把连续数值切段,并把连续值归属到对应的段中。数据分桶也叫做数据分箱或离散化。

指根据业务经验或者常识等自行设定划分的区间,然后将原始数据归类到各个区间中。

按照相同宽度将数据分成几等份。

从最小值到最大值之间,均分为N等份。如果A、B为最小最大值,则每个区间的长度为W=(BA)/N,区间边界值为A+W、A+2W、…、A+(N1)W。

等距分箱只考虑边界,每个等份里面的实例数量可能不等。等距分桶的缺点是受到异常值的影响比较大。

将数据分成几等份,每等份数据里面的个数是一样的。

在等频分箱中,区间的边界值要经过计算获得,最终每个区间包含大致相等的实例数量。比如说N=5,每个区间应该包含大约20%的实例。

我们先对船票价格做一个等频切分(大家如果对船票价格进行分布绘图,会发现是很长尾的分布,并不适合等距切分),看看分开的区间段。

#qcut等频率分箱df_titanic['fare_bin'],bins=pd.qcut(df_titanic['fare'],5,retbins=True)df_titanic['fare_bin'].value_counts()结果如下:

(7.854,10.5]184(21.679,39.688]180(-0.001,7.854]179(39.688,512.329]176(10.5,21.679]172bins#array([0.,7.8542,10.5,21.6792,39.6875,512.3292])下面根据区间段对其进行等频切分

#对船票fare进行分段分桶deffare_cut(fare):iffare<=7.8958:return0iffare<=10.5:return1iffare<=21.6792:return2iffare<=39.6875:return3return4df_titanic['fare_bin']=df_titanic['fare'].map(fare_cut)相比船票价格,年龄age字段的分布更加集中,且区间大小比较明确,我们采用等距切分,代码如下:

#cut等距离分箱bins=[0,12,18,65,100]pd.cut(df_titanic['age'],bins).value_counts(2)Best-KS分桶(3)卡方分桶自底向上的(即基于合并的)数据离散化方法,依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

基本思想:

如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。

实现步骤:

还有最小熵分箱法,需要使总熵值达到最小,也就是使分箱能够最大限度地区分因变量的各类别。

熵是信息论中数据无序程度的度量标准,提出信息熵的基本目的是找出某种符号系统的信息量和冗余度之间的关系,以便能用最小的成本和消耗来实现最高效率的数据存储、管理和传递。

数据集的熵越低,说明数据之间的差异越小,最小熵划分就是为了使每箱中的数据具有最好的相似性。给定箱的个数,如果考虑所有可能的分箱情况,最小熵方法得到的箱应该是具有最小熵的分箱。

我们在有些场景下会考虑特征组合构建强特征,如下为常用的特征组合构建方式:

1)离散+离散:构建笛卡尔积(即两两组合「且」关系)。2)离散+连续:连续特征分桶后进行笛卡尔积或基于类别特征groupby构建统计特征。3)连续+连续:加减乘除,多项式特征,二阶差分等。

针对连续值特征,我们对几个特征构建多项式特征,以达到特征组合与高阶增强的作用。

在Titanic的例子中,如下为数值型特征:

df_titanic_numerical=df_titanic[['age','sibsp','parch','fare','family_size']]df_titanic_numerical.head()我们可以参考下述代码构建多项式特征

我们对于构建完的特征,会做一些「特征变换」的操作,以适应不同的模型,更好地完成建模。

标准化操作也称作Z-score变换,它使数值特征列的算数平均为0,方差(以及标准差)为1,如下图所示。

标准化操作的参考代码如下:

fromsklearn.preprocessingimportStandardScale#标准化模型训练Stan_scaler=StandardScaler()Stan_scaler.fit(x)x_zscore=Stan_scaler.transform(x)x_test_zscore=Stan_scaler.transform(x_test)joblib.dump(Stan_scaler,'zscore.m')#写入文件4.2归一化(Normalization)归一化操作会基于向量模长调整数据幅度大小,但并不会改变原始数据的顺序。如下图所示:

幅度缩放是为了让不同特征的取值在大体一致的数量级和数据区间内,比较常用的方法是最大最小值缩放,如下图所示:

下面为幅度缩放操作的参考代码:

fromsklearnimportpreprocessingmin_max_scaler=preprocessing.MinMaxScaler()min_max_scaler.fit_transform(x)x_minmax=min_max_scaler.transform(x)x_test_minmax=min_max_scaler.transform(x_test)joblib.dump(min_max_scaler,'min_max_scaler.m')#写入文件4.4归一化VS标准化归一化和标准化是两个非常常见的特征变换操作,下面我们来对比一下标准化和归一化:

它们分别的适用场景可以归纳总结如下:

我们在有些场景下,还会对数值字段进行分布调整或者校正,利用统计或数学变换来减轻数据分布倾斜的影响。使原本密集的区间的值尽可能的分散,原本分散的区间的值尽量的聚合。

大部分变换函数都属于幂变换函数簇,主要作用是稳定方差,保持分布接近于正态分布并使得数据与分布的平均值无关。

我们来看看一些典型的非线性统计变换。

log变换通常用来创建单调的数据变换。主要作用为稳定方差,始终保持分布接近于正态分布并使得数据与分布的平均值无关。

log变换属于幂变换函数簇,数学表达式为

$$y=log_{b}(x)$$

下面我们对Titanic数据集中的船票价格字段进行log1p变换,示例代码如下:

box-cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,box-cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。

box-cox变换函数数学表达式如下:

$$y(\lambda)=\left\{\begin{array}{ll}\frac{y^{\lambda}-1}{\lambda},&\lambda\neq0\\\lny,&\lambda=0\end{array}\right.$$

生成的变换后的输出y,是输入x和变换参数的函数;当λ=0时,该变换就是自然对数log变换,前面我们已经提到过了。λ的最佳取值通常由最大似然或最大对数似然确定。

下面我们对Titanic数据集中的船票价格字段进行box-cox变换,示例代码如下:

对于类别型的字段特征(比如颜色、类型、好坏程度),有很多模型并不能直接处理,我们对其进行编码后能更好地呈现信息和支撑模型学习。有以下常见的类别型变量编码方式:

标签编码(labelencoding)是最常见的类别型数据编码方式之一,编码值介于0和n_classes-1之间的标签。

例如:比如有[dog,cat,dog,mouse,rabbit],我们把其转换为[0,1,0,2,3]。

标签编码的参考代码如下:

fromsklearn.preprocessingimportLabelEncoderle=LabelEncoder()le.fit(["超一线","一线","二线","三线"])print('特征:{}'.format(list(le.classes_)))#输出特征:['一线','三线','二线','超一线']print('转换标签值:{}'.format(le.transform(["超一线","一线","二线"])))#输出转换标签值:array([302]...)print('特征标签值反转:{}'.format(list(le.inverse_transform([2,2,1]))))#输出特征标签值反转:['二线','二线','三线(2)独热向量编码(onehotencoding)独热编码通常用于处理类别间不具有大小关系的特征。

例如:特征:血型,一共有四种类别(A,B,AB,O),采用独热编码后,会把血型变成有一个4维的稀疏向量

最终生成的稀疏向量的维度,和类别数相同。

sex_list=['MALE','FEMALE',np.NaN,'FEMALE','FEMALE',np.NaN,'MALE']df=pd.DataFrame({'SEX':sex_list})display(df)df.fillna('NA',inplace=True)df=pd.get_dummies(df['SEX'],prefix='IS_SEX')display(df)最终变换前后的结果如下:

#原始数据SEX0MALE1FEMALE2NaN3FEMALE4FEMALE5NaN6MALE#独热向量编码后IS_SEX_FEMALEIS_SEX_MALEIS_SEX_NA001011002001310041005001下面我们对'sex','class','pclass','embarked','who','family_size','age_bin'这些字段都进行独热向量编码。

importnumpyasnpfromsklearn.preprocessingimportOneHotEncoder#非负整数表示的标签列表labels=[0,1,0,2]#行向量转列向量labels=np.array(labels).reshape(len(labels),-1)#独热向量编码enc=OneHotEncoder()enc.fit(labels)targets=enc.transform(labels).toarray()#如果不加toarray()的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定sparse=False来达到同样的效果输出结果如下:

array([[1.,0.,0.],[0.,1.,0.],[1.,0.,0.],[0.,0.,1.]])(3)标签二值化(LabelBinarizer)功能与OneHotEncoder一样,但是OneHotEncoder只能对数值型变量二值化,无法直接对字符串型的类别变量编码,而LabelBinarizer可以直接对字符型变量二值化。

示例代码如下:

fromsklearn.preprocessingimportLabelBinarizerlb=LabelBinarizer()labelList=['yes','no','no','yes','no2']#将标签矩阵二值化dummY=lb.fit_transform(labelList)print("dummY:",dummY)#逆过程yesORno=lb.inverse_transform(dummY)print("yesOrno:",yesORno)输出如下:

通过特征降维希望达到的目的:

常用的降维方法有:

这里降维的讲解,我们给大家基于iris数据集讲解:

PCA降维的参考代码实现如下:

SVD方法的主要步骤如下:

$$A^{T}A=\left(U\SigmaV^{T}\right)^{T}U\SigmaV^{T}=V\Sigma^{T}U^{T}U\SigmaV^{T}=V\Sigma^{T}\SigmaV^{T}=V\Sigma^{2}V^{T}$$

所以$V$是$A^{T}A$特征值分解的特征向量按列组成的正交矩阵,$\Sigma^{2}$是$A^{T}A$特征值组成的对角矩阵,也可以看出$A_{m\timesn}$的奇异值$\sigma_{i}$是$A^{T}A$特征值$$\lambda_{i}$$的平方根。

$$\sigma_{i}=\sqrt{\lambda_{i}}$$

假如$A^{T}A$的特征向量为$v_{i}$,$U$中对应的$u_{i}$则可以由下式求出:

$$u_{i}=\frac{Av_{i}}{\sigma_{i}}$$

也即奇异值分解的关键在于对$A^{T}A$进行特征值分解。

对应的代码参考实现如下:

PCA求解关键在于求解协方差矩阵$C=\frac{1}{m}XX^{T}$的特征值分解。

SVD关键在于$A^{T}A$的特征值分解。

很明显二者所解决的问题非常相似,都是对一个实对称矩阵进行特征值分解,如果取:

$$A=\frac{X^{T}}{\sqrt{m}}$$

则有:

$$A^{T}A=\left(\frac{X^{T}}{\sqrt{m}}\right)^{T}\frac{X^{T}}{\sqrt{m}}=\frac{1}{m}XX^{T}$$

此时SVD与PCA等价,所以PCA问题可以转化为SVD问题求解。

是有监督的降维,通过最小化类内离散度与最大化类间离散度来获得最优特征子集。

对应的降维参考实现代码如下:

PCA试图寻找到方差最大的正交的主成分分量轴LDA发现可以最优化分类的特征子空间LDA和PCA都是可用于降低数据集维度的线性转换技巧PCA是无监督算法LDA是监督算法LDA是一种更优越的用于分类的特征提取技术

T-SNE(t-distributedstochasticneighborembedding)是一种非线性降维方法,参考的代码实现如下:

特征选择是在建模过程中经常会用到的一个处理,也有重要意义:

总体来说,进行特征选择有2个主要考虑方向:

对特征选择的方法进行归类,又大体可以归纳为下述3种:

这是通过特征本身的方差来筛选特征的类。

比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。

我们会剔除掉方差非常小的字段特征,参考代码实现如下:

如下为卡方过滤的参考代码示例:

其特征选择的参考代码如下:

fromsklearn.feature_selectionimportf_classiff_value,p_value=f_classif(X,y)#根据p值,得出k值k=f_value.shape[0]-(p_value>0.05).sum()#筛选后特征X_classif=SelectKBest(f_classif,k=14).fit_transform(X,y)(4)互信息法互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。

fromsklearn.feature_selectionimportmutual_info_classifasMIC#互信息法mic_result=MIC(X,y)#互信息量估计k=mic_result.shape[0]-sum(mic_result<=0)#16X_mic=SelectKBest(MIC,k=16).fit_transform(X,y)5.2包裹式Wrapper(1)递归特征删除法递归消除删除法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

fromsklearn.feature_selectionimportRFEfromsklearn.linear_modelimportLogisticRegression#递归特征消除法,返回特征选择后的数据#参数estimator为基模型#参数n_features_to_select为选择的特征个数X_ref=RFE(estimator=LogisticRegression(),n_features_to_select=10).fit_transform(X,y)(2)特征重要性评估我们基于一些模型(如各类树模型)可以得到特征重要度,进而进行筛选

fromsklearn.ensembleimportExtraTreesClassifier#建模与获取特征重要度model=ExtraTreesClassifier()model.fit(X,y)print(model.feature_importances_)#特征重要度排序feature=list(zip(X.columns,model.feature_importances_))feature=pd.DataFrame(feature,columns=['feature','importances'])feature.sort_values(by='importances',ascending=False).head(20)(3)排列重要性评估我们还有一类方法可以评估特征重要度,进而进行筛选,叫作排列重要度。

原理:在训练机器学习模型之后计算置换重要性。这种方法在向模型提出假设,如果在保留目标和所有其他列的同时随机打乱一列验证集特征数据,对预测机器学习模型的准确性的影响程度。对于一个具有高度重要性的特征,random-reshuffle会对机器学习模型预测的准确性造成更大的损害。

优点:快速计算;易于使用和理解;特征重要性度量的属性;追求特征稳定性。

参考代码实现如下:

使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。

使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

fromsklearn.feature_selectionimportSelectFromModelfromsklearn.linear_modelimportLogisticRegression#带L1和L2惩罚项的逻辑回归作为基模型的特征选择,这个设置带L1惩罚项的逻辑回归作为基模型的特征选择lr=LogisticRegression(solver='liblinear',penalty="l1",C=0.1)X_sfm=SelectFromModel(lr).fit_transform(X,y)X_sfm.shape(891,7使用feature_selection库的SelectFromModel类结合SVM模型,来选择特征的代码如下:

fromsklearn.feature_selectionimportSelectFromModelfromsklearn.svmimportLinearSVClsvc=LinearSVC(C=0.01,penalty='l1',dual=False).fit(X,y)model=SelectFromModel(lsvc,prefit=True)X_sfm_svm=model.transform(X)X_sfm_svm.shape(891,7(2)基于树模型树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

fromsklearn.feature_selectionimportSelectFromModelfromsklearn.ensembleimportGradientBoostingClassifier#GBDT作为基模型的特征选择gbdt=GradientBoostingClassifier()X_sfm_gbdt=SelectFromModel(gbdt).fit_transform(X,y)5.4特征选择总结关于特征选择,做一个经验总结,如下:

我们可能会做的一些数据预处理与特征处理如下:

结合业务场景和数据分布,进行合理的缺失值、异常值处理。

建议不要上来就做PCA或LDA降维,最好先构建特征并对特征做筛选。

median(N1)_by(C1)中位数mean(N1)_by(C1)算术平均数mode(N1)_by(C1)众数min(N1)_by(C1)最小值max(N1)_by(C1)最大值std(N1)_by(C1)标准差var(N1)_by(C1)方差freq(C2)_by(C1)频数N1-median(N1)_by(C1)N1-mean(N1)_by(C1)在Scikit-Learn和XGBoost里,可以基于apply()以及decision_path()等方法实现。

THE END
1.结构化与非结构化数据:特点处理与应用,与结构化数据不同,非结构化数据没有明确的数据模型或模式,因此处理和分析非结构化数据更具挑战性。传统的关系型数据库和查询语言无法直接处理非结构化数据,需要使用特定的技术和工具进行处理,如自然语言处理、文本挖掘、图像识别、语音识别等。 非结构化数据在现实生活中广泛存在,例如社交媒体上的用户评论、新闻文章、https://blog.csdn.net/weixin_42899191/article/details/133049007
2.非结构化数据分析技术非结构化数据主要包括6 非结构性数据预处理 非结构化数据是数据结构不规则或者说是不完整,没有预设的数据模型或者结构,不便使用数据库、模型及标准的数据接口表现的数据,包括所有格式的文本、图片、各类报表、图像、音频、视频数据等。 计算机信息化系统中的数据分为结构化数据和非结构化数据。非结构化数据的形式非常多样,标准也具有多样性https://blog.51cto.com/u_16099165/6757640
3.人工智能技术在群聊类数据分析中的探索5.其他非结构化数据 如表情符号、红包等,也是群聊中常见的交流形式。 二、人工智能技术应用 为了有效处理群聊数据的碎片化、多样化等特性,人工智能技术发挥了重要作用,主要包括: 1.自然语言处理 通过NLP技术,我们能够对群聊中的文字数据进行多种处理,包括分词、词性标注、命名实体识别等。这些处理步骤可以帮助我们更好http://www.51testing.com/mobile/view.php?itemid=7800371
4.探索非结构化数据入湖方式及相关技术的最佳实践数字经济观察网伴随着人工智能的兴起和数据湖的广泛应用,非结构化数据入湖变得尤为重要。非结构化数据,如文本、图像、音频和视频等,包含了丰富的信息,但由于其复杂性和多样性,传统的数据管理和分析方法往往无法充分利用这些数据的潜力。然而,结合人工智能和数据湖的技术和方法,可以有效地处理和分析非结构化数据,从中挖掘出有价值的https://www.szw.org.cn/20230817/62871.html
5.IBMCloudObjectStorage在银行业非结构化数据存储嘲下的对象随着银行业IT技术的快速发展和业务的不断升级变革,业务应用系统产生的非结构化数据(包括文件、图片、音视频文件等)的规模也越来越大,银行业非结构化数据呈指数式爆发式增长。目前使用非结构化数据的主要系统包括内容管理平台、后督影像系统、身份验证、柜员办业务扫描件等需要用到影像图片,以及呼叫中心系统、电话客服的https://redhat.talkwithtrend.com/Article/242823
6.非结构化数据包括哪些内容非结构化数据涵盖了文本、图像、音频、视频等多种类型的数据形式,具有丰富多样的内容和应用场景。https://www.gokuai.com/press/a572
7.非结构化数据提取技术在统计工作中的应用摘要结构化数据和非结构化数据是大数据的两种类型,目前非结构化数据信息已达信息总量的85%以上,且每年以55%~65%的速度增长,统计工作受到大数据的冲击,日常总会遇到一些非结构化数据提取的难题,导致工作量加大,效率低下。本文对非结构化数据及其提取技术、大数据处理语言——Python语言进行学习研究,解决实际中遇https://tjj.changzhi.gov.cn/sjfx/202207/t20220704_2588893.html
8.大数据金融第二章大数据相关技术首先是利用多种轻型数据库收集海量数据,对不同来源的数据进行预处理后,整合存储到大型数据库中,然后根据企业或个人目的和需求,运用合适的数据挖掘技术提取有益的知识,最后利用恰当的方式将结果展现给终端用户。 数据处理流程 一 数据采集 大数据的采集是指在确定用户目标的基础上,对该范围内的所有结构化、半结构化、https://www.jianshu.com/p/d68251554c66
9.行政管理论文15篇这势必导致学生处理社会现实问题和交往能力的技能很难有所提升,他们的知识结构、能力结构和素质明显存在不平衡,很难适应信息社会高速发展的需要。操作性和实践性教学严重薄弱。虽然目前我国高校《行政管理学》课程内容体系一般都设置了教学实习、实训等实践环节,但由于其时间短、任务重,而且管理松散,缺乏常态化和规范化,https://www.ruiwen.com/lunwen/6220159.html
10.2022年度陕西省重点研发计划项目申报指南目录4.9 大规模非结构化网格并行剖分技术研究 4.10 大流量高温燃油调节方法及调节器设计关键技术 5.新一代通信技术 5.1 空地一体化网络立体致密多维覆盖技术 5.2 面向天地一体化大规模星座的网络化测控关键技术 5.3 新型天线形态下基于大规模 MIMO 的机载数据高速传输技术 http://www.kt180.com/html/sxs/9889.html
11.数据架构:大数据数据仓库以及DataVault值得注意的是,企业中的大数据包括重复型非结构化数据和非重复型非结构化数据,如图1.1.6所示。 1.1.5 分界线 一开始,对于非结构化数据的两种类型(重复型非结构化数据和非重复型非结构化数据),我们可能认为它们之间的差别是难以预料、微不足道的。实际上,这两种非结构化数据类型之间的差异并非微不足道。因为这两https://www.ituring.com.cn/book/tupubarticle/11854
12.结构化与非结构化的区别多源异构数据源半结构化数据当代,高新技术发展迅速,大数据作为新兴潜力股也发展迅猛,人们不断探索数据分析、数据处理以及数据可视化等的深度,那么,活在这个时代的你,对结构化与非结构化数据了解多少?对多源异构数据源又多少了解?下面让我们一起来详细学习一下吧。 结构化与非结构化数据的区别: https://www.fanruan.com/bw/doc/154297
13.重识云原生第三章云存储3.4节——OpenStackSwift对象存储Swift无需采用RAID(磁盘冗余阵列),也没有中心单元或主控结点。Swift通过在软件层面引入一致性哈希技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性(High Availability,简称HA)和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。 https://cloud.tencent.com/developer/article/1977492
14.什么是非结构化数据?非结构化数据面临很多难题和挑战,主要包括以下方面。 -数据质量问题:由于非结构化数据的形式、文本格式、语法、拼写等问题,数据表现形式良莠不齐,造成了数据质量问题。 -数据分析难度:非结构化数据带来的复杂性高,使得非结构数据分析变得非常困难。 -旧有工具缺陷:传统的数据处理工具和技术,如SQL等,无法处理非结构化https://www.filez.com/news/detail/faee08ab6bdc85c2d6216e4773bcc01f.html
15.一文带你了解五种典型数据入湖嘲3. 整个数据链路中,数据如何治理。 当我们把数据栈的整个链路打开后发现是非常复杂的。首先需要解决的就是数据集成的场景,包括不同类型的数据源、APP应用、半结构化/非结构化数据的接入和集成。数据集成与数据迁移或者数据同步的场景不同,我们在这里可以简单的分为数据入仓和数据入湖。集成之后进行数据处理,再做数据https://maimai.cn/article/detail?fid=1737980109&efid=Z6YwIjWEl_nV7fbEQ0l9SA
16.科学网—[转载]武新:大数据架构及行业大数据应用所谓的“大数据应用”主要是对各类数据进行整理、交叉分析、比对,对数据进行深度挖掘,对用户提供自助的即席、迭代分析能力。还有一类就是对非结构化数据的特征提取(指纹、图像、语音自动识别、基因数据比对等),以及半结构化数据的内容检索(搜索)、理解(语义分析)等。传统数据库对这类需求和应用无论在技术上还是功能上https://blog.sciencenet.cn/blog-887780-1358813.html
17.一看就懂!15个交互与UI必懂的技术用语优设网2. 非结构化数据: 与上面相反,很难用统一的格式/结构来组织、且不能用二维关系表展示的数据。 比如:各种散落文本、图片、视频音频、文档、HTML 等 特点:信息展示比较零散 版本兼容 指新/老版本之间,在产品信息与能力上的协调或处理。一般体现在 2 个方面:数据兼容和功能兼容。 https://www.uisdc.com/15-ui-technical-terms/
18.爱数非结构化数据中台解决方案针对文档、图片、视频等非结构化数据,打造统一数据管理、统一分析洞察、统一安全体系、统一内容服务的融合式中台。 非结构化数据中台围绕非结构化数据以DIKW模型为指引,消除数据孤岛,深度融合人工智能技术,实现汇集、治理、分析洞察和知识服务,全方位赋能业务与人。 https://www.aishu.cn/cn/unstructured-data-solution