30

小さなコーパスがあり、10 倍の交差検証を使用して単純ベイズ分類器の精度を計算したいのですが、どうすればそれを行うことができますか。

4

5 に答える 5

27

NLTKは機械学習アルゴリズムの相互検証を直接サポートしていないため、オプションは、これを自分で設定するか、NLTK-Trainer のようなものを使用することです。

おそらく別のモジュールを使用してこれを行うことをお勧めしますが、本当に独自のコードを書きたい場合は、次のようなことができます。

10 倍の が必要だとすると、トレーニング セットを10サブセットに分割し、でトレーニング9/10し、残りの でテストし、1/10サブセットの組み合わせごとにこれを行う必要があります ( 10)。

トレーニング セットが という名前のリストにあると仮定すると、trainingこれを達成する簡単な方法は次のようになります。

num_folds = 10
subset_size = len(training)/num_folds
for i in range(num_folds):
    testing_this_round = training[i*subset_size:][:subset_size]
    training_this_round = training[:i*subset_size] + training[(i+1)*subset_size:]
    # train using training_this_round
    # evaluate against testing_this_round
    # save accuracy

# find mean accuracy over all rounds
于 2013-05-04T22:32:47.177 に答える
15

次のように、相互検証のためにライブラリと NLTK の両方を naivebayes sklearn に使用しました。

import nltk
from sklearn import cross_validation
training_set = nltk.classify.apply_features(extract_features, documents)
cv = cross_validation.KFold(len(training_set), n_folds=10, indices=True, shuffle=False, random_state=None, k=None)

for traincv, testcv in cv:
    classifier = nltk.NaiveBayesClassifier.train(training_set[traincv[0]:traincv[len(traincv)-1]])
    print 'accuracy:', nltk.classify.util.accuracy(classifier, training_set[testcv[0]:testcv[len(testcv)-1]])

そして最後に平均精度を計算しました

于 2013-05-05T20:27:04.560 に答える
1

2番目の回答を変更しました:

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)
于 2015-06-28T14:25:36.050 に答える
1

Jared's answerから着想を得て、ジェネレーターを使用したバージョンを次に示します。

def k_fold_generator(X, y, k_fold):
    subset_size = len(X) / k_fold  # Cast to int if using Python 3
    for k in range(k_fold):
        X_train = X[:k * subset_size] + X[(k + 1) * subset_size:]
        X_valid = X[k * subset_size:][:subset_size]
        y_train = y[:k * subset_size] + y[(k + 1) * subset_size:]
        y_valid = y[k * subset_size:][:subset_size]

        yield X_train, y_train, X_valid, y_valid

Xデータ セットには N 個のデータ ポイント (例では = 4) と D 個の特徴 (例では = 2) があると想定しています。関連する N 個のラベルは に格納されyます。

X = [[ 1, 2], [3, 4], [5, 6], [7, 8]]
y = [0, 0, 1, 1]
k_fold = 2

for X_train, y_train, X_valid, y_valid in k_fold_generator(X, y, k_fold):
    # Train using X_train and y_train
    # Evaluate using X_valid and y_valid
于 2016-01-07T16:02:48.327 に答える