【问题标题】:How to catch an exception if it's caused by a specific function如果异常是由特定功能引起的,如何捕获异常
【发布时间】: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


【解决方案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'

如果您想为其他问题引发异常,您可以使用“raise”并使用 sam 打印回溯调用问题

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多