有了上一篇《.NET Core玩转机器学习》打基础,这一次我们以纽约出租车费的预测做为新的场景案例,来体验一下回归模型。

场景概述


我们的目标是预测纽约的出租车费,乍一看似乎仅仅取决于行程的距离和时长,然而纽约的出租车供应商对其他因素,如额外的乘客数、信用卡而不是现金支付等,会综合考虑而收取不同数额的费用。纽约市官方给出了一份样本数据。

确定策略


为了能够预测出租车费,我们选择通过机器学习建立一个回归模型。使用官方提供的真实数据进行拟合,在训练模型的过程中确定真正能影响出租车费的决定性特征。在获得模型后,对模型进行评估验证,如果偏差在接受的范围内,就以这个模型来对新的数据进行预测。

解决方案


  • 创建项目

    看过上一篇文章的读者,就比较轻车熟路了,推荐使用Visual Studio 2017创建一个.NET Core的控制台应用程序项目,命名为TaxiFarePrediction。使用NuGet包管理工具添加对Microsoft.ML的引用。

  • 准备数据集

    下载训练数据集taxi-fare-train.csv和验证数据集taxi-fare-test.csv,数据集的内容类似为:

vendor_id,rate_code,passenger_count,trip_time_in_secs,trip_distance,payment_type,fare_amount

VTS,1,1,1140,3.75,CRD,15.5

VTS,1,1,480,2.72,CRD,10.0

VTS,1,1,1680,7.8,CSH,26.5

VTS,1,1,600,4.73,CSH,14.5

VTS,1,1,600,2.18,CRD,9.5

...

  • 对字段简单说明一下:

    字段名 含义 说明
    vendor_id 供应商编号 特征值
    rate_code 比率码 特征值
    passenger_count 乘客人数 特征值
    trip_time_in_secs 行程时长 特征值
    trip_distance 行程距离 特征值
    payment_type 支付类型 特征值
    fare_amount 费用 目标值

    在项目中添加一个Data目录,将两份数据集复制到该目录下,对文件属性设置“复制到输出目录”。


  • 定义数据类型和路径

    首先声明相关的包引用。

using System;

using Microsoft.ML.Models;

using Microsoft.ML.Runtime;

using Microsoft.ML.Runtime.Api;

using Microsoft.ML.Trainers;

using Microsoft.ML.Transforms;

using System.Collections.Generic;

using System.Linq;

using Microsoft.ML;

在Main函数的上方定义一些使用到的常量。

const string DataPath = @".\Data\taxi-fare-test.csv";const string TestDataPath = @".\Data\taxi-fare-train.csv";const string ModelPath = @".\Models\Model.zip";const string ModelDirectory = @".\Models";

接下来定义一些使用到的数据类型,以及和数据集中每一行的位置对应关系。

public class TaxiTrip

{

[Column(ordinal: "0")]

public string vendor_id;

[Column(ordinal: "1")]

public string rate_code;

[Column(ordinal: "2")]

public float passenger_count;

[Column(ordinal: "3")]

public float trip_time_in_secs;

[Column(ordinal: "4")]

public float trip_distance;

[Column(ordinal: "5")]

public string payment_type;

[Column(ordinal: "6")]

public float fare_amount;

}

public class TaxiTripFarePrediction

{

[ColumnName("Score")]

public float fare_amount;

}

static class TestTrips

{

internal static readonly TaxiTrip Trip1 = new TaxiTrip

{

vendor_id = "VTS",

rate_code = "1",

passenger_count = 1,

trip_distance = 10.33f,

payment_type = "CSH",

fare_amount = 0 // predict it. actual = 29.5

};

}

创建处理过程

创建一个Train方法,定义对数据集的处理过程,随后声明一个模型接收训练后的结果,在返回前把模型保存到指定的位置,以便以后直接取出来使用不需要再重新训练。

public static async Task<PredictionModel<TaxiTrip, TaxiTripFarePrediction>> Train()

{

var pipeline = new LearningPipeline();

pipeline.Add(new TextLoader<TaxiTrip>(DataPath, useHeader: true, separator: ","));

pipeline.Add(new ColumnCopier(("fare_amount", "Label")));

pipeline.Add(new CategoricalOneHotVectorizer("vendor_id",

"rate_code",

"payment_type"));

pipeline.Add(new ColumnConcatenator("Features",

"vendor_id",

"rate_code",

"passenger_count",

"trip_distance",

"payment_type"));

pipeline.Add(new FastTreeRegressor());

PredictionModel<TaxiTrip, TaxiTripFarePrediction> model = pipeline.Train<TaxiTrip, TaxiTripFarePrediction>();

if (!Directory.Exists(ModelDirectory))

{

Directory.CreateDirectory(ModelDirectory);

}

await model.WriteAsync(ModelPath);

return model;

}

