机器学习从原理到应用Chp4-特征工程_第1页
机器学习从原理到应用Chp4-特征工程_第2页
机器学习从原理到应用Chp4-特征工程_第3页
机器学习从原理到应用Chp4-特征工程_第4页
机器学习从原理到应用Chp4-特征工程_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章

特征工程

数据模型训练性能评估Recall:机器学习项目的开发过程数据和特征决定学习上限,算法和模型只是逼近这个上限。

数据探索性分析(ExploratoryDataAnalysis,EDA)是指在尽量少的先验假定下对数据进行探索,通过作图、制表和计算统计量等手段探索数据的结构和规律,了解变量间的相互关系以及变量与预测值之间的关系,从而帮助我们后续选择合适的特征工程技术和机器学习算法。数据探索有助于选择合适的数据预处理和学习器。输入特征类型、输出/标签的类型输入特征分布、输出/标签的分布:统计量、直方图输入特征之间的关系、输入特征与标签之间的关系数据的质量:是否有缺失值、是否有噪声点数据探索性分析二类分类问题:根据女性孕期体检信息和基因位点信息(SNP基因突变位点)预测受检者未来是否会患有妊娠糖尿病训练数据:共1000个样本带标签的A榜数据:200个样本,我们将其做为测试集例:糖尿病风险预测

数据总览连续的数值型特征身高、价格、销量、…离散特征/类别型特征

性别、受教育程度、….地点型特征(视情况可作为连续特征或类别型特征对待)IP地址、城市、经纬度、…时间型特征(视情况可作为连续特征或类别型特征对待)

日期、星期、月份、…特征类型id:和预测无关25个连续的数值型特征

孕次、产次、RBP4、年龄、身高、孕前体重、BMI、分娩时、糖筛孕周、VAR00007、wbc、ALT、AST、Cr、BUN、CHO、TG、HDLC、LDLC、ApoA1、ApoB、Lpa、hsCRP、舒张压58个离散特征/类别型特征SNP的55个位点数据(SNP1~55)、BMI分类、DM家族史、ACEID性别例:特征类型train=pd.read_csv('./data/f_train_20180204.csv',low_memory=False,encoding='gbk')train.info()数据质量严重影响模型的预测性能。数据缺失噪声数据质量缺失值分析由于各种原因,实际应用中数据总是存在一些缺失值,通常表示为NaN/NaT(日期型变量)。统计行/列缺失率#计算每一行有多少个缺失值的值,即按行统计缺失值row_null=df.isnull().sum(axis=1)#按列统计缺失值col_null=df.isnull().sum(axis=0)#统计整个DataFrame的缺失值all_null=df.isnull().sum().sum()缺失值处理缺失值处理删除含有(1个或多个)缺失特征的样本(行)删除缺失值太多的特征(列)对缺失值进行填补,如均值、中值不处理(有些算法可处理数据缺失情况,如XGBoost)

Pandas库的fillna函数可以对缺失值进行填补,灵活,但重用性较弱训练集中的缺失值用训练集的统计量填补测试集中的缺失值也要用训练集的统计量来填补#用列中值填补medians=df.median()df=df.fillna(medians)缺失值填补

Scikit-learn的SimpleImputer类提供一些常见填补方法均值mean(默认方法)中位数median众数most_frequent,可用于非数值数据指定的常数,用fill_value替换缺失值,可用于非数值数据fromsklearn.imputeimportSimpleImputer

imputer=SimpleImputer(strategy="median")data=im1.fit_transform([[1,2],

[np.nan,3],

[7,6]])class

SimpleImputer( missing_values

=

nan, Strategy

=

'mean', fill_value

=

None, verbose=0, copy=True, add_indicator=False)第1列第2行的的缺失值np.nan被第1列的均值3.5替代例:

train=train.drop('id',axis=

1)features=

[iforiintrain.columnsifi!='label']SNP_features=

[iforiinfeaturesif

'SNP'

ini]cat_features=SNP_features+

