大家好,我正在开发一个股票预测应用程序(大学项目),为了训练SVM模型,我需要将我的数据拆分为训练集和测试集 x_train, x_test, y_train, y_test
。我有X和Y双重集合需要拆分。在Python中,我知道有函数可以轻松地将数据拆分为四个变量 x_train, x_test, y_train, y_test
,但我在C#中找不到类似的功能。在微软的官方网站上,我只找到了这个示例,但如我所述,它只接受一个变量,在我的情况下SVM将无法正常工作。我听说过微软的ML项目,但它也只拆分一个变量。我尝试过这个示例,但如我所述,它只接受一个变量并提供训练和测试拆分
var mlContext = new MLContext();// Creating the ML.Net IHostEnvironmentvar dataview = mlContext.Data.LoadFromEnumerable(examples);var split = mlContext.Data.TrainTestSplit(dataview, testFraction: 0.1, samplingKeyColumnName: "Group");var trainSet = mlContext.Data.CreateEnumerable<DataPoint>(split.TrainSet, reuseRowObject: false);var testSet = mlContext.Data.CreateEnumerable<DataPoint>(split.TestSet,reuseRowObject: false);
也许有人遇到过这个问题?
回答:
数据集创建
首先,将你的X、Y列合并,形成一个单一的数据集(或IDataView),用于训练和测试的每个数据集。
然后,你可以拆分任一合并的数据集,以创建额外的保留/验证拆分。在股票数据集中,我会将训练集拆分为训练+验证集(或在训练集上使用交叉验证),以避免测试数据集中的泄漏,并确保测试数据集的指标准确无误。
数据泄漏
希望你的 samplingKeyColumnName: "Group"
列在一定程度上能保护你免受随机拆分时间序列数据集所带来的数据泄漏。这种拆分会导致你的模型在比评分数据更新和更旧的数据点上学习。数据泄漏会人为地使你的指标高于预期。基于股票代码的拆分仍然会有一定程度的泄漏,例如,知道GOOG的未来将为我预测MSFT提供有用信息。参见: https://en.wikipedia.org/wiki/Leakage_(machine_learning)
通常,对于时间序列数据集,你希望基于时间进行拆分(最旧的在训练集中,较新的在验证集中,最新的在测试集中);或者使用滚动原点交叉验证。