Сохранить промежуточные результаты склеарн конвейера - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть пример кода - конвейер sklearn, который состоит из двух компонентов (PCA и Random Forest), я хочу использовать промежуточные результаты конвейера, чтобы придать некоторую объяснимость. Я знаю, что можно использовать .get_params () для просмотра промежуточных шагов, но возможно ли сохранить или извлечь промежуточные результаты для дополнительных действий? Я хочу применить дополнительные функции PCA (разделы 1.1 и 1.2 в коде)

from sklearn.datasets import load_breast_cancer
import numpy as np
import pandas as pd
from sklearn.decomposition import FastICA, PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

#Convert the dataset to data frame
cancer = load_breast_cancer()     
data = np.c_[cancer.data, cancer.target]
columns = np.append(cancer.feature_names, ["target"])
df = pd.DataFrame(data, columns=columns)


#Split data into train and test 
X = df.iloc[:, 0:30].values
Y = df.iloc[:, 30].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)


#Create a pipeline 
n_comp = 12
clf = Pipeline([('pca', PCA(n_comp)), ('RandomForest', RandomForestClassifier(n_estimators=100))])
clf.fit(X_train, Y_train)


#Evalute the pipeline 
cr = classification_report(Y_test, Y_pred)
print(cr)


#see the intermediate steps of the pipeline
print(clf.get_params()['pca'])


##1.1 if I create PCA outside of the pipeline 
pca = PCA(n_components=10)
principalComponents = pca.fit_transform(X)

##1.2 some explainability on pca outside of the pipeline 
pca.explained_variance_ratio_

1 Ответ

1 голос
/ 06 февраля 2020

Мы можем присвоить get_params() переменной, которая должна возвращать объект типа sklearn.decomposition.pca.PCA. Благодаря этому мы можем получить доступ ко всем методам и атрибутам разложения.

from sklearn.datasets import load_breast_cancer
import numpy as np
import pandas as pd
from sklearn.decomposition import FastICA, PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

#Convert the dataset to data frame
cancer = load_breast_cancer()     
data = np.c_[cancer.data, cancer.target]
columns = np.append(cancer.feature_names, ["target"])
df = pd.DataFrame(data, columns=columns)


#Split data into train and test 
X = df.iloc[:, 0:30].values
Y = df.iloc[:, 30].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)


#Create a pipeline 
n_comp = 12
clf = Pipeline([('pca', PCA(n_comp)), ('RandomForest', RandomForestClassifier(n_estimators=100))])
clf.fit(X_train, Y_train)


### --- ###
pca = clf.get_params()['pca']

type(pca)
#sklearn.decomposition.pca.PCA

pca.explained_variance_ratio_
#array([9.81327198e-01, 1.67333696e-02, 1.73934848e-03, 1.05758996e-04,
#       8.29268494e-05, 6.34081771e-06, 3.75309113e-06, 7.08990845e-07,
#       3.16742542e-07, 1.75055859e-07, 7.11274270e-08, 1.43003803e-08])

pca.components_.shape
#(12, 30)

Надеюсь, это поможет.

...