めもめも。
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"));