0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RFE递归特征消除特征排序

Linux爱好者 来源:数据STUDIO 作者:云朵君 2022-03-16 17:26 次阅读

本文主要从股市数据变量的特征分布及特征重要性两个角度对数据进行分析。通过绘制图表等方法分析特征本身对分布状况或特征间相互关系。通过机器学习模型方法分析出特种重要性排序,选出对结果贡献较大对那几个特征,这对后面建模对模型效果有着不可小觑对效果。

数据准备

df.info()

	
		 DatetimeIndex: 1260 entries, 2015-12-31 to 2020-12-31 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Open 1260 non-null float64 1 High 1260 non-null float64 2 Low 1260 non-null float64 3 Close 1260 non-null float64 4 Adj Close 1260 non-null float64 5 Volume 1260 non-null int64 dtypes: float64(5), int64(1) memory usage: 68.9 KB

特征构造


	
		df['H-L']=df['High']-df['Low'] df['O-C']=df['AdjClose']-df['Open'] df['3dayMA']=df['AdjClose'].shift(1).rolling(window=3).mean() df['10dayMA']=df['AdjClose'].shift(1).rolling(window=10).mean() df['30dayMA']=df['AdjClose'].shift(1).rolling(window=30).mean() df['Std_dev']=df['AdjClose'].rolling(5).std() df.dtypes

描述性统计


	
		df.describe().Ta162b70c-a482-11ec-952b-dac502259ad0.png

缺失值分析

检查缺失值


	
		df.isnull().sum()

	
		Open 0 High 0 Low 0 Close 0 Adj Close 0 Volume 0 H-L 0 O-C 0 3day MA 3 10day MA 10 30day MA 30 Std_dev 4 dtype: int64

缺失值可视化

这里使用Series的属性plot直接绘制条形图。

	
		df_missing_count=df.isnull().sum() #-1表示缺失数据 #另一个不常见的设置画布的方法 plt.rcParams['figure.figsize']=(15,8) df_missing_count.plot.bar() plt.show()a177796c-a482-11ec-952b-dac502259ad0.png

	forcolumnindf: print("columnnuniqueNaN") print("{0:15}{1:6d}{2:6}".format( column,df[column].nunique(), (df[column]==-1).sum()))

	
		column nunique NaN Open 1082 0 High 1083 0 Low 1025 0 Close 1098 0 Adj Close 1173 0 Volume 1250 0 H-L 357 0 O-C 1237 2 3day MA 1240 0 10day MA 1244 0 30day MA 1230 0 Std_dev 1252 0

特征间相关性分析


	importseabornassns #一个设置色板的方法 #cmap=sns.diverging_palette(220,10, as_cmap=True) sns.heatmap(df.iloc[:df.shape[0]].corr() ,annot=True,cmap='Blues')a185bc48-a482-11ec-952b-dac502259ad0.png

特征值分布

直方图


	
		columns_multi=[xforxinlist(df.columns)] df.hist(layout=(3,4),column=columns_multi) #一种不常用的调整画布大小的方法 fig=plt.gcf() fig.set_size_inches(20,9)a19aedb6-a482-11ec-952b-dac502259ad0.png

密度图


	
		names=columns_multi df.plot(kind='density',subplots=True, layout=(3,4),sharex=False)a1aee26c-a482-11ec-952b-dac502259ad0.png

特征间的关系

函数可视化探索数据特征间的关系

	
		sns.pairplot(df,size=3, diag_kind="kde")a1d3695c-a482-11ec-952b-dac502259ad0.png

特征重要性

通过多种方式对特征重要性进行评估,将每个特征的特征重要的得分取均值,最后以均值大小排序绘制特征重要性排序图,直观查看特征重要性。

导入相关模块


	fromsklearn.feature_selectionimportRFE,RFECV,f_regression fromsklearn.linear_modelimport(LinearRegression,Ridge,Lasso,LarsCV) fromstability_selectionimportStabilitySelection,RandomizedLasso fromsklearn.preprocessingimportMinMaxScaler fromsklearn.ensembleimportRandomForestRegressor fromsklearn.ensembleimportRandomForestClassifier fromsklearn.svmimportSVR

