版本要求: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