2015-11-09 3 views
0

Я новичок в Sklearn и python; У меня есть этот фрагмент кода для проекта, который я пытаюсь расшифровать. Надеюсь, вы, ребята, можете мне помочь.use подходит для sklearn gridsearchcv

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» получает данные обучения и индексы меток (а не метки). Как классификатор принимает индексы, а не метки и все еще работает

+0

Если вы не возражаете, я спрашиваю, откуда вы это взяли? Только причина, о которой я спрашиваю, - это то, что вы сказали, что это работает. У меня нет 'repository', поэтому я не могу проверить его, посмотрев, что такое' dataset', это ссылка на – Leb

+0

@Leb Это фрагмент кода из академического проекта, которому я был назначен. набор данных состоит из отпечатков пальцев wifi (адрес mac, уровень сигнала), метки содержат координаты этого отпечатка пальца в здании. – Amani

+0

Хорошо, * моя догадка * есть: 'from sklearn.cross_validation import ShuffleSplit' возвращает [индексы] (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.ShuffleSplit.html). Таким образом, по внешнему виду они сделали это первым и использовали это в «GridSearchCV». Вот почему индекс используется для 'y_train', который, как я предполагаю, имеет форму (y) (т.е. только столбцы) – Leb

ответ

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] (индексы этикеток).

-1

Очевидно ваши метки кодируются здесь:

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

Помимо этого, я думаю, что стоит посмотреть на SearchGridCV documentation.