Я делаю простое приложение для обнаружения сетевых аномалий в .NET.
Приложение собирает необработанные пакеты, затем анализирует их и определяет, произошла ли потенциальная атака (с помощью статического алгоритма). На данный момент я реализовал алгоритм для обнаружения атаки TCP Flood на основе флагов SYN и ACK в TCP-пакетах. Помимо анализа, приложение сохраняет данные в файл по указанной схеме:
SOURCE_IP | DESTINATION_IP | ВРЕМЯ (ВРЕМЯ) | СИН | ACK
пример:
10.0.0.5 | 10.0.0.10 | 1726332243,275925 | 1 | 1
Я хочу реализовать модель машинного обучения (с помощью ML.NET), которая прогнозирует и предсказывает, произошла ли атака, на основе данных, которые уже были собраны в текущем «сеансе». >
Я попробовал добавить еще один столбец «IsAttack», который был моим ярлыком. После этого я смоделировал атаку TCP Flood и подготовил данные для обучения, заполнив последний столбец. Но модель ml также включает в себя предыдущие метки, все которые в текущем сеансе равны «0», поэтому она не работает должным образом. С другой стороны, когда я пытался спрогнозировать сценарий, ML брал данные только из одной строки. Есть идеи, как я могу совместить предсказание и прогноз? Или любое другое решение?
Сгенерированная модель машинного обучения:
public partial class TCPFloodMLDetector
{
///
/// model input class for TCPFloodMLDetector.
///
#region model input class
public class ModelInput
{
[LoadColumn(0)]
public string SourceAddress { get; set; }
[LoadColumn(1)]
public string DestinationAddress { get; set; }
[LoadColumn(2)]
public double Timeval { get; set; }
[LoadColumn(3)]
public bool SYN { get; set; }
[LoadColumn(4)]
public bool ACK { get; set; }
[LoadColumn(5)]
[ColumnName(@"col5")]
public Single IsAttack { get; set; }
}
#endregion
///
/// model output class for TCPFloodMLDetector.
///
#region model output class
public class ModelOutput
{
[ColumnName(@"col5")]
public float[] Col5 { get; set; }
[ColumnName(@"col5_LB")]
public float[] Col5_LB { get; set; }
[ColumnName(@"col5_UB")]
public float[] Col5_UB { get; set; }
}
#endregion
private static string MLNetModelPath = Path.GetFullPath(@"D:\Projects\NetworkAnalyzer\\Models\TCPFloodMLDetector.mlnet");
public static readonly Lazy PredictEngine = new Lazy(() => CreatePredictEngine(), true);
///
/// Use this method to predict on .
///
///
model input.
///
public static ModelOutput Predict(ModelInput? input = null, int? horizon = null)
{
var predEngine = PredictEngine.Value;
return predEngine.Predict(input, horizon);
}
private static TimeSeriesPredictionEngine CreatePredictEngine()
{
var mlContext = new MLContext();
ITransformer mlModel = mlContext.Model.Load(MLNetModelPath, out var schema);
return mlModel.CreateTimeSeriesEngine(mlContext);
}
}
Я использую это в функции обнаружения, которая запускается каждую секунду:
public async Task Detect()
{
try
{
var context = new MLContext();
var data = context.Data.LoadFromTextFile("tcpflood.txt",
hasHeader: false, separatorChar: '|');
TCPFloodMLDetector.LoadIDataViewFromFile(context, "tcpflood.txt",
'|', false, true);
// predict with default option.
var modelOutput = TCPFloodMLDetector.Predict();
Console.WriteLine(string.Join(",", modelOutput.Col5));
// predict next 5 periods
modelOutput = TCPFloodMLDetector.Predict(horizon: 5);
Console.WriteLine(string.Join(",", modelOutput.Col5));
}
catch (Exception ex)
{
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... nd-predict
ML.NET сочетает прогноз и предсказание ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение