如何准备带有时间值的数据以进行聚类?

时间:2019-04-03 15:07:45

标签: c# ml.net

我正在尝试将KMeans聚类应用于具有时间戳记值的数据集。数据集还有其他列,例如Id(int),Side(boolean),Quarter(int),Half(int)。但是我只想使用timestamp列执行集群。 如何使用MLContext创建管道来做到这一点?

数据集如下:

DataSet
{
        public int Contract_Id { get; set; }
        public System.DateTime TimeStamp { get; set; }
        public bool Side { get; set; }
        public int Quarter { get; set; }
        public int Half { get; set; }
}

我有一个实用程序可以从SQL数据库返回需要使用的数据集。我使用数据集加载MLContext,然后使用Kmeans函数创建管道,使用TimeStamp列作为功能输入,并使用ClusterId作为输出名称。

var data = unitOfWork.Repository.GetPastFiveSeconds(); // get past 5 sec data from now

var trainData = mlContext.Data.LoadFromEnumerable(data);

var pipeline = mlContext.Clustering.Trainers.KMeans("TimeStamp", "ClusterId", Convert.ToInt32(Math.Ceiling(  (double)5 / data.Count()   ))); // C# stuff to convert to int :/

var model = pipeline.Fit(trainData);

我想获取一个簇数组,并将数据点正确分配给一个簇,但是我遇到一个例外-找不到ClusterId列“ Weight”

编辑: 尝试从KMeans函数中删除ClusterId参数并将其设置为null并添加了一个转换步骤

mlContext.Transforms.Conversion.ConvertType("TimeStampFloat", "TimeStamp", DataKind.Single)
.Append(mlContext.Clustering.Trainers.KMeans("TimeStampFloat",null, Convert.ToInt32(Math.Ceiling(  (double)5 / trades.Count()   ))))

但是我收到错误消息“功能列'TimeStampFloat'的架构不匹配:预期的向量,现在得到R4 \ r \ n参数名称:inputSchema”

2 个答案:

答案 0 :(得分:0)

在您要传递“ ClusterId”的情况下,KMeans的第二个参数是起始权重列的名称。

您似乎在DataSet类型中没有ClusterId属性,因此无法找到它。

第三个参数也是您希望在数据中看到的簇数。如果您不知道会发生什么,我会尝试并尝试一些值。

所以尝试:

var pipeline = mlContext.Clustering.Trainers.KMeans("TimeStamp");

您需要对时间戳进行一些预处理,因为它是System.DateTime类型的。 KMeans(和大多数ML.NET算法)将期望使用float类型。将Transforms.Conversion.ConvertType添加到管道中。

答案 1 :(得分:0)

修改答案:

KMeans Feature列应该是浮点数的向量,因为通常有许多串联在一起的Feature列。这是一种hack,但是如果您在转换后,KMeans之前将管道连接添加到管道中,则应该成功:

mlContext.Transforms.Conversion.ConvertType("TimeStampFloat", "TimeStamp", DataKind.Single)
.Append(ml.Transforms.Concatenate("TimeStampFloat", new [] {"TimeStampFloat"}))
.Append(mlContext.Clustering.Trainers.KMeans("TimeStampFloat",null, 5))