模块总览
模块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)x−min(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()