您的位置:飞艇全天精准计划 > 全天飞艇计划 > python数据预处理,硅谷AI技术文章

python数据预处理,硅谷AI技术文章

发布时间:2019-12-27 23:55编辑:全天飞艇计划浏览(183)

    原标题:​硅谷AI技术文章:Google 机器学习40条最佳实践(中)

    • Dataset transformations| 数据转换

    硅谷AI技术文章:Google 机器学习40条最佳实践(上)

    • Combining estimators|组合学习器
    • Feature extration|特征提取
    • Preprocessing data|数据预处理

    机器学习第二阶段:feature 工程


    上一篇内容主要是说机器学习的第一阶段,主要涉及的内容是将训练数据导入学习系统、测量任何感兴趣的 metric,以及构建应用基础架构。当你构建了一个可以稳定运行的系统,并且进行了系统测试和单元测试后,就可以进入第二阶段了。第二阶段的很多objective 都很容易实现,并且有很多明显的 feature 可以导入系统。因此在第二阶段,你应该多次发布系统,并且安排多名工程师,以便创建出色的学习系统所需要的数据。

    <p id='1'>1 Dataset transformations</p>


    scikit-learn provides a library of transformers, which may clean (see Preprocessing data), reduce (see Unsupervised dimensionality reduction), expand (see Kernel Approximation) or generate (see Feature extraction) feature representations.

    scikit-learn 提供了数据转换的模块,包括数据清理、降维、扩展和特征提取。

    Like other estimators, these are represented by classes with fit method, which learns model parameters (e.g. mean and standard deviation for normalization) from a training set, and a transform method which applies this transformation model to unseen data. fit_transform may be more convenient and efficient for modelling and transforming the training data simultaneously.

    scikit-learn模块有3种通用的方法:fit(X,y=None)、transform(X)、fit_transform(X)、inverse_transform(newX)。fit用来训练模型;transform在训练后用来降维;fit_transform先用训练模型,然后返回降维后的X;inverse_transform用来将降维后的数据转换成原始数据

    第16条规则:计划发布和迭代。

    <p id='1.1'>1.1 combining estimators</p>

    • ### <p id='1.1.1'>1.1.1 Pipeline:chaining estimators</p>

    Pipeline 模块是用来组合一系列估计器的。对固定的一系列操作非常便利,如:同时结合特征选择、数据标准化、分类。

    • Usage|使用
      代码:
    from sklearn.pipeline import Pipeline  
    from sklearn.svm import SVC 
    from sklearn.decomposition import PCA
    from sklearn.pipeline import make_pipeline
    #define estimators
    #the arg is a list of (key,value) pairs,where the key is a string you want to give this step and value is an estimators object
    estimators=[('reduce_dim',PCA()),('svm',SVC())]  
    #combine estimators
    clf1=Pipeline(estimators)
    clf2=make_pipeline(PCA(),SVC())  #use func make_pipeline() can do the same thing
    print(clf1,'n',clf2) 
    

    输出:

    Pipeline(steps=[('reduce_dim', PCA(copy=True, n_components=None, whiten=False)), ('svm',           SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False))]) 
     Pipeline(steps=[('pca', PCA(copy=True, n_components=None, whiten=False)), ('svc', SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False))])
    

    可以通过set_params()方法设置学习器的属性,参数形式为<estimator>_<parameter>

    clf.set_params(svm__C=10)
    

    上面的方法在网格搜索时很重要

    from sklearn.grid_search import GridSearchCV
    params = dict(reduce_dim__n_components=[2, 5, 10],svm__C=[0.1, 10, 100])
    grid_search = GridSearchCV(clf, param_grid=params)
    

    上面的例子相当于把pipeline生成的学习器作为一个普通的学习器,参数形式为<estimator>_<parameter>。

    • Note|说明
      1.可以使用dir()函数查看clf的所有属性和方法。例如step属性就是每个操作步骤的属性。
    ('reduce_dim', PCA(copy=True, n_components=None, whiten=False))
    

    2.调用pipeline生成的学习器的fit方法相当于依次调用其包含的所有学习器的方法,transform输入然后把结果扔向下一步骤。pipeline生成的学习器有着它包含的学习器的所有方法。如果最后一个学习器是分类,那么生成的学习器就是分类,如果最后一个是transform,那么生成的学习器就是transform,依次类推。

    • ### <p id='1.1.2'> 1.1.2 FeatureUnion: composite feature spaces</p>

    与pipeline不同的是FeatureUnion只组合transformer,它们也可以结合成更复杂的模型。

    FeatureUnion combines several transformer objects into a new transformer that combines their output. AFeatureUnion takes a list of transformer objects. During fitting, each of these is fit to the data independently. For transforming data, the transformers are applied in parallel, and the sample vectors they output are concatenated end-to-end into larger vectors.

    • Usage|使用
      代码:
    from sklearn.pipeline import FeatureUnion   
    from sklearn.decomposition import PCA
    from sklearn.decomposition import KernelPCA
    from sklearn.pipeline import make_union
    #define transformers
    #the arg is a list of (key,value) pairs,where the key is a string you want to give this step and value is an transformer object
    estimators=[('linear_pca)',PCA()),('Kernel_pca',KernelPCA())]  
    #combine transformers
    clf1=FeatureUnion(estimators)
    clf2=make_union(PCA(),KernelPCA())
    print(clf1,'n',clf2) 
    print(dir(clf1))
    

    输出:

    FeatureUnion(n_jobs=1,
           transformer_list=[('linear_pca)', PCA(copy=True, n_components=None, whiten=False)), ('Kernel_pca', KernelPCA(alpha=1.0, coef0=1, degree=3, eigen_solver='auto',
         fit_inverse_transform=False, gamma=None, kernel='linear',
         kernel_params=None, max_iter=None, n_components=None,
         remove_zero_eig=False, tol=0))],
           transformer_weights=None) 
     FeatureUnion(n_jobs=1,
           transformer_list=[('pca', PCA(copy=True, n_components=None, whiten=False)), ('kernelpca', KernelPCA(alpha=1.0, coef0=1, degree=3, eigen_solver='auto',
         fit_inverse_transform=False, gamma=None, kernel='linear',
         kernel_params=None, max_iter=None, n_components=None,
         remove_zero_eig=False, tol=0))],
           transformer_weights=None)
    

    可以看出FeatureUnion的用法与pipeline一致

    • Note|说明

    (A [FeatureUnion
    ](http://scikit- learn.org/stable/modules/generated/sklearn.pipeline.FeatureUnion.html#sklearn.pipeline.FeatureUn ion) has no way of checking whether two transformers might produce identical features. It only produces a union when the feature sets are disjoint, and making sure they are is the caller’s responsibility.)

    Here is a example python source code:[feature_stacker.py](http://scikit-learn.org/stable/_downloads/feature_stacker.py)
    

    你现在正在构建的 model肯定不会是最后一个 model,所以 model一定要简单可行,否则会降低未来版本的发布速度。很多团队每个季度都会发布一个或几个 model,基本原因是:

    <p id='1.2'>1.2 Feature extraction</p>

    The sklearn.feature_extraction module can be used to extract features in a format supported by machine learning algorithms from datasets consisting of formats such as text and image.

    skilearn.feature_extraction模块是用机器学习算法所支持的数据格式来提取数据,如将text和image信息转换成dataset。
    Note:
    Feature extraction(特征提取)与Feature selection(特征选择)不同,前者是用来将非数值的数据转换成数值的数据,后者是用机器学习的方法对特征进行学习(如PCA降维)。

    • ### <p id='1.2.1'>1.2.1 Loading features from dicts</p>

    The class DictVectorizer can be used to convert feature arrays represented as lists of standard Python dict
    objects to the NumPy/SciPy representation used by scikit-learn estimators.
    Dictvectorizer类用来将python内置的dict类型转换成数值型的array。dict类型的好处是在存储稀疏数据时不用存储无用的值。

    代码:

    measurements=[{'city': 'Dubai', 'temperature': 33.}
    ,{'city': 'London', 'temperature':12.}
    ,{'city':'San Fransisco','temperature':18.},]
    from sklearn.feature_extraction import DictVectorizer
    vec=DictVectorizer()
    x=vec.fit_transform(measurements).toarray()
    print(x)
    print(vec.get_feature_names())```
    输出:
    

    [[ 1. 0. 0. 33.]
    [ 0. 1. 0. 12.]
    [ 0. 0. 1. 18.]]
    ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']
    [Finished in 0.8s]

    * ###<p id='1.2.2'>1.2.2 Feature hashing</p>
    * ###<p id='1.2.3'>1.2.3 Text feature extraction</p>
    * ###<p id='1.2.4'>1.2.4 Image feature extraction</p>
    以上三小节暂未考虑(设计到语言处理及图像处理)[见官方文档][官方文档]
    [官方文档]: http://scikit-learn.org/stable/data_transforms.html
    
    ##<p id='1.3'>1.3 Preprogressing data</p>
    >The sklearn.preprocessing
     package provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators
    
    sklearn.preprogressing模块提供了几种常见的数据转换,如标准化、归一化等。
    * ###<p id='1.3.1'>1.3.1 Standardization, or mean removal and variance scaling</p>
    >**Standardization** of datasets is a **common requirement for many machine learning estimators** implemented in the scikit; they might behave badly if the individual features do not more or less look like standard normally distributed data: Gaussian with **zero mean and unit variance**.
    
     很多学习算法都要求事先对数据进行标准化,如果不是像标准正太分布一样0均值1方差就可能会有很差的表现。
    
     * Usage|用法
    
     代码:
    ```python
    from sklearn import preprocessing
    import numpy as np
    X = np.array([[1.,-1., 2.], [2.,0.,0.], [0.,1.,-1.]])
    Y=X
    Y_scaled = preprocessing.scale(Y)
    y_mean=Y_scaled.mean(axis=0) #If 0, independently standardize each feature, otherwise (if 1) standardize each sample|axis=0 时求每个特征的均值,axis=1时求每个样本的均值
    y_std=Y_scaled.std(axis=0)
    print(Y_scaled)
    scaler= preprocessing.StandardScaler().fit(Y)#用StandardScaler类也能完成同样的功能
    print(scaler.transform(Y))
    

    输出:

    [[ 0.         -1.22474487  1.33630621]
     [ 1.22474487  0.         -0.26726124]
     [-1.22474487  1.22474487 -1.06904497]]
    [[ 0.         -1.22474487  1.33630621]
     [ 1.22474487  0.         -0.26726124]
     [-1.22474487  1.22474487 -1.06904497]]
    [Finished in 1.4s]
    
    • Note|说明
      1.func scale
      2.class StandardScaler
      3.StandardScaler 是一种Transformer方法,可以让pipeline来使用。
      MinMaxScaler (min-max标准化[0,1])类和MaxAbsScaler([-1,1])类是另外两个标准化的方式,用法和StandardScaler类似。
      4.处理稀疏数据时用MinMax和MaxAbs很合适
      5.鲁棒的数据标准化方法(适用于离群点很多的数据处理):

    the median and the interquartile range often give better results

    用中位数代替均值(使均值为0),用上四分位数-下四分位数代替方差(IQR为1?)。

    • ### <p id='1.3.2'>1.3.2 Impution of missing values|缺失值的处理</p>

    • Usage
      代码:

    import scipy.sparse as sp
    from sklearn.preprocessing import Imputer
    X=sp.csc_matrix([[1,2],[0,3],[7,6]])
    imp=preprocessing.Imputer(missing_value=0,strategy='mean',axis=0)
    imp.fit(X)
    X_test=sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
    print(X_test)
    print(imp.transform(X_test))
    

    输出:

      (1, 0)    6
      (2, 0)    7
      (0, 1)    2
      (2, 1)    6
    [[ 4.          2.        ]
     [ 6.          3.66666675]
     [ 7.          6.        ]]
    [Finished in 0.6s]
    
    • Note
      1.scipy.sparse是用来存储稀疏矩阵的
      2.Imputer可以用来处理scipy.sparse稀疏矩阵

    • ### <p id='1.3.3'>1.3.3 Generating polynomial features</p>

    • Usage
      代码:

    import numpy as np
    from sklearn.preprocessing import PolynomialFeatures
    X=np.arange(6).reshape(3,2)
    print(X)
    poly=PolynomialFeatures(2)
    print(poly.fit_transform(X))
    

    输出:

    [[0 1]
     [2 3]
     [4 5]]
    [[  1.   0.   1.   0.   0.   1.]
     [  1.   2.   3.   4.   6.   9.]
     [  1.   4.   5.  16.  20.  25.]]
    [Finished in 0.8s]
    
    • Note
      生成多项式特征用在多项式回归中以及多项式核方法中 。

    • ### <p id='1.3.4'>1.3.4 Custom transformers</p>

    这是用来构造transform方法的函数

    • Usage:
      代码:
    import numpy as np
    from sklearn.preprocessing import FunctionTransformer
    transformer = FunctionTransformer(np.log1p)
    x=np.array([[0,1],[2,3]])
    print(transformer.transform(x))
    

    输出:

    [[ 0.          0.69314718]
     [ 1.09861229  1.38629436]]
    [Finished in 0.8s]
    
    • Note

    For a full code example that demonstrates using a FunctionTransformer to do custom feature selection, see Using FunctionTransformer to select columns

    • 要添加新的 feature。
    • 要调整正则化并以新的方式组合旧的 feature。
    • 要调整 objective。

    在构建model 时,需要考虑以下几点:添加、删除或重组 feature 的难易程度;创建 pipeline 的全新副本以及验证其正确性的难易程度;是否可以同时运行两个或三个副本。

    第17条规则:放弃从经过学习的 feature 入手,改从可以直接观察和报告的 feature 入手。

    这一点可能存在争议,但确实避免许多问题。经过学习的feature 是由外部系统或学习器本身生成的 feature,这两种方式生成的feature都非常有用,但可能会导致很多问题,因此不建议在第一个 model 中使用。外部系统的objective可能与你当前的objective之间关联性非常小。如果你获取外部系统的某个瞬间状态,它可能会过期;如果你从外部系统更新 feature,feature 的含义就可能会发生变化。因此采用外部系统生成的feature 需要非常小心。因子model和深度model 的主要问题是它们属于非凸model,无法保证能够模拟或找到最优解决方案,并且每次迭代时找到的局部最小值都可能不同,而这种变化会导致无法对系统发生的变化做出准确的判断。而通过创建没有深度feature的 model,反而可以获得出色的基准效果。达到此基准效果后,你就可以尝试更深奥的方法。

    第18条规则:探索可概括所有内容的 feature。

    机器学习系统通常只是大系统中的一小部分。例如,想象热门信息中可能会使用的帖子,在它们显示为热门信息之前,很多用户已经对其转发或评论了。如果你将这些信息提供给学习器,它就会通过观看次数、连看次数或用户评分来对新帖子进行推广。最后,如果你将一个用户操作当作label,在其他地方看到用户对文档执行该操作就是很好的feature,你就可以借助这些feature引入新内容。但是要记住,一定要先弄清楚是否有人喜欢这些内容,然后再研究喜欢程度。

    第19条规则:尽可能使用非常具体的 feature。

    对于海量数据来说,相比学习几个复杂的feature,学习数百万个简单的feature会更简单一些。因此最好使用feature组,其中每个feature都适用于一小部分数据但总体覆盖率在 90% 以上。你可以使用正则化来消除适用example 过少的feature。

    第20条规则:组合并修改已有的 feature,以便用简单易懂的方式创建新 feature。

    组合并修改feature的方法有很多种,你可以借助机器学习系统通过转换对数据进行预处理。最标准的两种方法是"离散化"和"组合"。"离散化"是指提取一个连续feature,并从中创建许多离散feature。"组合"是指组合两个或更多feature column。但是你需要拥有大量数据,才能使用具有三个、四个或更多基准featurecolumn的组合学习model。生成非常大的featurecolumn 组合可能会过拟合。这时你就可以使用"组合"的方法将feature column组合起来,但最终会得到很多feature(请参阅第 21 条规则)。

    处理文本时,有两种备用方法:点积和交集。点积方法采用最简单的形式时,仅会计算查询和文档间共有字词的数量,然后将此feature 离散化。如果使用交集方法,只有文档和查询中都包含某一个词时,才会出现一个feature。

    第21条规则:你在线性 model 中学习的 feature 权重数与你拥有的数据应该大致成正比。

    在model 的合适复杂度方面有很多出色的统计学习理论成果,但这条规则是基本规则。曾经有人有过这样的疑虑:从一千个example中是否能够学到东西,或者是否需要超过一百万个example才会有比较好的效果。之所以会有这样的疑虑,是因为他们局限在了一种特定的学习方式中。问题的关键在于你应该根据数据规模来调整学习model:

    1.如果你正在构建搜索排名系统,文档和查询中有数百万个不同的字词,而且你有1000 个 label example,那么你应该在文档和查询feature、TF-IDF 和多个其他高度手动工程化的feature之间得出点积。这样你就会有1000 个 example,十多个feature。

    2.如果你有一百万个example,那么就使用正则化和feature 选择使文档 feature column 和查询feature column 相交。这样你就会获得数百万个feature;但如果使用正则化,那么你获得的feature 就会有所减少。这种情况下你会有千万个example,可能会产生十万个feature。

    3.如果你有数十亿或数千亿个example,你可以使用feature 选择和正则化,通过文档和查询标记组合feature column。这样你就会有十亿个example,一千万个feature。统计学习理论很少设定严格的限制,但能够提供很好的起点引导。

    最后,请根据第 28 条规则决定要使用哪些 feature。

    第22条规则:清理不再使用的 feature。

    没有使用的feature会产生技术负债。如果你发现自己没有使用某个feature,并且它和其他feature组合也起不到任何作用,那么就将其从你的基础架构中删除吧。你需要让自己的基础架构保持简洁,这样可以用最快的速度尝试最有可能带来好效果的feature。如果有必要,其他人也可以随时将这个feature添加回来。在决定要添加或保留哪些feature 时还必须要考虑到覆盖率。另外,有些feature也可能会超出其权重。例如,如果你的某个feature只覆盖 1% 的数据,但90% 具有该feature的example都是正分类 example,那么这是一个可以添加的好feature。

    系统的人工分析**

    在讨论机器学习的第三阶段之前,了解如何检查现有model并加以改善这点非常重要。这更像是一门艺术而非科学,但是有几个需要避免的反模式。

    第23条规则:你不是典型的最终用户。

    虽然fishfood(在团队内部使用的原型)和 dogfood(在公司内部使用的原型)有许多优点,但我们还是应该确定其是否符合性能要求。在即将投入生产时,我们需要对看起来表合理的更改进行进一步测试,具体方法有两种:1.请非专业人员在众包平台上回答有偿问题,2.对真实用户进行在线实验。原因是:首先,你与代码密切相关。这样你关注的可能只是帖子的某个特定方面,或者你只是投入了太多感情。其次,你的时间很宝贵。如果你确实想要获得用户反馈,请使用用户体验方法。在早期阶段创建用户角色,然后进行可用性测试,在可用性测试中请真实用户体验你的网站并观察他们的反应也可以让你从全新的视角重新审视问题。

    第24条规则:衡量 model 之间的差异。

    先衡量 model 间的差异,再向用户展示新 model。例如,如果你有一项排名任务,那么你应该在整个系统中针对示例查询运行这两个 model,然后看看结果的对称差分有多大(按排名位置加权)。如果差分非常小,那么你无需运行实验就可以判断不会出现很大变化。如果差分很大,那么你就需要确保这种更改可以带来好的结果。查看对称差分较大的查询有助于你了解更改的性质。但是必须确保你的系统是稳定的。要确保 model与自身之间的对称差分较低(理想状态是没有对称差分)。

    第25条规则:选择 model 时,实用效果比预测能力更重要。

    你的 model 可能会尝试预测点击率,但是你要这种预测有什么用呢。如果你使用该预测对文档进行排名,那么最终排名的质量肯定比预测本身更重要。如果你想要预测一个文档是垃圾内容的概率,然后确定要阻断的内容,那么允许内容的精确率更为重要。大多数情况下,这两项应该是一致的,当它们不一致时,带来的优势可能会非常小。因此,如果某种更改可以改善对数损失,但会降低系统的性能,那么你最好去查找其他 feature。而当这种情况开始频繁发生时,你就应该重新审视 model 的 objective 了。

    第26条规则:在衡量的错误中寻找规律,并且创建新的 feature。

    假设你看到 model "弄错"了一个训练 example。在分类任务中,这种错误可能是假正例或者假负例。在排名任务中,这种错误也可能是假正例或假负例,其中正例的排名比负例的排名低。最重要的是,机器学习系统知道自己弄错了该 example,如果有机会,它会修复该错误。如果你向该model提供一个允许其修正错误的 feature,该model会尝试使用它。另一方面,如果你尝试根据系统不会视为错误的 example 创建一个 feature,该 feature 将会被系统忽略。如果model弄错了你的某些 example,请在当前 feature集之外寻找规律。这是实现 objective 最简单的方式。

    第27条规则:尝试量化观察到的异常行为。

    当现有的损失函数没有捕获部分成员不喜欢的某些系统属性时,他们会开始有挫败感。此时,他们应该竭尽所能将问题量化。如果你的问题是可衡量的,那么你就可以开始将它们用作 feature、objective 或 metric。一般规则是"先量化,再优化"。

    第28条规则:请牢记,短期行为相同并不意味着长期行为也相同。

    假设你的新系统会查看每个 doc_id 和 exact_query,然后计算每次查询的每个文档的点击概率。你发现在并排分析和 A/B 测试中,其行为与你当前系统的行为几乎完全相同,于是你发布了它。但是你的系统仅会根据自己的查询历史记录显示文档,所以系统不会显示任何新的应用。了解这种系统长期行为的唯一方法是仅使用 model 在线时获得的数据对其进行训练。这一点非常难

    训练-应用偏差**

    训练-应用偏差是指训练效果与应用效果之间的差异。出现这种偏差的原因可能是:

    • 训练 pipeline 和应用 pipeline 中数据的处理方式不同。
    • 训练时和应用时所用的数据有变化。
    • model 和算法之间有反馈环。

    Google 的生产机器学习系统也存在训练-应用偏差,这种偏差对性能产生了负面影响。而最好的解决方案就是明确进行监控,以避免在系统和数据改变时引入容易被忽视的偏差。

    第29条规则:确保训练效果和应用效果一样的最佳方法是保存应用时使用的 feature 集,然后将这些 feature 通过 pipeline 传输到日志,以便在训练时使用。

    即使无法对每个 example 都这样做,至少也要对一小部分这样做,这样的话可以验证应用和训练之间的一致性(请参阅第 37 条规则)。这种做法有时候会带来令人惊讶的结果。目前许多团队都已经在基础设施上采用了这种方法。

    第30条规则:按重要性对采样数据加权,不要随意丢弃它们!

    数据过多时,人们总是会采用前面的文件而忽略后面的文件,这种做法并不正确。尽管可以丢弃从未向用户展示过的数据,但对于其他数据来说,按重要性加权是最佳选择。这样做意味着,如果你决定以 30% 的概率对example X 进行抽样,那么向其赋予 10/3 的权重。按重要性加权时,你仍然可以使用第 14 条规则中讨论的所有校准属性。

    第31条规则:请注意,如果你在训练和应用期间关联表格中的数据,表格中的数据可能会变化。

    假设你将文档 ID 与包含这些文档 feature 的表格相关联,表格中的feature在训练时和应用时就可能会有所不同。那么,你的 model 在训练时和应用时对同一文档的预测就可能不同。要避免这类问题最简单的方法是在应用时记录 feature(请参阅第 32 条规则)。如果表格变化的速度很慢,那么你还可以每小时或每天创建表格快照,以获得非常接近的数据。但是这仍然不能完全解决问题。

    第32条规则:尽可能在训练 pipeline 和应用 pipeline 间重复使用代码。

    批处理和在线处理不同。进行在线处理时,你必须在每个请求到达时对其进行处理,而进行批处理时,你可以组合任务。应用时,你进行的是在线处理,而训练时,你进行的是批处理。不过,你可以通过一些方法来重复使用代码。这样就可以消除训练-应用偏差的一个根源。因此在训练和应用时,尽量不要使用两种不同的编程语言。如果这样做,就几乎不可能共享代码了。

    第33条规则:如果你根据 1 月 5 日之前的数据生成 model,那么就根据 1 月 6 日及以后的数据测试 model。

    一般来说,要衡量model的效果,使用的数据应来自训练 model 所有数据对应日期之后的日期,因为这样能更好地反映系统应用到生产时的行为。比如,如果你根据 1 月 5 日之前的数据生成 model,那么就根据 1 月 6 日及之后的数据测试 model。你会发现,使用新数据时model的效果不如原来好,但也不会太糟。由于可能存在的一些日常影响,你可能没有预测到平均点击率或转化率,但曲线下面积应该非常接近。

    第34条规则:在有关过滤的二元分类中,在短期内稍微牺牲一下效果,就可以获得非常纯净的数据。

    在过滤任务中,标记为负分类的 example 不会向用户显示。假设你的过滤器在应用时可屏蔽 75% 的负分类 example,你可能希望从向用户显示的 Instance 中提取额外的训练数据。但这种方法会引入采样偏差。如果你改为在应用期间将所有流量的 1% 标记为"预留",并向用户发送所有预留 example,那么你就可以收集更纯净的数据。现在,过滤器屏蔽了至少 74% 的负分类 example,这些预留 example 可以成为训练数据。请注意,如果过滤器屏蔽了 95% 或以上的负分类 example,那么这种方法的可行性会降低。即便如此,如果你希望衡量应用效果,可以进行更低比例的采样(比如 0.1% 或 0.001%),一万个 example 足以非常准确地评估效果。

    第35条规则:注意排名问题中存在的固有偏差。

    当你彻底改变排名算法,导致出现不同的排名结果时,实际上是改变了你的算法以后会处理的数据。这时就会出现固有偏差,你应该围绕这种偏差来设计 model。具体方法如下:

    1.对覆盖更多查询的 feature 进行更高的正则化。通过这种方式,model将专门针对一个或几个查询的 feature,而不是所有查询的 feature。这种方法有助于防止不相关的查询出现十分热门的查询结果。请注意,这与以下更为传统的建议相左:对具有更多唯一值的 feature column 进行更高的正则化。

    2.仅允许 feature 具有正权重。这样一来,就可以确保任何好feature都比"未知"feature合适。

    3.不选择只处理文档数据的 feature。这是第一条规则的极端版本。

    第36条规则:通过位置 feature 避免出现反馈环。

    内容的位置对用户与其互动的可能性的影响非常大。如果你将应用放在首位,则应用获得的点击率更高,你可能就会认为用户更有可能点击该应用。处理此类问题的一种方法是添加位置 feature,你可以使用位置 feature 训练 model,然后在应用时,你不向任何 Instance 提供位置 feature,或为所有 Instance 提供相同的默认 feature,因为在决定以怎样的顺序显示候选 Instance之前,你就对其进行了打分。因为训练和测试之间的这种不对称性,请务必在位置 feature 与 model 的其余 feature 之间保持一定的分离性。让 model 成为位置 feature 函数和其余 feature 函数之和是理想的状态。

    第37条规则:测量训练/应用偏差。

    一般来说,很多情况都会引起偏差。具体分为以下几个部分:

    • 训练数据和预留数据效果之间的差异。一般来说,这种情况始终存在,而且不一定就是坏事。
    • 预留数据和"次日"数据效果之间的差异。同样,这种情况也始终存在。你应该调整正则化,最大程度地提升次日数据的效果。不过,如果与预留数据相比,次日数据效果下降明显,则可能表明某些 feature 具有时效性,而且可能会降低 model 的效果。
    • "次日"数据和实时数据效果之间的差异。如果你将 model 应用于训练数据中的某个example,并在应用时使用同一example,那么你得到的结果应该完全相同(请参阅第 5 条规则)。因此,此处的差异很可能表示出现了工程错误。

    未完待续

    硅谷AI技术公开课直播系列

    每周硅谷AI技术公开课直播。和全球AI技术工程师一起学习和练习AI技术。可以在任何地方接入听讲和讲师互动。在AICamp(ID:aicampsv)公众号回复“直播”两个字获取听课链接。

    吴恩达大力推荐的深度学习课程学习笔记(下载全部课程笔记)返回搜狐,查看更多

    责任编辑:

    本文由飞艇全天精准计划发布于全天飞艇计划,转载请注明出处:python数据预处理,硅谷AI技术文章

    关键词:

上一篇:自由软件之父理查德,Linux在为谁代言

下一篇:没有了