學習ML.NET(3): 匯入資料集
阿新 • • 發佈:2018-12-13
機器學習演算法需要作用於資料,用來訓練演算法模型。資料集通常是以純文字檔案儲存的表格資料,檔案的每一行是一條資料記錄,每條記錄由多列組成,列之間用分隔符(一般是逗號,)分開,例如前面用到過的
在ML.NET中,使用TextLoader將文字檔案匯入到資料集。使用方式如下:
new TextLoader(filePath).CreateFrom<TInput>()
filePath是資料集檔案路徑。TInput是資料類,資料類中的每個屬性對應資料集檔案中的一列,屬性使用ColumnAttribute匹配指定源列的索引,例如:
[Column("0")] publicfloat 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
第一行列名被過濾。
第二行的文字列用引號引著,結果是原樣輸出。
第三行的文字列雖然有逗號,但是作為了分隔符。
第四行的文字列的結尾空白被去除。