ML.NET 示例:二元分類之使用者評論的情緒分析

feiyun0112發表於2018-12-04

寫在前面

準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。
如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn

使用者評論的情緒分析

ML.NET 版本 API 型別 狀態 應用程式型別 資料型別 場景 機器學習任務 演算法
v0.7 動態API README.md 已更新 控制檯應用程式 .tsv 檔案 情緒分析 二元分類 線性分類

在這個介紹性示例中,您將看到如何使用ML.NET預測客戶評論的情緒(積極或消極)。在機器學習領域中,這種型別的預測被稱為二元分類

問題

這個問題集中在預測客戶的評論是否具有正面或負面情緒。我們將使用小型的wikipedia-detox-datasets(一個用於訓練的資料集,一個用於模型的準確性評估的資料集),這些資料集已經由人工處理過,並且每個評論都被分配了一個情緒標籤:

  • 0 - 好評/正面
  • 1 - 差評/負面

我們將使用這些資料集構建一個模型,在預測時將分析字串並預測情緒值為0或1。

機器學習任務 - 二元分類

二元分類一般用於將專案分類為兩個類中的一個的問題(將專案分類為兩個以上的類稱為多類分類)。

  • 預測保險索賠是否有效。
  • 預測飛機是否會延誤或將準時到達。
  • 預測face ID(照片)是否屬於裝置的所有者。

所有這些示例的共同特徵是我們想要預測的引數只能採用兩個值中的一個。 換句話說,該值由 boolean 型別表示。

解決方案

要解決這個問題,首先我們將建立一個機器學習模型。然後,我們將在現有資料上訓練模型,評估其有多好,最後我們將使用該模型來預測新評論的情緒。

建立 -> 訓練 -> 評估 -> 使用

1. 建立模型

建立模型包括:

  • 定義對映到資料集的資料架構,以便用DataReader讀取(“wikipedia-detox-250-line-data.tsv”和“wikipedia-detox-250-line-test.tsv”)

  • 建立一個評估器,並將資料轉換為數值向量,以便它能夠被機器學習演算法有效地使用(使用“FeaturizeText”)

  • 選擇訓練器/學習演算法(如“FastTree”)來訓練模型。

初始程式碼類似以下內容:

// STEP 1: Common data loading configuration
TextLoader textLoader = mlContext.Data.TextReader(new TextLoader.Arguments()
                                        {
                                            Separator = "tab",
                                            HasHeader = true,
                                            Column = new[]
                                                        {
                                                        new TextLoader.Column("Label", DataKind.Bool, 0),
                                                        new TextLoader.Column("Text", DataKind.Text, 1)
                                                        }
                                        });
IDataView trainingDataView = textLoader.Read(TrainDataPath);
IDataView testDataView = textLoader.Read(TestDataPath);

// STEP 2: Common data process configuration with pipeline data transformations          
var dataProcessPipeline = mlContext.Transforms.Text.FeaturizeText("Text", "Features");

// STEP 3: Set the training algorithm, then create and config the modelBuilder                            
var trainer = mlContext.BinaryClassification.Trainers.FastTree(labelColumn: "Label", featureColumn: "Features");
var trainingPipeline = dataProcessPipeline.Append(trainer);

2. 訓練模型

訓練模型是在訓練資料(具有已知情緒值)上執行所選演算法以調整模型引數的過程。它是在評估器物件的 Fit() 方法中實現。

為了執行訓練,您需要在DataView物件中提供了訓練資料集(wikipedia-detox-250-line-data.tsv檔案)後呼叫 Fit() 方法。

ITransformer trainedModel = trainingPipeline.Fit(trainingDataView);

請注意,ML.NET使用延遲載入方式處理資料,所以在實際呼叫.Fit()方法之前,沒有任何資料真正載入到記憶體中。

3. 評估模型

我們需要這一步驟來判定我們的模型對新資料的準確性。 為此,上一步中的模型再次針對另一個未在訓練中使用的資料集(wikipedia-detox-250-line-test.tsv)執行。 此資料集也包含了已知的情緒。

Evaluate()比較測試資料集的預測值,並生成各種指標,例如準確性,您可以對其進行瀏覽。

var predictions = trainedModel.Transform(testDataView);
var metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label", "Score");

ConsoleHelper.PrintBinaryClassificationMetrics(trainer.ToString(), metrics);

如果您對模型的質量不滿意,可以通過提供更大的訓練資料集,併為每個演算法選擇具有不同超引數的不同訓練演算法來嘗試改進它。

請記住,對於這個示例,它的質量會低於可能的質量,因為資料集很小,以便可以很快地訓練。您應該使用更大的已標記情緒的資料集來顯著提高模型的質量。

4. 使用模型

訓練完模型後,您可以使用Predict()API來預測新示例文字的情緒。

// Create prediction engine related to the loaded trained model
var predFunction= trainedModel.MakePredictionFunction<SentimentIssue, SentimentPrediction>(mlContext);

//Score
var resultprediction = predFunction.Predict(sampleStatement);

其中resultprediction.PredictionLabel將為True或False,具體取決於它是否被預測為負面或正面的情緒。

相關文章