[u'BMI分类',u'DM家族史',u'ACEID']num_features=list(set(features)-set(cat_features))#数值型特征,缺失值用正常人的均值填补normal=train[train['label']

==

0]#类别型特征,缺失值用9填充(不可能出现的特征取值)forcolinfeatures:

ifcolincat_features:

#类别型特征

train[col].fillna(9,inplace=True)

test[col].fillna(9,inplace=True)

else:

#数值型特征

mean_val=normal[col].mean()

train[col].fillna(mean_val,inplace=True)

test[col].fillna(mean_val,inplace=True)噪声识别

噪声噪声

特征/目标的分布:直方图直方图:每个取值在数据集中出现的次数,可视为概率密度函数的估计核密度估计(KernelDensityEstimation,KDE):直方图的加窗平滑对连续特征,seaborn工具包的distplot画直方图对离散特征,seaborn工具包的countplot画直方图条形图

dataframe的value_counts()得到每个特征取值的样本数目importmatplotlib.pyplotaspltimportseabornassns%matplotlibinlinesns.distplot(df[‘sepal-length’],bins=20,

kde=True)特征之间的相关性数值型特征之间的相关系数:线性相关程度feat_corr=df.corr().abs()sns.heatmap(feat_corr,annot=True)

特征与特征之间强相关意味着信息冗余。特征之间的相关性可视化:散点图#正对角线上的图表示单个特征/标签的直方图,其他表示散点图sns.pairplot(df,

kind=“reg”)

#带线性回归线特征与目标之间的关系#通过hue设定种类,markers不同种类的点的表示方式

sns.pairplot(df,kind="scatter",hue="species",markers=["o","s","D"])我们希望特征与标签强相关分类:不同类别的直方图差异大

数据模型训练性能评估机器学习项目的开发过程特征工程特征工程是原始数据与学习器的连接器。首先,我们根据原始数据的特性初步确定学习器的类型。原始数据可能不能直接输入到学习器。

如字符串类型数据不能直接送入到线性分类模型数据预处理特征抽取特征构造特征选择特征工程虽然数值型特征输入是大多数机器学习模型能接受的输入,但有时候原始数值和模型假设不吻合。

如一些线性模型假设输入预输出之间是线性关系,但实际不符合线性假设常用的数值型特征处理方法多项式扩展:

PolynomialFeatures

log变换:np.log1p()区间量化、二值化数据预处理:缩放、规范化数值型特征编码不会做特征工程的AI研究员不是好数据科学家!上篇-连续数据的处理方法/news/201801/T9JlyTOAMxFZvWly.html

log变换train.SalePrice=np.log1p(train.SalePrice)费用/价格/计数类的特征可以考虑log变换例:广告费用与销量预测TV和sales关联密切,但不是线性关系,尤其TV值较大和较小时log(TV)和log(sales)之间的线性关系更明显广告数据集上不同线性回归模型的性能(R方分数)

原始特征+标准化Log(原始特征)+标准化最小二乘线性回归岭回归Lasso弹性网络最小二乘线性回归岭回归Lasso弹性网络训练集上性能0.8962850.8962850.8959250.8959250.9429290.9429290.9428040.942667测试集上性能0.8937290.8938650.8991970.8991970.9024780.9027720.9071400.909407log_Train_Test_Advertising.ipynb有时候将数值型属性分成一些区间表示更有意义:量化/分箱。对区间表示(类别型特征)进一步进型独热编码可扩展特征维数,增强(线性)模型表示能力。区间量化如电商数据中对年龄分组:预测用户是否拥有某款衣服,可将年龄分布划分成1-10,11-18,19-25,26-40…如房屋到街道的距离,分为远、中、近区间划分:等宽分区:每个区间都是固定宽度的,通常可以预先分析数据进行定义:基于一些领域知识、规则或约束。由于每个区间宽度相等,可能落入每个区间的数据点数目不均匀。自适应分区:根据数据分布来决定区间的范围。常用的有基于分位数的分区:如根据1/4分位数,将数据划分为4个区间;或者根据1/10分位数,将数据取值区间划分为10个区间。聚类技术可实现样本分组GBDT(集成学习部分讲解)也可实现特征的组合及离散化多特征联合量化:例:根据分位数进行区间量化#计算1/4分位数quantile_list=

