2016-10-17 2 views
2

CDC 데이터 세트에 가장 적합한 분류자를 찾기 위해 코드를 약간 코딩했습니다. 먼저 다양한 scikit-learn 분류기를 시도한 다음 API가 거의 동일하므로 TF.Learn 클래스 (DNNClassifier 및 LinearClassifier)를 추가하기로 결정했습니다.TF.Learn의 정확도 문제 DNNClassifier 및 LinearClassifier

그런 다음 결과를 비교할 때 모든 scikit-learn 모델은 TF로 60-70 %의 정확도와 손쉬운 도달률을 보입니다. DNanClassifier 및 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 나는 0 또는 1 (그리고 1, 2 원래 CDC 데이터 세트에서와 같이) 나는이 분류의 테스트를 실행 다시로 라벨을 수정했습니다. 새로운 결과는 다음과 같습니다.

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 학습 분류 자 ​​뒤에 상당히 있습니다. scickit learn Multi-layer Perceptron classifier와 같이 DNNClassifier가 "불량"하다고 생각할 수도 있습니다.

데이터 및 분류 자의 종류를 고려할 때 TF.Learn DNNClassifier 및 LinearClassifier의 정확도가 좋지 않다고 생각하십니까?

+0

더 많은 시간 (더 많은 단계) 동안 시도하고 결과가 일관성이 있는지 확인할 수 있습니까? 200 걸음이 너무 심하게 보인다. – sygi

+0

나는 방금 5000 steps, 같은 결과, 약 34 %의 정확도로 시도했다. (그러나 scikit learn classifier의 즉석 결과와 비교하여 5 초가 소요된다.) – Shazz

+0

tf.learn의 RandomForestEstimator가주는 것은 무엇인가? 예를 들어, DNNClassifier에 대한 예제는 examples/random_forest_mnist.py를 참고하십시오. – jonas25007

답변

3

문제는 TF.learn 분류기가 클래스 레이블을 색인으로 요구한다는 것입니다 (예 : 2 클래스 문제의 경우 y는 0 또는 1이어야 함) 반면 scikit 학습 분류 프로그램은 y를 임의의 값으로 취급합니다 (예 : 77 및 99는 2 클래스 문제에서 y에 유효한 값).

이 경우 데이터를 보면 클래스 레이블은 1과 2입니다. 결과적으로 TF.learn 교육에서는 범위를 벗어나는 값 2가 때때로 무시되어 무시됩니다. 결과적으로 항상 '1'을 예측합니다 (predict()를 호출 한 후 'prediction'및 'Y_test'를 인쇄하면이 값이 분명 해집니다). 레이블 값 '1'은 아마도 데이터의 40 %이므로 40 %의 정확도를 갖습니다.

해결 방법은 레이블을 클래스 색인 (예 : 레이블 '1'에서 색인 0, 레이블 2에서 색인 1)에 매핑하는 것입니다. 적어도 호환 될 이상적으로 두 개의 API를

# 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) 
    ... 

, 또는 (더 일반적인 해결책은 임의의 값에 대한 더 좋을 것이다하지만) 데이터를로드 한 후 - 예를 들어, 나는 "1 Y = Y"로 이런 짓을 TF.learn API는이 구분을보다 명확하게 문서화해야합니다. 틀림없이 클래스 색인을 사용하는 것이 임의의 클래스 (예 : 이미지 클래스)에 대해보다 효율적이고 명확합니다.

+0

고마워요 쿠마라 ... 지금은 바보예요 :)하지만 자리 잡기는 쉽지 않았습니다. 그래서 레이블을 0 또는 1 (남성/여성)으로 수정하고 다시 분류 자 ​​테스트를 실행했습니다. 그게 더 좋지만 아직 좋지는 않습니다. 나는 주요 질문을 업데이트했다. – Shazz