线性回归系数大小排序

回归系数(regression coefficient)在回归方程中表示自变量对因变量影响大小的参数。回归系数越大表示对影响越大。

创建排序函数


	
		df=df.dropna() Y=df['AdjClose'].values X=df.values colnames=df.columns #定义字典来存储的排名 ranks={} #创建函数,它将特征排名存储到rank字典中 defranking(ranks,names,order=1): minmax=MinMaxScaler() ranks=minmax.fit_transform( order*np.array([ranks]).T).T[0] ranks=map(lambdax:round(x,2),ranks) res=dict(zip(names,ranks)) returnres

多个回归模型系数排序


	#使用线性回归 lr=LinearRegression(normalize=True) lr.fit(X,Y) ranks["LinReg"]=ranking(np.abs(lr.coef_),colnames) #使用Ridge ridge=Ridge(alpha=7) ridge.fit(X,Y) ranks['Ridge']=ranking(np.abs(ridge.coef_),colnames) #使用Lasso lasso=Lasso(alpha=.05) lasso.fit(X,Y) ranks["Lasso"]=ranking(np.abs(lasso.coef_),colnames)

随机森林特征重要性排序

随机森林得到的特征重要性的原理是我们平时用的较频繁的一种方法,无论是对分类型任务还是连续型任务,都有较好对效果。在随机森林中某个特征X的重要性的计算方法如下:
  1. 对于随机森林中的每一颗决策树, 使用相应的OOB(袋外数据)数据来计算它的袋外数据误差 ,记为.
  2. 随机地对袋外数据OOB所有样本的特征X加入噪声干扰 (就可以随机的改变样本在特征X处的值), 再次计算它的袋外数据误差 ,记为.
  3. 假设随机森林中有棵树,那么对于特征X的重要性,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

连续型特征重要性

对于连续型任务的特征重要性,可以使用回归模型RandomForestRegressorfeature_importances_属性。

	
		X_1=dataset[['Open','High','Low','Volume', 'Increase_Decrease','Buy_Sell_on_Open', 'Buy_Sell','Returns']] y_1=dataset['AdjClose'] #创建决策树分类器对象 clf=RandomForestRegressor(random_state=0,n_jobs=-1) #训练模型 model=clf.fit(X_1,y_1) #计算特征重要性 importances=model.feature_importances_ #按降序排序特性的重要性 indices=np.argsort(importances)[::-1] #重新排列特性名称,使它们与已排序的特性重要性相匹配 names=[dataset.columns[i]foriinindices] #创建画布 plt.figure(figsize=(10,6)) #添加标题 plt.title("FeatureImportance") #添加柱状图 plt.bar(range(X.shape[1]),importances[indices]) #为x轴添加特征名 plt.xticks(range(X.shape[1]),names,rotation=90)a1efefd2-a482-11ec-952b-dac502259ad0.png

分类型特征重要性

当该任务是分类型,需要用分类型模型时,可以使用RandomForestClassifier中的feature_importances_属性。

	
		X2=dataset[['Open','High','Low','AdjClose', 'Volume','Buy_Sell_on_Open', 'Buy_Sell','Returns']] y2=dataset['Increase_Decrease'] clf=RandomForestClassifier(random_state=0,n_jobs=-1) model=clf.fit(X2,y2) importances=model.feature_importances_ indices=np.argsort(importances)[::-1] names=[dataset.columns[i]foriinindices] plt.figure(figsize=(10,6)) plt.title("FeatureImportance") plt.bar(range(X2.shape[1]),importances[indices]) plt.xticks(range(X2.shape[1]),names,rotation=90) plt.show()a20230de-a482-11ec-952b-dac502259ad0.png

本案例中使用回归模型


	
		rf=RandomForestRegressor(n_jobs=-1,n_estimators=50,verbose=3) rf.fit(X,Y) ranks["RF"]=ranking(rf.feature_importances_,colnames);
		下面介绍两个顶层特征选择算法,之所以叫做顶层,是因为他们都是建立在基于模型的特征选择方法基础之上的,例如回归和SVM,在不同的子集上建立模型,然后汇总最终确定特征得分。

