public override void Initialize() { LibLinearClassifier.Solver solver = (LibLinearClassifier.Solver)Enum.Parse(typeof(LibLinearClassifier.Solver), Configuration.ClassifierTypeOptions[GetType()]["solver"]); string trainPath = Configuration.ClassifierTypeOptions[GetType()]["train"]; string predictPath = Configuration.ClassifierTypeOptions[GetType()]["predict"]; _libLinear = new LibLinearClassifier(solver, NumericFeatureNameTransform.AccessMethod.Memory, FeatureSpace.AccessMethod.Memory, true, Model.ModelDirectory, trainPath, predictPath, null, float.MinValue); _libLinear.OutputProbabilities = true; }
internal override string GetDetails(Prediction prediction, Dictionary <string, string> attFeatureIdInformation) { StringBuilder report = new StringBuilder("Details for model created by prediction \"" + prediction.Name + "\"" + Environment.NewLine); Dictionary <int, Dictionary <int, double> > classFeatureWeight = LibLinearClassifier.GetFeatureWeights(Path.Combine(Model.ModelDirectory, LibLinearClassifier.ModelFileName)); LabelMap labelMap = new LabelMap(Path.Combine(Model.ModelDirectory, LibLinearClassifier.LabelMapFileName)); MemoryNumericFeatureNameTransform featureNameTransform = new MemoryNumericFeatureNameTransform(Path.Combine(Model.ModelDirectory, LibLinearClassifier.FeatureNameTransformFileName)); Dictionary <int, string> liblinearFeatureNumberAttFeatureId = new Dictionary <int, string>(); foreach (string attFeatureId in featureNameTransform) { // nominal features in the ATT have IDs in the transform that include the nominal feature value - trim this off to recover the original ID int dashIndex = attFeatureId.IndexOf('-'); if (dashIndex >= 0) { liblinearFeatureNumberAttFeatureId.Add(featureNameTransform.GetFeatureNumber(attFeatureId), attFeatureId.Substring(0, dashIndex)); } else { liblinearFeatureNumberAttFeatureId.Add(featureNameTransform.GetFeatureNumber(attFeatureId), attFeatureId); } } Dictionary <string, string> attFeatureIdDesc = new Dictionary <string, string>(); foreach (PTL.ATT.Models.Feature f in Model.Features) { attFeatureIdDesc.Add(f.Id, "Feature \"" + f.Description + "\""); } foreach (int classNumber in classFeatureWeight.Keys.OrderBy(i => i)) { report.AppendLine("\tClass \"" + labelMap.GetUnmappedLabel(classNumber.ToString()) + "\""); int maxFeatureNameWidth = classFeatureWeight[classNumber].Keys.Max(f => attFeatureIdDesc[liblinearFeatureNumberAttFeatureId[f]].Length); foreach (int liblinearFeatureNumber in classFeatureWeight[classNumber].Keys.OrderBy(f => - Math.Abs(classFeatureWeight[classNumber][f]))) { string desc = attFeatureIdDesc[liblinearFeatureNumberAttFeatureId[liblinearFeatureNumber]]; double weight = classFeatureWeight[classNumber][liblinearFeatureNumber]; string attFeatureId = liblinearFeatureNumberAttFeatureId[liblinearFeatureNumber]; string information = (attFeatureIdInformation == null || !attFeatureIdInformation.ContainsKey(attFeatureId) ? "" : Environment.NewLine + "\t\t\tInformation: " + attFeatureIdInformation[attFeatureId]); report.AppendLine(string.Format("\t\t{0,-" + maxFeatureNameWidth + "}: weight = {1:0.00}", desc, weight) + information + Environment.NewLine); } report.AppendLine(); } return(report.ToString()); }