详解 Scikit-learn 的 metrics.adjusted_rand_score函数:调整兰德指数评估聚类结果

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技术站

(0)
上一篇 2023年3月30日
下一篇 2023年3月30日

相关文章

合作推广
合作推广
分享本页
返回顶部