RandomizedLasso

RandomizedLasso的选择稳定性方法排序。 稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。 理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

	
		lambda_grid=np.linspace(0.001,0.5,num=100) rlasso=RandomizedLasso(alpha=0.04) selector=StabilitySelection(base_estimator=rlasso,lambda_name='alpha', lambda_grid=lambda_grid,threshold=0.9,verbose=1) selector.fit(X,Y) #运行随机Lasso的选择稳定性方法 ranks["rlasso/Stability"]=ranking(np.abs(selector.stability_scores_.max(axis=1)),colnames) print('finished')

	
		{'Open': 1.0, 'High': 1.0, 'Low': 0.76, 'Close': 1.0, 'Adj Close': 0.99, 'Volume': 0.0, 'H-L': 0.0, 'O-C': 1.0, '3day MA': 1.0, '10day MA': 0.27, '30day MA': 0.75, 'Std_dev': 0.0} finished

稳定性得分可视化


	
		fig,ax=plot_stability_path(selector) fig.set_size_inches(15,6) fig.show()a218fab2-a482-11ec-952b-dac502259ad0.png

查看得分超过阈值的变量索引及其得分


	#获取所选特征的掩码或整数索引 selected_variables=selector.get_support(indices=True) selected_scores=selector.stability_scores_.max(axis=1) print('Selectedvariablesare:') print('-----------------------') foridx,(variable,score)inenumerate( zip(selected_variables, selected_scores[selected_variables])): print('Variable%d:[%d], score%.3f'%(idx+1,variable,score))

	
		Selected variables are: ----------------------- Variable 1: [0], score 1.000 Variable 2: [1], score 1.000 Variable 3: [3], score 1.000 Variable 4: [4], score 0.990 Variable 5: [7], score 1.000 Variable 6: [8], score 1.000

RFE递归特征消除特征排序

基于递归特征消除的特征排序。 给定一个给特征赋权的外部评估器(如线性模型的系数),递归特征消除(RFE)的目标是通过递归地考虑越来越小的特征集来选择特征。 主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选)。
  1. 首先,在初始特征集上训练评估器,并通过任何特定属性或可调用属性来获得每个特征的重要性。
  2. 然后,从当前的特征集合中剔除最不重要的特征。
  3. 这个过程在训练集上递归地重复,直到最终达到需要选择的特征数。
这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。 RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

	
		sklearn.feature_selection.RFE(estimator, *,n_features_to_select=None, step=1,verbose=0, importance_getter='auto')
estimatorEstimator instance 一种带有""拟合""方法的监督学评估器,它提供关于特征重要性的信息(例如"coef_"、"feature_importances_")。n_features_to_selectint or float, default=None 要选择的功能的数量。如果'None',则选择一半的特性。如果为整数,则该参数为要选择的特征的绝对数量。如果浮点数在0和1之间,则表示要选择的特征的分数。stepint or float, default=1 如果大于或等于1,那么'step'对应于每次迭代要删除的(整数)特征数。如果在(0.0,1.0)范围内,则'step'对应于每次迭代中要删除的特性的百分比(向下舍入)。verboseint, default=0 控制输出的冗长。importance_getterstr or callable, default='auto' 如果是'auto',则通过估计器的'coef_'或'feature_importances_'属性使用特征重要性。

	
		lr=LinearRegression(normalize=True) lr.fit(X,Y) #当且仅当剩下最后一个特性时停止搜索 rfe=RFE(lr,n_features_to_select=1,verbose=3) rfe.fit(X,Y) ranks["RFE"]=ranking(list(map(float,rfe.ranking_)), colnames,order=-1)

	
		Fitting estimator with 12 features. ... Fitting estimator with 2 features.

RFECV

