2016-03-22 13 views
0

Sorun:belirli bir işlevi nedeniyle mi diye bir durum yakalamak için nasıl

sklearn kullanıcı tanımlı mesafe oluşturma işlevleri (örneğin KNN için) birkaç algoritmalar kullanılmak üzere izin verir. Ancak, kullanıcı tanımlı işlevi a random numpy array (sayfanın sonunda) oluşturarak sınar. Fonksiyonum kategorik değişkenler için tanımlanır ve bir sözlük aktardığım hesaplamaları hızlandırmak için önceden oluşturduğum mesafe fonksiyonuna. Doğal olarak, sklearn float dizisini test etmek için geçtiğinde, bir KeyError'ı yükseltir çünkü sözlük yalnızca anahtar olarak özellik değerlerine sahiptir.

Kodu:

import pandas as pd 
import numpy as np 
from sklearn import preprocessing 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn import cross_validation 

df = pd.DataFrame(np.random.choice(["a", "b", "c", "d"], (200, 4))) 

for col in df: 
    le = preprocessing.LabelEncoder() 
    le.fit(df[col]) 
    df[col] = le.transform(df[col]) 

value_dict = df[0].value_counts().to_dict() 

def custom_distance(point1, point2, value_dict): 
    #this is not the actual distance function, just a simplified version for reproducibility 
    distance = .0 
    for i in range(1, len(point1)+1): 
     distance += abs(value_dict[point1[i]] - value_dict[point2[i]]) 
    return distance 

neigh_custom = KNeighborsClassifier(n_neighbors=10, metric=custom_distance, 
         metric_params = {"value_dict": value_dict}) 

scores = cross_validation.cross_val_score(neigh_custom, df.ix[:,1:], df.ix[:,0], cv=10) 

Soru:

Ben kaldırdı yalnızca bu istisnayı da yakalayabilir, hatalar orijinal verilerle ancak testin neden olmadığından emin olmak için tarafından PyFuncDistance? Şu anda rasgele üretilip üretilmediğini anlamak için sayının 0 ile 1 arasında olup olmadığını kontrol ediyorum ama bunun iyi bir uygulama olduğunu düşünmüyorum.

+0

Bence "KNeighborsClassifier" sklearn.neighbors.dist_metrics.DistanceMetric.get_metric' işlevlerini çağırır ve sklearn.neighbors.dist_metrics.PyFuncDistance .__ init__'. – ayhan

cevap

1
import traceback 
import sys 


try: 
    scores = cross_validation.cross_val_score(neigh_custom, df.ix[:,1:], df.ix[:,0], cv=10) 
except Exception, err: 
    exc_type, exc_value, exc_traceback = sys.exc_info() 
    sam = traceback.format_exception(exc_type, exc_value, 
              exc_traceback) 
    if 'PyFuncDistance.__init__' in sam[-3]: 
     print 'I knew it' 

Eğer 'zam' kullanmak ve traceback çağrı konuyu

Umut bu yardım yazdırmak için Sam kullanabileceğiniz diğer sorunlar için istisna yükseltmek istiyorsanız !