[0,

.25,

.5,

.75,

1.]quantiles=df['Income'].quantile(quantile_list)#在直方图上显示1/4分位数的位置forquantileinquantiles:qvl=plt.axvline(quantile,color='r')#调用qcut函数进行特征变换quantile_labels=

['0-25Q',

'25-50Q',

'50-75Q',

'75-100Q']

df['Income_quantile_label']

=pd.qcut(df['Income'],q=quantile_list,labels=quantile_labels)

数值型特征预处理fromsklearn.preprocessingimport

…数据取值范围缩放数据标准化(

Standardization

)数据缩放(Scaling)数据正规化/归一化(Normalization)

…很多机器学习模型只能处理数值型数据。如果给定的数据是不同的类型,必须先将数据变成数值型。实际应用中很多特征都是离散值/类别型特征。如商品类型类别型特征编码

0/1编码

标签编码独热编码计数编码类别型特征编码

标签编码#import编码器fromsklearn.preprocessingimportLabelEncoder#1.生成编码器实例enc=LabelEncoder()#调用fit_transform进行编码(对测试集调用transform)genre_labels=enc.fit_transform(df['Genre'])

独热编码Scikt-learn中的OneHotEncoderclass

sklearn.preprocessing.OneHotEncoder(*,

categories='auto',

drop=None,

sparse_output=True,

dtype=<class

'numpy.float64'>,

handle_unknown='error',

min_frequency=None,

max_categories=None,

feature_name_combiner='concat')

视频游戏有6代(特征'Generation'有6个不同的取值)例:独热编码fromsklearn.preprocessingimportOneHotEncoderenc=OneHotEncoder()transformed_df=pd.DataFrame(enc.fit_transform(df[‘Generation’]),

columns=enc.get_feature_names_out(),

index=df.index)poke_df=pd.concat([df,

transformed_df],axis=1)NameGenerationGeneration_Gen1Generation_Gen2Generation_Gen3Generation_Gen4Generation_Gen5Generation_Gen64OctilleryGen20.01.00.00.00.00.05HelioptileGen60.00.00.00.00.01.06DialgaGen40.00.00.01.00.00.0

计数编码

两类分类的计数编码例:两类分类的计数编码len(df[‘device_id’].unique())#有多少不同的特征取值(多少个设备)#对于每一个特征取值,计算#Theta=[counts,p(click),p(noclick),p(click)/p(noclick)]defclick_counting(x,column):

clicks=pd.Series(x[x['click']>0][column].value_counts(),name='clicks')

no_clicks=pd.Series(x[x['click']<1][column].value_counts(),name='no_clicks')

counts=pd.DataFrame([clicks,no_clicks]).T.fillna('0')

counts['total']=counts['clicks'].astype('int64')+counts['no_clicks'].astype('int64')

returncountsdefcounting_enc(counts):

counts['N+']=counts['clicks'].astype('int64').divide(counts['total'].astype('int64'))

counts['N-']=counts['no_clicks'].astype('int64').divide(counts['total'].astype('int64'))

counts['log_N+-log_N-']=np.log(1+counts['N+'].divide(counts['N-']))根据点击率(clike),对设备id(device_id)编码:例:两类分类的计数编码len(df[‘device_id’].unique())#有多少不同的特征取值#对于每一个特征取值,计算#Theta=[counts,p(click),p(noclick),p(click)/p(noclick)]column='device_id'device_clicks=click_counting(df.filter(items=[column,'click']),column)counting_enc(device_clicks)clicksno_clickstotalsN+N-log_N+-log_N-a99f214a1572971206869350.1809280.8190720.199584c357dbff331341670.1976050.8023950.22015431da1bd0062620.0000001.0000000.000000936e92fb554590.0847460.9152540.088553有些特征值的样本数目非常少,单独编码浪费空间,且样本数太少模型中相应特征的参数训练不充分。解决方案:只有当样本数目超过某个阈值才单独编码,小于阈值的特征值统一编码为‘其他’(back-off,后退箱)。稀有取值

