-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGlickoEstimator.training.cs
101 lines (87 loc) · 7.94 KB
/
GlickoEstimator.training.cs
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// This file was auto-generated by ML.NET Model Builder.
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers.LightGbm;
using Microsoft.ML.Trainers;
using Microsoft.ML;
namespace Minomuncher
{
public partial class GlickoEstimator
{
public const string RetrainFilePath = @"C:\Users\CSDotNET\source\repos\Minomuncher\NeuralNetwork\bin\Debug\net8.0\OutputFile.csv";
public const char RetrainSeparatorChar = ',';
public const bool RetrainHasHeader = true;
/// <summary>
/// Train a new model with the provided dataset.
/// </summary>
/// <param name="outputModelPath">File path for saving the model. Should be similar to "C:\YourPath\ModelName.mlnet"</param>
/// <param name="inputDataFilePath">Path to the data file for training.</param>
/// <param name="separatorChar">Separator character for delimited training file.</param>
/// <param name="hasHeader">Boolean if training file has a header.</param>
public static void Train(string outputModelPath, string inputDataFilePath = RetrainFilePath, char separatorChar = RetrainSeparatorChar, bool hasHeader = RetrainHasHeader)
{
var mlContext = new MLContext();
var data = LoadIDataViewFromFile(mlContext, inputDataFilePath, separatorChar, hasHeader);
var model = RetrainModel(mlContext, data);
SaveModel(mlContext, model, data, outputModelPath);
}
/// <summary>
/// Load an IDataView from a file path.
/// </summary>
/// <param name="mlContext">The common context for all ML.NET operations.</param>
/// <param name="inputDataFilePath">Path to the data file for training.</param>
/// <param name="separatorChar">Separator character for delimited training file.</param>
/// <param name="hasHeader">Boolean if training file has a header.</param>
/// <returns>IDataView with loaded training data.</returns>
public static IDataView LoadIDataViewFromFile(MLContext mlContext, string inputDataFilePath, char separatorChar, bool hasHeader)
{
return mlContext.Data.LoadFromTextFile<ModelInput>(inputDataFilePath, separatorChar, hasHeader);
}
/// <summary>
/// Save a model at the specified path.
/// </summary>
/// <param name="mlContext">The common context for all ML.NET operations.</param>
/// <param name="model">Model to save.</param>
/// <param name="data">IDataView used to train the model.</param>
/// <param name="modelSavePath">File path for saving the model. Should be similar to "C:\YourPath\ModelName.mlnet.</param>
public static void SaveModel(MLContext mlContext, ITransformer model, IDataView data, string modelSavePath)
{
// Pull the data schema from the IDataView used for training the model
DataViewSchema dataViewSchema = data.Schema;
using (var fs = File.Create(modelSavePath))
{
mlContext.Model.Save(model, dataViewSchema, fs);
}
}
/// <summary>
/// Retrains model using the pipeline generated as part of the training process.
/// </summary>
/// <param name="mlContext"></param>
/// <param name="trainData"></param>
/// <returns></returns>
public static ITransformer RetrainModel(MLContext mlContext, IDataView trainData)
{
var pipeline = BuildPipeline(mlContext);
var model = pipeline.Fit(trainData);
return model;
}
/// <summary>
/// build the pipeline that is used from model builder. Use this function to retrain model.
/// </summary>
/// <param name="mlContext"></param>
/// <returns></returns>
public static IEstimator<ITransformer> BuildPipeline(MLContext mlContext)
{
// Data process configuration with pipeline data transformations
var pipeline = mlContext.Transforms.ReplaceMissingValues(new []{new InputOutputColumnPair(@"Single", @"Single"),new InputOutputColumnPair(@"Double", @"Double"),new InputOutputColumnPair(@"Triple", @"Triple"),new InputOutputColumnPair(@"Quad", @"Quad"),new InputOutputColumnPair(@"Tspin", @"Tspin"),new InputOutputColumnPair(@"TspinSingle", @"TspinSingle"),new InputOutputColumnPair(@"TspinDouble", @"TspinDouble"),new InputOutputColumnPair(@"TspinTriple", @"TspinTriple"),new InputOutputColumnPair(@"TspinMini", @"TspinMini"),new InputOutputColumnPair(@"TspinMiniSingle", @"TspinMiniSingle"),new InputOutputColumnPair(@"PerfectClear", @"PerfectClear"),new InputOutputColumnPair(@"TEfficiency", @"TEfficiency"),new InputOutputColumnPair(@"IEfficiency", @"IEfficiency"),new InputOutputColumnPair(@"CheeseApl", @"CheeseApl"),new InputOutputColumnPair(@"DownStackAPL", @"DownStackAPL"),new InputOutputColumnPair(@"UpStackAPL", @"UpStackAPL"),new InputOutputColumnPair(@"APL", @"APL"),new InputOutputColumnPair(@"APP", @"APP"),new InputOutputColumnPair(@"KPP", @"KPP"),new InputOutputColumnPair(@"KPS", @"KPS"),new InputOutputColumnPair(@"StackHeight", @"StackHeight"),new InputOutputColumnPair(@"GarbageHeight", @"GarbageHeight"),new InputOutputColumnPair(@"SpikeEfficiency", @"SpikeEfficiency"),new InputOutputColumnPair(@"APM", @"APM"),new InputOutputColumnPair(@"OpenerAPM", @"OpenerAPM"),new InputOutputColumnPair(@"MidGameAPM", @"MidGameAPM"),new InputOutputColumnPair(@"PPS", @"PPS"),new InputOutputColumnPair(@"OpenerPPS", @"OpenerPPS"),new InputOutputColumnPair(@"MidGamePPS", @"MidGamePPS"),new InputOutputColumnPair(@"BTBChainEfficiency", @"BTBChainEfficiency"),new InputOutputColumnPair(@"BTBChain", @"BTBChain"),new InputOutputColumnPair(@"BTBChainAPM", @"BTBChainAPM"),new InputOutputColumnPair(@"BTBChainAttack", @"BTBChainAttack"),new InputOutputColumnPair(@"BTBChainAPP", @"BTBChainAPP"),new InputOutputColumnPair(@"BTBChainEfficiency2", @"BTBChainEfficiency2"),new InputOutputColumnPair(@"ComboChain", @"ComboChain"),new InputOutputColumnPair(@"ComboChainAPM", @"ComboChainAPM"),new InputOutputColumnPair(@"ComboChainAttack", @"ComboChainAttack"),new InputOutputColumnPair(@"ComboChainAPP", @"ComboChainAPP"),new InputOutputColumnPair(@"AverageSpikePotential", @"AverageSpikePotential"),new InputOutputColumnPair(@"AverageDefencePotential", @"AverageDefencePotential"),new InputOutputColumnPair(@"BlockfishScore", @"BlockfishScore"),new InputOutputColumnPair(@"BurstPPS", @"BurstPPS"),new InputOutputColumnPair(@"AttackDelayRate", @"AttackDelayRate"),new InputOutputColumnPair(@"PreAttackDelayRate", @"PreAttackDelayRate")})
.Append(mlContext.Transforms.Concatenate(@"Features", new []{@"Single",@"Double",@"Triple",@"Quad",@"Tspin",@"TspinSingle",@"TspinDouble",@"TspinTriple",@"TspinMini",@"TspinMiniSingle",@"PerfectClear",@"TEfficiency",@"IEfficiency",@"CheeseApl",@"DownStackAPL",@"UpStackAPL",@"APL",@"APP",@"KPP",@"KPS",@"StackHeight",@"GarbageHeight",@"SpikeEfficiency",@"APM",@"OpenerAPM",@"MidGameAPM",@"PPS",@"OpenerPPS",@"MidGamePPS",@"BTBChainEfficiency",@"BTBChain",@"BTBChainAPM",@"BTBChainAttack",@"BTBChainAPP",@"BTBChainEfficiency2",@"ComboChain",@"ComboChainAPM",@"ComboChainAttack",@"ComboChainAPP",@"AverageSpikePotential",@"AverageDefencePotential",@"BlockfishScore",@"BurstPPS",@"AttackDelayRate",@"PreAttackDelayRate"}))
.Append(mlContext.Regression.Trainers.LightGbm(new LightGbmRegressionTrainer.Options(){NumberOfLeaves=6077,NumberOfIterations=5351,MinimumExampleCountPerLeaf=32,LearningRate=0.0348779173562721,LabelColumnName=@"Glicko",FeatureColumnName=@"Features",ExampleWeightColumnName=null,Booster=new GradientBooster.Options(){SubsampleFraction=0.00617418716985885,FeatureFraction=0.99999999,L1Regularization=4.75137461226499E-09,L2Regularization=0.212213320351439},MaximumBinCountPerFeature=272}));
return pipeline;
}
}
}