1

Encog(Java経由)を使用してバイナリ分類器に取り組んでいます。SVM またはニューラル ネットワークを使用してセットアップしました。ROC 曲線の下の領域を (部分的に) 使用して、さまざまなモデルの品質を評価したいと考えています。

より具体的には、理想的には、モデルの出力を、ROC でのランク付けに使用できるある種の予測信頼スコアに変換したいと考えていますが、ドキュメントにはまだ何も見つかりません。

コードでは、次のようなモデルの結果を取得します。

MLData result = ((MLRegression) method).compute( pair.getInput() );
String classification = normHelper.denormalizeOutputVectorToString( result )[0]; 

分類の数値的信頼性を得るにはどうすればよいですか?

4

2 に答える 2

1

encog フレームワーク内の SVM から予測確率を引き出す方法を見つけました。このメソッドは、libSVM の -b オプションに相当するものに依存しています ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.htmlを参照) 。

これを行うには、encog から SVM クラスをオーバーライドします。コンストラクターは、smv_parameter オブジェクト (以下を参照) を介して確率推定を有効にします。次に、計算を行うときに、以下に示すようにメソッド svm_predict_probability を呼び出します。

警告: 以下はコードの断片にすぎません。有用なものにするためには、おそらく他のコンストラクターを作成し、結果の確率を以下のメソッドから渡す必要があります。このフラグメントは、encog バージョン 3.3.0 に基づいています。

public class MySVMProbability extends SVM {

public MySVMProbability(SVM method) {
    super(method.getInputCount(), method.getSVMType(), method.getKernelType());
    // Enable probability estimates 
    getParams().probability = 1;
}


@Override
public int classify(final MLData input) {
    svm_model model = getModel();
    if (model == null) {
        throw new EncogError(
                "Can't use the SVM yet, it has not been trained, " 
                + "and no model exists.");
    }

    final svm_node[] formattedInput = makeSparse(input);
    final double probs[] = new double[svm.svm_get_nr_class(getModel())];
    final double d = svm.svm_predict_probability(model, formattedInput, probs);

    /* probabilities for each class are in probs[] */

    return (int) d;
}


@Override
public MLData compute(MLData input) {
    svm_model model = getModel();
    if (model == null) {
        throw new EncogError(
                "Can't use the SVM yet, it has not been trained, "
                + "and no model exists.");
    }

    final MLData result = new BasicMLData(1);

    final svm_node[] formattedInput = makeSparse(input);

    final double probs[] = new double[svm.svm_get_nr_class(getModel())];
    final double d = svm.svm_predict_probability(model, formattedInput, probs);
    /* probabilities for each class are in probs[] */
    result.setData(0, d);

    return result;
}
}
于 2014-12-17T15:30:10.163 に答える
0

Encog は ROC 曲線を直接サポートしていません。ROC 曲線は、主に Encog の焦点である実際のモデル タイプよりも視覚化に近いものです。

SVM とニューラル ネットワークの ROC 曲線の生成は多少異なります。ニューラル ネットワークの場合、分類ニューロンのしきい値を設定する必要があります。ここにそれについての良い論文があります: http://www.lcc.uma.es/~jja/recidiva/048.pdf

将来的には、ROC 曲線の直接サポートを Encog に追加する可能性があります。それらは非常に一般的な視覚化になりつつあります。

于 2014-12-13T04:43:20.000 に答える