2017-09-22 11 views
0

숫자가 아닌 데이터로 KNeighborClassifier을 트레이닝하려고하는데 샘플간에 유사성 점수를 계산할 수있는 사용자 지정 메트릭을 제공하고 있습니다.숫자가 아닌 데이터가있는 KNeighborClassifier가 실패합니다.

from sklearn.neighbors import KNeighborsClassifier 

#Compute the "ASCII" distance: 
def my_metric(a,b): 
    return ord(a)-ord(b) 

#Samples and labels 
X = [["a"],["b"], ["c"],["m"], ["z"]] 

#S=Start of the alphabet, M=Middle, E=end 
y = ["S", "S", "S", "M", "E"] 

model = KNeighborsClassifier(metric=my_metric) 
model.fit(X,y) 

X_test = [["e"],["f"],["w"]] 
y_test = [["S"],["M"],["E"]] 
model.score(X_test, y_test) 

나는 다음과 같은 오류 얻을 :

Traceback (most recent call last): 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 2862, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
File "<ipython-input-20-e339c96eea22>", line 1, in <module> 
    model.score(X_test, y_test) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/base.py", line 350, in score 
    return accuracy_score(y, self.predict(X), sample_weight=sample_weight) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/neighbors/classification.py", line 145, in predict 
    neigh_dist, neigh_ind = self.kneighbors(X) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/neighbors/base.py", line 361, in kneighbors 
    **self.effective_metric_params_) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1247, in pairwise_distances 
    return _parallel_pairwise(X, Y, func, n_jobs, **kwds) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1090, in _parallel_pairwise 
    return func(X, Y, **kwds) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1104, in _pairwise_callable 
    X, Y = check_pairwise_arrays(X, Y) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 110, in check_pairwise_arrays 
    warn_on_dtype=warn_on_dtype, estimator=estimator) 
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/utils/validation.py", line 402, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: could not convert string to float: 'e' 

내가 아주 쉽게 알고리즘을 구현할 수 추측을하지만, sklearn 분류의 모든 기능이없는. 몇 가지 옵션이 없어 졌어? 아니면 단순히 샘플을 수레로 번역하지 않으면 모델을 훈련 할 수 없습니까?

N.B. 그 문제는 문자 대신 숫자를 넣으면 쉽게 해결할 수 있습니다. 그러나 비 수치 데이터를 다루는 또 다른 문제를 해결할 필요가 있으며 이전에 말했듯이 수레로의 간단한 매핑을 찾을 수없는 경우가 있습니다.

답변

1

코드에 몇 가지 오류가 있습니다. 첫째, 당신은 어떻게 든 범주 형 데이터를 수치 형 데이터로 변환해야합니다. Sklearn의 KNN 분류기는 아직 범주 적 데이터를 지원하지 않습니다. 둘째, 맞춤 측정 항목을 사용하려면 sklearn에서 make_Scorer() 함수를 사용해야합니다. KNN의 기본 score 기능은 지정한 측정 항목이 아닌 평균 정확도를 반환합니다. 그것에 대해 자세히 알아보십시오 here. KNN Classifier의이 sklearn 구현을 사용하려면 데이터 세트를 변경해야합니다.

2

모하메드가 이미 언급 한 것 외에 : 당신의 접근 방식은 수학적으로 결함이 있습니다 그리고 sklearn은 아마도 어떤 일이 일어날 지 보증하지 않습니다.

KNN 분류기는 KD-treesBall-trees과 같은 핵심 데이터 구조에 대한 멋진 래퍼입니다. Here you can see what kind of assumptions those need.

Here func is a function which takes two one-dimensional numpy arrays, and returns a distance. Note that in order to be used within the BallTree, the distance must be a true metric: i.e. it must satisfy the following properties

Non-negativity: d(x, y) >= 0

Identity: d(x, y) = 0 if and only if x == y

Symmetry: d(x, y) = d(y, x)

Triangle Inequality: d(x, y) + d(y, z) >= d(x, z)

공정하게 말하십시오. That's just what a metric is.

이렇게 말하면 메트릭은 실제 통계가 아닙니다. (심지어 가장 명백한 규칙 : 음수가 주어지지 않음.

이제 위의 텍스트에서 볼 트리 (KD 트리가 아님)에 대한 경고 만 제공되고 KNN은 기본 트리 구조를 선택합니다 자동으로 여기에 나쁜 경우가있을 수 있으므로 피해야합니다.

KD 트리에도 이러한 가정이 필요한 경우 확실하지 않습니다. 예스라고 생각하면 kd-trees docs이라는 수치는이며 사용 가능한 수치는 kd_tree.valid_metrics입니다. (이 목록은 sklearn과 함께 제공되는 일반적인 측정 항목의 일부 임에도 불구하고)

+0

나는 하나를 떠날 줄 알았습니다. 중요한 지적! 이 정보를 가져 주셔서 감사합니다. 메트릭 속성 :) –