字符串操作
type
status
date
slug
summary
tags
category
icon
password
Property
 

字符串对象方法

 
 

正则表达式

notion image
 

pandas的矢量化字符串函数

notion image
不平衡数据
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
做分类算法训练时,如果训练集里的各个类别的样本数量不是大约相同的比例,就需要处理样本不平衡问题。不处理会怎么样呢?如果不处理,那么拟合出来的模型对于训练集中少样本的类别泛化能力会很差。一个二分类问题,如果训练集里A类样本占90%,B类样本占10%。 而测试集里A类样本占50%, B类样本占50%, 如果不考虑类别不平衡问题,训练出来的模型对于类别B的预测准确率会很低,甚至低于50%。
如何解决这个问题呢?
基本上有这几个策略:
  1. 增加数据。很多其它问题也都能用这个方法解决,但成本太高
  1. Oversampling和Undersampling,也有很多变种
  1. 划分训练集
  1. 改变评价指标
    1. 算法层面
       

      权重法

      不平衡分类的k折交叉验证
      type
      status
      date
      slug
      summary
      tags
      category
      icon
      password
      Property
       
      k 折交叉验证不适用于评估不平衡的分类器
      k 折交叉验证把数据被分成k -folds,具有均匀的概率分布。这对于具有平衡类分布的数据可能工作得很好,但是当分布严重偏斜时,很可能一个或多个fold将很少或没有来自少数类的示例。
       
      解决方案是在使用 k 折交叉验证或训练测试拆分时不要随机拆分数据。
      具体来说,我们可以随机拆分数据集,但是在每个子集中保持相同的类分布。这称为分层分层抽样,目标变量 ( y ),即类别,用于控制抽样过程。
      例如可以使用一个版本的 k-fold 交叉验证来保留每个折叠中不平衡的类分布。它被称为分层 k 折交叉验证,它将在数据的每个拆分中强制执行类分布以匹配完整训练数据集中的分布
      我们可以使用支持分层 k 折交叉验证的StratifiedKFold 类对拆分进行分层
      数据转换
      type
      status
      date
      slug
      summary
      tags
      category
      icon
      password
      Property
       
       
      有些特征的默认取值比较特殊,一般需要做了处理后才能用于算法。
      对于时间原始特征,,比如显示20180519,这样的值一般没办法直接使用,处理方法有很多。 第一种是使用连续的时间差值法,即计算出所有样本的时间到某一个未来时间之间的数值差距,这样这个差距是UTC的时间差,从而将时间特征转化为连续值。第二种方法是根据时间所在的年,月,日,星期几,小时数,将一个时间特征转化为若干个离散特征,这种方法在分析具有明显时间趋势的问题比较好用。第三种是权重法,即根据时间的新旧得到一个权重值。比如对于商品,三个月前购买的设置一个较低的权重,最近三天购买的设置一个中等的权重,在三个月内但是三天前的设置一个较大的权重。
      对地理特征,比如“广州市天河区XX街道XX号”,这样的特征应该如何使用呢?处理成离散值和连续值都是可以的。如果是处理成离散值,则需要转化为多个离散特征,比如城市名特征,区县特征,街道特征等。但是如果需要判断用户分布区域,则一般处理成连续值会比较好,这时可以将地址处理成经度和纬度的连续特征。
       

      离散特征的连续化处理

      有很多机器学习算法只能处理连续值特征,不能处理离散值特征,比如线性回归,逻辑回归等。那么想使用逻辑回归,线性回归时需要将离散特征连续化处理。
      最常见的离散特征连续化的处理方法是独热编码one-hot encoding。处理方法其实比较简单,比如某特征的取值是高,中和低,那么可以创建三个取值为0或者1的特征,将高编码为1,0,0这样三个特征,中编码为0,1,0这样三个特征,低编码为0,0,1这样三个特征,之前的一个特征被转化为了三个特征。sklearn的OneHotEncoder可以帮我们做这个处理。
       
      独热编码的好处:
      • 解决了分类器不好处理属性数据的问题,让特征之间的距离计算更加合理
        编码分类数据
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         

        名义变量和有序变量

        数值数据,涉及仅由数字组成的特征,例如整数或浮点值。
        分类数据是包含标签值而不是数值的变量,可能值的数量通常被限制在一个固定的集合中。分类变量通常称为名义变量。
        例如:
        • 一个“ pet ”变量,其值为:“ dog ”和“ cat ”
        • 一个“颜色”变量,其值为:“红色”、“绿色”和“蓝色”
        • 一个“ place ”变量,其值为:“ first ”、“ second ”和“ third ”
        每个值代表一个不同的类别。某些类别可能彼此之间具有自然关系,例如自然排序,上面的“ place ”变量确实有一个自然的值顺序。这种类型的分类变量称为有序变量,因为可以对值进行排序或排序。
        通过将数值变量的范围划分为bin并将值分配给每个bin,可以将数值变量转换为序数变量。例如,一个介于1和 10 之间的数值变量可以划分为具有5个具有序数关系的标签的序数变量:1-2、3-4、5-6、7-8、9-10,这称为离散化。
        • 名义变量(分类):变量包含一组有限的离散值,值之间没有关系
        • 有序变量:变量包括一组有限的离散值,这些值之间具有排序顺序
        离散化变换
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         
         
        数值输入变量可能具有高度偏斜或非标准分布。
        这可能是由数据中的异常值、多模态分布、高指数分布等引起的。
        当数值输入变量具有标准概率分布时,许多机器学习算法更喜欢或表现更好。
        离散化变换提供了一种自动方式来更改数字输入变量以具有不同的数据分布,这反过来又可以用作预测模型的输入。
         
        变量的值被一起分组到离散的 bin 中,并且每个 bin 都被分配一个唯一的整数,以便保留 bin 之间的序数关系。
        bins 的使用通常称为 binning 或k -bins,其中k是指数字变量映射到的组数。
        该映射提供了值的高阶排序,可以平滑观察之间的关系。转换可以应用于训练数据集中的每个数字输入变量,然后作为输入提供给机器学习模型以学习预测建模任务。
         
        可以使用将值分组到 k 个离散箱中的不同方法,常用技术包括:
        标准化
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property

        z-score标准化

        这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。具体的方法是求出样本特征 的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。在sklearn中,可以用StandardScaler来做z-score标准化。当然,如果用pandas做数据预处理,可以自己在数据框里面减去均值,再除以方差做z-score标准化

        max-min标准化

        也称为离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征 的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。在sklearn中,可以用MinMaxScaler来做max-min标准化。
        这种方法的问题就是如果测试集或者预测数据里的特征有小于min,或者大于max的数据,会导致max和min发生变化,需要重新计算。所以实际算法中, 除非对特征的取值区间有需求,否则max-min标准化没有 z-score标准化好用。
         

        L1/L2范数标准化

        如果只是为了统一量纲,那么通过L2范数整体标准化也是可以的,具体方法是求出每个样本特征向量 的L2范数,然后用 代替原样本特征即可。当然L1范数标准化也是可以的,即用 代替原样本特征。通常情况下,范数标准化首选L2范数标准化。在sklearn中,可以用Normalizer来做L1/L2范数标准化
         
        Column Transformer
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         

        Column Transformer

        当所有输入变量都是相同类型时,应用数据转换(如缩放或编码分类变量)很简单。当有一个具有混合类型的数据集并且您希望有选择地将数据转换应用于某些(但不是全部)输入特征时,这可能具有挑战性。
        scikit-learn 提供了ColumnTransformer,它允许您有选择地将数据转换应用于数据集中的不同列。
         
        要使用 ColumnTransformer,必须指定一个转换器列表。
        每个转换器都是一个三元素元组,它定义了转换器的名称、要应用的转换以及要应用它的列索引,例如:
        • (名称、对象、列)
        例如,下面的 ColumnTransformer 将 OneHotEncoder 应用于第0列和第1列。
        下面的示例应用一个 SimpleImputer,对数值列 0 和 1 进行中值插补,并将最频繁插补到分类列 2 和 3 的 SimpleImputer。
        多项式特征变换
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         
        多项式特征是通过将现有特征提升到指数而创建的那些特征。
        例如,如果数据集有一个输入特征 ,那么多项式特征将是添加一个新特征,其值是通过对 X 中的值进行平方来计算的,例如 。可以对数据集中的每个输入变量重复此过程,从而创建每个输入变量的转换版本。因此,多项式特征是一种特征工程,基于现有特征创建新的输入特征。
         
        多项式的“度”用于控制添加的特征数量,例如,3的度数将为每个输入变量添加两个新变量。通常使用较小的度数,例如 2 或 3。
        添加表示特征之间相互作用的新变量也很常见,例如,表示一个变量乘以另一个变量的新列。这也可以对每个输入变量重复,为每对输入变量创建一个新的“交互”变量。
        输入变量的平方或立方版本将改变概率分布,将小值和大值分开,这种分离随着指数的大小而增加。
        这种分离可以帮助一些机器学习算法做出更好的预测,并且在回归预测建模任务和具有数字输入变量的一般任务中很常见。
        通常线性算法,例如线性回归和逻辑回归,对多项式输入变量的使用反应良好。当用作线性回归算法的输入时,该方法更广泛地称为多项式回归。
         
        多项式特征变换可通过PolynomialFeatures 类在 scikit-learn 库中使用。
        创建的功能包括:
        数据泄漏
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         
        数据泄漏是指使用来自训练数据集外部的信息来创建模型。这些额外的信息可以让模型学习或知道一些它原本不会知道的东西,进而使正在构建的模式的估计性能无效。
        例如,如果对整个数据集进行规范化或标准化,然后使用交叉验证来估计模型的性能,那么会导致了数据泄漏。在计算缩放因子(标准化)时,执行的数据在缩放过程中了解了训练集中数据的完整分布。
         
        如果不是完全无效的预测模型,数据泄漏可能会导致创建过于乐观的预测模型。
        这是一个严重的问题,至少有 3 个原因:
        1. 如果正在运行机器学习竞赛,顶级模型将使用泄漏数据,而不是潜在问题的良好通用模型
        1. 如果是一家提供数据的公司逆转匿名化和混淆可能会导致未预料到的隐私泄露
        1. 开发自己的预测模型时,可能正在创建实际上无用且无法在生产中使用的过于乐观的模型
         

        我有数据泄露吗?

        了解是否存在数据泄漏的一种简单方法是:是否实现了看起来好得令人难以置信的性能。就像您可以高精度地预测彩票号码或挑选股票一样。
        爬山测试集
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         
         
        爬山测试集是一种在机器学习竞赛中实现良好或完美预测的方法,无需接触训练集,甚至无需开发预测模型。
        作为机器学习竞赛的一种方法,它理所当然地不受欢迎,并且大多数竞赛平台都会施加限制来防止它。
        然而,爬山测试集是机器学习从业者在参加比赛时不小心做的事情。通过开发一个显式的实现来爬山测试集,它有助于更好地理解过度使用测试数据集来评估建模pipelines是多么容易。
         
        机器学习竞赛,如 Kaggle 上的竞赛,提供了完整的训练数据集以及测试集的输入。
        给定竞赛的目标是预测目标值,例如测试集的标签或数值。解决方案根据隐藏的测试集目标值进行评估并适当评分。在测试集上得分最高的提交赢得了比赛。
        机器学习竞赛的挑战可以被定义为一个优化问题。传统上,竞赛参与者充当优化算法,探索导致不同预测集的不同建模pipelines,对预测进行评分,然后对pipelines进行更改以提高分数。
        这个过程也可以直接使用优化算法进行建模,其中生成和评估候选预测,而无需查看训练集。
        通常,这被称为爬山测试集,因为实现解决这个问题的最简单的优化算法之一是爬山算法。
        尽管在实际的机器学习比赛中爬山测试集是理所当然的,但为了了解该方法的局限性和过度拟合测试集的危险,实施该方法可能是一个有趣的练习。此外,无需接触训练数据集就可以完美预测测试集这一事实常常让许多机器学习初学者感到震惊。
        特征选择
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        Property
         

        特征的来源

        在做数据分析的时候,特征的来源一般有两块:一块是业务已经整理好各种特征数据,需要去找出适合问题需要的特征;另一块是从业务特征中去寻找高级数据特征。
        当业务已经整理好各种特征数据时,此时特征数可能成百上千,哪些才是需要的呢?
        第一步是找到该领域懂业务的专家,让他们给一些建议。假如需要解决一个药品疗效的分类问题,那么先找到领域专家,向他们咨询哪些因素(特征)会对该药品的疗效产生影响,较大影响的和较小影响的都要。这些特征就是我们的特征的第一候选集。
         
        这个特征集合有时候也可能很大,在尝试降维之前,有必要用特征工程的方法去选择出较重要的特征结合,这些方法不会用到领域知识,而仅仅是统计学的方法。
        特征选择方法有很多,一般分为三类:
        • 第一类过滤法比较简单,它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适特征,方差筛选就是过滤法的一种;
        • 第二类是包装法,根据目标函数,通常是预测效果评分,每次选择部分特征,或者排除部分特征;
        • 第三类嵌入法,稍微复杂一点,它先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征,类似于过滤法,但是它是通过机器学习训练来确定特征的优劣,而不是直接从特征的一些统计学指标来确定特征的优劣。