信息泄漏class

sklearn.preprocessing.TargetEncoder(categories='auto',

target_type='auto',

smooth='auto',

cv=5,

shuffle=True,

random_state=None)

哈希编码fromsklearn.feature_extractionimportFeatureHasherenc=FeatureHasher(n_features=6,input_type='string')hashed_features=enc.fit_transform(df['Genre'])嵌入式编码的使用场合和结果同哈希编码类似,将类别型变量转换为一个低维稠密向量:映射方式通过学习得到

学习方式可以与标签无关:如Word2Vec学习方式与标签有关:如CTR预估中,用户ID和商品ID等的编码与CTR预估模型一起学习嵌入编码例:推荐系统中的wide

anddeep模型

特征构建:两个App

ID的交叉连续值特征

[0,1]离散值特征

32

维embedding如果知道数据的物理意义(领域专家),可能可以设计更多特征如果不是领域专家,一些通用的规则:字符串型特征:Label编码时间特征:年月日、时间段(早中晚)…数值型特征:加减乘除,多项式,log,exp低基数类别型特征:独热编码高基数类别型特征:计数编码、哈希编码、嵌入编码深度学习自动学习特征如用CNN网络提取图像特征如何获取重要特征数据预处理特征提取:原始特征维度太高:通过降维提取特征,例如主成分分析(PCA)非结构化数据:根据信号特征进行特征提取,如文本特征提取、音频特征提取、图像特征提取、…

非结构化数据:通过深度学习,将特征提取与分类进行端到端学习特征构造:从原始数据构造新特征,思考业务逻辑与探索业务数据,往往需要手工创建,科学与艺术的有机结合交换特征多项式扩展特征选择特征工程数据预处理特征提取特征构造特征选择随机

手动过滤式包裹式嵌入式特征工程手工特征选择…子集选择模型训练性能评估过滤式子集选择模型训练性能评估包裹式子集选择模型训练与性能评估嵌入式特征选择

手工特征选择手工:

手工移除特征冗余的(multicollinearity/VIFs)不相关(文本挖掘中的停用词)质量差的特征(如特征的缺失比例超过50%)方差过小的特征sklearn.feature_selection/stable/modules/feature_selection.html#feature-selection

过滤式选择

信息增益:当特征出现或者不出现时,预测的熵的减少信息增益(Information

Gain)

类别标签的熵

特征:

女性孕期体检信息(身高、体重、血常规、肾功能、肝功能、…)

53个SNP基因突变位点信息标签:受检者未来是否会患有妊娠糖尿病特征之间冗余:特征对之间相关系数超过0.9

孕前体重与孕前BMI:0.92

,删除孕前体重例:糖尿病风险预测特征与标签之间互信息例:糖尿病风险预测fromsklearn.feature_selectionimportmutual_info_classifmi=mutual_info_classif(train[features],train['label']

)df_mi=pd.DataFrame({'feature':list(features),

'mutual_info':list((mi.T))})df_mi=df_mi.sort_values(by=['mutual_info'],ascending=False)

特征与标签之间的关系:可视化例:糖尿病风险预测sns.barplot(data=train,x='SNP34',y='label')sns.kdeplot(train.loc[(train['label']==0),'VAR00007'],shade=True,label='notdiabete')sns.kdeplot(train.loc[(train['label']==1),'VAR00007'],shade=True,label='diabete')用最终要用的学习器的性能评价特征的重要性。搜索有用的特征子集前向从零个特征开始一遍式(one

pass)或者迭代式(iterative)地选择后向(更常用,递归特征删除)用所有特征训练一个模型,得到特征重要性根据特征重要性,每次删除最不重要的一些特征是否删除/增加特征,需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论