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

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

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

最真实的开发者用云体验

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

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

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

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

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

为开发者定制的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://baijiahao.baidu.com/s?id=1786215597320995897&wfr=spider&for=pc
2.面试总结,十大数据预处理方法!归一化后的数据: 4. 类别编码(Categorical Encoding) 将类别特征转换为数值形式,以便机器学习算法能够处理。 原理 机器学习算法通常只能处理数值特征,因此需要将类别特征转换为数值。 核心公式 独热编码(One-Hot Encoding):对于一个类别特征具有个不同的类别,将其转换为维向https://mp.weixin.qq.com/s?__biz=MjM5NzEyMzg4MA==&mid=2649508484&idx=4&sn=34a64015791748ac0f28fee2e107bcec&chksm=bf1edcfc1d0bc191805601740b1706942b62a12c8955315a78069a1dc61e7ec4d7138b0837ea&scene=27
3.非结构化数据挖掘方法非结构化数据如何采集2.对非结构化数据的采集 非结构化数据的采集就是针对所有非结构化的数据的采集,包括企业内部数据的采集和网络数据的采集等。企业内部数据的采集是针对企业内部各种文档、视频、音频、邮件、图片等数据格式之间互不兼容的数据采集。 网络数据采集是指针对通过爬虫或网站公开api等方式从网上获取互联网中相关网页内容的过程https://blog.51cto.com/u_16213663/7030338
4.非结构化数据挖掘是什么帆软数字化转型知识库社交媒体分析:非结构化数据挖掘在社交媒体分析中具有重要作用,通过分析用户帖子、评论、互动数据等非结构化数据,可以了解公众的情感态度、热点话题、社交网络结构等信息,支持舆情监测、市场调研、品牌管理等。例如,通过分析社交媒体上的用户评论,可以了解公众对某个事件或产品的情感态度,帮助企业进行品牌管理和市场调研。 https://www.fanruan.com/blog/article/611436/
5.技术与工程师的巧妙联系这是远高于平均年薪增幅为IT工作者。公司需要数据库专业人员,一切从主数据管理和预测分析,以移动应用和开放系统的发展。但他们需要的是那些专业人士谁可以攻击非结构化数据集是什么。 数据更高达90% ,现在是非结构化的, 这是关于你如何创建一个结构,从噪声区分信号。https://m.zol.com.cn/article/4304345.html
6.如何高效的使用Python和pandas清理非结构化文本字段技巧pandas有多种清洗文本字段的方法,可以用来为进一步分析做准备。随着数据集越来越大,文本清洗的过程会逐渐变长,寻找一个能在合理时间内有效运行并可维护的方法变得非常重要。本文将展示清洗大数据文件中文本字段的示例,帮助大家学习使用 Python 和pandas 高效清理非结构化文本字段的技巧。https://www.elecfans.com/d/1563616.html
7.研究生开题报告(合集15篇)其二,作者自4月在XXX实习过程中进一步了解到,因为关系数据库在存储数据格式方面的局限,以及其Schema机制带来的扩展性上的不便,目前在大部分的大数据应用环境中都采用非结构化的数据库,如列式存储的Hbase,文档型存储的MangoDB,图数据库neo4j等。这些非结构化数据库因为可扩展性强、资源利用率高,高并发、响应速度快等https://www.ruiwen.com/kaitibaogao/6370166.html
8.数字化学习资源及其应用专题培训1. 获取的便捷性 利用数字化学习资源的学生可以不受时空和传递呈现方式的限制,通过多种设备,使用各种学习平台获得高质量课程相关信息,可以实现随意的信息的传送、接收、共享、组织和储存。 2.形式的多样性 数字化学习资源以电子数据的形式表现信息内容,其主要的媒体呈现形式有文本、图像、声音、动画、视频等,极大地丰http://www.zpxx.wj.czedu.cn/html/article731078.html
9.企业提升非结构化数据数据质量的5个技巧数据清洗涉及识别并纠正(或删除)非结构化数据集中的错误和不一致数据,这可能包括消除重复项、校正错别字、格式化日期和时间、统一大小写等。 实施步骤: 识别错误和异常值。 标准化数据格式。 移除无关内容。 2. 数据标注与分类 技巧描述: 对非结构化数据进行标注和分类,可以增加数据的可用性和准确性,对图片标记相https://www.kdun.com/ask/406286.html
10.不懂这25个名词,好意思说你懂大数据?流处理被设计来用于持续地进行流数据的处理。与流分析技术(指的是能够持续地计算数值和统计分析的能力)结合起来,流处理方法特别能够针对大规模数据的实时处理。 25 结构化vs非结构化数据(Structured v Unstructured Data) 这是大数据中的对比之一。结构化数据基本上是那些能够被放在关系型数据库中的任何数据,以这种方式https://gxq.guiyang.gov.cn/zjgxq/zjgxqxyzs/zjgxqxyzsdsjqy/201710/t20171013_17120534.html
11.2022年中国知识图谱行业研究报告澎湃号·湃客澎湃新闻互联网的海量信息带有碎片化与非架构化特征。新兴互联网应用的蓬勃发展,让完整信息被分类分解为信息片段,信息被大量简化,从而导致信息本身不全面、内在逻辑不完整。同时,文本、图片、各类报表和音频、视频、HTML等非结构化数据广泛存在于互联网中。互联网企业需要在现有的存量业务中,收集碎片化信息,处理非结构化数据,挖掘https://www.thepaper.cn/newsDetail_forward_19458208
12.简述密文检索技术非结构化数据的密文检索 非结构数据是没有固定数据结构的数据,如文件、声音、图像等。主要的技术是基于关键字的密文文本型数据的检索。 根据检索方法的不同,可以分为基于顺序扫描的方案,以及基于密文索引的方案;可以检索性质的不同,可以分为基于单关键字的检索、基于可连接的多关键字的检索、模糊检索、密文排序检索等https://www.jiamisoft.com/blog/35200-mwjs.html
13.高中信息技术课程标准有专家认为,对于能够借助计算机技术来解决的问题,可以按照其结构化程度划分成三个类型:结构化问题,是能够通过形式化(或称公式化)方法描述和求解的一类问题;非结构化问题难以用确定的形式来描述,主要根据经验来求解;半结构化问题则介于上述两者之间。请依照该思路,调查结构化问题的实例,并归纳解决此类问题的一般规律。 https://www.fqkhzx.cn/index/article/view/id/94.html
14.枣庄市课程纲要编写指导意见“内容目标”主要是进一步挖掘教材文本的教学价值,从语文核心素养四个方面,审视文本特质,梳理核心的教学内容,提炼出本课文中具体的内容目标。文本特质的确定原则:从语言、文学、文章、文化、文体等要素思考,为语文核心价值内容,针对文本,非教不可的内容。 http://tzsxzx.tzjtzy.cn/index.php?r=space/school/portal/content/view&id=419895
15.HDFS上传文件不均衡和Balancer太慢的问题腾讯云开发者社区向HDFS上传文件,如果是从某个datanode开始上传文件,会导致上传的数据优先写满当前datanode的磁盘,这对于运行分布式程序是非常不利的。 解决的办法: 1、从其他非datanode节点上传 可以将Hadoop的安装目录复制一份到一个不在集群中的节点(直接从非datanode的namenode上传也可以,但是这样不太好,会增加namenode的负担,并且https://cloud.tencent.com/developer/article/2038873
16.浅谈大数据趋势下的企业财务分析改进分析财务管理论文还需要收集、整理与财务、业务、客户相关的数据,更重要的是具备利用大数据的能力;财务人员要能够从海量、不断更新的非结构化数据中寻找与企业决策相关的重要信息,探索不同数据之间的关系;要能够掌握一定的数据分析技巧,深入挖掘企业各个流程相关的数据,掌握数据变化的规律,利用一定数据模型及工具进行实时分析和相关信息的http://www.kjlww.com/m/article-60023.html
17.数据建模经典教程(第2版)这些从事数据管理行业的大咖有:UML领域专家Mickael Blaha;善于语言表达的Wayne Eckerson;对于数据建模富有极大热情(而且对我的第1版图书给出了中肯的评价和建议,并在第2版中做了相应修改)的David Hay;数据仓库领域的卓越贡献者以及对非结构化数据处理等未来趋势具有敏锐观察力的Bill Inmon;带来了元数据主流处理方法的Dahttps://www.epubit.com/bookDetails?id=N36848
18.复杂高维多元数据的可视化高维多元数据(Multidimensional常规的关系型数据库处理具有明确结构、可有效存储于二维数据库表中的结构化数据。 非结构化数据(文本、时间、日志等)无法采用这种形式表示。 非结构化数据不但大量存在, 而且蕴涵巨大价值。 异构数据 异构数据指同一个数据集中存在结构或者属性不同的数据的情况。 https://juejin.cn/post/6922364405111848967
19.职业院校数字校园规范本次修订仍沿用“数字校园”而非智能或智慧校园,有四个方面的原因,其一是各种新技术的核心都是数字化,“数字化”是教育信息化的基本特征;其二,与近年来有关国家教育信息化文件中关于“数字校园”的提法保持一致性,与原《建设规范》保持连续性和稳定性;其三,考虑了各级各类、不同地区职业院校发展的差异性和不均衡https://www.nbcc.cn/2020/1029/c1114a34386/page.htm
20.解析非结构化数据与结构化数据的区别与联系非结构化数据和结构化数据是两种不同的数据形式,它们在数据的结构、处理方式、获取方式等方面存在差异。非结构化数据是指没有固定格式和明确结构的数据,它包括文本、图像、视频等类型,其组织形式相对自由灵活。而结构化数据是以表格和数据库形式组织的数据,具有明确的数据结构和规范的格式。本文将通过对非结构化数据和https://www.filez.com/news/detail/8334ba6c5eb4f79c51096083f5cb75ca.html