深圳幻海软件技术有限公司 欢迎您!

C#通过ML.NET实现机器学习(纽约出租车价格的预测)

2023-03-25

版本要求:VisualStudio201715.6或者以后版本创建控制台应用程序1创建一个.NETCoreConsoleApplication2然后在项目中新建一个Data文件夹,用来放置数据和模型文件3安装Microsoft.MLNuGetPackage,在以相同的方法安装Microsoft.ML

版本要求:Visual Studio 2017 15.6 或者以后版本
创建控制台应用程序
1创建一个.NET Core Console Application
2然后在项目中新建一个Data文件夹,用来放置数据和模型文件
3安装 Microsoft.ML NuGet Package,在以相同的方法安装 Microsoft.ML.FastTree Nuget package.
准备数据
1下载taxi-fare-train.csv和taxi-fare-test.csv数据集,并把他们保存到Data文件夹中,我们使用这些数据集来训练机器学习模型并且评估模型的精度,更多数据集你可以从NYC TLC Taxi trip data set中下载.
2在解决方案管理器中,右击每个.csv文件选择属性,将复制到输出目录改为如果较新则复制。
3打开taxi-fare-train.csv数据集,查看第一行的标题头,决定每列是特征还是标签。
标签是你想要预测的,确定的特征是你预测模型的输入。

提供的数据集包含以下几列
vendor_id:特征;
rate_code:特征;
passenger_count:特征;
trip_time_in_secs:特征;
payment_type:特征;
vendor_id:特征;
fare_amount:标签。
创建数据类
1在解决方案管理器中,右击项目,添加新项目— TaxiTrip.cs。
2 添加using Microsoft.ML.Data;在新文件中。
移除现有类的定义,添加如下代码。

using Microsoft.ML.Data;
namespace TaxiFarePrediction
{
    //使用浮点类型表示输入和预测数据类中的浮点值
    public class TaxiTrip  //是输入数据类,它对每个数据集列都有定义
    {
        [LoadColumn(0)]    //指定数据集中源列的索引
        public string VendorId;

        [LoadColumn(1)]
        public string RateCode;

        [LoadColumn(2)]
        public float PassengerCount;

        [LoadColumn(3)]
        public float TripTime;

        [LoadColumn(4)]
        public float TripDistance;

        [LoadColumn(5)]
        public string PaymentType;

        [LoadColumn(6)]
        public float FareAmount;
    }

    public class TaxiTripFarePrediction    //代表了预测结果
    {
        [ColumnName("Score")]  //对于回归任务,Score列包含预测的标签值
        public float FareAmount;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

Program.cs代码和备注

定义数据和模型路径

using System;
using System.IO;
using Microsoft.ML;
  • 1
  • 2
  • 3

创建3个文件来保存带有数据集的文件路径和保存模型的文件

class Program
    {
        static readonly string _trainDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-train.csv");//模型路径
        static readonly string _testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-test.csv");
        static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "Model.zip");
        static void Main(string[] args)
        {
            MLContext mlContext = new MLContext(seed: 0);//一旦被用户实例化,它就提供了一种方法来创建用于数据准备、特性工程、训练、预测和模型评估的组件
            var model = Train(mlContext, _trainDataPath);//执行1:加载数据 2.提取和转换数据3.训练模型 4.返回模型
            Evaluate(mlContext, model);
            TestSinglePrediction(mlContext, model);
            //Console.WriteLine();
            //Console.WriteLine($"*************************************************");
            //Console.WriteLine($"*       Model quality metrics evaluation         ");
            //Console.WriteLine($"*------------------------------------------------");

        }
        public static ITransformer Train(MLContext mlContext, string dataPath)        // 训练模型
        {
            ///*如果想要预测出租车价格,FareAmount是label(作为模型输出),使用CopyColumnsEstimator转换类复制FareAmount来预测结果
            ///算法训练模型要求数字特征,所以你必须转换数字值(VendorId, RateCode, and PaymentType,注意:这些TaxiTrip中是string类型,所以要装换成数字)成数字 (VendorIdEncoded, RateCodeEncoded, and PaymentTypeEncoded).实现他,使用OneHotEncodingTransformer类
            ///为每列中的不同值分配不同的数值键值
            ///数据准备的最后一步将所有特性列合并到特性列中,使用mlContext.Transforms.Concatenate转换类型,默认情况下,学习算法只处理features列中的特征
            ///
            IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');// IDataView  描述数字或文本表格数据,能够实时加载文件
            var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount")
                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"))
                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"))
                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"))
                .Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"))
                .Append(mlContext.Regression.Trainers.FastTree());
            var model = pipeline.Fit(dataView);//训练模型,Fit()方法转换数据集并应用训练
            return model;//返回模型
        }
        private static void Evaluate(MLContext mlContext, ITransformer model)//使用测试数据评估模型性能,以确保质量和验证///工作::::1加载数据 2创建回归评估器 3评估模型和创建指标 4显示指标
        {
            IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');
            var predictions = model.Transform(dataView);//转换测试数据,Transform()方法对测试数据集输入行进行预测
            var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");//返回评估指标
            Console.WriteLine();
            Console.WriteLine($"*************************************************");
            Console.WriteLine($"*       Model quality metrics evaluation         ");
            Console.WriteLine($"*------------------------------------------------");
            Console.WriteLine($"*       RSquared Score:      {metrics.RSquared:0.##}");//模型的r平方值,也称为确定系数,数值月靠近1越好
            Console.WriteLine($"*       Root Mean Squared Error:      {metrics.RootMeanSquaredError:#.##}");//得到损失的平方根,数值约到0越好
        }
        private static void TestSinglePrediction(MLContext mlContext, ITransformer model)//1创建测试数据的单个注释 2根据测试数据预测票价 3结合测试数据和报告预测 4显示预测结果
        {
            var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);//对测试过的数据进行单个预测
            var taxiTripSample = new TaxiTrip()
            {
                VendorId = "CMT",//供应商ID
                RateCode = "1",//频率编码
                PassengerCount = 1,//乘客数量
                TripTime = 571,//时间
                TripDistance = 5.2f,//距离
                PaymentType = "CRD",//付款方式
                FareAmount = 0 // To predict. Actual/Observed = 16
            };
            var prediction = predictionFunction.Predict(taxiTripSample);//Predict功能是对单个数据实例进行预测
            Console.WriteLine($"**********************************************************************");
            Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 16");
            Console.WriteLine($"**********************************************************************");
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树首页概览14769 人正在系统学习中