//************************************************************************************** public override void RebuildClassifier() { Console.WriteLine("Rebuilding classifier: " + ID); // Start removal from children foreach (var i in J48Info.ChildrenID) { if (i != null) { var c = Find((int)i); if (c != null) { c.RemoveClassifier(); } } } // Update info J48Info.OnClassifierRebuild(); WekaJ48Info.UpdateDB(J48Info); // Remove model DeleteModel(ID); // Remove training data DeleteTrainingPoints(ID); }
//************************************************************************************** public static WekaJ48 CreateNew(int iParamtersID, List <ClassifierParameter> iParameters, Candlestick.Period iPeriod, int iProfitTime, List <int> iTrainingPoints) { // Create WekaInfo and retrive ID var info = new WekaInfo(null, typeof(WekaJ48), iParamtersID, iPeriod, iProfitTime); WekaInfo.InsertToDB(info); if (info.ID is null) { throw new Exception("Could not deduct ID"); } // Create J48Info var j48Info = new WekaJ48Info((int)info.ID); WekaJ48Info.UpdateDB(j48Info); // Save training points if (iTrainingPoints != null) { SaveTrainingPoints(iTrainingPoints, "Data/TrainingPoints/Classifier_" + info.ID.ToString() + ".dat"); } // Create classifier return(new WekaJ48(info, iParameters, j48Info)); }
//************************************************************************************** public override void RemoveClassifier() { if (!Exist(ID)) { return; } Console.WriteLine("Removing classifier: " + ID); // Start removal from children foreach (var i in J48Info.ChildrenID) { if (i != null) { var c = Find((int)i); if (c != null) { c.RemoveClassifier(); } } } // Remove model DeleteModel(ID); // Remove training data DeleteTrainingPoints(ID); // Remove info from parents if (J48Info.ParentID != null) { if (Find((int)J48Info.ParentID) is WekaJ48 parent) { for (int i = 0; i < parent.J48Info.ChildrenID.Length; i++) { if (parent.J48Info.ChildrenID[i] == ID) { parent.J48Info.ChildrenID[i] = null; WekaJ48Info.UpdateDB(parent.J48Info); } } } } // Remove info WekaJ48Info.RemoveFromDB(ID); WekaInfo.RemoveFromDB(ID); // Remove target classifier from static list classifiers.Remove(ID); }
//************************************************************************************** /// <summary> /// Build cllasifier model and save it to a file. /// </summary> public override void Build(CandlestickCollection iCandlestick) { List <int> trainingPoints = null; // Calculate average profit and std dev if (J48Info.ProfitAverage is null || J48Info.ProfitStdDev is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); float[] profits = FullToTraining(new List <float>(CalculateFutureProfits(iCandlestick[kTrainingPeriod], ProfitTime)), trainingPoints).ToArray(); J48Info.ProfitStdDev = Statistics.StandardDeviation(profits); J48Info.ProfitAverage = J48Info.ParentID is null ? 0.0f : Statistics.ArithmeticMean(profits); WekaJ48Info.UpdateDB(J48Info); } // Build model if (!File.Exists(ModelFilename)) { OutputMessage("Building model"); if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } Model = new weka.classifiers.trees.J48(); Model.buildClassifier(CreateInstances(iCandlestick, trainingPoints, Attributes, Parameters, Period, ProfitTime)); weka.core.SerializationHelper.write(ModelFilename, Model); } // Perfrom crossfold test if (J48Info.Precision is null) { if (Model is null) { LoadModel(); } OutputMessage("Perfroming crossfold"); if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } var instances = CreateInstances(iCandlestick, trainingPoints, Attributes, Parameters, Period, ProfitTime); var evaluation = new weka.classifiers.Evaluation(instances); evaluation.crossValidateModel(Model, instances, 10, new java.util.Random(0)); J48Info.Precision = (float)evaluation.pctCorrect(); WekaJ48Info.UpdateDB(J48Info); } // Perfrom singular test if (J48Info.IsSingular == null) { if (Model is null) { LoadModel(); } OutputMessage("Perfroming singular test"); var results = new SortedList <Prediction, List <int> >(); foreach (Prediction p in (Prediction[])Enum.GetValues(typeof(Prediction))) { results.Add(p, new List <int>()); } if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } var parameters = CalculateParameters(Parameters, iCandlestick, trainingPoints, Period); for (int k = 0; k < parameters.Count; k++) { var pred = Predict(parameters[k]); results[pred].Add(trainingPoints[k]); } J48Info.IsSingular = results.Count(x => x.Value.Count > 0) <= 1; WekaJ48Info.UpdateDB(J48Info); } // Calculating prediction profits if (J48Info.PredictionProfits.Count(x => x != null) == 0) { if (Model is null) { LoadModel(); } OutputMessage("Calculating prediction profits"); if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } var predictionPoints = GetHistoricalPredictionPoints(iCandlestick, trainingPoints); foreach (Prediction p in (Prediction[])Enum.GetValues(typeof(Prediction))) { float[] profits = FullToTraining(new List <float>(CalculateFutureProfits(iCandlestick[kTrainingPeriod], ProfitTime)), predictionPoints[p]).ToArray(); if (profits.Length < 10) { J48Info.PredictionProfits[(int)p] = DecisionToFutureProfit(p, (float)J48Info.ProfitStdDev, (float)J48Info.ProfitAverage); } else { J48Info.PredictionProfits[(int)p] = Statistics.ArithmeticMean(profits); } } WekaJ48Info.UpdateDB(J48Info); } // Create children if (!J48Info.ReproductionComplete.GetValueOrDefault(false)) { lock (this) { if (J48Info.Precision > 50.0f && !J48Info.IsSingular.GetValueOrDefault(false)) { OutputMessage("Creating children"); if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } var predictionPoints = GetHistoricalPredictionPoints(iCandlestick, trainingPoints); foreach (Prediction p in (Prediction[])Enum.GetValues(typeof(Prediction))) { if (predictionPoints[p] != null && predictionPoints[p].Count >= 1000 && J48Info.ChildrenID[(int)p] == null) { var child = CreateNew(ParametersID, Parameters, Period, ProfitTime, predictionPoints[p]); // Set parent child.J48Info.ParentID = ID; WekaJ48Info.UpdateDB(child.J48Info); // Update parent info J48Info.ChildrenID[(int)p] = (int)child.ID; WekaJ48Info.UpdateDB(J48Info); childs[(int)p] = child; } } } J48Info.ReproductionComplete = true; WekaJ48Info.UpdateDB(J48Info); } } }