Я думаю, что у M0rkHaV правильная идея. Класс конвейера Scikit-learn - полезный инструмент для инкапсуляции нескольких разных преобразователей вместе с оценщиком в один объект, так что вам нужно вызывать важные методы только один раз ( fit()
, predict()
и т. Д.). Давайте разберем два основных компонента:
Трансформаторы - это классы, реализующие fit()
и transform()
. Возможно, вы знакомы с некоторыми инструментами предварительной обработки sklearn, такими как TfidfVectorizer
и Binarizer
. Если вы посмотрите документацию по этим инструментам предварительной обработки, вы увидите, что они реализуют оба этих метода. Что я считаю довольно крутым, так это то, что некоторые оценщики также могут использоваться как шаги преобразования, например LinearSVC
!
Оценщики - это классы, которые реализуют fit()
и predict()
. Вы обнаружите, что многие классификаторы и регрессионные модели реализуют оба этих метода, и поэтому вы можете легко протестировать множество различных моделей. Можно использовать другой преобразователь в качестве окончательного оценщика (т.е. он не обязательно реализует predict()
, но определенно реализует fit()
). Все это означает, что вы не сможете позвонить predict()
.
Что касается вашего редактирования: давайте рассмотрим текстовый пример. Используя LabelBinarizer, мы хотим превратить список меток в список двоичных значений.
bin = LabelBinarizer() #first we initialize
vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
Теперь, когда бинаризатор настроен на некоторые данные, у него будет вызванная структура classes_
, содержащая уникальные классы, о которых преобразователь «знает». Без вызова fit()
бинаризатора понятия не имеет, как выглядят данные, поэтому вызов transform()
не имеет смысла. Это верно, если вы распечатываете список классов, прежде чем пытаться уместить данные.
print bin.classes_
При этом я получаю следующую ошибку:
AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
Но когда вы поместите бинаризатор в vec
список:
bin.fit(vec)
и попробуй еще раз
print bin.classes_
Получаю следующее:
['cat' 'dog']
print bin.transform(vec)
И теперь, после вызова transform на vec
объекте, мы получаем следующее:
[[0]
[1]
[1]
[1]]
Что касается оценщиков, используемых в качестве преобразователей, давайте воспользуемся DecisionTree
классификатором в качестве примера экстрактора признаков. Деревья решений хороши по многим причинам, но для наших целей важно то, что они имеют возможность ранжировать функции, которые дерево сочло полезными для прогнозирования. Когда вы вызываете transform()
дерево решений, оно берет ваши входные данные и обнаруживает, что, по его мнению, является наиболее важными функциями. Таким образом, вы можете представить себе преобразование вашей матрицы данных (n строк на m столбцов) в меньшую матрицу (n строк на k столбцов), где k столбцов - это k наиболее важных функций, обнаруженных деревом решений.