递归特征消除交叉验证。 Sklearn提供了RFE包,可以用于特征消除,还提供了RFECV,可以通过交叉验证来对的特征进行排序。

	#实例化估计器和特征选择器 svr_mod=SVR(kernel="linear") rfecv=RFECV(svr_mod,cv=5) #训练模型 rfecv.fit(X,Y) ranks["RFECV"]=ranking(list(map(float,rfecv.ranking_)),colnames,order=-1) #Printsupportandranking print(rfecv.support_) print(rfecv.ranking_) print(X.columns)

LarsCV

最小角度回归模型(Least Angle Regression)交叉验证。

	#删除第二步中不重要的特征 #X=X.drop('sex',axis=1) #实例化 larscv=LarsCV(cv=5,normalize=False) #训练模型 larscv.fit(X,Y) ranks["LarsCV"]=ranking(list(map(float,larscv.ranking_)),colnames,order=-1) #输出r方和估计alpha值 print(larscv.score(X,Y)) print(larscv.alpha_)
		以上是两个交叉验证,在对特征重要性要求高时可以使用。因运行时间有点长,这里大家可以自行运行得到结果。

创建特征排序矩阵

创建一个空字典来存储所有分数,并求其平均值。

	
		r={} fornameincolnames: r[name]=round(np.mean([ranks[method][name] formethodinranks.keys()]),2) methods=sorted(ranks.keys()) ranks["Mean"]=r methods.append("Mean") print(" %s"%" ".join(methods)) fornameincolnames: print("%s %s"%(name," ".join(map(str, [ranks[method][name]formethodinmethods]))))

	
		LassoLinRegRFRFERidgerlasso/StabilityMean Open1.01.00.020.910.471.00.73 High0.140.00.10.360.061.00.28 Low0.020.00.080.730.050.760.27 Close0.140.00.640.550.321.00.44 Adj Close0.021.01.00.821.00.990.8 Volume0.00.00.00.00.00.00.0 H-L0.00.00.00.450.010.00.08 O-C0.851.00.01.00.531.00.73 3day MA0.00.00.00.270.011.00.21 10day MA0.00.00.020.090.00.270.06 30day MA0.00.00.00.180.00.750.16 Std_dev0.00.00.00.640.010.00.11

绘制特征重要性排序图

将平均得到创建DataFrame数据框,从高到低排序,并利用可视化方法将结果展示出。这样就一目了然,每个特征重要性大小。

	
		meanplot=pd.DataFrame(list(r.items()),columns=['Feature','MeanRanking']) #排序 meanplot=meanplot.sort_values('MeanRanking',ascending=False) g=sns.factorplot(x="MeanRanking",y="Feature",data=meanplot,kind="bar", size=14,aspect=1.9,palette='coolwarm')a236141c-a482-11ec-952b-dac502259ad0.png

原文标题:YYDS!使用 Python 全面分析股票数据特征

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6504

    浏览量

    87448
  • 存储
    +关注

    关注

    12

    文章

    3825

    浏览量

    84589
  • 频率
    +关注

    关注

    4

    文章

    1272

    浏览量

    58407
  • 机器学习
    +关注

    关注

    66

    文章

    8062

    浏览量

    130442

