【发布时间】:2016-07-09 23:50:28
【问题描述】:
问题:
sklearn 允许创建用户定义的距离函数以用于多种算法(例如 KNN)。但是,它通过创建a random numpy array(页面末尾的class PyFuncDistance(DistanceMetric) 的__init__ 来测试用户定义的函数)。我的函数是为分类变量定义的,为了加快计算速度,我将字典传递给我预先构建的距离函数。自然,当 sklearn 传递浮点数组进行测试时,它会引发 KeyError,因为字典只有属性值作为键。
代码:
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)
问题:
为了确保错误不是由原始数据引起的,而是由测试引起的,只有当它由PyFuncDistance 的__init__ 引发时,我才能捕获该异常?目前我正在检查数字是否在 0 和 1 之间,以了解它是否是随机产生的,但我认为这不是一个好习惯。
【问题讨论】:
-
我认为
KNeighborsClassifier调用sklearn.neighbors.dist_metrics.DistanceMetric.get_metric并且它调用sklearn.neighbors.dist_metrics.PyFuncDistance.__init__。
标签: python python-2.7 exception-handling scikit-learn