使用K-means算法报错:Jupyter中scikit-learn出现'NoneType'无split属性错误
问题:自定义scikit-learn Transformer报错 'NoneType' object has no attribute 'split'
在本地Jupyter Notebook运行自定义聚类相似度Transformer时,出现错误:'NoneType' object has no attribute 'split',但相同代码在Google Colab可正常运行。代码如下:
from sklearn.cluster import KMeans class ClusterSimilarity(BaseEstimator, TransformerMixin): def __init__(self, n_clusters=10, gamma=1.0, random_state=None): self.n_clusters = n_clusters self.gamma = gamma self.random_state = random_state def fit(self, X, y=None, sample_weight=None): self.kmeans_ = KMeans(self.n_clusters, random_state=self.random_state) self.kmeans_.fit(X, sample_weight=sample_weight) return self # always return self! def transform(self, X): return rbf_kernel(X, self.kmeans_.cluster_centers_, gamma=self.gamma) def get_feature_names_out(self, names=None): return [f"Cluster {i} similarity" for i in range(self.n_clusters)] cluster_simil = ClusterSimilarity(n_clusters=10, gamma=1, random_state=42) similarities = cluster_simil.fit_transform(housing_tr[["latitude", "longitude"]], sample_weight=housing_labels)
解决方案
1. 补全缺失的导入语句
代码中未显式导入BaseEstimator、TransformerMixin和rbf_kernel,虽然Colab环境可能隐式依赖,但本地环境可能因缺失导入引发隐式错误。添加以下导入:
from sklearn.base import BaseEstimator, TransformerMixin from sklearn.metrics.pairwise import rbf_kernel
2. 适配旧版scikit-learn的get_feature_names_out方法
scikit-learn 0.24版本之前,get_feature_names_out的API规范尚未完全统一,当传入names=None时,内部逻辑可能尝试对None调用split方法导致报错。修改方法以显式处理None情况:
def get_feature_names_out(self, names=None): # 处理names为None的情况,避免内部调用split报错 if names is None: names = [] return [f"Cluster {i} similarity" for i in range(self.n_clusters)]
3. 统一scikit-learn版本
Google Colab通常使用较新版本的scikit-learn(1.0+),而本地版本可能过低。先查看本地版本:
import sklearn print(sklearn.__version__)
若版本低于0.24,执行升级命令:
pip install --upgrade scikit-learn
内容的提问来源于stack exchange,提问作者Harrsion
相关产品推荐
相关产品推荐

