是否可以使用ML.NET Preview(0.6)使C#集合具有特色?

时间:2018-10-17 18:42:16

标签: c# collections ml.net

让我们说我的类型很复杂:

class Policy
{
    string Name { get; set; }
    DateTime InceptionDate { get; set; }
    DateTime ExpirationDate { get; set; }
    List<Location> Locations { get; set; }
}

class Location
{
    string Street { get; set; }
    string City { get; set; }
    string State { get; set; }
    string PostalCode { get; set; }
}

如何将Locations的集合转换为ML.NET可以理解的特征列?

2 个答案:

答案 0 :(得分:2)

可以找到here的示例,该示例使用新的API将数据从内存中读取到ML管道中。复制相关代码,尽管该链接包含一些其他有用的注释:

var mlContext = new MLContext();

IEnumerable<CustomerChurnInfo> churnData = GetChurnInfo();

var trainData = mlContext.CreateStreamingDataView(churnData);

var dynamicLearningPipeline = mlContext.Transforms.Categorical.OneHotEncoding("DemographicCategory")
    .Append(new ConcatEstimator(mlContext, "Features", "DemographicCategory", "LastVisits"))
    .Append(mlContext.BinaryClassification.Trainers.FastTree("HasChurned", "Features", numTrees: 20));

var dynamicModel = dynamicLearningPipeline.Fit(trainData);

答案 1 :(得分:2)

可以将原始类型的数组特征化。

如果您的班级是这样的:

class Policy
{
    string Name { get; set; }
    DateTime InceptionDate { get; set; }
    DateTime ExpirationDate { get; set; }
    float[] Locations { get; set; }
}

然后,Locations将转换为类型Vector的{​​{1}}(映射为R4)。

然后您创建一个float

SchemaDefinition

如果Vector的大小在编译时未知,那么您还需要:

var env = new LocalEnvironment();
var schemaDef = SchemaDefinition.Create(typeof(Policy));

如果矢量的大小是固定的,则可以在属性上添加int vectorSize = 4 schemaDef["Locations"].ColumnType = new VectorType(NumberType.R4, vectorSize); 属性:

VectorType

然后您创建class Policy { string Name { get; set; } DateTime InceptionDate { get; set; } DateTime ExpirationDate { get; set; } [VectorType(4)] float[] Locations { get; set; } }

DataView

在您的情况下,var data = new List<Policy>(); var dataView = env.CreateStreamingDataView(data, schemaDef); 是一个类,因此我认为您首先需要通过连接值来将其转换为原始数组,如下例所示:

Locations

但是我还没有真正尝试过这种情况,所以在这里我无能为力。

还请查看Schema Comprehension文档here