一. 概述
二. 数据预处理
2.1 数据无量纲化
将不同规格的数据转换到同一规格;
以梯度和矩阵为核心的算法中,如逻辑回归,SVM,神经网络等
无量纲化可以加快求解速度
在距离类模型:
KNN,K-Means中,无量纲化可以帮我们提升模型精度
决策树和随机森林不需要无量纲化,决策树可以把任何数据处理得很好
处理方法:中心化和缩放处理
中心化:所有记录减去一个固定值
缩放处理:除以一个固定值,把数据固定在某个范围之中
2.1.1 数据归一化(MinMaxScaler)
preprocessing.MinMaxScaler
数据x按照最小值中心化,再按照极差(Max-Min)缩放。
数据移动了最小值个单位,然后收敛到[0,1]之间
这个过程叫:**数据归一化**(Normalization)
feature_range:希望数据压缩的范围
scaler = MinMaxScaler()
scaler.fit(data) #本质是生成mix(x),max(x)
res = scaler.transform(data) #通过接口导出结果
res
res_ = scaler.fit_transform(data) #一步到位输出结果
res_
scaler.inverse_transform(res) #归一化好的结果还原
scaler = MinMaxScaler(feature_range=[5,10])
scaler.fit_transform(data)
scaler = scaler.partial_fit(data)#当特征非常多的时候使用
scaler
#numpy实现
import numpy as np
X = np.array(data)
x_nor = (X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
2.1.2 数据标准化(StandardScaler)
数据按均值中心化后,再按照标准差缩放;
数据会服从均值为0,方差为1的正态分布
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() #实例化
scaler.fit(data) #本质是生成均值和方差
scaler.mean_
scaler.var_
x_std = scaler.transform(data)
x_std.mean()
x_std.var()
scaler.fit_transform(data)
scaler.inverse_transform(data)
对于StandardScaler和MinMaxScaler来说,空值Nan会被当做缺失值;
fit时候忽略,transform时保持Nan缺失状态
2.1.3 MinMaxScaler和StandardScaler的选择
大部分会选择标准化(PCA,聚类,逻辑回归,SVM,神经网络)
不涉及距离度量,梯度,协方差计算,数据要压缩到特定区间用MinMaxScaler(数字图像处理量化像素强度)
建议先用标准化,再用均一化
2.2 缺失值
from sklearn.impute import SimpleImputer
#专门用来填缺失值
SimpleImputer(missing_values=0 #缺失值类型
,strategy='mean' #填补缺失值的策略
# (median中值 most_frequent众数 constant b表示参考fill_value)
,fill_value=0 #与strategy='constant'配合
,copy=True #将创造特征矩阵的副本,反之将缺失值填补到原本的特征矩阵中
)
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化
imp_median = SimpleImputer(strategy='median')
imp_0 = SimpleImputer(strategy='constant'
,fill_value=0)
imp_mean_data = imp_mean.fit_transform(Age)
imp_mean_data
用pandas增补数据会更简单
data.loc[:,'Age'] = data.loc[:,'Age'].fillna(data.loc[:,'Age'].median())
data.dropna(axis=0,inplace=True)
data.info()
2.3 处理分类型特征:编码与哑变量
将文字型数据转换为数值型
preprocessing.LabelEncoder:
#标签专用,能够将分类转换为分类数值
#允许一维
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1]
le = LabelEncoder()
label = le.fit_transform(y)
le.classes_ #查看标签中究竟有多少类别
le.inverse_transform(label)#可以逆转
preprocessing.OrdinalEncoder
#特征专用,可以将分类特征转换为分类数值
OrdinalEncoder.fit(data[:,1:-1]).categories_
对应classes_ 每个特征有哪些类别
preprocessing.OneHotEncoder #哑变量
#独热编码,创建哑变量
数据取值:(名义变量(没有联系),有序变量(有大小不能计算),有距变量)
名义变量 使用哑变量进行处理
s-->[1,0,0] q-->[0,1,0] c-->[0,0,1](独热编码)
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
result.shape #5列
enc.inverse_transform(result) #还原
enc.get_feature_names()
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.drop(['Sex','Embarked'],axis=1,inplace=True)
newdata.columns = [
'Age','Survived','Female','Male'
,'Embarked_C','Embarked_Q','Embarked_S'
]
2.4 处理连续型特征:二值化与分段
#根据阈值将数据二值化,大于为1,小于等于为0
preprocessing.Binarizer
data2 = data.copy()
from sklearn.preprocessing import Binarizer
X = data2.iloc[:,0].values.reshape(-1,1)#不能用一维向量
bina = Binarizer(threshold=30)
transformer = bina.transform(X)
transformer
#连续型变量划分为分类变量的类
preprocessing.KBinsDiscretizer
#n_bins:每个特征分成几个类
#encode:编码方式 onehot:一列是特征中的一个类别
#encode:ordinal:每个特征的每个箱都被编码成一个整数
#encode:onehot-dense:哑变量,返回一个密集数组
#strategy:定义箱宽 quantile(等位分箱) 默认 uniform 等宽分箱 kmeans(聚类分箱)
三. 特征选择
3.1 分类
3.1.1 特征提取
非结构化特征中提取新信息
3.1.2 特征创造
现有特征进行组合计算
3.1.3 特征选择
选择有意义的特征
3.2 Filter过滤法
根据各种统计检验中的分数以及相关性的各项指标选择特征
全部特征–最佳特征子集–算法–模型评估
3.2.1 方差过滤
VarianceThreshold
#要优先消除方差为0的特征
#threshold:舍弃方差小于threshold的特征,默认为0
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold()
x_var0 = selector.fit_transform(X)
#中位数筛选掉一般特征
x_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)
x_fsvar
方差过滤对于需要遍历特征的算法(KNN,单决策树,SVM,神经网络,回归等)提升的效率比较大;
但对于随机森林(随机选取特征进行分支)效果提升不大;
随机森林中的每棵树都比单独的一颗决策树简单很多;
3.2.2 相关性过滤
卡方过滤
专门针对离散型标签(分类问题)
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#%%
X_fschi = SelectKBest(chi2,k=300).fit_transform(x_fsvar,y)
X_fschi.shape
选取超参数k
学习曲线+相关性过滤
卡方检验本质是推测两组数据之间的差异,检验的原假设是 两组数据是相互独立的
chi_value,p = chi2(x_fsvar,y) #返回卡方值和p值
k = chi_value.shape[0]-(p>0.05).sum() #p值<0.05相关性显著
3.2.3 F检验
方差齐性检验
可以回归可以分类
适合正态分布的数据
同卡方检验,可以直接输出统计量判断到底设置什么k
p<0.05/0.01 特征与标签显著线性相关
p>0.05/0.01 特征与标签不存在显著的线性关系
from sklearn.feature_selection import f_classif
F,p = f_classif(x_fsvar,y)
k = F.shape[0]-(p>0.05).sum()
3.2.4 互信息法
互信息法用于捕捉每个特征与标签之间的任意关系(线性与非线性)过滤;
可以分类可以回归
比F检验更加强大
返回的是 每个特征与目标之间的互信息量的统计[0,1]
0:两个变量独立 1:两个变量完全相关
3.2.5 总结
建议先方差过滤,然后互信息捕捉相关性
3.3 Embeddedd嵌入法
让算法自己决定使用哪些特征,特征选择与算法训练同时进行,得到各特征的权值系数;
更加精确到模型效用本身,属于过滤法的进化版;
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators=10
,random_state=22)
x_embeded = SelectFromModel(RFC_,threshold=0.02).fit_transform(X,y)
3.4 Wrapper包装法
特征选择与算法训练同时进行
算法完成最佳特征选择,每次选择舍弃一部分,再迭代训练;
使用的是专门的数据挖掘算法
from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators=10
,random_state=22)
select = RFE(RFC_
,n_features_to_select=340,
step=50).fit(X,y)
#n_features_to_select:想要的特征个数
#step:每次迭代希望移除的特征个数
#.ranking_:返回特征的按数次迭代中综合重要性的排名
#support_返回所有特征是否被选中的布尔矩阵
select.support_.sum()
x_wrapper = select.transform(X)