sklearn 之 数据预处理与特征工程

模块总览

模块preprocessing:几乎包含数据预处理的所有内容

模块Impute:填补缺失值专用

模块feature_selection:包含特征选择的各种方法的实践

模块decomposition:包含降维算法

数据预处理

数据的无量纲化

preprocessing
preprocessing.MinMaxScaler

(数据归一化:Normalization,又称Min-Max Scaling)
x ∗ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^*=\frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(x)

#实现归一化
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler(feature_range=[min,max])     #默认为0-1   
scaler=scaler.fit(data) #fit,本质生成min(x) 和 max(x)  
result=scaler.transform(data)  #通过接口导出结果

result_=scaler.fit_transform(data)   #二合一

scaler.inverse_transform(result)  #将归一化后的结果逆转

#当x中特征数量特别多的时候,应该使用partial_fit作为训练借口
scaler=scaler.partial_fit(data)
preprocessing.StandardScaler

数据标准化(Standardization,又称Z-score normalization)
x ∗ = x − μ σ μ : 均 值 σ : 标 准 差 x^*=\frac{x-μ}{σ} \quad μ:均值 \quad σ:标准差 x=σxμμ:σ:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() 
scaler.fit(data)   
scaler.mean_ #查看均值的属性
scaler.var_ #查看方差的属性

x_std = scaler.transform(data) #通过接口导出结果 

scaler.fit_transform(data) #二合一

scaler.inverse_transform(x_std)    #逆转标准化

对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。

首选StandradScaler,效果不好再换MinMaxScaler。

缺失值

impute
impute.SimpleImputer
参数含义&输入
missing_values缺失值样式,默认为np.nan
strategy填补缺失值策略,默认均值。
mean,median(中值).most_frequent(众数,对数值型和字符型的都可用),constant
fill_value当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
copy默认为True,创建新的副本。
from sklearn.impute import SimpleImputer

Age = data.loc[:,"Age"].values.reshape(-1,1) 
#sklearn当中特征矩阵必须是二维Age[:20]

imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
imp_mode = SimpleImputer(strategy = "most_frequent")#用众数填补
	
imp_mean = imp_mean.fit_transform(Age)#fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)


#得出来的矩阵还要代入回原矩阵

处理分类型特征

preprocessing.LabelEncoder

标签专用,能将分类转换为数值

from sklearn.preprocessing import LabelEncoder 

y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维 

le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y)   #transform接口调取结果 

le.classes_ #属性.classes_查看标签中究竟有多少类别

le.fit_transform(y) #也可以直接fit_transform一步到位 

le.inverse_transform(label) #使用inverse_transform可以逆转

#得出来的矩阵还要代入回原矩阵


快捷写法
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
preprocessing.OrdinalEncoder

特征专用,能够将分类特征转换为分类数值,可用用来处理有序变量,但不能处理名义变量。

from sklearn.preprocessing import OrdinalEncoder
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])

#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
preprocessing.OneHotEncoder:

独热编码,创建哑变量。用来处理名义变量

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()

OneHotEncoder(categories='auto').fit_transform(X).toarray()   #二合一

#重要属性,得到列名
enc.get_feature_names()

newdata=pd.concat([data,pd.DataFrame(result)],axis=1)
#记得删除原矩阵中的特征,在后来加入的矩阵中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiTVG91p-1646640652953)(C:\Users\winkey\Desktop\学习\sklearn\3数据预处理与特征工程\image-20220302100843273-16461869251292-16461869429493.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhZ5BNOc-1646640652954)(C:\Users\winkey\Desktop\学习\sklearn\3数据预处理与特征工程\image-20220302101056635-16461870580404.png)]

处理连续性特征

preprocessing.Binarizer

将数据二值化,将大于某值的数据映射到1,小于某值的数据映射到0

