sklearn学习——特征处理

news/2025/4/22 1:03:07

sklearn学习——特征处理

特征提取(feature extraction):
从文字,图像,声音等其他非结构化数据中提取新信息作为特征。比如说,从淘宝宝贝的名称中提取出产品类别,产品颜色,是否是网红产品等等。
特征创造(feature creation):
把现有特征进行组合,或互相计算,得到新的特征。比如说,我们有一列特征是速度,一列特征是距离,我们就可以通过让两列相处,创造新的特征:通过距离所花的时间。
特征选择(feature selection):
从所有的特征中,选择出有意义,对模型有帮助的特征,以避免必须将所有特征都导入模型去训练的情况。

代码:

#导入数据,让我们使用digit recognizor数据来一展身手
import pandas as pd
data = pd.read_csv(r"digit recognizor.csv")
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
print(X.shape)# 1 过滤法,主要对象是:需要遍历特征或升维的算法们,而过滤法的主要目的是:在维持算法表现的前提下,帮助算法们降低计算成本。
# 1.1方差过滤 VarianceThreshold
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() # 实例化,不填参数默认方差为0
X_var0 = selector.fit_transform(X) # 获取删除不合格特征之后的新特征矩阵
# 也可以直接写成 X = VairanceThreshold().fit_transform(X)
print(X_var0.shape)import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)
# print(X.var().values)
np.median(X.var().values)
print(X_fsvar.shape)# 1.2 相关性过滤
# 1.2.1 卡方过滤,
# 是专门针对离散型标签(即分类问题)的相关性过滤,
# 卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。
# 卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.010.05作为显著性水平,
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
import matplotlib.pyplot as plt
#假设在这里我一直我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
print(X_fschi.shape)'''
score = []
for i in range(390,200,-10):X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()score.append(once)
plt.plot(range(350, 200, -10), score)
plt.show()
'''
chivalue, pvalues_chi = chi2(X_fsvar, y)
# k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征:
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
#X_fschi = SelectKBest(chi2, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()# 1.2.2  F检验
# F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。
# 它即可以做回归也可以做分类
# feature_selection.f_classif(F检验分类)
# feature_selection.f_regression(F检验回归)
# F检验的本质是寻找两组数据之间的线性关系
# 我们希望选取p值小于0.050.01的特征,这些特征与标签时显著线性相关的from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,y)
print(F)
print(pvalues_f)
k = F.shape[0] - (pvalues_f > 0.05).sum()
#X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()# 1.2.3 互信息法
# 互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类
# feature_selection.mutual_info_classif(互信息分类)
# feature_selection.mutual_info_regression(互信息回归)
# 互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,
# 这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar, y)
k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()# 2 Embedded嵌入法
# 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行
# feature_selection.SelectFromModel
# class sklearn.feature_selection.SelectFromModel (estimator, threshold=None, prefit=False, norm_order=1,max_features=None)
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators =10, random_state=0)
X_embedded = SelectFromModel(RFC_, threshold=0.005).fit_transform(X, y) #在这里我只想取出来有限的特征。0.005这个阈值对于有780个特征的数据来说,是非常高的阈值,因为平均每个特征只能够分到大约0.001的feature_importances_
print(X_embedded.shape)
#模型的维度明显被降低了
#同样的,我们也可以画学习曲线来找最佳阈值
import numpy as np
import matplotlib.pyplot as plt
print(RFC_.fit(X,y).feature_importances_)
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)
score = []
for i in threshold:X_embedded = SelectFromModel(RFC_, threshold=i).fit_transform(X,y)once = cross_val_score(RFC_, X_embedded, y, cv=5).mean()score.append(once)
plt.plot(threshold, score)
plt.show()# 3 Wrapper包装法
# class sklearn.feature_selection.RFE (estimator, n_features_to_select=None, step=1, verbose=0)
from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators =10,random_state=0)
selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y)
selector.support_.sum()
print(selector.ranking_)
X_wrapper = selector.transform(X)
cross_val_score(RFC_, X_wrapper, y, cv=5).mean()
score = []
for i in range(1, 751, 50):X_wrapper = RFE(RFC_, n_features_to_select=i, step=50).fit_transform(X, y)once = cross_val_score(RFC_, X_wrapper, y, cv=5).mean()score.append(once)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 751, 50), score)
plt.xticks(range(1, 751, 50))
plt.show()

https://dhexx.cn/news/show-2654230.html

相关文章

环境变量问题

软件出现下面的问题&#xff1a; 解决方法&#xff1a; 直接用export命令&#xff1a;#export PATH$PATH:/usr/local/sbin:/usr/sbin:/sbin

粒子群优化支持向量机代码(PSO-SVM)

粒子群优化支持向量机代码 数据WFs1 import pandas as pd import numpy as np import random from sklearn.svm import SVC import matplotlib.pyplot as plt from sklearn.model_selection import cross_val_predict from sklearn.metrics import confusion_matrix from skl…

LeetCode Bulb Switcher

题目&#xff1a; There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if its off or turning off if its on). For the nth round, you only …

C++操作MySQL,有用的朋友顶下,辛苦的原创啊. - 天下 - C++博客

C操作MySQL,有用的朋友顶下,辛苦的原创啊. - 天下 - C博客C操作MySQL,有用的朋友顶下,辛苦的原创啊.向google大神搜 :mysql-connector得http://www.mysql.com/products/connector/这些就是mysql所谓的连接器吧.一路向下看到:C Wrapper for MySQL C API (MySQL) Download http:/…

sklearn学习——递归特征消除法(RFE)

sklearn学习——递归特征消除法&#xff08;RFE&#xff09; 1 作用 消除特征之间的冗余&#xff0c;选取最优特征组合。降低特征维数。 2 步骤 将筛选的k个特征作为初始特征子集输入到随机森林分类器中&#xff0c;计算得到每个特征的重要性&#xff0c;并利用交叉验证方法…

Java Code Review清单

2019独角兽企业重金招聘Python工程师标准>>> 整洁的代码 清单项目分类使用可以表达实际意图(Intention-Revealing)的名称有意义的名称每一个概念只用一个词有意义的名称使用方案/问题领域名称有意义的名称类应该是比较小的!类函数应该是比较小的!函数只做一件事函数…

LeetCode Generate Parentheses

题目&#xff1a; Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()(…

python起步——可变对象和不可变对象

学习python了一小段时间&#xff0c;觉得整体上还是真的让程序更好写了。   学习过程中&#xff0c;突然想到一个问题——我之前博客写过的一篇文章&#xff0c;关于不用第三个数交换a、b的问题&#xff1a;http://www.cnblogs.com/FreeAquar/archive/2012/07/22/2603381.htm…

Java学习笔记(1)——常用cmd命令与Java编制编译

Java学习笔记——常用cmd命令与Java编制编译 1 JDK下载安装与环境配置 附上链接 2 常用cmd命令 dir 列出当前目录下的文件以及文件夹md 创建目录rd 删除目录cd 进入指定目录cd… 退回到上一级目录del 删除文件 3 Java特点 简单性面向对象分布式健壮性安全性体系结构中立…

华为防火墙-适合CSSIP方向

新版的OS初始console的用户名&#xff1a;admin&#xff0c;密码&#xff1a;Admin123连接console进入设备&#xff1a; Copyright(C) 2010-2013 Huawei Technologies Co., Ltd. *All rights reserved *Without the owners prior written consent, *no decompiling or reverse-…