评估验证模型

创建一个Evaluate方法,对训练后的模型进行验证评估。

public static void Evaluate(PredictionModel<TaxiTrip, TaxiTripFarePrediction> model)

{

var testData = new TextLoader<TaxiTrip>(TestDataPath, useHeader: true, separator: ",");

var evaluator = new RegressionEvaluator();

RegressionMetrics metrics = evaluator.Evaluate(model, testData);

// Rms should be around 2.795276

Console.WriteLine("Rms=" + metrics.Rms);

Console.WriteLine("RSquared = " + metrics.RSquared);

}

预测新数据

定义一个被用于预测的新数据,对于各个特征进行恰当地赋值。

static class TestTrips

{

internal static readonly TaxiTrip Trip1 = new TaxiTrip

{

vendor_id = "VTS",

rate_code = "1",

passenger_count = 1,

trip_distance = 10.33f,

payment_type = "CSH",

fare_amount = 0 // predict it. actual = 29.5

};

}

  • 预测的方法很简单,prediction即预测的结果,从中打印出预测的费用和真实费用。

    var prediction = model.Predict(TestTrips.Trip1);Console.WriteLine("Predicted fare: {0}, actual fare: 29.5", prediction.fare_amount);
  • 运行结果

到此我们完成了所有的步骤,关于这些代码的详细说明,可以参看《Tutorial: Use ML.NET to Predict New York Taxi Fares (Regression)》,只是要注意该文中的部分代码有误,由于使用到了C# 7.1的语法特性,本文的代码是经过了修正的。完整的代码如下:

using System;

using Microsoft.ML.Models;

using Microsoft.ML.Runtime;

using Microsoft.ML.Runtime.Api;

using Microsoft.ML.Trainers;

using Microsoft.ML.Transforms;

using System.Collections.Generic;

using System.Linq;

using Microsoft.ML;

using System.Threading.Tasks;

using System.IO;

namespace TaxiFarePrediction

{

class Program

{

const string DataPath = @".\Data\taxi-fare-test.csv";

const string TestDataPath = @".\Data\taxi-fare-train.csv";

const string ModelPath = @".\Models\Model.zip";

const string ModelDirectory = @".\Models";

public class TaxiTrip

{

[Column(ordinal: "0")]

public string vendor_id;

[Column(ordinal: "1")]

public string rate_code;

[Column(ordinal: "2")]

public float passenger_count;

[Column(ordinal: "3")]

public float trip_time_in_secs;

[Column(ordinal: "4")]

public float trip_distance;

[Column(ordinal: "5")]

public string payment_type;

[Column(ordinal: "6")]

public float fare_amount;

}

public class TaxiTripFarePrediction

{

[ColumnName("Score")]

public float fare_amount;

}

static class TestTrips

{

internal static readonly TaxiTrip Trip1 = new TaxiTrip

{

vendor_id = "VTS",

rate_code = "1",

passenger_count = 1,

trip_distance = 10.33f,

payment_type = "CSH",

fare_amount = 0 // predict it. actual = 29.5

};

}

public static async Task<PredictionModel<TaxiTrip, TaxiTripFarePrediction>> Train()

{

var pipeline = new LearningPipeline();

pipeline.Add(new TextLoader<TaxiTrip>(DataPath, useHeader: true, separator: ","));

pipeline.Add(new ColumnCopier(("fare_amount", "Label")));

pipeline.Add(new CategoricalOneHotVectorizer("vendor_id",

"rate_code",

"payment_type"));

pipeline.Add(new ColumnConcatenator("Features",

"vendor_id",

"rate_code",

"passenger_count",

"trip_distance",

"payment_type"));

pipeline.Add(new FastTreeRegressor());

PredictionModel<TaxiTrip, TaxiTripFarePrediction> model = pipeline.Train<TaxiTrip, TaxiTripFarePrediction>();

if (!Directory.Exists(ModelDirectory))

{

Directory.CreateDirectory(ModelDirectory);

}

await model.WriteAsync(ModelPath);

return model;

}

public static void Evaluate(PredictionModel<TaxiTrip, TaxiTripFarePrediction> model)

{

var testData = new TextLoader<TaxiTrip>(TestDataPath, useHeader: true, separator: ",");

var evaluator = new RegressionEvaluator();

RegressionMetrics metrics = evaluator.Evaluate(model, testData);

// Rms should be around 2.795276

Console.WriteLine("Rms=" + metrics.Rms);

Console.WriteLine("RSquared = " + metrics.RSquared);

}

static async Task Main(string[] args)

{

PredictionModel<TaxiTrip, TaxiTripFarePrediction> model = await Train();

Evaluate(model);

var prediction = model.Predict(TestTrips.Trip1);

Console.WriteLine("Predicted fare: {0}, actual fare: 29.5", prediction.fare_amount);

}

}

}

