【问题标题】:scikit learn: learning curve without information leak?scikit learn:没有信息泄露的学习曲线?
【发布时间】:2020-04-11 07:43:30
【问题描述】:

我想为使用 countVectorizer 提取特征的 LinearSVC 估计器生成学习曲线。 countVectorizer 也在应用一些特征选择步骤。

我可以做到以下几点:

  1. 在所有数据上拟合矢量化器,包括前 N 个特征的选择

  2. 使用这些特征拟合线性SVC

  3. 在 sklearn.model_selection.learning_curve() 中使用 linearSVC 作为估计器

但我认为这会导致信息泄露:基于所有数据的信息将用于为学习曲线中使用的较小集合选择特征。

这是正确的吗? 有没有办法使用内置的 sklearn.model_selection.learning_curve() 和 countVectorizer 而不会泄露信息?

谢谢!

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    您需要将管道与learning_curve 结合使用。 管道将在训练时调用变压器的fit_transform,在测试时仅调用transformlearning_curve 也将应用可以由参数cv 控制的交叉验证。

    有了这个管道,就不会泄露信息。这是一个在 scikit-learn 中使用集成玩具库的示例。

    from sklearn.datasets import fetch_20newsgroups
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer
    from sklearn.svm import LinearSVC
    from sklearn.pipeline import make_pipeline
    from sklearn.model_selection import learning_curve
    
    
    categories = [
        'alt.atheism',
        'talk.religion.misc',
    ]
    # Uncomment the following to do the analysis on all the categories
    #categories = None
    
    data = fetch_20newsgroups(subset='train', categories=categories)
    
    pipeline = make_pipeline(
        CountVectorizer(), TfidfTransformer(), LinearSVC()
    )
    
    learning_curve(pipeline, data.data, data.target, cv=5)
    

    【讨论】:

    • 谢谢,这正是我需要的。有没有办法从管道中提取选定特征的列表?我想比较通过同一管道的多个数据集中的选定特征。
    • 一旦拟合,您可以使用named_steps 访问底层拟合估计器(变压器或预测器):例如pipeline.named_steps['linearsvc'].coef_
    猜你喜欢
    • 2020-11-15
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2016-06-18
    • 2020-10-26
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多