めもめも。

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"));
投稿日時: 2024-12-30 16:10:30
更新日時: 2025-04-06 11:01:06

最近の投稿

最近のコメント

タグ

アーカイブ

その他