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

标签 python scikit-learn

我想通过交叉验证检查一种新方法的预测误差。 我想知道我是否可以将我的方法传递给 sklearn 的交叉验证函数,以防万一。

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

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

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

我找到了这个教程 link但对我来说不是很清楚。

documentation他们使用

>>> 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的documentation .

你需要定义两件事:

  • 实现 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'(完整列表在 this part of the documentation 中提供)传递给 cross_val_score 函数使用预定义的记分器。

另一种可能是使用 make_scorer工厂函数。

至于第二件事,您可以通过cross_val_scorefit_params dict 参数将参数传递给您的模型。功能(如文档中所述)。这些参数将被传递给 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')

关于python - 如何在 sklearn 中编写自定义估算器并对其使用交叉验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20330445/

相关文章:

python - 在生产系统中重置 Django 迁移

python - 如何使用 python 重置游戏中的随机选择

python - ValueError : After pruning, 没有条款保留。尝试较低的 min_df 或较高的 max_df

python - R 的可训练 sklearn StandardScaler

python - scikit Lasso/LARS 如何用作回归特征选择工具?

python - 如何从数据流中的谷歌存储桶中读取csv文件,合并,对数据流中的数据帧进行一些转换,然后将其转储到bigquery中?

python - 按元素出现频率对 python 列表进行排序

c# - 重定向.net程序的标准输入和输出

python - SciKit-learn 导入错误

scikit-learn - sklearn.preprocessing 中没有 StandardScaler 类