第二行应该是#includecmath
然后void main 后面应该是加(),而不是 ;
因为这个错误是指"main函数未在正式的参数列表"
你重新调试一下吧,希望能帮到你
递归特征消除(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所选特征的数量.
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.
这是运行结果.
按照惯例跟进去看一下源码.
传入参数:
estimator:和上面的一样.
step:和上面的一样.
cv:int,交叉验证的生成器或者迭代器.可选.
cv可选择的输入为:
-integer,指定交叉验证的折数.
-一个object用作交叉验证的生成器.
-一种迭代的训练/测试集的分割.
对于None或者integer的输入.如果"y"是二分类或者多分类,就要用
class: sklearn.model_selection.StratifiedKFold
如果估计函数是一个分类器,或者"y"不是二分类也不是多分类,就要用
class: sklearn.model_selection.KFold
这里可以使用多种交叉验证的方法.
我这里使用的是回归的数据,所以呢可以知道使用的是KFold.
跟进去看一下KFold的源码.
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_ :和上面一样.
VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
VLOOKUP 函数语法具有下列参数 (参数:为操作、事件、方法、属性、函数或过程提供信息的值.):
lookup_value 必需.要在表格或区域的第一列中搜索的值.lookup_value 参数可以是值或引用.如果为 lookup_value
参数提供的值小于 table_array 参数第一列中的最小值,则 VLOOKUP
将返回错误值 #N/A.
col_index_num 必需.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降维都是需要做数值缩放的.
①.)加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少...
①.)等距切分.pd.cut()
如果是用逻辑回归模型,就要做离散化,如果使用树模型,如决策树、随机森林,就不一定要做离散化,因为模型本身会给你做离散化.
口红色号,衣服尺码等等
red:---1
如果用以上的编码方式,不同颜色之间存在了大小关系,而应该是等价的.
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.但是这种方法比较稀疏,词库太大了.
改进方法:比如我对于每一个领域都有一个词表,比如财经类词表,体育类词表...然后有一篇文章,我要对他进行分类,就可以看这篇文章里有多少个词是财经词表里的,有多少词是体育词表里面的.
比如:
性别:[男,女]
爱好:[足球,散步,电视剧]
要用爱好来表达性别
把这三列 ["喜欢足球的概率","喜欢散步的概率","喜欢电视剧的概率"] 加在对应的性别后面,可以作为新的特征.
既可以作为连续值,也可以作为离散值.
连续值:持续时间(浏览时长)、间隔时间(上次购买距离现在的时间)
离散值:哪个时间段、周几 等,离散后,就是类别型的数据.但不是说一定要做one-hot编码,比如时间段,可以离散化为"上班高峰期"和"非高峰期".而周几,可以用one-hot,也可以离散为"工作日"和"周末".
①.、词袋模型:就是指上面的hash技巧,文本数据去掉停用词,剩下的词组成list,在词库中的映射稀疏向量.
解决方案:使用TF-IDF特征.如果t虽然在文档中出现次数多,但是在其他文档中出现的次数也很多,那么这个词就不重要.
TF(t)=
IDF(t)=
TF-IDF权重=TF(t)*IDF(t)
①.)购物车购买转化率(用户维度统计特征)
等等...
统计值也可以用来发现一些规律,比如前一天加购物车的商品很有可能第二天购买;加车N件,只买了一件,剩余的不会买...
如:张三电子产品,李四服装,
增加一列,只有同时出现指定的用户和品类的时候,才取1.
①.)冗余,部分特征相关度高,消耗计算性能.
前者只踢掉原本特征里,和结果预测关系不大的列.后者是要在低维空间中,尽量保存住高维的信息.
①.)评估 单个 特征和结果值之间的相关程度,排序,留下Top相关的特征部分.
python包:SelectKBest(选最重要的K个)、SelectPercentile(选最重要的百分之多少)
看做一个子集搜索问题,筛选各种特征子集,用模型评估效果.
典型的包裹型算法为:递归特征删除算法(recursive feature elimination algorithm).
做法:
①.)先用全量特征跑逻辑回归模型
python包:RFE
L1正则化 + 逻辑回归LR/ linear SVM
L1正则化的效果,是让一些不重要的特征的权重系数变成0.
通常用在 稀疏的高维 数据.