めもめも。
using Microsoft.ML;
using Microsoft.ML.Data;
public class CommentData
{
    // このカラム名は「Label」として指定
    [ColumnName("Label")]
    public bool IsSpam { get; set; }
    public string Comment { get; set; }
}
public class CommentPrediction
{
    [ColumnName("PredictedLabel")]
    public bool IsSpam { get; set; }
}
public class SpamFilter
{
    private static MLContext context = new MLContext();
    public static void Main(string[] args)
    {
        // MLContextの作成
        var context = new MLContext();
        // 学習データの準備
        var data = context.Data.LoadFromEnumerable(new List<CommentData>
        {
            // スパムコメント
            new CommentData { IsSpam = true, Comment = "今すぐ報酬を手に入れるチャンス!" },
            new CommentData { IsSpam = true, Comment = "無料で今すぐ登録して!" },
            new CommentData { IsSpam = true, Comment = "お金を稼ぐチャンスを見逃すな!" },
            new CommentData { IsSpam = true, Comment = "クリックして簡単に儲けよう!" },
            // 非スパムコメント
            new CommentData { IsSpam = false, Comment = "この会議は素晴らしかったです。" },
            new CommentData { IsSpam = false, Comment = "最近観た映画はとても面白かったです。" },
            new CommentData { IsSpam = false, Comment = "今日のランチはとても美味しかったです。" },
            new CommentData { IsSpam = false, Comment = "新しい本を読んでみたけど面白かった。" }
        });
        // テキストの前処理と特徴量化(フィーチャー化)
        var pipeline = context.Transforms.Text.FeaturizeText("Features", "Comment")
            .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));
        // モデルのトレーニング
        var model = pipeline.Fit(data);
        var modelPath = @"spam_model.zip"; //お好きなパス
        context.Model.Save(model, data.Schema, modelPath);
        // 既存のモデルをロード
        var newComment = new CommentData { Comment = "あなたにだけ、報酬をあげます!" };
        ITransformer newModel = LoadModel(modelPath);
        // モデルを使って予測
        var prediction = Predict(newModel, newComment);
        Console.WriteLine($"コメント: {newComment.Comment}");
        Console.WriteLine($"スパム予測: {prediction.IsSpam}");
    }
    // モデルをロードする
    private static ITransformer LoadModel(string modelPath)
    {
        return context.Model.Load(modelPath, out var modelInputSchema);
    }
    // モデルを使って新しいデータを予測する
    private static CommentPrediction Predict(ITransformer model, CommentData newComments)
    {
        // 新しいデータをロード
        var predictionEngine = context.Model.CreatePredictionEngine<CommentData, CommentPrediction>(model);
        var predictions = predictionEngine.Predict(newComments);
        return predictions;
    }
    // 新しいデータを使ってモデルを再学習する
    private static ITransformer RetrainModel(ITransformer existingModel, List<CommentData> updatedData)
    {
        var data = context.Data.LoadFromEnumerable(updatedData);
        // パイプラインを作成(フィーチャーの生成とトレーニング)
        var pipeline = context.Transforms.Text.FeaturizeText("Features", "Comment")
            .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));
        // モデルを再学習
        var retrainedModel = pipeline.Fit(data);
        return retrainedModel;
    }
    // 再学習したモデルを保存する
    private static void SaveModel(ITransformer model, string modelPath)
    {
        context.Model.Save(model, null, modelPath);
    }
}複数のデータから判定したい場合は
public class CommentData
{
    // このカラム名は「Label」として指定
    [ColumnName("Label")]
    public bool IsSpam { get; set; }
    public string Comment { get; set; }
    public string DataA{ get; set; }
    public string DataB{ get; set; }
    public string DataC{ get; set; }
}
として、特徴量の定義を増やす。
var pipeline = context.Transforms.Text.FeaturizeText("CommentFeatures", "Comment")
    .Append(context.Transforms.Text.FeaturizeText("DataAFeatures", "DataA"))
    .Append(context.Transforms.Text.FeaturizeText("DataBFeatures", "DataB"))
    .Append(context.Transforms.Text.FeaturizeText("DataCFeatures", "DataC"))
    .Append(context.Transforms.Concatenate("Features", "CommentFeatures", "DataAFeatures", "DataBFeatures", "DataCFeatures"))
    .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));