Scikit-learn 的sklearn.metrics.adjusted_rand_score 函数
Scikit-learn的sklearn.metrics.adjusted_rand_score
函数用于计算两个簇分配结果之间的调整兰德指数。调整兰德指数是一种衡量两个簇分配结果相似程度的指标,它考虑到了随机基线,因此相较于兰德指数更具有鲁棒性。该函数的输入是两个列表,分别表示两个簇分配结果。
语法说明
函数的具体语法说明如下:
sklearn.metrics.adjusted_rand_score(labels_true, labels_pred, *, sample_weight=None)
参数说明
labels_true
:array-like or list of int,表示真实的簇分配结果
labels_pred
:array-like or list of int,表示预测的簇分配结果
sample_weight
:array-like of shape (n_samples,), 可选,样本权重
返回值
返回一个正浮点数,表示两个簇分配结果之间的调整兰德指数。
实例一
下面是一个简单的例子,我们定义两个簇分配结果,然后计算它们之间的调整兰德指数。其中,真实的簇分配结果是[0, 0, 1, 1]
,而预测的簇分配结果是[1, 1, 0, 0]
。
from sklearn.metrics import adjusted_rand_score
labels_true = [0, 0, 1, 1]
labels_pred = [1, 1, 0, 0]
score = adjusted_rand_score(labels_true, labels_pred)
print(score)
输出结果为:
-1.0
理论上,调整兰德指数的取值范围为[-1, 1]
,其中-1表示完全不相关,0表示随机情况,1表示完美匹配。显然,本例中的结果是-1,说明预测的簇分配结果与真实的簇分配结果完全不同。
实例二
接下来看一个更为实际的例子,我们假设有一批文本数据,我们使用KMeans算法对其进行聚类,然后使用调整兰德指数来评价聚类的效果。下面是完整代码:
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
from sklearn.decomposition import TruncatedSVD
def load_data():
categories = ['comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories, remove=('headers', 'footers', 'quotes'))
return newsgroups_train
def feature_extraction(data):
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(data)
return X
def kmeans_clustering(X, labels_true):
k = len(set(labels_true))
svd = TruncatedSVD(n_components=k - 1)
X = svd.fit_transform(X)
kmeans = KMeans(n_clusters=k, random_state=0)
labels_pred = kmeans.fit_predict(X)
score = adjusted_rand_score(labels_true, labels_pred)
return score
def main():
data = load_data().data
X = feature_extraction(data)
labels_true = load_data().target
score = kmeans_clustering(X, labels_true)
print('ARI score is', score)
if __name__ == '__main__':
main()
代码中,我们先从sklearn.datasets库中读取20个新闻组数据(不包含头部、尾部和引用),然后使用TfidfVectorizer进行特征提取,得到向量表示的文本数据。接着,我们使用TruncatedSVD
进行降维,将特征数降到聚类的数目。最后,我们使用k-means算法对数据进行聚类,得到结果后使用调整兰德指数来评价聚类效果。
输出结果为:
ARI score is 0.22767248567176146
根据调整兰德指数的定义,该结果表明k-means算法对20个新闻组数据的聚类效果一般,并不完全匹配真实的簇分配结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解 Scikit-learn 的 metrics.adjusted_rand_score函数:调整兰德指数评估聚类结果 - Python技术站