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.
Bence "KNeighborsClassifier" sklearn.neighbors.dist_metrics.DistanceMetric.get_metric' işlevlerini çağırır ve sklearn.neighbors.dist_metrics.PyFuncDistance .__ init__'. – ayhan