原文标题:YYDS!使用 Python 全面分析股票数据特征

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    模拟电路故障诊断中的特征提取方法

    映射到一个低维向量空间,降维后保留数据的主要信息,且主分量间彼此独立,从而使数据更易于处理。在模拟电路故障诊断中,采用主元分析实现数据压缩和特征提取的过程是:首先将原始特征数据标准化,消除原变量的量纲
    发表于 12-09 18:15

    labview 将矩阵的特征排序,再把排序后的特征值对应的特征向量组成矩阵

    将矩阵的特征排序,取最大的前90%,再把前90%由大到小特征值所对应的特征向量组成一个新的矩阵,应该要怎么做呢?我尝试着用特征值连到一维数
    发表于 04-17 21:11

    特征阻抗简介

    传输线的特征阻抗,又称为特性阻抗,是我们在进行高速电路设计的时候经常会提到的一个概念。但是很多人对这个概念并不理解,有时还会错误的理解为直流阻抗。弄明白这个概念对我们更好的进行高速电路设计很有必要。高速电路的很多设计规则都和特征阻抗有关。
    发表于 05-30 07:48

    如何提取颜色特征

    计算机视觉的特征提取算法研究至关重要。在一些算法中,一个高复杂度特征的提取可能能够解决问题(进行目标检测等目的),但这将以处理更多数据,需要更高的处理效果为代价。而颜色特征无需进行大量计算。只需将数字图像中的像素值进行相应转换,
    发表于 10-12 06:55

    纹理图像的特征是什么?

    纹理图像的特征是什么?指纹图像的特征是什么?
    发表于 06-02 07:05

    基于统计特征主分量的信号调制识别

    采用数字信号处理方法提取待识别信号的瞬时特征统计参量,利用多元统计的主分量分析方法对特征参量进行其主分量组合,以消除特征参量间的相关性和压缩特征
    发表于 03-03 23:18 29次下载

    基于已知特征项和环境相关量的特征提取算法

    在现有基于已知特征特征提取算法的基础上,提出一种基于已知特征项和环境相关量的特征提取算法。该算法通过已知特征项搜索频繁项集,提高了
    发表于 04-18 09:37 17次下载

    基于特征码的网页去重

        网页去重处理是提高检索质量的有效途径,本文给出了一个基于特征码的网页去重算法,介绍了算法的具体实现步骤,采用二叉排序树实现。算法有较高的判断正确
    发表于 09-04 09:58 19次下载

    克隆代码有害性预测中的特征选择模型

    为解决克隆代码有害性预测过程中特征无关与特征冗余的问题,提出一种基于相关程度和影响程度的克隆代码有害性特征选择组合模型。首先,利用信息增益率对特征数据进行相关性的初步
    发表于 12-04 10:09 0次下载
    克隆代码有害性预测中的<b class='flag-5'>特征</b>选择模型

    特征码怎么用_特征码下载

     特征码(attribute code)用来判断某段数据属于哪个计算机字段。共计40个字符。特征码的获取不可能再是简单的取出一段代码来,而是分段的,中间可以包含任意的内容(也就是增加了一些不参加比较的“掩码字节”,在出现“掩码字节”的地方,出现什么内容都不参加比较)。这就
    发表于 12-05 17:40 1.5w次阅读
    <b class='flag-5'>特征</b>码怎么用_<b class='flag-5'>特征</b>码下载

    机器学习之特征提取 VS 特征选择

    机器学习中特征选择和特征提取区别 demi 在 周四, 06/11/2020 - 16:08 提交 1. 特征提取 V.S 特征选择 特征
    的头像 发表于 09-14 16:23 3744次阅读
    机器学习之<b class='flag-5'>特征</b>提取 VS <b class='flag-5'>特征</b>选择

    融合神经网瓶颈特征与MFCC特征的符合特征构造方法

    针对梅尔频率倒谱系数(MrCC)语音特征不能有效反映连续帧之间有效信息的问题,基于深度神经网络相关性和紧凑性特征,提岀一种融合神经网瓶颈特征与MFCC特征的复合
    发表于 03-17 11:31 5次下载
    融合神经网瓶颈<b class='flag-5'>特征</b>与MFCC<b class='flag-5'>特征</b>的符合<b class='flag-5'>特征</b>构造方法

    基于自编码特征的语音声学综合特征提取

    利用监督性学习算法进行语音増强时,特征提取是至关重要的步骤。现有的组合特征和多分辨率特征等听觉特征是常用的声学特征,基于这些
    发表于 05-19 16:33 26次下载

    特征模型和特征-这是什么?

    “大家好,这是【产品线工程(PLE)专题】更新的第四篇,上一篇我们介绍了‘版本、变体和其他的基础定义’,这一篇我们介绍特征模型和特征-这是什么”非正式地谈论可变性是很有趣的一件事,但最终还是需要
    的头像 发表于 01-05 11:16 465次阅读
    <b class='flag-5'>特征</b>模型和<b class='flag-5'>特征</b>-这是什么?

    排序算法有哪些

    1. 归并排序递归版) 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略,即分为两步:分与治。 分:先递归
    的头像 发表于 10-11 15:49 287次阅读
    <b class='flag-5'>排序</b>算法有哪些