当前位置: 首页 > 面试题库 >

如何在sklearn中编写自定义估算器并在其上使用交叉验证?

端木震博
2023-03-14
问题内容

我想检查通过交叉验证的新方法的预测错误。我想知道是否可以将我的方法传递给sklearn的交叉验证功能,以及如何传递给我。

我想要类似的东西sklearn.cross_validation(cv=10).mymethod

我还需要知道如何定义mymethod它应该是一个函数以及哪个输入元素和哪个输出

例如,我们可以考虑将其作为mymethod最小二乘估计器(当然不是sklearn中的估计器)的实现。

我找到了本教程链接,但对我来说还不是很清楚。

他们在文档中使用

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

 >>> clf = svm.SVC(kernel='linear', C=1) 
 >>> scores = cross_validation.cross_val_score(
 ...    clf, iris.data, iris.target, cv=5)
 ...
 >>> scores

但是问题在于,他们正在使用clf通过sklearn内置函数获得的估计量。我应该如何定义自己的估算器才能将其传递给cross_validation.cross_val_score函数?

因此,例如,假设有一个使用线性模型$ y = x \ beta $的简单估计量,其中beta被估计为X [1,:] +
alpha,其中alpha是参数。我应该如何完成代码?

class my_estimator():
      def fit(X,y):
          beta=X[1,:]+alpha #where can I pass alpha to the function?
          return beta
      def scorer(estimator, X, y) #what should the scorer function compute?
          return ?????

使用以下代码,我收到一个错误:

class my_estimator():
    def fit(X, y, **kwargs):
        #alpha = kwargs['alpha']
        beta=X[1,:]#+alpha 
        return beta
>>> cv=cross_validation.cross_val_score(my_estimator,x,y,scoring="mean_squared_error")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\cross_validation.py", line 1152, in cross_val_score
    for train, test in cv)
  File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\externals\joblib\parallel.py", line 516, in __call__
    for function, args, kwargs in iterable:
  File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\cross_validation.py", line 1152, in <genexpr>
    for train, test in cv)
  File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\base.py", line 43, in clone
    % (repr(estimator), type(estimator)))
TypeError: Cannot clone object '<class __main__.my_estimator at 0x05ACACA8>' (type <type 'classobj'>): it does not seem to be a scikit-learn estimator a it does not implement a 'get_params' methods.
>>>

问题答案:

答案还在于sklearn的文档中。

您需要定义两件事:

  • 实现fit(X, y)函数的估计量,X它是带有输入的矩阵,y是输出的向量

  • 可以与以下功能一起使用的计分器功能或可调用对象:scorer(estimator, X, y)并返回给定模型的分数

参考您的示例:首先,scorer不应该是估计器的方法,它是不同的概念。只需创建一个可调用对象:

def scorer(estimator, X, y)
    return ?????  # compute whatever you want, it's up to you to define
                  # what does it mean that the given estimator is "good" or "bad"

或更简单的解决方案:您可以传递字符串'mean_squared_error''accuracy'(文档的此部分提供完整列表)cross_val_score以使用预定义的计分器。

另一种可能性是使用make_scorer工厂功能。

至于第二件事,你可以通过传递参数给你的模型fit_params dict的参数cross_val_score功能(在文档中提到)。这些参数将传递给fit函数。

class my_estimator():
    def fit(X, y, **kwargs):
        alpha = kwargs['alpha']
        beta=X[1,:]+alpha 
        return beta

阅读完所有错误消息(这些错误消息可以清楚地了解丢失的内容)之后,下面是一个简单的示例:

import numpy as np
from sklearn.cross_validation import cross_val_score

class RegularizedRegressor:
    def __init__(self, l = 0.01):
        self.l = l

    def combine(self, inputs):
        return sum([i*w for (i,w) in zip([1] + inputs, self.weights)])

    def predict(self, X):
        return [self.combine(x) for x in X]

    def classify(self, inputs):
        return sign(self.predict(inputs))

    def fit(self, X, y, **kwargs):
        self.l = kwargs['l']
        X = np.matrix(X)
        y = np.matrix(y)
        W = (X.transpose() * X).getI() * X.transpose() * y

        self.weights = [w[0] for w in W.tolist()]

    def get_params(self, deep = False):
        return {'l':self.l}

X = np.matrix([[0, 0], [1, 0], [0, 1], [1, 1]])
y = np.matrix([0, 1, 1, 0]).transpose()

print cross_val_score(RegularizedRegressor(),
                      X,
                      y, 
                      fit_params={'l':0.1},
                      scoring = 'mean_squared_error')


 类似资料:
  • 问题内容: 我正在尝试中构建一个简单的自定义。我在这里可以编写自定义的Transformer,但是我不确定如何在上执行此操作Estimator。我也不明白做什么,为什么我需要这么多的设置方法和获取方法。似乎有一个适用于自定义模型的文档(请参阅此处,但PySpark没有。 示例模型的伪代码: 问题答案: 一般来说,没有文档,因为对于Spark 1.6 / 2.0,大多数相关API都不打算公开。它应该

  • 校验者: @想和太阳肩并肩 @樊雯 翻译者: @\SRY/ 学习预测函数的参数,并在相同数据集上进行测试是一种错误的做法: 一个仅给出测试用例标签的模型将会获得极高的分数,但对于尚未出现过的数据它则无法预测出任何有用的信息。 这种情况称为 overfitting(过拟合). 为了避免这种情况,在进行(监督)机器学习实验时,通常取出部分可利用数据作为 test set(测试数据集) X_test,

  • 问题内容: 我有其他人编写的REST api,其中处理请求到特定url的方法接受一堆从路径参数填充的参数。 撰写此文章的人曾经使用过DropWizard,但我以前没有使用它的经验。我的任务是通过将其与db中的值进行比较来验证studentId字段。这将非常简单,但是我被告知要使用自定义验证程序来执行此操作。我对编写注释非常陌生,但经过大量挖掘后,这样编写了注释, 此后,我将注释添加到了要像这样运行

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触

  • 问题内容: 我正在尝试进行交叉验证,并且遇到一个错误:“找到的输入变量样本数量不一致:[18,1]” 我在熊猫数据框(df)中使用不同的列作为要素,最后一列作为标签。这源自UC Irvine的机器学习存储库。导入我过去使用过的交叉验证程序包时,我收到了一个错误消息,说明它可能已贬值。我将运行决策树,SVM和K-NN。 我的代码是这样的: 任何帮助将是巨大的! 问题答案: 不推荐使用该模块。新模块已

  • 问题内容: 问题 我希望某些观点仅适用于网站的高级用户。 在项目中的各种应用程序中如何使用此装饰器? 问题答案: 你不必为此编写自己的装饰器,就像中已经包含的那样。 还有一个扩展此装饰器的代码段(),该代码段非常适合你的用例。 而且,要(重新)使用装饰器,只需将装饰器放在路径中的模块中,即可从任何其他模块导入它。