Я пытаюсь найти «лучшее» значение «k» для кластеризации k-средних, используя конвейер, где я использую стандартный масштабатор, за которым следует пользовательское k-средство, за которым, наконец, следует классификатор дерева решений. Затем я пытаюсь использовать этот конвейер для поиска по сетке, чтобы получить наилучшее значение «k». Python 3.7 и используется sklearn.
У меня есть следующий код:
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_blobs
from sklearn.pipeline import Pipeline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.cluster import KMeans
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import GridSearchCV, RandomizedSearchC
class KMeansTransformer(BaseEstimator, TransformerMixin):
def __init__(self, **kwargs):
# The purpose of 'self.model' is to contain the
# underlying cluster model-
self.model = KMeans(**kwargs)
def fit(self, X):
self.X = X
self.model.fit(X)
def transform(self, X):
pred = self.model.predict(X)
return np.hstack([self.X, pred.reshape(-1, 1)])
def fit_transform(self, X, y=None):
self.fit(X)
return self.transform(X)
# Create features and target-
X, y = make_blobs(n_samples=100, n_features=2, centers=3)
# Get shape/dimension-
X.shape, y.shape
# ((100, 2), (100,))
# Create another pipeline using Decision Tree as classifier-
pipe_dt = Pipeline(
[
('sc', StandardScaler()),
('kmt', KMeansTransformer()),
('dt_clf', DecisionTreeClassifier())
]
)
# Train defined pipline-
pipe_dt.fit(X, y)
# Get accuracy score of pipeline-
pipe_dt.score(X, y)
# 1.0
# Make predictions using pipeline defined above-
y_pred_dt = pipe_dt.predict(X)
# Perform hyperparameter search/optimization using 'GridSearchCV'-
# Specify parameters to be hyper-tuned-
params = {
'n_clusters': [2, 3, 5, 7]
}
# Initialize GridSearchCV() object using 3-fold CV-
grid_kmt = GridSearchCV(param_grid=params, estimator=pipe_dt, cv = 3)
# Perform GridSearchCV on training data-
grid_kmt.fit(X, y)
Когда я использую grid_kmt.fit (X, y), он дает мне следующая ошибка:
ValueError: Неверный параметр n_clusters для конвейера оценки (память = нет, шаги = [('s c', StandardScaler (копия = True, with_mean = True, with_std = True) ), ('kmt', KMeansTransformer ()), ('dt_clf', DecisionTreeClassifier (ccp_alpha = 0.0, class_weight = нет, критерий = 'gini', max_depth = нет, max_features = нет, max_leaf_nodes = нет, min_aserease_de__de__de__de__de__de__de__de__de__de__de__de__de__de_) = Нет, min_samples_leaf = 1, min_samples_split = 2, min_weight_fraction_leaf = 0.0, presort = 'не рекомендуется', random_state = Нет, splitter = 'best'))], verbose = False). Проверьте список доступных параметров с помощью estimator.get_params().keys()
.
Однако, когда я инициализирую объект для пользовательских kmeans-
# Initialize a new clustering object-
km = KMeansTransformer(n_clusters=3, init = 'k-means++')
# Get the list of available parameters-
km.get_params().keys()
# dict_keys([])
Тогда почему я получаю 'ValueError'? 'n_clusters' находится в списке доступных параметров для пользовательского объекта кластеризации.
Спасибо!