不知不觉我们的ML.NET之旅又向前进了一步,是不是对于使用.NET Core进行机器学习解决现实生活中的问题更有兴趣了?请保持关注吧。

原文地址: http://www.cnblogs.com/BeanHsiang/p/9017618.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

使用ML.NET预测纽约出租车费相关推荐

  1. 【Kaggle】纽约市出租车费预测(经典)

    [参考:New York City Taxi Fare Prediction | Kaggle] [参考:美国纽约市出租车大数据探索-基于kaggle比赛_@Irene的博客-CSDN博客]这个参考较 ...

  2. Kaggle-纽约市出租车费预测

    1 数据导入 在kaggle上下载完训练数据和测试数据之后,将数据导入.由于训练数据集过大,电脑配置有限,训练集只导入100000条记录. trainData=pd.read_csv('train.c ...

  3. 某天没有数据能查出来0数量_用Excel对纽约市出租车费数据探索性分析

    一.引言 背景:在纽约,游客们往往把自由女神象.帝国大厦.中央公园等视为纽约的象征, 但穿梭在人海中的出租车也是纽约靓丽的人文景观之一, 是其流动的风景线, 在纽约公共文化中别具魅力.本篇文章利用之前 ...

  4. 贪心入门——出租车费

    问题 B: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 6 解决: 6 [提交][状态][讨论版] 题目描述 某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里: ...

  5. ML之预测:玩转2018世界杯—采用机器学习预测小组赛、十六比赛、四决赛、半决赛、决赛以及世界杯总冠军的各个队伍

    ML之预测:玩转2018世界杯-采用机器学习预测小组赛.十六比赛.四决赛.半决赛.决赛以及世界杯总冠军的各个队伍 导读       机器学习预测.玩转2018世界杯-采用机器学习预测小组赛.十六比赛. ...

  6. codeup 1128: 出租车费 贪心|找规律

    1128: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 871 解决: 299 [提交][状态][讨论版][命题人:外部导入] 题目描述 某市出租车计价规则如下:起步4公里10元 ...

  7. ML.NET教程之出租车车费预测(回归问题)

    理解问题 出租车的车费不仅与距离有关,还涉及乘客数量,是否使用信用卡等因素(这是的出租车是指纽约市的).所以并不是一个简单的一元方程问题. 准备数据 建立一控制台应用程序工程,新建Data文件夹,在其 ...

  8. [转载] 使用神经网络和ml模型预测客户流失

    参考链接: Keras中的深度学习模型-探索性数据分析(EDA) This story is a walk-through of a notebook I uploaded on Kaggle. Or ...

  9. ML .NET 预测订单是否被退货

    场景 根据历史订单的退货情况,预测新订单是否被退货 这次利用ML .NET的数据分类功能,将订单状态分为退货.不退货两种,计算每笔订单被退货.不被退货的概率 需要注意的是,这里是文本数据分类,使用数据 ...

最新文章

  1. Spring AOP切面的时候参数的传递
  2. JAVA-WEB开发环境和搭建
  3. 给大家推荐9个专业分享生信技术的公众号
  4. 上位机通过串口获取单片机数据
  5. PAT甲级1002 多项式相加
  6. Halcon 4点单标相机外参
  7. mysql 自增长id string_Mysql中获取刚插入的自增长id的三种方法归纳
  8. Linux学习笔记(用户管理)
  9. 【Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/hml/Library/LaunchAgents/homebre】
  10. 为什么说90%以上的创业者都在亏钱?
  11. SpringBoot后端+Vue之AntDesignVue前端实现查询表格导出excel功能
  12. 电脑上的记事本便签纸怎么用
  13. 学系统集成项目管理工程师(中项)系列17a_范围管理(上)
  14. 中国石油大学《催化原理》第三阶段在线作业
  15. 动画练习:Punch
  16. Html5禁止浏览器后退,多页面网站禁用浏览器后退键
  17. 用代理IP帮助网络推广
  18. 地址栏HTTPS怎么实现的
  19. react native : Implementing unavailable method
  20. adb shell下使用命令行删除android系统中指定文件和文件夹

热门文章

  1. 批处理解决局域网共享打印机问题
  2. 自已做的第一个autoconf程序(不断完善中)
  3. Asp.NET Core 一个接口的多个实现如何通过 DI 注册?
  4. 使用C#开发交互式命令行应用
  5. 如何编写干净流畅的Web API测试
  6. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异
  7. NET问答: 如何让 HttpClient 支持 Http 2.0 协议?
  8. 祝福!微软 46 周年生日快乐!
  9. 跟我一起学Redis之加个哨兵让主从复制更加高可用
  10. 使用 C# 9.0 新语法提升 if 语句美感