让我们说我的类型很复杂:
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可以理解的特征列?
答案 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