gpt4 book ai didi

Scikit-Learn GridSearch 自定义评分函数

转载 作者:行者123 更新时间:2023-12-04 03:40:12 27 4
gpt4 key购买 nike

我需要对维度 (5000, 26421) 的数据集执行内核 pca 以获得较低维度的表示。为了选择分量的数量(比如 k)参数,我正在执行数据的减少和对原始空间的重建,并获得不同 k 值的重建数据和原始数据的均方误差。

我遇到了 sklearn 的 gridsearch 功能,并希望将其用于上述参数估计。由于内核 pca 没有评分函数,所以我实现了一个自定义评分函数并将其传递给 Gridsearch。

from sklearn.decomposition.kernel_pca import KernelPCA
from sklearn.model_selection import GridSearchCV
import numpy as np
import math

def scorer(clf, X):
Y1 = clf.inverse_transform(X)
error = math.sqrt(np.mean((X - Y1)**2))
return error

param_grid = [
{'degree': [1, 10], 'kernel': ['poly'], 'n_components': [100, 400, 100]},
{'gamma': [0.001, 0.0001], 'kernel': ['rbf'], 'n_components': [100, 400, 100]},
]

kpca = KernelPCA(fit_inverse_transform=True, n_jobs=30)
clf = GridSearchCV(estimator=kpca, param_grid=param_grid, scoring=scorer)
clf.fit(X)

但是,它会导致以下错误:
/usr/lib64/python2.7/site-packages/sklearn/metrics/pairwise.py in check_pairwise_arrays(X=array([[ 2.,  2.,  1., ...,  0.,  0.,  0.],
...., 0., 1., ..., 0., 0., 0.]], dtype=float32), Y=array([[-0.05904257, -0.02796719, 0.00919842, .... 0.00148251, -0.00311711]], dtype=float32), precomp
uted=False, dtype=<type 'numpy.float32'>)
117 "for %d indexed." %
118 (X.shape[0], X.shape[1], Y.shape[0]))
119 elif X.shape[1] != Y.shape[1]:
120 raise ValueError("Incompatible dimension for X and Y matrices: "
121 "X.shape[1] == %d while Y.shape[1] == %d" % (
--> 122 X.shape[1], Y.shape[1]))
X.shape = (1667, 26421)
Y.shape = (112, 100)
123
124 return X, Y
125
126

ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 26421 while Y.shape[1] == 100

有人能指出我到底做错了什么吗?

最佳答案

评分函数的语法不正确。您只需要通过predictedtruth分类器的值。这就是您声明自定义评分函数的方式:

def my_scorer(y_true, y_predicted):
error = math.sqrt(np.mean((y_true - y_predicted)**2))
return error

那么你可以使用 make_scorer Sklearn 中的函数将其传递给 GridSearch。一定要设置 greater_is_better相应地属性:

Whether score_func is a score function (default), meaning high is good, or a loss function, meaning low is good. In the latter case, the scorer object will sign-flip the outcome of the score_func.



我假设你正在计算一个错误,所以这个属性应该设置为 False ,因为误差越小越好:
from sklearn.metrics import make_scorer
my_func = make_scorer(my_scorer, greater_is_better=False)

然后你将它传递给 GridSearch :
GridSearchCV(estimator=my_clf, param_grid=param_grid, scoring=my_func)

哪里 my_clf是你的分类器。

还有一件事,我不认为 GridSearchCV正是您正在寻找的。它基本上以训练和测试分割的形式接受数据。但在这里您只想转换您的输入数据。您需要使用 Pipeline in Sklearn .看例子 mentioned here结合 PCA 和 GridSearchCV。

关于Scikit-Learn GridSearch 自定义评分函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com