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

版本要求: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.csvtaxi-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;
    }
}

Program.cs代码和备注

定义数据和模型路径

using System;
using System.IO;
using Microsoft.ML;

创建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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值