使用适合sklearn gridsearchcv

时间:2015-11-09 21:23:57

标签: python machine-learning scikit-learn

我是Sklearn和python的新手;我有一个项目的代码片段,我正试图破译。我希望你们可以帮助我。

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”接收训练数据和标签的索引(而不是标签)。 分类器如何获取索引而不是标签仍然有效

2 个答案:

答案 0 :(得分:2)

标签只是一个抽象术语。它可以是任何东西,单词,数字,索引,任何东西。在你的情况下(无论是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]上培训模型并不重要(标签索引)。

答案 1 :(得分:-1)

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

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

除此之外,我认为值得看一下https://github.com/Azure/azure-powershell/issues