مقدمة: هل يمكن لـ C# منافسة Python في تعلم الآلة؟
لطالما ارتبط عالم تعلم الآلة (ML) حصريًا بلغة Python. فالكثير من المكتبات (scikit-learn, PyTorch, TensorFlow)، والمجتمع النشط، ووفرة المواد التعليمية جعلت Python الرائدة بلا منازع. ومع ذلك، كثيرًا ما يتساءل المطورون الذين يستخدمون C# ومنصة .NET: هل يمكن استخدام الأداة المألوفة لمهام تعلم الآلة؟ الإجابة — نعم، يمكن، ولكن مع بعض التحفظات.
في هذه المقالة، سنستعرض الأدوات التي توفرها بيئة .NET لتعلم الآلة، وما هي نقاط قوتها، وأين لا تزال C# متأخرة عن Python. ستكون المقالة مفيدة لمطوري .NET الراغبين في دخول عالم تعلم الآلة، وكذلك لمتخصصي البيانات الذين يبحثون عن بدائل.
ML.NET: المكتبة الأصلية من Microsoft
الأداة الرئيسية لتعلم الآلة في C# هي ML.NET. وهي مكتبة مفتوحة المصدر ومتعددة المنصات، طورتها Microsoft خصيصًا لبيئة .NET. تتيح هذه المكتبة دمج نماذج تعلم الآلة مباشرة في تطبيقات C# دون الحاجة إلى التحول إلى Python.
الإمكانيات الرئيسية لـ ML.NET
- التدريب والاستدلال: تدعم ML.NET كلاً من تدريب النماذج «من الصفر» وتحميل النماذج المدربة مسبقًا.
- المهام النمطية: التصنيف، الانحدار، التجميع، الترتيب، اكتشاف الحالات الشاذة، تحليل المشاعر النصية.
- AutoML: آلية مدمجة للاختيار التلقائي لأفضل خوارزمية والمعلمات الفائقة (التعلم الآلي الآلي).
- التكامل مع ONNX: دعم تنسيق Open Neural Network Exchange (ONNX) لاستيراد النماذج من PyTorch أو TensorFlow.
مثال: التنبؤ بالسعر (الانحدار) باستخدام ML.NET
لننظر في مثال بسيط لتدريب نموذج للتنبؤ بتكلفة السكن بناءً على المساحة. أولاً، نحدد فئة البيانات:
public class HousingData
{
public float Size { get; set; }
public float Price { get; set; }
}
public class PricePrediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
الآن نكتب كود التدريب:
using Microsoft.ML;
var context = new MLContext();
var data = context.Data.LoadFromTextFile<HousingData>("housing.csv", separatorChar: ',');
var pipeline = context.Transforms.Concatenate("Features", new[] { "Size" })
.Append(context.Regression.Trainers.Sdca(labelColumnName: "Price"));
var model = pipeline.Fit(data);
var predictionEngine = context.Model.CreatePredictionEngine<HousingData, PricePrediction>(model);
var prediction = predictionEngine.Predict(new HousingData { Size = 75f });
Console.WriteLine($"السعر المتوقع: {prediction.Price:F2}");
كما ترون، فإن واجهة برمجة التطبيقات (API) بديهية لمطور .NET. ومع ذلك، من المهم أن نفهم: ML.NET لا تدعم التعلم العميق (الشبكات العصبية) بنفس مرونة Keras أو PyTorch.
TensorFlow.NET ومجموعة SciSharp Stack
لمهام التعلم العميق في C#، يوجد مشروع TensorFlow.NET (TF.NET). وهو ربط .NET بـ TensorFlow الأصلي، مما يسمح بإنشاء وتدريب وتشغيل الشبكات العصبية في C#. إلى جانب مكتبات SciSharp (Keras.NET, NumSharp, Pandas.NET)، يشكل هذا نظيرًا لمكدس Python في .NET.
مثال: شبكة عصبية بسيطة باستخدام TensorFlow.NET
using Tensorflow;
using static Tensorflow.Binding;
using NumSharp;
// إنشاء نموذج Sequential بسيط
var model = keras.Sequential();
model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));
model.add(keras.layers.Dense(10, activation: "softmax"));
// التجميع
model.compile(optimizer: "adam",
loss: "categorical_crossentropy",
metrics: new[] { "accuracy" });
// تحميل بيانات MNIST (عبر NumSharp)
var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();
x