1. 程式人生 > >學習ML.NET(3): 匯入資料集

學習ML.NET(3): 匯入資料集

機器學習演算法需要作用於資料,用來訓練演算法模型。資料集通常是以純文字檔案儲存的表格資料,檔案的每一行是一條資料記錄,每條記錄由多列組成,列之間用分隔符(一般是逗號,)分開,例如前面用到過的

ML.NET中,使用TextLoader將文字檔案匯入到資料集。使用方式如下:

new TextLoader(filePath).CreateFrom<TInput>()

filePath是資料集檔案路徑。TInput是資料類,資料類中的每個屬性對應資料集檔案中的一列,屬性使用ColumnAttribute匹配指定源列的索引,例如:

[Column("0")]
public
float SepalLength;

CreateFrom方法包含多個引數,用於指定如何處理文字:

  • useHeader:檔案第一行是否為列名,預設為false
  • separator:列分隔符,預設是製表符\t
  • allowQuotedStrings:列值是否是有引號字串,預設是true,例如“ABC”實際值是ABC,不包含引號
  • trimWhitespace:是否去除列值結尾空白,預設是false,例如“ABC ”實際值的長度是4,包含一個空格

示例程式

假設有一個數據集test-data.txt,包含1列Id和一列文字資料,列名分別是Col1和Col2,檔案內容如下:

"Col1","Col2"
1,"包含逗號和結尾空格, "
2,包含逗號, 
3,包含結尾空格 

建立對應的資料類,資料類屬性名可以不和列名一致,只要索引對應就可以了:

public class TestData
{
      [Column("0")]
      public float ID;

      [Column("1")]
      public string Text;
}

建立TextLoader:

var loader = new Microsoft.ML.Data.TextLoader("test-data.txt").CreateFrom<TestData>(
                 useHeader: 
true, separator: ',', allowQuotedStrings: true, trimWhitespace: true);

接著我們載入資料集:

using (var environment = new TlcEnvironment())
            {
                var experiment = environment.CreateExperiment();
                var output = loader.ApplyStep(null, experiment) as ILearningPipelineDataStep;

                experiment.Compile();
                loader.SetInput(environment, experiment);
                experiment.Run();

                var data = experiment.GetOutput(output.Data);
                using (var cursor = data.GetRowCursor((a => true)))
                {
                    var IDGetter = cursor.GetGetter<float>(0);
                    var TextGetter = cursor.GetGetter<DvText>(1);
                   
                    while(cursor.MoveNext())
                    {
                        float ID = 0;
                        IDGetter(ref ID);
                        DvText Text = new DvText();
                        TextGetter(ref Text);
                        Console.WriteLine($"ID:{ID},Text:\"{Text}\",Text長度為{Text.Length}");
                    }
                }
            }

最後的輸出結果:

ID:1,Text:"包含逗號和結尾空格, ",Text長度為11
ID:2,Text:"包含逗號",Text長度為4
ID:3,Text:"包含結尾空格",Text長度為6

第一行列名被過濾。

第二行的文字列用引號引著,結果是原樣輸出。

第三行的文字列雖然有逗號,但是作為了分隔符。

第四行的文字列的結尾空白被去除。