栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

preprocessing/ feature

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

preprocessing/ feature

1.数据挖掘的五大流程

        

获取数据
数据预处理数据类型不同;数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不易,有重复,数据量过大或过小
特征工程特征过多过小,特征之间的相关性,特征与标签之间相关性,目的使降低运算成本,提升模型上限
建模测试模型并预测结果
上线验证模型效果

2.数据预处理

        2.1数据的无量纲化

中心化平移到某一区间,减法
缩放处理缩放到某一区间,取对数或除法

               2.1.1

                                 processing.MinMaxScaler将数据缩放到【0,1】  

                                       

                

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
result = scaler.fit_transform(data)

result = scaler.reverse_transform(result)

                 同样可以使用numpy来实现这一过程

import numpy as np

x = np.array([[1,4],[-1,2],[4,2],[5,3]])

x_nor = (x-x.min(axis=0))/(x.max(axis=0)-x.min(axis=0))
x_nor

x_returned = x_nor*(x.max(axis=0)-x.min(axis=0))+x.min(axis=0)
x_returned

                2.1.2

                                preprocessing.StandardScaler 数据的标准化即正态分布

            

from sklearn,preprocessing import StandardScaler

scaler = StandardScaler()
result = scaler.fit_transform(data)

        2.2填补缺失值

                impute.SimpleImputer

         numpy中对缺失值的处理·

data.loc[:,"age"] = data.loc[:,"age"].fillna(data.loc[:,"age"].median())

data.dropna(axis=0,inplace=True)

         2.3处理分类型特征的编码与哑变量

                标签专用:将不同标签转化为数值

                        

from sklearn.preprocessing import LabelEncoder

data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

                 特征专用:

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

                独热编码:

                        preprocessing.OneHotEncoder可以用来处理名义变量,就是各变量之间没有完全的联系。

        

from sklearn.preprocessing import oneHotEncoder

x= data.iloc[:,1:-1]
enc = oneHotEncoder(categories="auto").fit_transform(x).toarray()
#auto自动检索几个特征中的个数,结果为稀疏矩阵转换为数组类型

newdata = pd.concat([data,pd.Dataframe(enc)],axis=1)
newdata.drop(["sex","embarked"],axis=1,inplace=True)

        2.4处理连续性特征的二值化与分段

                        二值化preprocessing.Binarizer

from sklearn.preprocessing import Binarizer

x = data.iloc[:,0].values.reshape(-1,1)    #特征专用,不能使用一维数组
transformer = Binarizer(threshold=30).fit_transform()

                        分箱preprocessing.KBinsDiscretizer

from sklearn.preprocessing import KBinsDiscretizer

X = data.iloc[:,0].values.reshape(-1,1) 
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
#查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())#降维后用set去重

3.特征选择

        1.特征工程        2.Filter过滤法

                2.1方差过滤VarianceThreshold

                

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() #实例化,不填参数默认方差为0
X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
#也可以直接写成 X = VairanceThreshold().fit_transform(X)
X_var0.shape

                方差过滤方法以特征方差的中位数为阈值的情况下KNN和随机森林的比较

                 2.2相关性过滤

                                考虑特征与标签的相关性:卡方过滤、F检验、互信息

                        卡方过滤:

                                                专门针对于离散型标签的相关性过滤,t通过feature_selection.chi2计算特征与标签之际的卡方统计并进行排名,结合feature_selection.SelecKtBest输入k留下k个特征。

from sklearn.feature_selection import SelecKBest
from sklearn.feature_selection import chi2

X_fschi = SelectKBest(chi2,k=300).fit_transform(x_fsvar,y)

通过p值判断相关性

chivalue, pvalues_chi = chi2(X_fsvar,y)
chivalue
pvalues_chi
#k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征:
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()

                         F检验:捕捉特征与标签之间的线性关系

                        feature_selection.f_classif

                        feature_selection.f_regression

                和卡方检验原理相同放回F值和p值,p<0.5即线性相关

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

                        互信息法:用于捕捉特征与标签之间的任意关系,不返回p值或f值而是返回【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)

                3.嵌入法

                        feature_selection.SelectFromModel 

嵌入法使用算法训练和特征选择同时进行,得到特征的权值系数即特征对模型的贡献程度选择特征,但我们无法确定一个准确的临界值去界定超参数来滤去多少特征。

 

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)

        通过学习曲线选取阈值

RFC_.fit(X,y).feature_importances_
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)#(0,x)中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()

                4.包装法:

        包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择,比如 coef_属性或feature_importances_属性来完成特征选择。但不同的是,我们往往使用一个目标函数作为黑盒来帮 助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器,并且通过 coef_属性或通过feature_importances_属性获得每个特征的重要性。然后,从当前的一组特征中修剪最不重要的 特征。在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次 训练解决所有问题,包装法要使用特征子集进行多次训练,因此它所需要的计算成本是最高的

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_  #返回特征被选择最后的布尔矩阵
selector.ranking_    #返回迭代中的综合排名

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283504.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号