from sklearn.datasets import load_iris from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr import numpy as np import pandas as pd from IPython.display import display # 导入IRIS数据集 iris = load_iris() # 特征矩阵 iris_data = iris.data print('iris_data:\n', iris_data) # 目标向量 iris_target = iris.target print('iris_target:\n', iris_target) # 特征 feature_names = iris.feature_names print('feature_names:\n', feature_names) #class sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, *, k=10) # 参数: # score_func:为计算评估特征是否好的函数(该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组, # 数组第i项为第i个特征的评分和P值,在此定义为计算相关系数)。 # k:为选择的特征个数,保留前几个最佳特征 #返回选择器selector ''' score_func参数的内容: lambda x:pearson(x,Y) :是计算x(每一个特征)与Y(预测结果)的pearson系数。 lambda argument_list:expersion :lambda函数是匿名函数 argument_list是参数列表、expression是一个关于参数的表达式 map(lambda x:pearsonr(x, Y)[0], X.T) : map(function, iterable, ...) :第一个参数 function以参数序列iterable中的每一个元素调用function 函数, 返回包含每次 function 函数返回值的新列表。 .T :是.permute函数的简化版本,不仅可以转置2维tensor,甚至可以对n维tensor进行转置 X.T :在lambda函数后面直接传递实参给x np.array(list(map( , ))) :map函数在Python3.x下返回迭代器,numpy.array()需写入list。map前要再套一个list() map(lambda x: pearsonr(x, Y)[0], X.T) :要计算的是每一个特征与预测结果的关系,不加转置则相当于是每一个样本与预测结果的关系了。 故X后要再加一个.T scipy.stats.pearsonr(x, y)返回值这里只需要返回的r值即皮尔森系数即可。 pearsonr(x, Y)[0]=r,pearsonr(x, Y)[1]=p-value. ''' selector = SelectKBest(lambda X, Y: np.array(list(map(lambda x: pearsonr(x, Y)[0], X.T))).T, k=3) # 常用方法: #fit(x,y):传入特征集x和标签y,拟合数据。 #transform(x):fit(x,y)后使用,转换数据,返回特征过滤后保留下的特征数据集。 #fit_transform(x,y):拟合数据+转化数据,返回特征过滤后保留下的特征数据集。 #get_support(indices=True):fit(x,y)后使用,返回特征过滤后保留下的特征列索引。 #用fit_transform方法,返回选择特征后的数据。 ''' (lambda X, Y:np.array(...),, k=3).fit_transform(iris.data, iris.target): fit_transform分别传递实参iris.data、iris.target给X,Y ''' datas=selector.fit_transform(iris.data, iris.target) #用get_support(indices=True)方法,返回特征列索引 select_feature_index=selector.get_support(indices=True) print('select feature index:\n',select_feature_index) #属性:fit(x,y)方法后才能调用 #scores_ :返回每个特征的得分 #pvalues_ : 返回每个特征得分对应的p_value值。如果score_func只返回分数,则pvalues_返回空 #调用属性scores_,获得特征选择函数返回的得分 feature_score = selector.scores_ print('feature score:\n',feature_score) #调用属性pvalues_ ,获得特征选择函数返回的P值 feature_P = selector.pvalues_ print('feature P:\n',feature_P) #以DataFrame形式返回特征选择后的数据 iris_data_new = pd.DataFrame(data=datas, columns=np.array(feature_names)[select_feature_index]) print('new data:') display(iris_data_new)
参考资料:
机器学习中,有哪些特征选择的工程方法? - bonelee - 博客园 (cnblogs.com)
每天一点sklearn函数之SelectKBest(9.5) - 知乎 (zhihu.com)
(5条消息) Python数据分析:特征选择-SelectKBest_爱上这个夏天的博客-优快云博客
(5条消息) 机器学习学习记录之sklearn特征选择SelectKBest函数_sklearn selectkbest_Lotus莲的博客-优快云博客
细说Python的lambda函数用法,建议收藏 - 知乎 (zhihu.com)(5条消息) tensor .t() vs .T_tensor.t()_lollows的博客-优快云博客Python map() 函数 | 菜鸟教程 (runoob.com)
注明:
仅供个人参考,如有理解错误还请评论区指出,不胜感激(*^_^*)