【问题标题】:use fit for sklearn gridsearchcv使用适合 sklearn gridsearchcv
【发布时间】:2016-02-10 15:45:00
【问题描述】:

我是 Sklearn 和 python 的新手;我有这个代码 sn-p 用于我试图破译的项目。我希望你们能帮助我。

from repository import Repository
from configuration import config
repository = Repository(config)
dataset, labels = repository.get_dataset_and_labels()
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from sklearn.cross_validation import ShuffleSplit
from sklearn.grid_search import GridSearchCV  
# Ensure that there are no NaNs
dataset = dataset.fillna(-85)
# Split the dataset into training (90 \%) and testing (10 \%)
X_train, X_test, y_train, y_test = train_test_split(dataset, labels,      test_size = 0.1 )
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
# Define the classifier to use
estimator = SVC(kernel='linear')
# Define parameter space
gammas = np.logspace(-6, -1, 10)
# Use Test dataset and use cross validation to find bet hyper-p  rameters.
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, [repository.locations.keys().index(tuple(l))  for l in y_train])

我无法理解的是分类器的 fit 方法的使用。在我在网上找到的所有示例中,“fit”都会接收训练数据和相应的标签。在上面的示例中,“fit”接收训练数据和标签(而不是标签)的索引。 分类器如何获取索引而不是标签并且仍然有效

【问题讨论】:

  • 如果你不介意我问,你从哪里得到的?我问的唯一原因是因为你说它有效。我没有repository,所以我无法通过查看dataset 所指的内容来测试它
  • @Leb 这是我被分配到的一个学术项目的代码 sn-p。数据集由wifi指纹(mac地址,信号级别)组成,标签包含该指纹在建筑物中的坐标。
  • 好吧,我的猜测是:from sklearn.cross_validation import ShuffleSplit 返回indices。因此,从外观上看,他们首先做到了这一点,并在GridSearchCV 中使用了它。这就是为什么索引被用于y_train 的原因,我假设它的形状为 (y,)(即仅列)
  • @Leb 所以classifier.fit实际上是接收一个索引列表,而不是y_train中保存的位置?
  • 它正在接收一个索引列表,它表示y_train 的位置。这是使用ShuffleSplit 进行交叉验证的,这就是为什么您看到cv=cv 代表GridSearchCV。换句话说,ShuffleSplit 返回索引,为了让这些索引与y_train 位置相关,必须传递list,即repository.locations.keys().index(tuple(l))

标签: python machine-learning scikit-learn


【解决方案1】:

标签只是一个抽象术语。它可以是任何东西,单词,数字,索引,任何东西。在您的情况下(无论repository.locations.keys().index(...) 是什么,让我们假设它是一个确定性 函数,为简单起见我们称之为f),您创建一个列表

 [f(tuple(l)) for l in y_train]

y_train 本身是一个列表(或更一般的 - 可迭代)。所以上面也是一个标签列表,只是通过f 转换,出于其他原因(也许在这种特殊情况下,用户需要与原始数据集中不同的标签集?)。无论哪种方式,您仍然将 标签 传递给您的 fit 方法,它们只是被转换了。

以标签集 ['cat', 'dog'] 为例,我是在 [x1, x2, x3]['cat', 'cat', 'dog'] 还是在 [x2,x3,x3][0, 0, 1](标签索引)上训练模型并不重要。

【讨论】:

    【解决方案2】:

    显然你的标签在这里编码:

    [repository.locations.keys().index(tuple(l))  for l in y_train]
    

    除此之外,我认为值得关注SearchGridCV documentation

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2022-01-01
      • 2016-07-27
      • 2018-06-02
      • 2021-11-12
      • 1970-01-01
      • 2014-05-12
      • 2017-12-06
      • 2014-01-29
      相关资源
      最近更新 更多