版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章特征工程特征工程是指寻找能够准确刻画建模对象的特征并用于建模,准确的特征可以降低构建模型的难度,提高模型的质量。特征工程概述特征工程的定义与意义特征工程是指寻找能够准确刻画建模对象的特征并用于建模,准确的特征可以降低构建模型的难度,提高模型的质量。特征工程的组成部分第一部分:寻找能够准确刻画建模对象的特征从数据集中直接获取准确刻画建模对象的特征对现有特征进行组合、衍生和交互,创建新特征第二部分:对特征值进行优化实施途径使用数学工具进行特征的量化分析采取专业知识进行特征的筛选及特征值的优化本章主要内容本章介绍的特征工程主要通过各种算法处理数据集,从现有的属性中直接选择准确刻画建模对象的特征。核心内容从已有特征集中选择最优特征子集的主要算法功能强大的NullImportance算法及代码实例后续章节将讨论如何利用现有属性构建新特征和进行特征值优化图5.1本章主要内容结构5.1过滤法概述特征分类以能否对算法效果带来提升为标准,特征可分为三类:相关特征对模型有积极贡献无关特征对模型无明显作用冗余特征与其他特征高度相关过滤法的目标降低计算复杂度提高模型性能增加模型可解释性术语说明列标签:可称为特征或属性条件属性:用于预测的特征决策属性:预测目标5.1.1单变量过滤法基本原理在数据处理阶段,依据统计方法或简单的模型评分准则评估:评估内容各特征之间的关联性各特征与决策属性之间的关联性作为保留或删除特征的依据,提高模型的预测性能。1.缺失百分比法原理在进行单变量过滤之前,先对数据进行清洗。单变量过滤法用于评估每个特征与决策属性之间的关系,根据评估结果进行特征排序或设定阈值以选择重要特征。应用方法(1)填充法使用fillna()函数填充缺失值查询并统计缺失值数量根据业务逻辑选择合适的填充值缺失值处理示例查询缺失值print(df[df.isnull().values==True])#显示包含缺失值的样本print(df.isnull().sum())#显示所有列的缺失值个数填充缺失值df=df.fillna(0)#缺失值填充为0关键函数:fillna()可以填充固定值可以使用均值、中位数等统计量填充支持向前填充(ffill)或向后填充(bfill)缺失值处理:删除法删除法原理如果某特征的特征值缺失比例过多且难以填补,建议剔除该特征。dropna()函数参数axis:0为按行删除,1为按列删除how:'any'表示只要存在缺失值就删除;'all'表示全部为缺失值才删除thresh:保留含有int个以上非NaN值的行或列subset:删除特定列中包含缺失值的行或列inplace:False表示返回副本,True表示直接修改原数据2.方差法原理若某连续型特征的方差很小,说明该特征趋向于稳定状态,删除该特征对数据集所包含的信息影响不大,建议剔除该特征。注意事项利用方差过滤特征之前,一般需要先对特征归一化不同特征的特征取值差异大时,方差小不一定代表波动率小方差大的特征可能只是因为数值范围大方差法应用VarianceThreshold函数fromsklearn.feature_selectionimportVarianceThresholdvar=VarianceThreshold(threshold=df.std().mean())var.fit(df)model=var.transform(df)处理流程计算各列的标准差设定方差阈值删除方差低于阈值的特征获取保留的特征列重要提示:使用前需要对特征进行归一化处理sklearn.feature_selection模块主要功能该模块集中了多种特征选择算法:VarianceThreshold:采用方差过滤chi2:采用卡方检验f_classif/f_regression:采用F检验mutual_info_classif/mutual_info_regression:采用互信息法SelectKBest:选择k个最优特征SelectFromModel:由模型自主选择最优特征RFE:采用递归特征消除法3.频数法原理若某类别型条件属性的属性值样本量占比分布不均匀,集中在某一属性值上,说明该变量对模型的预测能力贡献不大,建议剔除该变量。应用方法forcolumnindf.columns:counts=df[column].value_counts().sort_index()cat_df=pd.DataFrame({'enterprise_val':list(counts.index),'frequency':list(counts.values)})适用场景:类别型特征的频数分布分析5.1.2多变量过滤法基本原理多变量过滤法考虑特征之间的相互关系,通过相关性来评估特征的重要性。应用目的识别冗余特征识别具有高度相关的两两条件属性,避免选择重复或冗余的特征识别重要特征识别与决策属性相关联的条件属性,提高预测性能考虑复杂关系在特征选择过程中考虑特征之间的复杂关系多变量关系分析两种主要关系(1)条件属性之间的相关性相关程度越高,模型稳定性越差样本微小扰动会使拟合系数发生变化解决方案:在具有共线性的条件属性中选择一个,剔除其余(2)条件属性与决策属性之间的相关性相关性越高,特征对模型预测目标更重要建议在建模过程中保留高相关性特征注意:需根据变量类型(连续型/类别型)选择适当方法1.皮尔逊相关系数原理皮尔逊相关系数用来衡量两个变量之间线性相关程度的统计指标。计算方式:两个变量的协方差除以两变量的标准差乘积取值范围[-1,1]趋于1正相关增强趋于-1负相关增强缺点:只能测量变量之间的线性关系,无法测量非线性关系皮尔逊相关系数应用函数语法#Pandas库DataFrame.corr(method='pearson')#NumPy库numpy.corrcoef(x,y=None,rowvar=True,dtype=None)处理步骤计算属性两两相关系数表提取上三角矩阵查找高度相关的属性(|系数|>0.8)删除高度相关的属性之一保留剩余属性集皮尔逊相关系数代码实现核心代码df_corr_00=df_2.corr(method='pearson')upperTriangle=np.triu(df_corr_00.values,k=1)upperTriangle=np.where((upperTriangle>0.8)|(upperTriangle<-0.8),1,upperTriangle)df_corr_00=pd.DataFrame(upperTriangle,index=df_corr_00.index,columns=df_corr_00.columns)df_corr_1=df_corr_00[df_corr_00!=1]df_corr_2=df_corr_1.dropna(axis=1,how='any')处理原理:通过上三角矩阵避免重复删除重要函数对比apply()、map()、applymap()、np.where()的区别apply()可用于DataFrame和Series在DataFrame中作用于整行或整列在Series中作用于每个元素map()仅用于Series的每个元素参数:func(函数)、iterable(可迭代对象)applymap()仅应用到DataFrame的每个元素注意:部分版本已弃用,建议使用mapnp.where(condition,x,y)条件成立返回x,不成立返回y2.斯皮尔曼相关系数法原理斯皮尔曼相关系数是衡量两个变量之间关系的非参数统计方法,基于两个变量的等级或顺序计算相关性。取值范围[-1,1]正负号表示正负相关关系计算步骤将原值转为顺序等级计算等级差d计算d²的和应用公式计算相关系数斯皮尔曼相关系数计算示例计算公式应用函数#Pandas库DataFrame.corr(method='spearman')#SciPy库correlation,pvalue=stats.spearmanr(x,y)3.肯德尔等级相关系数原理按一个变量对样本排序,若排序后两变量排名相同,则系数为1(正相关);若完全相反,系数为-1(负相关);若完全独立,系数为0。计算过程对学历进行标签编码基于学历对样本排序统计同序对数和异序对数计算肯德尔系数ρ=(同序对数-异序对数)/总对数肯德尔等级相关系数应用函数语法#Pandas库DataFrame.corr(method='kendall')#SciPy库scipy.stats.kendalltau(x,y,nan_policy='propagate',method='auto')参数说明nan_policy:'propagate'(返回NaN)、'raise'(提示出错)、'omit'(忽略NaN)method:'auto'(自动选择)、'asymptotic'、'exact'4.方差分析(ANOVA)原理方差分析又称F检验,目的是检验不同组下的平均数是否存在显著差异。核心思想SST总体方差SSR组间方差SSE组内方差判断依据总体方差主要来自组间方差:组间存在明显差异总体方差主要来自组内方差:组间不存在明显差异方差分析的前提假设三个假设条件1.方差齐性样本具备方差齐性2.正态分布组内样本服从正态分布3.样本独立样本间相互独立适用场景类别型变量与连续型变量之间的关系例如:判断不同班级学生的考试成绩是否有显著区别方差分析计算示例F统计量计算判断标准计算p值基于F统计量和自由度计算p值判断结果p值<0.05:拒绝原假设,组间存在显著差异p值≥0.05:接受原假设,组间不存在显著差异SelectKBest函数应用数据预处理步骤分割样本集训练集和测试集数据类型转换处理缺失值和无穷值归一化处理StandardScaler或MinMaxScaler注意事项使用f_classif时,如果返回NaN,可能是数据存在缺失值或方差为零需要检查数据的方差,确保没有为零的情况SelectKBest代码实现fromsklearn.feature_selectionimportSelectKBest,f_classifselector=SelectKBest(score_func=f_classif,k=10)model=selector.fit_transform(X_trainScaler,y_train)print(selector.scores_)#获取得分print(selector.pvalues_)#获取p值print(selector.get_support(indices=True))#获取特征索引结果解读scores_得分越高,特征对目标变量影响越大pvalues_p值小于0.05表示存在显著关系5.卡方检验原理卡方检验用于检验实际的数据分布与理论分布是否相同,可以考查两个类别型变量之间的相关性。零假设:两变量之间不相关判断依据卡方值越大,理论值与实际观察值差异越显著支持拒绝零假设,认为两个变量之间存在相关性计算函数:scipy.stats.chi2_contingency卡方检验计算公式卡方统计量应用示例使用电子产品超过8h是否会导致近视计算步骤01统计实际观察值02基于总体比例计算理论值03应用公式计算卡方值04计算p值并判断卡方检验代码实现关键注意事项数据必须非负使用MinMaxScaler归一化(不能使用StandardScaler)适用于类别型变量fromsklearn.feature_selectionimportSelectKBest,chi2StandardScaler=preprocessing.MinMaxScaler()selector=SelectKBest(score_func=chi2,k=10)model=selector.fit_transform(X_trainScaler,y_train)6.互信息法原理互信息衡量变量之间相互依赖的程度,当两个变量完全相同时,互信息最大。计算公式其中:H(X):X的信息熵H(X|Y):在Y确定情况下X的条件熵特点功能强大,可用于线性和复杂关系具有对称性缺点:计算量较大互信息计算公式展开完整推导物理意义互信息量化了知道一个变量后,对另一个变量不确定性的减少程度互信息检验应用可选参数mutual_info_classif用于分类问题mutual_info_regression用于回归问题代码实现fromsklearn.feature_selectionimportSelectKBest,mutual_info_classifselector=SelectKBest(score_func=mutual_info_classif,k=10)model=selector.fit_transform(X_trainScaler,y_train)注意:两种方法计算的最优属性差异不大过滤法总结过滤法对比表观察变量适用变量挑选规则备注缺失占比单变量缺失样本过多且难以填补连续型/类别型均可用方差单变量方差接近或等于0连续型/类别型均可用频率单变量过分集中在某类别值适用于类别型皮尔逊多变量相关系数接近或等于0样本需符合正态分布斯皮尔曼多变量相关系数接近或等于0适合有序类别,不对样本分布做要求过滤法总结(续)5.2包裹法概述基本原理包裹法将要使用的学习器的性能作为特征子集的评价准则,以选择最具针对性的特征子集来训练模型。包含技术完全搜索启发式搜索随机搜索优点特征选择更具针对性,可提升模型质量缺点需要评估每个可能的特征子集,运行时间更长包裹法流程图推荐方法RFECV和NullImportance既考虑了特征权重也考虑了模型表现图5.2包裹法流程图包裹法的三类搜索方法图5.3包裹法的三类搜索方法三类方法完全搜索:穷尽所有可能的特征组合启发式搜索:利用启发式信息缩小搜索空间随机搜索:随机选择特征子集进行评估5.2.1完全搜索原理完全搜索法通过穷尽所有可能的特征组合来寻找最优特征集。处理流程遍历所有可能组合的特征子集通过随机森林的模型评分功能获得特征子集得分根据得分选择最佳特征子集注意事项计算开销过大,不推荐使用特征数量越多,样本数量越多,耗时越长示例采用11个条件属性以缩短耗时完全搜索数据预处理基本步骤#读取数据df_1=pd.read_excel(path+'上市公司风险预警样本(11个指标).xlsx')df_2=df_1.T#处理异常值df_2=df_2.replace((np.inf,-np.inf,np.nan),0)#分割特征和标签X,y=df_2.iloc[:,:-1],df_2.iloc[:,-1]#分割训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=6)自定义评分函数defevaluate_subset(features):fromsklearn.ensembleimportRandomForestRegressorregressor=RandomForestRegressor()scores=cross_val_score(regressor,X_train[features],y_train,cv=5,scoring='r2')returnscores.mean()函数功能采用给定条件属性子集利用随机森林建模使用交叉验证计算模型分数返回平均分数完全搜索实现实现思路第1层循环:让待评估的条件属性个数从1逐步增加到11第2层循环:生成所有可能的条件属性子集组合计算每个条件属性子集的模型分数找出最佳条件属性子集forLinrange(1,len(X.columns)+1):forsubsetinbinations(X.columns,L):features=[fforfinsubsetiffinX_train.columns]score=evaluate_subset(features)ifscore>best_score:best_score=scorebest_subset=features完全搜索重要函数cross_val_score函数cross_val_score(estimator,X,y,scoring=None,cv=None,n_jobs=None)主要参数estimator:实例化的模型X,y:自变量和决策属性值scoring:评估标准('accuracy'、'precision'、'r2'等)cv:交叉验证分割策略,默认5倍binations函数生成所有组合,返回元组列表iterable:可迭代对象r:返回的元组长度5.2.2启发式搜索基本原理启发式搜索利用启发式信息不断缩小搜索空间的方法。包含方法向前/向后搜索递归特征消除法(RFE)启发式信息模型的评分特征的权重目标:选择最有希望的特征子集1.向前/向后搜索向前搜索原理从空集开始每轮只加入一个特征若模型评估分数提高,保留该特征,否则丢弃向后搜索原理从全特征集开始每轮减去一个特征若模型表现降低,保留特征,否则弃之向前搜索代码实现frommlxtend.feature_selectionimportSequentialFeatureSelectorfromsklearn.ensembleimportRandomForestRegressorregressor=RandomForestRegressor()Feature_sel=SequentialFeatureSelector(regressor,k_features='best',forward=True,scoring='r2',cv=5)Feature_sel=Feature_sel.fit(X_train,y_train)selected_features=list(X_train.columns[list(Feature_sel.k_feature_idx_)])SequentialFeatureSelector函数主要参数estimator:学习器k_features:最佳特征数量整数:设定具体数量'best':选择最佳数量forward:True为向前搜索,False为向后搜索scoring:评分指标cv:交叉验证折数,默认5交叉验证折数:将数据集分成k个子集,依次用k-1个子集训练,1个子集测试2.递归特征消除(RFE)原理对删除模型进行多轮训练:每轮训练后获得每个属性的重要性删除若干重要性低的特征基于新特征集进行下一轮训练缺点难以设置合理的n_features_to_select参数只基于特征重要性,忽略模型表现RFECV:RFE的改进原理RFECV=RFE+交叉验证(CV)工作流程使用RFE获取各特征重要性逐步删除重要性弱的特征每删除一个特征,用交叉验证评估新特征集选择平均分最高的特征子集优势:结合特征重要性和模型表现RFE代码实现fromsklearn.svmimportSVCfromsklearn.feature_selectionimportRFEsvc=SVC(kernel="linear")rfe=RFE(estimator=svc,n_features_to_select=10,step=1,verbose=0)model=rfe.fit_transform(X_train,y_train)selected_features=X_train.columns[rfe.support_]关键属性support_:特征是否被选中的布尔值数组ranking_:特征的排名信息RFECV代码实现fromsklearn.svmimportSVCfromsklearn.model_selectionimportStratifiedKFoldfromsklearn.feature_selectionimportRFECVsvc=SVC(kernel="linear")rfecv=RFECV(estimator=svc,min_features_to_select=2,step=1,cv=StratifiedKFold(2),scoring='accuracy',verbose=0,n_jobs=1).fit(X_train,y_train)selected_rfecv_features=X_train.columns[rfecv.support_]RFECV函数参数详解主要参数estimator:学习器step:每次迭代移除的特征个数,默认1min_features_to_select:选择的最优特征个数cv:交叉验证方法None:5倍交叉验证int:指定折数分类问题:使用StratifiedKFold回归问题:使用KFoldscoring:评分标准verbose:控制输出详细程度,默认0n_jobs:CPU个数,-1表示全部CPU5.2.3随机搜索特点每次随机搜索时都考虑不同的特征子集,可能导致每次运行选择的最佳特征子集数量不完全一致。原因每次评估的特征子集都有可能表现优异反映了包裹法的随机性质体现了对特征子集进行全面搜索的特点1.随机特征子集原理随机选择多个特征子集,分别评估模型表现,选择评估分数高的特征子集。处理流程随机选择特征子集评估模型表现记录最佳特征子集和分数重复多次迭代输出最优结果随机特征子集数据预处理归一化处理fromsklearnimportpreprocessingimportrandomStandardScaler=preprocessing.StandardScaler()X_trainScaler=StandardScaler.fit_transform(X_train)X_testScaler=StandardScaler.transform(X_test)注意事项使用StandardScaler进行z值归一化确保训练集和测试集使用相同的标准化参数自定义评分函数(随机特征子集)defevaluate_feature_subset(features):#随机选择k个特征selected_features=random.sample(features,k=random.randint(1,len(features)))
#选择特征子集对应的列X_train_subset=X_train[selected_features]X_test_subset=X_test[selected_features]
#训练模型model=LinearRegression()model.fit(X_train_subset,y_train)
#预测和评估y_pred=model.predict(X_test_subset)score=r2_score(y_test,y_pred)
returnselected_features,score获取最优特征子集#初始化best_subset=Nonebest_score=0.0features=X.columns.tolist()#进行多次迭代num_iterations=10foriinrange(num_iterations):selected_features,score=evaluate_feature_subset(features)ifscore>best_score:best_subset=selected_featuresbest_score=scoreprint("BestFeatureSubset:",best_subset)print("BestScore:",best_score)2.NullImportance算法核心思想通过评估特征的不重要性来选择属性,与前面算法思路不同。基本原理在样本集中引入随机噪声(打乱特征值或随机替换)把重要性下降的特征挑选出来组成最优特征集关键观察真正重要的特征:原始标签下重要性显著,打乱后重要性下降不重要的特征:原始标签下重要性低,打乱后可能升高NullImportance计算过程步骤说明计算原表格中每个条件属性的重要性A_i打乱决策属性的值,每打乱一次,计算一次每个条件属性的重要性B_{ij}重复第(2)步很多次(如1万次),得到每个条件属性的多个重要性值B_{ij}计算条件属性的评分NullImportance两种比较方法第1种:分位数比较计算公式:步骤打乱标签N次取importance_shuffle的75%分位数对比importance_real和分位数计算评分NullImportance两种比较方法(续)第2种:次数占比比较计算公式:步骤打乱标签N次比较每次importance_shuffle与importance_real统计importance_real大于importance_shuffle的次数F计算评分:(F/N)×100NullImportance代码实现思路整体流程①计算原始数据中每个条件属性的重要性,存储到original_importance②打乱决策属性的值,每打乱一次,计算一次表格中每个条件属性的重要性,存储到shuffled_importances③重复第②步100次(实际应用中建议更多次)④分别利用两种比较方法得出每个属性的得分计算属性重要性importwarningswarnings.simplefilter('ignore',UserWarning)importgcgc.enable()#训练模型fromsklearn.ensembleimportRandomForestRegressormodel=RandomForestRegressor(n_estimators=100,random_state=42)model.fit(X_train,y_train)#获取原始特征重要性original_importance=model.feature_importances_#构建shuffled_importancesshuffled_importances=np.zeros((100,X_train.shape[1]))分位数比较法实现defquantile_comparison(X_train,y_train,model,num_iterations=100):foriinrange(num_iterations):#打乱决策属性shuffled_y=np.random.permutation(y_train)model.fit(X_train,shuffled_y)shuffled_importances[i,:]=model.feature_importances_
#取75%分位数percentile_shuffled=np.percentile(shuffled_importances,75,axis=0)
#计算评分s_percentile=[(1/(1+score))forscoreinpercentile_shuffled]s1_percentile=10e-10+original_importance*s_percentilescore_percentile=np.log10(s1_percentile)score_index=np.argsort(-score_percentile)
returnscore_index次数占比比较法实现defcalculate_feature_score(original_importance,X_train,y_train,model):forainrange(len(original_importance)):feature_decrease=0shuffled_importances=np.zeros((100,len(original_importance)))
foriinrange(100):shuffled_y=np.random.permutation(y_train)model.fit(X_train,shuffled_y)shuffled_importances[i,:]=model.feature_importances_
ifshuffled_importances[i,a]<original_importance[a]:feature_decrease+=1
score=(feature_decrease/100)*100print("第{0}个索引条件属性得分:{1}".format(a,score))NullImportance结果分析分位数比较法结果属性索引号排序:[376200524182523122151092132616421191127122814817]次数占比比较法结果(部分)属性索引3718205601624得分1001001001009999986460结论:两种算法得分高的属性基本一致5.3嵌入法5.3.1原理基本概念嵌入法是将特征选择过程嵌入模型的训练过程中,直接在模型训练过程中考虑特征的重要性。与包裹法的区别包裹法:特征选择与模型训练分离嵌入法:特征选择融入模型训练嵌入法的优缺点优点直接与模型训练过程相结合,更加高效充分利用模型的学习能力,更好地捕捉特征之间的关系缺点在模型训练过程中评估特征重要性,增加训练时间和计算成本特征选择与模型训练联系紧密,容易受训练数据噪声和过拟合影响常见方法:LASSO的L1正则惩罚项、ElasticNet回归、GBDT、决策树等5.3.2嵌入法应用基本代码实现importwarningswarnings.simplefilter('ignore',UserWarning)fromsklearn.ensembleimportRandomForestRegressorfromsklearn.feature_selectionimportSelectFromModel#训练模型clf=RandomForestRegressor(n_estimators=100)clf.fit(X_train,y_train)#使用嵌入法进行特征选择sfm=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医疗废物分类处理考试试题及答案
- 无人机航测企业管理规范岗前培训试题及答案
- 成本控制责任制制度
- 手术室医生安全责任制度
- 扶贫责任制度
- 抓网逃责任制度
- 护理基本护理社会学
- 招标责任制度
- 掘进工岗位责任制度范本
- 搅拌机安全责任制度
- 水利三防培训课件
- 制冷基础知识课件
- 锅炉满水培训课件
- 放射科质控管理(技师组)
- 2026年江西单招新能源汽车技术专业基础经典题详解
- 手键拍发课件
- 2026春教科版(新教材)小学科学一年级下册(全册)教学设计(附教材目录)
- 小儿股静脉抽血课件
- 管理研究方法:逻辑、软件与案例 课件 第6章:社会网络分析及应用
- DB32∕T 5274-2025 聚氨酯硬泡体防水保温工程技术规程
- 2026年湖南有色金属职业技术学院单招职业技能考试题库附答案
评论
0/150
提交评论