【问题标题】:What ML.NET Concatenate really does?ML.NET Concatenate 真正做什么?
【发布时间】:2021-12-17 18:19:04
【问题描述】:

我相信我了解何时需要调用 Concatenate、调用什么数据以及为什么。我想了解的是调用 Concatenate 时输入列数据的物理变化。

这是某种散列函数,对列中的所有输入数据进行散列运算并生成结果?

换句话说,我想知道这在技术上是否可以从 Concatenate 生成的值中恢复原始值?

传递给 Concatenate 的数据列的顺序是否会影响结果模型?以何种方式影响?

我为什么要问这些。我试图了解哪些输入参数以及以何种方式影响所生成模型的质量。我有很多输入数据列。它们都相当重要,重要的是这些价值观之间的关系。如果 Concatenate 做了一些简单的事情并失去了值之间的关系,我会尝试一种方法来提高模型的质量。如果它相当复杂并且保留了值的详细信息,我会使用其他方法。

【问题讨论】:

    标签: ml.net ml.net-model-builder


    【解决方案1】:

    在 ML.NET 中,Concatenate 采用单个特征(相同类型)并创建一个 feature vector

    在模式识别和机器学习中,特征向量是代表某个对象的数值特征的 n 维向量。机器学习中的许多算法都需要对象的数字表示,因为这样的表示有助于处理和统计分析。在表示图像时,特征值可能对应于图像的像素,而在表示文本时,特征可能是文本术语的出现频率。特征向量相当于线性回归等统计过程中使用的解释变量向量。

    据我了解,不涉及散列。从概念上讲,您可以将其想象为String.Join 方法,您可以将各个元素合并为一个。在这种情况下,该单个组件是一个特征向量,它作为一个整体将基础数据表示为 T 类型的数组,其中 T 是各个列的数据类型。

    因此,您始终可以访问各个组件,顺序无关紧要。

    这是一个使用 F# 的示例,它获取数据、使用连接变换创建特征向量并访问各个组件:

    #r "nuget:Microsoft.ML"
    
    open Microsoft.ML
    open Microsoft.ML.Data
    
    // Raw data
    let housingData = 
        seq {
            {| NumRooms = 3f; NumBaths = 2f ; SqFt = 1200f|}
            {| NumRooms = 2f; NumBaths = 1f ; SqFt = 800f|}
            {| NumRooms = 6f; NumBaths = 7f ; SqFt = 5000f|}
        }
    
    // Initialize MLContext
    let ctx = new MLContext()
    
    // Load data into IDataView
    let dataView = ctx.Data.LoadFromEnumerable(housingData)
    
    // Get individual column names (NumRooms, NumBaths, SqFt)
    let columnNames = 
        dataView.Schema 
        |> Seq.map(fun col -> col.Name)
        |> Array.ofSeq
    
    // Create pipeline with concatenate transform
    let pipeline = ctx.Transforms.Concatenate("Features", columnNames)
    
    // Fit data to pipeline and apply transform
    let transformedData = pipeline.Fit(dataView).Transform(dataView)
    
    // Get "Feature" column containing the result of applying Concatenate transform
    let features = transformedData.GetColumn<float32 array>("Features")
    
    // Deconstruct feature vector and print out individual features
    printfn "Rooms | Baths | Sqft"
    for [|rooms;baths;sqft|] in features do
        printfn $"{rooms} | {baths} | {sqft}"
    

    输出到控制台的结果是:

    Rooms | Baths | Sqft
    2 | 3 | 1200
    1 | 2 | 800
    7 | 6 | 5000
    

    如果您想了解各个功能对模型的影响,我建议您查看 Permutation Feature Importance (PFI)Feature Contribution Calculation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多