Sklearn.preprocessing

特殊的特征处理

如时间20200404

  • 使用连续的时间差值法,即计算出所有样本的时间到某一个未来时间之间的数值差距,从而将时间特征转化为连续值。
  • 根据时间所在的年月日星期小时,将一个时间特征转化为若干个离散特征,在分析具有明显时间趋势的问题比较好用。
  • 权重法,根据时间的新旧得到一个权重值。比如三个月前设置一个较低的权重,最近三天设置一个中等的权重,在三个月内但是三天前的设置一个较大的权重。根据要解决的问题来灵活确定。

离散特征的离散化处理

有很多机器学习算法只能处理连续值特征,不能处理离散值特征,比如线性回归,逻辑回归等。

  • preprocessing.OneHotEncoder
    如某特征的取值是高中低,那么就可以创建三个取值为0或1的特征,将高编码为1,0,0中编码为0,1,0低编码为0,0,1。也就是说,之前的一个特征被转化为了三个特征。

    • 对于定类类型的数据,建议使用one-hot encoding。定类类型就是纯分类,不排序,没有逻辑关系。比如性别分男和女。
  • pandas.get_dummies
    虚拟编码dummy coding。如果特征有N个取值,它只需要N-1个新特征来代替,而独热编码会用N个新特征代替。如一个特征的取值是高中低,那么1,0是中0,1是低0,0是高。

    • 对数值大小敏感的模型必须使用one-hot encoding或者Dummy。典型的例子就是LR和SVM。二者的损失函数对数值大小是敏感的,并且变量间的数值大小是有比较意义的。
  • sklearn.preprocessing.LabelEncoder
    将分类问题的特征输出[“paris”, “paris”, “tokyo”, “amsterdam”]转化为0,1,2…这样的类别标签值。

    • 对于定序类型的数据,建议使用label encoding。定序类型也是分类,但有排序逻辑关系,等级上高于定类。比如,学历分小学,初中,高中,本科,研究生,各个类别之间存在一定的逻辑。
    • 对数值大小不敏感的模型(如树模型)不建议使用one-hot encoding。一般这类模型为树模型。如果分类类别特别多,那么one-hot encoding会分裂出很多特征变量。这时候,如果我们限制了树模型的深度而不能向下分裂的话,一些特征变量可能就因为模型无法继续分裂而被舍弃损失掉了。因此,此种情况下可以考虑使用Label encoding。
  • 特征嵌入embedding
    如:word2vec将词转化为词向量

连续特征的离散化处理

离散化处理将特征变得高维稀疏。

  • 根据阈值进行分组,比如根据连续值特征的分位数,将该特征分为高,中和低三个特征。
  • x_new = one_hot.fit_transform(gbc.apply(X)[:, :, 0])
    使用GDBT来先将连续值转化为离散值。用训练集的所有连续值和标签输出来训练GBDT,最后得到的GBDT模型(n_estimators=2)有两颗决策树,第一颗决策树有三个叶子节点,第二颗决策树有4个叶子节点,如果某一个样本在第一颗决策树会落在第二个叶子节点,在第二颗决策树落在第4颗叶子节点,那么它的编码就是0,1,0,0,0,0,1

缺失值处理

  • Sklearn.impute.SimpleImputer([missing_values])
    首先看该特征是连续值还是离散值。如果是连续值,一是取所有有该特征值样本的平均值来填充缺失值,另一种是取中位数来填充缺失值。如果是离散值,则一般会选择所有有该特征值的样本中最频繁出现的类别值,来填充缺失值。
    missing_values:默认为NaN(缺失值numpy.nan用字符串‘NaN’表示)
    strategy:替换策略,mean, median, most_frequent。默认用均值‘mean’替换

异常特征样本清洗

  • 聚类,比如可以用KMeans聚类将训练样本分成若干个簇,如果某一个簇中样本数很少,而且簇质心和其他所有的簇都很远,那么这个簇里面的样本极有可能是异常特征样本,可以将其从训练集过滤掉。
  • 异常点检测方法,主要是使用iForest (ensemble.IsolationForest)或者one class SVM (svm.OneClassSVM),使用异常点检测的机器学习算法来过滤所有的异常点。

标准化和归一化

  • preprocessing.StandardScaler
    z-score标准化。求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。
  • preprocessing.MinMaxScaler
    离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果希望将数据映射到任意一个区间[a,b],而不是[0,1],用(x-min)(b-a)/(max-min)+a来代替原特征即可。这种方法的问题在于如果测试集或预测数据里的特征有小于min,或者大于max的数据,会导致max和min发生变化,需要重新计算。
  • preprocessing.Normalizer
    L1/L2范数标准化。求出每个样本特征向量 𝑥⃗ 的L2范数||𝑥⃗|| 2 _2 2,然后用𝑥⃗ / ||𝑥⃗ || 2 _2 2代替原样本特征即可。当然L1范数标准化是用𝑥⃗ / ||𝑥⃗|| 1 _1 1代替原样本特征。通常情况下,范数标准化首选L2范数标准化。

处理不平衡数据

做分类算法训练时,如果训练集里的各个类别的样本数量不是大约相同的比例,就需要处理样本不平衡问题。

  • 权重法,可以对训练集中的每个类别加一个权重class weight。如果该类别的样本数多,那么它的权重就低,反之则权重就高。如果更细致点,还可以对每个样本加权重sample weight,即样本数多的类别样本权重低,反之样本权重高。
  • 采样法常用有两种思路,一种是对类别样本数多的样本做子采样, 比如训练集里A类别样本占90%,B类别样本占10%。那么对A类样本子采样,直到子采样得到的A类样本数和B类现有样本数一致。第二种思路是对类别样本数少的样本做过采样, 直到过采样得到的B类别样本数加上原来样本和A类样本数一致,最后再去拟合模型。
  • imblearn.combine.SMOTEENN
    采样后改变了训练集的分布,可能导致泛化能力差。SMOTE算法通过人工合成的方法来生成少类别的样本,对于某一个缺少样本的类别,它会随机找出几个该类别的样本,再找出最靠近这些样本的若干个该类别样本,组成一个候选合成集合,然后在这个集合中不停的选择距离较近的两个样本,在这两个样本之间,比如中点,构造一个新的该类别样本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值