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()); }
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(); }