数据预处理和特征工程
一、数据预处理
1.数据采集
2.数据格式化(存储格式等)
3.数据清洗:去掉脏数据
简单直观可以看出的不可能数据
组合或统计属性判定
缺失值处理
1.删除元祖:删除这一条记录或者一列特征,适合记录或者特征占总样本比例很小,或者缺失值非常多。但是会造成数据少很多,有可能造成性能下降
2.数据补齐:这类方法是用一定的值去填充空值,通常基于统计学原理,根据初始数据集中其余对象取值的分布情况来对一个缺失值进行填充
3.不处理:不处理缺失值,直接在包含空值的数据上进行数据挖掘的方法包括贝叶斯网络和人工神经网络等。
具体请看:https://blog.csdn.net/lujiandong1/article/details/52654703
4.数据采样
很多情况下,正负样本不均衡
1.当正负样本量很大时,进行下采样,随机采样和分层抽样
2.当样本量不大时
采集更多样本
过采样
修改损失函数
二、特征工程
1.数值类型
归一化、标准化、正则化:https://www.cnblogs.com/chaosimple/p/4153167.html
统计特征:pandas的mean方法和describe()方法
离散化:将连续数值切割成几块,pandas库里有cut()方法,可以指定对数组arr切成n块,返回的是每个样本属于的那一个区间。cut(arr,n)或者直接指定区间cut(arr,[-5,-1,2,5,10]),返回的result,统计result,pd.value_counts(result).reindex(result.levels)
2.类别类型
2.1.one-hot编码
pandas库的get_dummies(series,prefix='列名前缀')
2.2 Hash处理
3.时间类型
既可以看做连续值,也可以看做离散值
1.连续值,持续时间(单页浏览时长),间隔时间(两次活动的间隔时间)
2.离散值,时间段,星期几,月,季度
python中datetime的strptime函数:datetime.datetime.strptime(x,时间格式,如:"%Y-%m-%d %H:%M:%S"),将字符串转为时间格式类型
时间类型函数可以返回年月日星期:.year,.month,.day,.weekday()
4.文本型
自然语言处理相关
5.组合特征
5.1简单组合特征:拼凑
5.2模型特征组合
GBDT+LR
6.特征选择
原因有:冗余:特征相关性太高,浪费计算性能
噪声:特征对预测结果有负影响
6.1.过滤型(单个)
评估单个特征和结果值之间的相关程度,排序留下top相关的部分特征
评估的准则:pearson相关系数,互信息,距离相关度
缺点是:没有考虑到特征之间的关联作用,可能把有用的关联特征误删掉
相关系数:用scipy.stats.pearsonr(x,y)来计算相关系数,函数返回相关系数和风险值(越小越可信),缺点是只对线性有用,如果是非线性就不适用
互信息:minepy.MINE库
距离相关系数:gist库
sklearn.feature_selection.SelectBest 可以很方便的实现取前k个特征,参数有两个,第一个是评估函数,第二个K=n,评估函数的选择:
回归:
f_regression:相关系数,计算每个变量与目标变量的相关系数,然后计算出F值和P值;
mutual_info_regression:互信息,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。
分类:
chi2:卡方检验;
f_classif:方差分析,计算方差分析(ANOVA)的F值 (组间均方 / 组内均方);
mutual_info_classif:互信息,互信息方法可以捕捉任何一种统计依赖,但是作为非参数方法,需要更多的样本进行准确的估计。
6.2包裹型(子集合)
把特征选择看做一个特征子集搜索问题,筛选各种特征子集,然后用模型评估效果
递归特征删除算法:给特征赋予一个外部模型产生的权重(例如:线性模型系数),RFE递归地使用越来越少的特征来进行特征选择。首先,在原始数据上建立模型并且给每个特征一个权重;然后,淘汰绝对权重最小的特征,递归地执行这个过程直到达到希望的特征数。
RFECV使用交叉验证方法发现最优特征数量。
from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression #递归特征消除法,返回特征选择后的数据 #参数estimator为基模型 #参数n_features_to_select为选择的特征个数 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
6.3嵌入型
根据模型来判断特征的重要性
最常用的方式是用正则化的方法来做特征选择
使用SelectFromModel方法特征选择
SelectFromModel是一种元转换器,可以与那些有coef_ 或者feature_importances_属性的模型一起使用。如果coef_ 或者feature_importances_小于阈值,我们就认为特征是不重要的。除了指定阈值以外,也可以使用启发式的方式。有效的启发式方法包括均值、中位数或者乘以系数,比如 0.1*均值。
基于L1范数的特征选择
使用L1范数的线性模型有一个稀疏解:许多估计系数都为0。当降维的目的是为了使用其他分类器,他们能和feature_selection.SelectFromModel一起使用选择非零系数。特别地,稀疏估计量对于回归中的 linear_model.Lasso、分类中的linear_model.LogisticRegression和svm.LinearSVC都很有用。
from sklearn.svm import LinearSVC from sklearn.datasets import load_iris from sklearn.feature_selection import SelectFromModel iris = load_iris() X, y = iris.data, iris.target X.shape (150,4) lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y) model = SelectFromModel(lsvc, prefit=True) X_new = model.transform(X) X_new.shape (150,3)