from sklearn.preprocessing import Binarizer
transformer = Binarizer(threshold=30).fit_transform(X) transformer
preprocessing.KBinsDiscretizer
from sklearn.preprocessing import KBinsDiscretizer
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')#strategy: ‘uniform’ 策略使用固定宽度的bins。 ‘quantile’ 策略在每个特征上使用分位数(quantiles)值以便具有相同填充的bins。 ‘kmeans’ 策略基于在每个特征上独立执行的k-means聚类过程定义bins

#encode  onehot生成哑变量   ordinal 用0,1,2在一行中进行分类 

est.fit_transform(X) 
#查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel()) 
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()

特征选择

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OdrkweP8-1646640652954)(C:\Users\winkey\Desktop\学习\sklearn\3数据预处理与特征工程\image-20220302103430375-16461884719415.png)]

过滤法,嵌入法,包装法,和降维算法

Filter过滤法

方差过滤VarianceThreshold

使用对象:需要遍历特征或升维的算法们

优先消除方差为0的特征,也可以找到方差的中位数作为阈值。

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=) #threshold为舍弃小于threshold的特征,默认为0
X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
X = VairanceThreshold().fit_transform(X)  #二合一

当特征是二分类时,var(x)=p(1-p) 当某种分类占到80%以上时删除特征。

X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)
X_bvar.shape

注意事项

如果在用方差阈值过滤掉一半特征后,模型的精确度上升了。这说明被我们过滤掉的特征在当前的随机模式下大部分是噪音,那我们可以过滤掉,反之,放弃过滤,用其他手段。

一般在特征选择前,只会消除阈值很小或为0的方差。

相关性过滤
卡方过滤

专门针对离散型标签(即分类问题)的相关性过滤,只能计算非负特征与标签之间的卡方统计量。

以此来选出与分类目的特征

简单版:

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   #卡方
#假设在这里我一直我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)  #k为需要的特征值
X_fschi.shape

#还可用学习曲线选取超参数k

进阶版:

通过p值选择k

卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.01或0.05作为显著性水平,即p值判断的边界。

从特征工程的角度,我们希望选取p值小于0.05的特征,即和标签是相关联的特征。

chivalue, pvalues_chi = chi2(X_fsvar,y)
chivalue       #方差
pvalues_chi    #p值
#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()
F检验

每个特征与标签之间的线性关系的过滤方法。

feature_selection.f_classif 分类:用于标签是离散型的数据

feature_selection.f_regression 回归:用于标签是连续型的数据

注意

F检验在数据服从正态分布时效果会非常稳定,因此如果使用F检验过滤,我们会先将数据转换成服从正态分布的方式。

from sklearn.feature_selection import f_classif 
F, pvalues_f = f_classif(X_fsvar,y) 
F 
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()

本质与卡方过滤一致,也可以用p值来选择要过滤的可证

互信息法

与f检验用法一致,比f检验更强大,能找出任意关系。

返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。

feature_selection.mutual_info_classif(互信息分类)

feature_selection.mutual_info_regression(互信息回归)

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()

嵌入法

feature_selection.SelectFromModel

缺点:非常耗时间。

可以与具有coef_,feature_importances_属性或参数中可选惩罚项的评估器一起使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0nVThPb-1646640652955)(C:\Users\winkey\Desktop\学习\sklearn\3数据预处理与特征工程\image-20220304091438332-16463564810661.png)]

包装法

sklearn.feature_selection.RFE

参数estimator是需要填写的实例化后的评估器

n_features_to_select是想要选择的特征个数

step表示每次迭代中希望移除的特征个数。

重要属性:

support_:返回所有的特征的是否最后被选中的布尔矩阵。

ranking:返回特征的按数次迭代中综合重要性的排名。

feature_selection.RFECV会在交叉验证循环中执行RFE以找到最佳数量的特征,增加参数cv,其他用法都和RFE一模一样。

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() 
selector.ranking_ 
X_wrapper = selector.transform(X) cross_val_score(RFC_,X_wrapper,y,cv=5).mean()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值