我正在尝试将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”
答案 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))