python中rfe函数 rf调用python函数
C语言编程出现错误,'main' : not in formal parameter list
第二行应该是#includecmath
创新互联公司专注于内江网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供内江营销型网站建设,内江网站制作、内江网页设计、内江网站官网定制、小程序开发服务,打造内江网络公司原创品牌,更为您提供内江网站排名全网营销落地服务。
然后void main 后面应该是加(),而不是 ;
因为这个错误是指“main函数未在正式的参数列表”
你重新调试一下吧,希望能帮到你
递归特征消除(RFE)+ 交叉验证
递归特征消除(Recursive feature elimination)
递归特征消除的主要思想是反复构建模型,然后选出最好的(或者最差的)特征(根据系数来选),把选出来的特征放到一边,然后在剩余的特征上重复这个过程,直到遍历了所有的特征。在这个过程中被消除的次序就是特征的排序。
RFE的稳定性很大程度上取决于迭代时,底层用的哪种模型。比如RFE采用的是普通的回归(LR),没有经过正则化的回归是不稳定的,那么RFE就是不稳定的。假如采用的是Lasso/Ridge,正则化的回归是稳定的,那么RFE就是稳定的。
from sklearn.feature_selection import RFE
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from pandas import read_csv
import numpy as np
from scipy.stats import pearsonr
from sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
import csv
tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]
def RFErfe():
看一下RFE的输入参数:
estimator:估计函数,底层的回归模型。一个监督学习的估计函数,有fit方法,fit方法,通过 coef_ 属性或者 feature_importances_ 属性来提供feature重要性的信息。
n_features_to_select : int or None (default=None)选择(最优)feature的数量,超出的部分按照关联性排序。如果选择 None , 就选择一半的feature。
step:int or float, 可选(default=1)如果大于等于1,step对应于迭代过程中每次移除的属性的数量(integer)。如果是(0.0,1.0),就对应于每次移除的特征的比例,四舍五入。
可以调用的属性:
n_features_ : int所选特征的数量。
这是n_features_to_select=2时候的运行结果,可以看出来,两个部分的属性应该是最好的,超过的部分按照属性相关的强弱一次排序。
support_ : array of shape [n_features],[n_features]大小的array,所选特征的一种模糊的表示,可以看出来,打印结果就是true和false,最优的是true,别的是false。
ranking_ : array of shape [n_features],[n_features]大小的array,特征的排序,比如 ranking_[i] 表示的就是第i个特征的排名位置。估计最佳的属性被排为1.
tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]
这是运行结果。
按照惯例跟进去看一下源码。
传入参数:
estimator:和上面的一样。
step:和上面的一样。
cv:int,交叉验证的生成器或者迭代器。可选。
cv可选择的输入为:
-None,使用默认的3折交叉验证。
-integer,指定交叉验证的折数。
-一个object用作交叉验证的生成器。
-一种迭代的训练/测试集的分割。
对于None或者integer的输入。如果“y”是二分类或者多分类,就要用
class: sklearn.model_selection.StratifiedKFold
如果估计函数是一个分类器,或者“y”不是二分类也不是多分类,就要用
class: sklearn.model_selection.KFold
这里可以使用多种交叉验证的方法。
我这里使用的是回归的数据,因此可以知道使用的是KFold。
跟进去看一下KFold的源码。
n_splits : int, default=3,交叉验证的折数,默认3,最少是2。
shuffle : boolean, optional,可选。是否在分割成若干批次之前对数据进行洗牌。
random_state : int, RandomState 实例,或者None, optional, 可选default=None默认None。
如果是int, random_state是随机数生成器的种子。(指定一个,不指定的话每次结果都会不一样)
如果是RandomState 实例, random_state是随机数生成器。
如果是None,随机数是通过 RandomState 实例 np.random 生成的。此时 shuffle == True.
scoring : string, callable(可调用的) or None, optional,可选的 default: None,默认:None,评分标准。一个string型(参考model evaluation documentation模型评估文档)或者一个可以调用的评分object/function
with signature scorer(estimator, X, y) .
可调用的属性:
n_features_ : int,通过交叉验证得到的特征选择的数量。
support_:和上面一样。
ranking_:和上面一样。
grid_scores_:array of shape [n_subsets_of_features],交叉验证的分数,比如 grid_scores_[i] 第i个特征子集的CV分数。 grid_scores_ is equal to ceil((n_features - 1) / step) + 1,
estimator_ :和上面一样。
谁动了我的VS
谁动了我的特征1为什么要记录特征转换行为?使用机器学习算法和模型进行数据挖掘,有时难免事与愿违:我们依仗对业务的理解,对数据的分析,以及工作经验提出了一些特征,但是在模型训练完成后,某些特征可能“身微言轻”——我们认为相关性高的特征并不重要,这时我们便要反思这样的特征提出是否合理;某些特征甚至“南辕北辙”——我们认为正相关的特征结果变成了负相关,造成这种情况很有可能是抽样与整体不相符,模型过于复杂,导致了过拟合。然而,我们怎么判断先前的假设和最后的结果之间的差异呢?线性模型通常有含有属性coef_,当系数值大于0时为正相关,当系数值小于0时为负相关;另外一些模型含有属性feature_importances_,顾名思义,表示特征的重要性。根据以上两个属性,便可以与先前假设中的特征的相关性(或重要性)进行对比了。但是,理想是丰满的,现实是骨感的。经过复杂的特征转换之后,特征矩阵X已不再是原来的样子:哑变量使特征变多了,特征选择使特征变少了,降维使特征映射到另一个维度中。累觉不爱了吗?如果,我们能够将最后的特征与原特征对应起来,那么分析特征的系数和重要性又有了意义了。所以,在训练过程(或者转换过程)中,记录下所有特征转换行为是一个有意义的工作。可惜,sklearn暂时并没有提供这样的功能。在这篇博文中,我们尝试对一些常见的转换功能进行行为记录,读者可以在此基础进行进一步的拓展。2有哪些特征转换的方式?《使用sklearn做单机特征工程》一文概括了若干常见的转换功能:类名功能说明StandardScaler数据预处理(无量纲化)标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布MinMaxScaler数据预处理(无量纲化)区间缩放,基于最大最小值,将特征值转换到[0,1]区间上Normalizer数据预处理(归一化)基于特征矩阵的行,将样本向量转换为“单位向量”Binarizer数据预处理(二值化)基于给定阈值,将定量特征按阈值划分OneHotEncoder数据预处理(哑编码)将定性数据编码为定量数据Imputer数据预处理(缺失值计算)计算缺失值,缺失值可填充为均值等PolynomialFeatures数据预处理(多项式数据转换)多项式数据转换FunctionTransformer数据预处理(自定义单元数据转换)使用单变元的函数来转换数据VarianceThreshold特征选择(Filter)方差选择法SelectKBest特征选择(Filter)可选关联系数、卡方校验、最大信息系数作为得分计算的方法RFE特征选择(Wrapper)递归地训练基模型,将权值系数较小的特征从特征集合中消除SelectFromModel特征选择(Embedded)训练基模型,选择权值系数较高的特征PCA降维(无监督)主成分分析法LDA降维(有监督)线性判别分析法按照特征数量是否发生变化,这些转换类可分为:无变化:StandardScaler,MinMaxScaler,Normalizer,Binarizer,Imputer,FunctionTransformer*有变化:OneHotEncoder,PolynomialFeatures,VarianceThreshold,SelectKBest,RFE,SelectFromModel,PCA,LDAFunctionTransformer*:自定义的转换函数通常不会使特征数量发生变化对于不造成特征数量变化的转换类,我们只需要保持特征不变即可。在此,我们主要研究那些有变化的转换类,其他转换类都默认为无变化。按照映射的形式,可将以上有变化的转换类可分为:一对一:VarianceThreshold,SelectKBest,RFE,SelectFromModel一对多:OneHotEncoder多对多:PolynomialFeatures,PCA,LDA原特征与新特征为一对一映射通常发生在特征选择时,若原特征被选择则直接变成新特征,否则抛弃。哑编码为典型的一对多映射,需要哑编码的原特征将会转换为多个新特征。多对多的映射中PolynomialFeatures并不要求每一个新特征都与原特征建立映射关系,例如阶为2的多项式转换,第一个新特征只由第一个原特征生成(平方)。降维的本质在于将原特征矩阵X映射到维度更低的空间中,使用的技术通常是矩阵乘法,所以它既要求每一个原特征映射到所有新特征,同时也要求每一个新特征被所有原特征映射。3特征转换的组合在《使用sklearn优雅地进行数据挖掘》一文中,我们看到一个基本的数据挖掘场景:特征转换行为通常是流水线型和并行型结合的。所以,我们考虑重新设计流水线处理类Pipeline和并行处理类FeatureUnion,使其能够根据不同的特征转换类,记录下转换行为“日志”。“日志”的表示形式也是重要的,由上图可知,集成后的特征转换过程呈现无环网状,故使用网络来描述“日志”是合适的。在网络中,节点表示特征,有向连线表示特征转换。为此,我们新增两个类型Feature和Transfrom来构造网络结构,Feature类型表示网络中的节点,Transform表示网络中的有向边。python的networkx库可以很好地表述网络和操作网络,我这是要重新造轮子吗?其实并不是,现在考虑代表新特征的节点怎么命名的问题,显然,不能与网络中任意节点同名,否则会发生混淆。然而,由于sklearn的训练过程存在并行过程(线程),直接使用network来构造网络的话,将难以处理节点重复命名的问题。所以,我才新增两个新的类型来描述网络结构,这时网络中的节点名是可以重复的。最后,对这网络进行广度遍历,生成基于networkx库的网络,因为这个过程是串行的,故可以使用“当前节点数”作为新增节点的序号了。
vlookup函数rfe怎么回事
VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
VLOOKUP 函数语法具有下列参数 (参数:为操作、事件、方法、属性、函数或过程提供信息的值。):
lookup_value 必需。要在表格或区域的第一列中搜索的值。lookup_value 参数可以是值或引用。如果为 lookup_value
参数提供的值小于 table_array 参数第一列中的最小值,则 VLOOKUP
将返回错误值 #N/A。
table_array 必需。包含数据的单元格区域。可以使用对区域(例如,A2:D8)或区域名称的引用。table_array 第一列中的值是由 lookup_value 搜索的值。这些值可以是文本、数字或逻辑值。文本不区分大小写。
col_index_num 必需。table_array
参数中必须返回的匹配值的列号。col_index_num 参数为 1 时,返回 table_array 第一列中的值;col_index_num 为 2 时,返回 table_array 第二列中的值,依此类推。
如果 col_index_num 参数:
小于 1,则 VLOOKUP 返回错误值 #VALUE!。
大于 table_array 的列数,则 VLOOKUP 返回错误值
#REF!。
range_lookup 可选。一个逻辑值,指定希望 VLOOKUP 查找精确匹配值还是近似匹配值:
如果 range_lookup 为 TRUE
或被省略,则返回精确匹配值或近似匹配值。如果找不到精确匹配值,则返回小于 lookup_value 的最大值。
要点 如果 range_lookup 为 TRUE
或被省略,则必须按升序排列 table_array 第一列中的值;否则,VLOOKUP 可能无法返回正确的值。
有关详细信息,请参阅对区域或表中的数据进行排序。
如果 range_lookup 为 FALSE,则不需要对 table_array 第一列中的值进行排序。
如果 range_lookup 参数为 FALSE,VLOOKUP
将只查找精确匹配值。如果 table_array 的第一列中有两个或更多值与 lookup_value 匹配,则使用第一个找到的值。如果找不到精确匹配值,则返回错误值
#N/A。
注解
在 table_array 的第一列中搜索文本值时,请确保 table_array 第一列中的数据不包含前导空格、尾部空格、非打印字符或者未使用不一致的直引号(' 或 ")与弯引号(‘ 或
“)。否则,VLOOKUP 可能返回不正确或意外的值。
有关详细信息,请参阅 CLEAN 函数和 TRIM 函数。
在搜索数字或日期值时,请确保 table_array 第一列中的数据未存储为文本值。否则,VLOOKUP 可能返回不正确或意外的值。
如果 range_lookup 为 FALSE 且 lookup_value 为文本,则可以在 lookup_value 中使用通配符 - 问号 (?) 和星号
(*)。问号匹配任意单个字符;星号匹配任意字符序列。如果要查找实际的问号或星号,请在字符前键入波形符 (~)。
特征工程:特征处理方法
如果不同特征的数量级不在一个等级,模型就不是碗形,而是长条形,难收敛。如果是逻辑回归、线性回归,一定要做幅度调整,如果用树模型,就不需要幅度调整。因为树模型是对各个特征一个一个做的,幅度差异不影响。
可以把不同特征调整到[0,1]范围内,(x-min)/(max-min),适用于非高斯分布,可以保留数值大部分信息,但易受到异常值影响。
或者使用standard scaler, ,适用于高斯分布。优点是处理后的数据更加正态化,但是缺点是对分布要求严格。
树模型(决策树、随机森林、GBDT)不需要做数值的缩放,线性模型、SVM、神经网络、KNN、PCA降维都是需要做数值缩放的。
1)加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少。。。
2)分位线:商品属于售出商品价格的多少分位线处。
3)次序型:排在第几位
4)比例类:电商中,好/中/差评 比例,你已超过全国百分之多少的同学。
比如年龄,是一个连续值。如果要通过逻辑回归来判断是否要让座,要同时顾及“尊老”“爱幼”。而激活函数sigmoid函数是 ,如果 是正数,函数是单调增,年龄越大让座可能越大,但是小孩子就不让座了,如果 是负数,函数单调减,只能满足爱幼,不能尊老了。所以,将年龄字段分成[0,6],[7,59],[60,120]三段,变成三个字段,对应就会有三个 来判别,是否应该让座,就可以同时实现尊老和爱幼。
1)等距切分。pd.cut()
2)等频切分,按照分位数切分。pd.qcut()
如果是用逻辑回归模型,就要做离散化,如果使用树模型,如决策树、随机森林,就不一定要做离散化,因为模型本身会给你做离散化。
口红色号,衣服尺码等等
red:---1
blue:---2
yellow:---3
如果用以上的编码方式,不同颜色之间存在了大小关系,而应该是等价的。
red:--1,0,0
blue:--0,1,0
yellow:--0,0,1
拆分成三列,“是否是red”、"是否是blue"、“是否是yellow”。
操作:pd.get_dummies()
哑变量和one hot其实是一件事,就像奇异果和猕猴桃。
相当于multi-hot,有多个1。
比如,我可以建一个词库,一句话里如果含有单词apple,那就在apple这列打1,含有多少单词就打多少个1。但是这种方法比较稀疏,词库太大了。
改进方法:比如我对于每一个领域都有一个词表,比如财经类词表,体育类词表。。。然后有一篇文章,我要对他进行分类,就可以看这篇文章里有多少个词是财经词表里的,有多少词是体育词表里面的。
比如:
性别:[男,女]
爱好:[足球,散步,电视剧]
要用爱好来表达性别
男生中这三个爱好的人数比例是:[2/3, 1/3, 0]
女生中这三个爱好的人数比例是:[0, 1/3, 2/3]
把这三列 [“喜欢足球的概率”,“喜欢散步的概率”,“喜欢电视剧的概率”] 加在对应的性别后面,可以作为新的特征。
4.如果类别特征空间太大,超过了几十个一般就不适用one hot了。比如是中介的ID,可以考虑用Label encoding(直接用1,2,3代替,会产生次序关系,但总好过直接丢弃特征)、Count encoding(出现了多少次就写多少)、Target encoding(根据标签,反过来对特征编码,使用方法就是上面的histogram,但是会造成标签泄露,产生过拟合。可以用交叉验证的思想,分成5折,用4份的数据做编码,然后用剩下的一份做训练。)
既可以作为连续值,也可以作为离散值。
连续值:持续时间(浏览时长)、间隔时间(上次购买距离现在的时间)
离散值:哪个时间段、周几 等,离散后,就是类别型的数据。但不是说一定要做one-hot编码,比如时间段,可以离散化为“上班高峰期”和“非高峰期”。而周几,可以用one-hot,也可以离散为“工作日”和“周末”。
1、词袋模型:就是指上面的hash技巧,文本数据去掉停用词,剩下的词组成list,在词库中的映射稀疏向量。
2、词袋模型的问题: 李雷喜欢韩梅梅 VS 韩梅梅喜欢李雷,丢失了顺序信息。
解决方案:把词袋中的词扩充到n-gram,就是分词的时候,除了“李雷”、“喜欢”、“韩梅梅”,还要加上“李雷喜欢”、“喜欢韩梅梅”。这叫2-gram。在python里的库叫CountVectorizer。
3、新的问题:只统计了频次,但是,出现频次高的一定是重要的吗?
解决方案:使用TF-IDF特征。如果t虽然在文档中出现次数多,但是在其他文档中出现的次数也很多,那么这个词就不重要。
TF(t)=
IDF(t)=
TF-IDF权重=TF(t)*IDF(t)
4、稀疏--稠密,工具是word2vec,在机器学习中不太好用,在深度学习中用得多。原理比较复杂,先不讲。
比如:
1)购物车购买转化率(用户维度统计特征)
2)商品热度(商品维度统计特征)
3)对不同item点击/收藏/购物车/购买的总计(商品维度统计特征)
4)对不同item点击/收藏/购物车/购买平均每个user的计数(用户维度统计特征)
5)变热门的品牌/商品(商品维度,差值型)
6)最近1/2/3/7天的行为数与平均行为数的比值(用户维度,比例型)
7)商品在类别中的排序(商品维度,次序型)
8)商品交互的总人数(商品维度,求和型)
等等。。。
统计值也可以用来发现一些规律,比如前一天加购物车的商品很有可能第二天购买;加车N件,只买了一件,剩余的不会买。。。
如:张三电子产品,李四服装,
增加一列,只有同时出现指定的用户和品类的时候,才取1。
第一种组合完全是拍脑袋,所以可以结合使用 决策树模型 (GBDT),用GBDT学习出来的路径,组合成新的特征。不一定是整条路径,选取其中的一小段也可以是一个新的特征。例如下图,“年龄 25 是教师” 就是一个新的特征。
1)冗余,部分特征相关度高,消耗计算性能。
2)噪声,有些特征对结果有负影响。
前者只踢掉原本特征里,和结果预测关系不大的列。后者是要在低维空间中,尽量保存住高维的信息。
1)评估 单个 特征和结果值之间的相关程度,排序,留下Top相关的特征部分。
2)Pearson相关系数,
3)缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。
python包:SelectKBest(选最重要的K个)、SelectPercentile(选最重要的百分之多少)
看做一个子集搜索问题,筛选各种特征子集,用模型评估效果。
典型的包裹型算法为:递归特征删除算法(recursive feature elimination algorithm)。
做法:
1)先用全量特征跑逻辑回归模型
2)然后系数排序(体现相关性),砍掉5-10%的弱特征,观察准确率/auc的变化。
3)逐步进行,直至准确率/auc出现大的下滑为止。
python包:RFE
L1正则化 + 逻辑回归LR/ linear SVM
L1正则化的效果,是让一些不重要的特征的权重系数变成0。
通常用在 稀疏的高维 数据。
分享文章:python中rfe函数 rf调用python函数
网页链接:http://pwwzsj.com/article/hejpse.html