0

ここに文書化されているように、SciKitLearn で決定木と kNN を使用して、「相互検証による再帰的機能の除去」をプロットしたいと思います。

両方の結果を同時に出力するために、すでに作業している分類子にこれを実装したいと思います。ただし、エラーが発生し続けます。

これは、DT 用に変更したコードです。

from collections import defaultdict

import numpy as np
from sklearn.cross_validation import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sk.learn.feature_selection import RFECV
from sklearn.metrics import zero_one_loss


from scipy.sparse import csr_matrix

lemma2feat = defaultdict(lambda: defaultdict(float))  # { lemma: {feat : weight}}
lemma2cat = dict()
features = set()


with open("input.csv","rb") as infile:
    for line in infile:
        lemma, feature, weight, tClass = line.split()
        lemma2feat[lemma][feature] = float(weight)
        lemma2cat[lemma] = int(tClass)
        features.add(feature)


sorted_rows = sorted(lemma2feat.keys())
col2index = dict()
for colIdx, col in enumerate(sorted(list(features))):
    col2index[col] = colIdx

dMat = np.zeros((len(sorted_rows), len(col2index.keys())), dtype = float)


# populate matrix
for vIdx, vector in enumerate(sorted_rows):
    for feature in lemma2feat[vector].keys():
        dMat[vIdx][col2index[feature]] = lemma2feat[vector][feature]


# sort targ. results.


res = []
for lem in sorted_rows:
    res.append(lemma2cat[lem])


clf = DecisionTreeClassifier(random_state=0)
rfecv = RFECV(estimator=DecisionTreeClassifier, step1, cv=10, 
              scoring='accuracy')
rfecv.fit(dMat)

print("Optimal number of features : %d" % rfecv.n_features_)

# Plot number of features VS. cross-validation scores
import pylab as pl
pl.figure()
pl.xlabel("Number of features selected")
pl.ylabel("Cross validation score (nb of misclassifications)")
pl.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
pl.show()

print "Acc:"
print cross_val_score(clf, dMat, np.asarray(res), cv=10, scoring = "accuracy")

エラーは 56 行目から始まります。具体的には、rfecv = RFECV(estimator=DecisionTreeClassifier, step1, cv=10, SyntaxError: non-keyword arg after keyword arg です。

少なくとも DT でこの関数を実装するためにコードを修正する方法について、誰か洞察を提供できますか?

ogriselからの以下の応答は、引数の問題を解決したように見えましたが、次のエラーを引き起こしました。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "input.py", line 58, in <module>
    rfecv.fit(col_index, rows)
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 321, in fit
    X, y = check_arrays(X, y, sparse_format="csr")
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/sklearn/utils/validation.py", line 211, in check_arrays
    % (size, n_samples))
ValueError: Found array with dim 267. Expected 16

RFE は入力ファイル形式を逆に読み取っているようです (私の入力には 267 のターゲットを持つ 16 の機能が含まれているため)。このように、どのようにしてコードにディムを正しく提供できるのでしょうか?

ありがとうございました。

4

1 に答える 1

1

SyntaxError: non-keyword arg after keyword argstep1は非常に明示的です: キーワード パラメータの後に非キーワード パラメータ (例: ) を渡すことはできませんestimator=DecisionTreeClassifier

したがって、この場合の正しい構文はestimator=、最初の引数のプレフィックスを削除することです。

rfecv = RFECV(DecisionTreeClassifier, step1, cv=10, 
              scoring='accuracy')

ここで、別のエラーが発生します。RFECV は、最初の引数として、クラスではなくモデルのインスタンスを想定しています。デフォルトのディシジョン ツリー パラメーターを使用するには、次を使用します。

rfecv = RFECV(DecisionTreeClassifier(), step1, cv=10, 
              scoring='accuracy')
于 2013-10-04T09:07:36.607 に答える