Склеарн конвейер с PCA на подмножестве функций с использованием FunctionTransformer - PullRequest
0 голосов
/ 30 ноября 2018

Рассмотрим задачу объединения PCA и регрессии, когда PCA выполняет уменьшение размерности, а регрессия - прогнозирование.

Пример, взятый из документации sklearn:

import numpy as np
import matplotlib.pyplot as plt

from sklearn import linear_model, decomposition, datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

logistic = linear_model.LogisticRegression()

pca = decomposition.PCA()
pipe = Pipeline(steps=[('pca', pca), ('logistic', logistic)])

digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target

n_components = [5, 10]
Cs = np.logspace(-4, 4, 3)

param_grid = dict(pca__n_components=n_components, logistic__C=Cs)
estimator = GridSearchCV(pipe,param_grid)
estimator.fit(X_digits, y_digits)

Как выполнитьуменьшение размерности только для подмножества моего набора функций с использованием FunctionTransformer (например, ограничить PCA последними десятью столбцами X_digits)?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете сначала создать функцию (называемую last_ten_columns ниже), которая возвращает последние 10 столбцов ввода X_digits.Создайте преобразователь функции, который указывает на функцию, и используйте его в качестве первого шага конвейера.

import numpy as np
import matplotlib.pyplot as plt

from sklearn import linear_model, decomposition, datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import FunctionTransformer

logistic = linear_model.LogisticRegression()

pca = decomposition.PCA()

def last_ten_columns(X):
    return X[:, -10:]

func_trans = FunctionTransformer(last_ten_columns)

pipe = Pipeline(steps=[('func_trans',func_trans), ('pca', pca), ('logistic', logistic)])

digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target

n_components = [5, 10]
Cs = np.logspace(-4, 4, 3)

param_grid = dict(pca__n_components=n_components, logistic__C=Cs)
estimator = GridSearchCV(pipe, param_grid)
estimator.fit(X_digits, y_digits)
...