带有sklearn的python中的轮廓系数
Posted
技术标签:
【中文标题】带有sklearn的python中的轮廓系数【英文标题】:silhouette coefficient in python with sklearn 【发布时间】:2013-12-20 20:35:11 【问题描述】:我在使用 sklearn 计算 python 中的轮廓系数时遇到问题。 这是我的代码:
from sklearn import datasets
from sklearn.metrics import *
iris = datasets.load_iris()
X = pd.DataFrame(iris.data, columns = col)
y = pd.DataFrame(iris.target,columns = ['cluster'])
s = silhouette_score(X, y, metric='euclidean',sample_size=int(50))
我得到错误:
IndexError: indices are out-of-bounds
我想使用 sample_size 参数,因为在处理非常大的数据集时,轮廓太长而无法计算。任何人都知道这个参数是如何工作的?
完整的回溯:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-72-70ff40842503> in <module>()
4 X = pd.DataFrame(iris.data, columns = col)
5 y = pd.DataFrame(iris.target,columns = ['cluster'])
----> 6 s = silhouette_score(X, y, metric='euclidean',sample_size=50)
/usr/local/lib/python2.7/dist-packages/sklearn/metrics/cluster/unsupervised.pyc in silhouette_score(X, labels, metric, sample_size, random_state, **kwds)
81 X, labels = X[indices].T[indices].T, labels[indices]
82 else:
---> 83 X, labels = X[indices], labels[indices]
84 return np.mean(silhouette_samples(X, labels, metric=metric, **kwds))
85
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in __getitem__(self, key)
1993 if isinstance(key, (np.ndarray, list)):
1994 # either boolean or fancy integer index
-> 1995 return self._getitem_array(key)
1996 elif isinstance(key, DataFrame):
1997 return self._getitem_frame(key)
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in _getitem_array(self, key)
2030 else:
2031 indexer = self.ix._convert_to_indexer(key, axis=1)
-> 2032 return self.take(indexer, axis=1, convert=True)
2033
2034 def _getitem_multilevel(self, key):
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in take(self, indices, axis, convert)
2981 if convert:
2982 axis = self._get_axis_number(axis)
-> 2983 indices = _maybe_convert_indices(indices, len(self._get_axis(axis)))
2984
2985 if self._is_mixed_type:
/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _maybe_convert_indices(indices, n)
1038 mask = (indices>=n) | (indices<0)
1039 if mask.any():
-> 1040 raise IndexError("indices are out-of-bounds")
1041 return indices
1042
IndexError: indices are out-of-bounds
【问题讨论】:
请粘贴更多的回溯。您不必用 int 包装 50。 我编辑有回溯。 50 以前是一个变量。我更改了它以确保我有一个固定值的错误。我忘了删除 int。 【参考方案1】:silhouette_score 需要常规的 numpy 数组作为输入。为什么要将数组包装在数据框中?
>>> silhouette_score(iris.data, iris.target, sample_size=50)
0.52999903616584543
从回溯中,您可以观察到代码在第一个轴上进行了精美的索引(子采样)。默认情况下,索引数据框将索引列而不是行,因此您观察到的问题。
【讨论】:
好的,谢谢。我以 iris 数据集为例,因为我实际上正在为我的项目处理数据框。如果第一个条目是数据框,第二个条目是数组,则 Silhouette 有效。我没有考虑索引的潜在问题。 只需将您的数据帧转换为 numpy 数组(例如使用data_fram.values
),然后再将它们传递给 silhouette_score
函数。以上是关于带有sklearn的python中的轮廓系数的主要内容,如果未能解决你的问题,请参考以下文章
机器学习sklearn----通过轮廓系数确定适合的n_clusters
机器学习sklearn----通过轮廓系数确定适合的n_clusters