ML.NET Cookbook:(17)如何在分类数据上训练模型?
一般來說,所有的ML.NET學(xué)習(xí)器都希望這些特征是一個(gè)浮點(diǎn)向量。因此,如果您的一些數(shù)據(jù)不是一個(gè)float,您需要將其轉(zhuǎn)換為float。
如果我們的數(shù)據(jù)包含“分類”特征(比如“enum”),我們需要以某種方式對(duì)它們進(jìn)行“特征化”。ML.NET提供了幾種將分類數(shù)據(jù)轉(zhuǎn)換為功能的方法:
獨(dú)熱編碼
基于哈希的獨(dú)熱編碼
二進(jìn)制編碼(將類別索引轉(zhuǎn)換為位序列并使用位作為特征)
如果某些類別的基數(shù)非常高(有很多不同的值,但通常只有幾個(gè)),那么獨(dú)熱編碼可能是浪費(fèi)的。我們可以使用基于計(jì)數(shù)的特征選擇來減少我們編碼的槽的數(shù)量。
與規(guī)范化一樣,將分類特征化直接包含在ML.NET學(xué)習(xí)管道中是一種很好的做法:這樣您就可以確保分類轉(zhuǎn)換
只是在訓(xùn)練數(shù)據(jù)上“訓(xùn)練”,而不是在你的測(cè)試數(shù)據(jù)上,
正確應(yīng)用于所有新傳入的數(shù)據(jù),而無需在預(yù)測(cè)時(shí)進(jìn)行額外的預(yù)處理。
下面是成人普查數(shù)據(jù)集[1]的分類處理示例:
Label?Workclass?education?marital-status?occupation?relationship?ethnicity?sex?native-country-region?age?fnlwgt?education-num?capital-gain?capital-loss?hours-per-week 0?Private?11th?Never-married?Machine-op-inspct?Own-child?Black?Male?United-States?25?226802?7?0?0?40 0?Private?HS-grad?Married-civ-spouse?Farming-fishing?Husband?White?Male?United-States?38?89814?9?0?0?50 1?Local-gov?Assoc-acdm?Married-civ-spouse?Protective-serv?Husband?White?Male?United-States?28?336951?12?0?0?40 1?Private?Some-college?Married-civ-spouse?Machine-op-inspct?Husband?Black?Male?United-States?44?160323?10?7688?0?40 //?創(chuàng)建加載器:定義數(shù)據(jù)列以及它們?cè)谖谋疚募械奈恢谩?var?loader?=?mlContext.Data.CreateTextLoader(new[]?{new?TextLoader.Column("Label",?DataKind.Boolean,?0),//?我們將把所有分類特征加載到一個(gè)大小為8的向量列中。new?TextLoader.Column("CategoricalFeatures",?DataKind.String,?1,?8),//?類似地,將所有數(shù)字特征加載到一個(gè)大小為6的向量中。new?TextLoader.Column("NumericalFeatures",?DataKind.Single,?9,?14),//?讓我們單獨(dú)加載“Workclass”列。new?TextLoader.Column("Workclass",?DataKind.String,?1)},hasHeader:?true );//?加載數(shù)據(jù)。 var?data?=?loader.Load(dataPath);//?檢查分類列的前10條記錄以檢查它們是否被正確讀取。 var?catColumns?=?data.GetColumn<string[]>(data.Schema["CategoricalFeatures"]).Take(10).ToArray();//?建造多條可選的特征化管道。 var?pipeline?=//?將每個(gè)分類特征轉(zhuǎn)換為獨(dú)熱編碼。mlContext.Transforms.Categorical.OneHotEncoding("CategoricalOneHot",?"CategoricalFeatures")//?將所有分類特征轉(zhuǎn)換為索引,并構(gòu)建一個(gè)“詞袋”。.Append(mlContext.Transforms.Categorical.OneHotEncoding("CategoricalBag",?"CategoricalFeatures",?OneHotEncodingEstimator.OutputKind.Bag))//?對(duì)workclass列進(jìn)行獨(dú)熱編碼,然后刪除列集中少于10個(gè)實(shí)例的所有類別。.Append(mlContext.Transforms.Categorical.OneHotEncoding("WorkclassOneHot",?"Workclass")).Append(mlContext.Transforms.FeatureSelection.SelectFeaturesBasedOnCount("WorkclassOneHotTrimmed",?"WorkclassOneHot",?count:?10));//?讓我們訓(xùn)練管道,然后將其應(yīng)用于同一個(gè)數(shù)據(jù)上。 var?transformedData?=?pipeline.Fit(data).Transform(data);//?檢查結(jié)果數(shù)據(jù)集的某些列。 var?categoricalBags?=?transformedData.GetColumn<float[]>(transformedData.Schema["CategoricalBag"]).Take(10).ToArray(); var?workclasses?=?transformedData.GetColumn<float[]>(transformedData.Schema["WorkclassOneHotTrimmed"]).Take(10).ToArray();//?當(dāng)然,如果我們想訓(xùn)練模型,我們需要合成一個(gè)包含所有特征的浮點(diǎn)向量。 //?我們可以這樣做:var?fullLearningPipeline?=?pipeline//?連接3個(gè)分類管道中的2個(gè),以及數(shù)字特征。.Append(mlContext.Transforms.Concatenate("Features",?"NumericalFeatures",?"CategoricalBag",?"WorkclassOneHotTrimmed"))//?將數(shù)據(jù)緩存在內(nèi)存中,以便下面的訓(xùn)練器能夠訪問訓(xùn)練樣本,而無需從磁盤多次加載它們。.AppendCacheCheckpoint(mlContext)//?現(xiàn)在我們要訓(xùn)練了。我們選擇了我們的FastTree訓(xùn)練器來完成這個(gè)分類任務(wù)。.Append(mlContext.BinaryClassification.Trainers.FastTree(numTrees:?50));//?訓(xùn)練模型。 var?model?=?fullLearningPipeline.Fit(data);
參考資料
[1]
成人普查數(shù)據(jù)集: https://github.com/dotnet/machinelearning/blob/main/test/data/adult.tiny.with-schema.txt
總結(jié)
以上是生活随笔為你收集整理的ML.NET Cookbook:(17)如何在分类数据上训练模型?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 爬虫:疫情实时信息图
- 下一篇: .NET之模型绑定和验证