2016-10-17 8 views
2

CDCデータセットに適合する最適な分類子を見つけるためのコードを少しコード化しました。最初に、さまざまなscikit-learnクラシファイアを試してみましたが、APIがほぼ同じであるため、TF.Learnクラス(DNNClassifierとLinearClassifier)を追加することにしました。TF.Learnの精度問題DNNClassifierとLinearClassifier

次に、私が結果を比較すると、すべてのscikit-learnモデルが容易に60〜70%の精度に達し、TF.learn DNNClassifiersとLinearClassifierで38%を超えることはできず、時間がかかります私はモデルのフィッティング中にステップ数を設定しません)。

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)  

for classifier in classifiers: 
    if classifier == "TF Deep Neural Network": 
     feature_columns = learn.infer_real_valued_columns_from_input(X_train) 
     clf = DNNClassifier(feature_columns=feature_columns, 
          hidden_units=[10,10,10], 
          n_classes=2, enable_centered_bias=None); 
     clf.fit(X_train, Y_train, steps=200) 
    elif classifier == "TF Linear Classifier": 
     feature_columns = learn.infer_real_valued_columns_from_input(X_train) 
     clf = LinearClassifier(n_classes=2, feature_columns=feature_columns)  
     clf.fit(X_train, Y_train, steps=200) 
    else: 
     clf = getInstance(classifiers[classifier][0], classifiers[classifier][1], classifiers[classifier][2]) 
     clf.fit(X_train, Y_train) 


    # predict on test data 
    prediction = clf.predict(X_test) 

    # compute accuracy and sum it to the previous ones 
    accuracy = accuracy_score(Y_test, prediction) 

結果エキス:ここ

classifier Gaussian Naive Bayes accuracy 0.85 
classifier K-Nearest Neighbors accuracy 0.87 
classifier TF Deep Neural Network accuracy 0.4 
classifier Random Forest accuracy 0.85 
classifier TF Linear Classifier accuracy 0.4 
classifier Decision Tree accuracy 0.87 
classifier Neural Network accuracy 0.4 
classifier AdaBoost accuracy 0.86 
classifier Linear Support Vector Machine accuracy 0.88 
classifier Radial Basic Function Support Vector Machine accuracy 0.74 

全コード

私はおそらくミスを犯したが、私はそれを見ていない...ここで

は、コードの抽出物です: https://github.com/shazz/gender_classification_challenge/blob/master/demo_with_BRFSS_and_TF.py

したがって、正確性が非常に低い理由についての洞察は(また、フィットする時間)TF.Learnと感謝されます!クマラの答え

に基づい

UPDATE Iは、(元のCDCデータセットと同様としない1及び2)は0または1であるとラベルを変更し、私は再び分類テストを実行しました。新しい結果は次のとおりです。

classifier AdaBoost accuracy 0.87 
classifier Linear Support Vector Machine accuracy 0.86 
classifier K-Nearest Neighbors accuracy 0.86 
classifier Gaussian Naive Bayes accuracy 0.85 
classifier Random Forest accuracy 0.85 
classifier Radial Basic Function Support Vector Machine accuracy 0.83 
classifier Decision Tree accuracy 0.83 
classifier Neural Network accuracy 0.64 
classifier TF Deep Neural Network accuracy 0.63 
classifier TF Linear Classifier accuracy 0.62 

まだscikit learn classifiersのかなり後ろです。 意味があるのは、scikit多層マルチパーセプトロン分類器と同様、DNNClassifierが「不良」であることです。

データの種類と分類子を考慮すると、TF.Learn DNNClassifierとLinearClassifierの精度はよくないと思いますか?

+0

長い時間(より多くのステップ)試して結果が一致するかどうか確認できますか? 200歩がひどくないようです。 – sygi

+0

私はちょうど5000ステップ、同じ結果、約34%の精度で試しました(しかし、scikitラーニングクラシファイアからの瞬時の結果と比較して5秒かかる) – Shazz

+0

tf.learnのRandomForestEstimatorはあなたに何を与えるのですか?それは、例えば、 DNNClassifierについてはexamples/random_forest_mnist.pyを見てください。 – jonas25007

答えて

3

問題は、TF.learn分類器がクラスラベルをインデックスとして期待していることです(つまり、2つのクラス問題ではyは0または1でなければなりません)。scikit学習分類器はyを任意の値として扱います。 2クラスの問題ではyの有効な値)。

この場合、データを見ると、クラスラベルは1と2です。その結果、TF.learnトレーニングでは、範囲外の値2が時々無視されて無視されます。結果として、常に '1'が予測されます(これはpredict()を呼び出した後に 'predict'と 'Y_test'を出力すると明白になります)。ラベル値 '1'はおそらくデータの40%であるため、40%の精度が得られます。

ラベルをクラスインデックスにマッピングすることです(ラベル '1'からインデックス0に、ラベル '2'からインデックス1)。例えば、私が「Y = Y - 1」でこれをしたデータをロードした後(より一般的な解決策は、任意の値のためのより良いであろうが):

# load data and convert Y into 1d vector 
X, Y = data_importer.load_data(500) 
print("X", X.shape, "Y", Y.shape) 

# FIX: Y/Labels are "1" and "2" for male/female. We should convert 
# these to indices into a 2 class space 
# (i.e. "1" is index 0, and "2" is index 1). 
Y = Y - 1 

# train and check the model against the test data for each classifier 
iterations = 1 
results = {} 
for itr in range(iterations): 

    # Resuffle training/testing datasets by sampling randomly 80/20% of the input data 
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) 
    ... 

理想的には2つのAPIの互換性、または少なくともあろうTF.learn APIはこの区別をより明確に文書化すべきである。間違いなくクラスインデックスを使用することは、任意のクラス(例えば画像クラス)の方が効率的かつクリーンである。

+0

ありがとうございますクマラ...今見た目は馬鹿です:)しかし、見つけるのは簡単ではありませんでした。そこで、ラベルを0または1(男性/女性)に変更し、分類テストを再度実行しました。それは良いが、それほど良いことではない。私は主な質問を更新しました。 – Shazz