public void Train(ILabeledExampleCollection <LblT, SparseVector <double> > dataset) { Utils.ThrowException(dataset == null ? new ArgumentNullException("dataset") : null); Utils.ThrowException(dataset.Count == 0 ? new ArgumentValueException("dataset") : null); Dispose(); int[] trainSet = new int[dataset.Count]; int[] labels = new int[dataset.Count]; int j = 0; foreach (LabeledExample <LblT, SparseVector <double> > lblEx in dataset) { SparseVector <double> vec = lblEx.Example; int[] idx = new int[vec.Count]; float[] val = new float[vec.Count]; for (int i = 0; i < vec.Count; i++) { idx[i] = vec.InnerIdx[i] + 1; // *** indices are 1-based in SvmLightLib val[i] = (float)vec.InnerDat[i]; // *** loss of precision (double -> float) } int lbl; if (!mLblToId.TryGetValue(lblEx.Label, out lbl)) { mLblToId.Add(lblEx.Label, lbl = mLblToId.Count + 1); // *** labels start with 1 in SvmLightLib mIdxToLbl.Add(lblEx.Label); } trainSet[j++] = SvmLightLib.NewFeatureVector(idx.Length, idx, val, lbl); } mModelId = SvmLightLib.TrainMulticlassModel(string.Format("-c {0} -e {1}", mC.ToString(CultureInfo.InvariantCulture), mEps.ToString(CultureInfo.InvariantCulture)), trainSet.Length, trainSet); // delete training vectors foreach (int vecIdx in trainSet) { SvmLightLib.DeleteFeatureVector(vecIdx); } }
public Prediction <LblT> Predict(SparseVector <double> example) { Utils.ThrowException(mModelId == -1 ? new InvalidOperationException() : null); Utils.ThrowException(example == null ? new ArgumentNullException("example") : null); Prediction <LblT> result = new Prediction <LblT>(); int[] idx = new int[example.Count]; float[] val = new float[example.Count]; for (int i = 0; i < example.Count; i++) { idx[i] = example.InnerIdx[i] + 1; val[i] = (float)example.InnerDat[i]; // *** cast to float } int vecId = SvmLightLib.NewFeatureVector(idx.Length, idx, val, 0); SvmLightLib.Classify(mModelId, 1, new int[] { vecId }); double score = SvmLightLib.GetFeatureVectorClassifScore(vecId, 0); LblT lbl = mIdxToLbl[score > 0 ? 0 : 1]; LblT otherLbl = mIdxToLbl[score > 0 ? 1 : 0]; result.Inner.Add(new KeyDat <double, LblT>(Math.Abs(score), lbl)); result.Inner.Add(new KeyDat <double, LblT>(-Math.Abs(score), otherLbl)); SvmLightLib.DeleteFeatureVector(vecId); // delete feature vector return(result); }
public Prediction <LblT> Predict(SparseVector <double> example) { Utils.ThrowException(mModelId == -1 ? new InvalidOperationException() : null); Utils.ThrowException(example == null ? new ArgumentNullException("example") : null); Prediction <LblT> result = new Prediction <LblT>(); int[] idx = new int[example.Count]; float[] val = new float[example.Count]; for (int i = 0; i < example.Count; i++) { idx[i] = example.InnerIdx[i] + 1; // *** indices are 1-based in SvmLightLib val[i] = (float)example.InnerDat[i]; // *** loss of precision (double -> float) } int vecId = SvmLightLib.NewFeatureVector(idx.Length, idx, val, 0); SvmLightLib.MulticlassClassify(mModelId, 1, new int[] { vecId }); int n = SvmLightLib.GetFeatureVectorClassifScoreCount(vecId); for (int i = 0; i < n; i++) { double score = SvmLightLib.GetFeatureVectorClassifScore(vecId, i); LblT lbl = mIdxToLbl[i]; result.Inner.Add(new KeyDat <double, LblT>(score, lbl)); } result.Inner.Sort(DescSort <KeyDat <double, LblT> > .Instance); result.Trim(); SvmLightLib.DeleteFeatureVector(vecId); // delete feature vector return(result); }
public void Train(ILabeledExampleCollection <LblT, SparseVector <double> > dataset) { Utils.ThrowException(dataset == null ? new ArgumentNullException("dataset") : null); Utils.ThrowException(dataset.Count == 0 ? new ArgumentValueException("dataset") : null); Dispose(); int[] trainSet = new int[dataset.Count]; int[] labels = new int[dataset.Count]; Dictionary <LblT, int> lblToIdx = new Dictionary <LblT, int>(mLblCmp); MultiSet <int> lblCount = new MultiSet <int>(); int j = 0; foreach (LabeledExample <LblT, SparseVector <double> > lblEx in dataset) { SparseVector <double> vec = lblEx.Example; int[] idx = new int[vec.Count]; float[] val = new float[vec.Count]; for (int i = 0; i < vec.Count; i++) { idx[i] = vec.InnerIdx[i] + 1; val[i] = (float)vec.InnerDat[i]; // *** cast to float } int lbl; if (!lblToIdx.TryGetValue(lblEx.Label, out lbl)) { lblToIdx.Add(lblEx.Label, lbl = lblToIdx.Count); mIdxToLbl.Add(lblEx.Label); } Utils.ThrowException(lbl == 2 ? new ArgumentValueException("dataset") : null); trainSet[j++] = SvmLightLib.NewFeatureVector(idx.Length, idx, val, lbl == 0 ? 1 : -1); lblCount.Add(lbl == 0 ? 1 : -1); } string costFactor = ""; if (mBiasedCostFunction) { costFactor = "-j " + ((double)lblCount.GetCount(-1) / (double)lblCount.GetCount(1)); } mModelId = SvmLightLib.TrainModel(string.Format(CultureInfo.InvariantCulture, "-v {0} -c {1} -t {2} -g {3} -d {4} -s {5} -r {6} -b {7} -e {8} -# {9} {10} {11}", (int)mVerbosityLevel, mC, (int)mKernelType, mKernelParamGamma, mKernelParamD, mKernelParamS, mKernelParamC, mBiasedHyperplane ? 1 : 0, mEps, mMaxIter, mCustomParams, costFactor), trainSet.Length, trainSet); // delete training vectors foreach (int vecIdx in trainSet) { SvmLightLib.DeleteFeatureVector(vecIdx); } }