我在 ML.NET 中对分类数据进行聚类时遇到了困难。
使用 var predictor = mlContext.Model.CreatePredictionEngine(model) 这一行代码时,出现了异常 “System.InvalidOperationException: ‘Incompatible features column type: ‘Vector’ vs ‘Vector””
我对机器学习还比较新手,能有人帮助我吗?
谢谢!
class Program{ static void Main(string[] args) { var mlContext = new MLContext(); var samples = new[] { new DataPoint {Education = "0-5yrs", ZipCode = "98005"}, new DataPoint {Education = "0-5yrs", ZipCode = "98052"}, new DataPoint {Education = "6-11yrs", ZipCode = "98005"}, new DataPoint {Education = "6-11yrs", ZipCode = "98052"}, new DataPoint {Education = "11-15yrs", ZipCode = "98005"} }; IDataView data = mlContext.Data.LoadFromEnumerable(samples); var multiColumnKeyPipeline = mlContext.Transforms.Categorical.OneHotEncoding( new[] { new InputOutputColumnPair("Education"), new InputOutputColumnPair("ZipCode") }); IDataView transformedData = multiColumnKeyPipeline.Fit(data).Transform(data); string featuresColumnName = "Features"; var pipeline = mlContext.Transforms .Concatenate(featuresColumnName, "Education", "ZipCode") .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 2)); var model = pipeline.Fit(transformedData); var predictor = mlContext.Model.CreatePredictionEngine<TransformedData, ClusterPredictionItem>(model); } private class DataPoint { public string Education { get; set; } public string ZipCode { get; set; } } private class TransformedData { public float Education { get; set; } public float ZipCode { get; set; } } internal class ClusterPredictionItem { }}
回答:
我怀疑你遇到问题的原因是你将管道分成了几部分,并且你的实际训练基于转换后的 IDataView,而没有将其作为管道的一部分。如果你将 onehotencoding 和训练器合并到一个管道中,你可以简化你的代码:
IDataView data = mlContext.Data.LoadFromEnumerable(samples); string featuresColumnName = "Features"; var pipeline = mlContext.Transforms.Categorical.OneHotEncoding( new[] { new InputOutputColumnPair("Education"), new InputOutputColumnPair("ZipCode") }).Append(mlContext.Transforms.Concatenate("Features", "Education", "ZipCode")) .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 2)); var model = pipeline.Fit(data); var predictor = mlContext.Model.CreatePredictionEngine<DataPoint, ClusterPredictionItem>(model);
这样应该可以避免异常的发生。