大模型实战-文本分类和聚类

https://zhuanlan.zhihu.com/p/629024155

openai的completion与embedding接口

1.Completion可以让模型根据用户的输入进行目动续写,Completion接口,一万面可以直接当作天机器人使用,另一方面,只要善用prompt提示词,就能完成文案撰写、文本摘要、机器翻译等工作2.Embedding可以将用户输入的文本转化成向量。Embedding向量适合作为一个中间结果,用于传统的机器学习场景,比如分类、聚类。

OpenAI 支持批量调用接口,可以在一个请求里一次批量处理很多个请求。通过将 1000 条记录打包在一起处理,速度将会快很多。
对于大数据集,我们不应该存储成 CSV 格式。特别是获取到的 Embedding 数据,它是由很多浮点数组成的。如果存储成 CSV 格式,那么它会把本来只需要 4 个字节的浮点数都用字符串的形式存储下来,这会浪费好几倍的空间,并且写入的速度也会变得很慢。因此,我在这里采用了 parquet 这个序列化的格式。使用 parquet 格式可以节省空间并提高写入速度,整个存储的过程只需要 1 分钟左右。另外,为了确保数据的安全,我们还可以对 parquet 文件进行加密和压缩,这样可以进一步减小存储空间,并且保护数据的机密性。

指标含义

准确率表示模型正确判断为该类别的标题所占的比例,即在所有判断为该类别的标题中有多少是真正属于该类别。举个例子,模型判断有100个标题属于农业新闻,但实际上只有83个标题是农业新闻,那么准确率就是0.83。准确率越高越好,但是并不意味着准确率达到100%就代表模型完全正确,因为模型可能会漏判,所以我们还需要考虑召回率。

召回率表示模型正确判断为该类别的标题占实际该类别下所有标题的比例,即没有漏掉的比例。例如,模型判断有100个标题属于农业新闻,这100个标题实际上都是农业新闻。准确率已经达到100%,但是实际上我们共有200条农业新闻。因此,在农业新闻类别中,我们的召回率只有100/200 = 50%。

因此,评估模型效果时需要考虑准确率和召回率,综合考虑这两个指标得出的结果就是F1分数。F1分数是准确率和召回率的调和平均数,即 F1 Score = 2 * (Precision * Recall) / (Precision + Recall)。当准确率和召回率都为100%时,F1分数也为1。如果准确率为100%,召回率为80%,那么计算得到的F1分数为0.88。F1分数越高越好。

支持样本量表示数据中实际属于该类别的样本数量。一般来说,样本数量越多,该类别的训练结果就越准确。

accuracy:总体上判断正确的分类数除以测试样本数,即模型的整体准确率。
macro average是宏平均,它将每个类别计算得到的指标加在一起取平均。宏平均对于数据分类不平衡的情况非常有用。比如,假设我们进行情感分析,其中90%的样本属于正面情感,而10%的样本属于负面情感。在这种情况下,如果我们的模型在正面情感方面的预测效果很好,准确率达到了90%,但在负面情感方面的准确率只有50%。如果只看整体数据,准确率似乎很高,因为正面情感的样本很多。但是对于我们的目标来说,即找到具有负面情感的客户并与他们沟通、进行赔偿,整体准确率就没有什么用了。而宏平均会将整体准确率计算为(90% + 50%)/2 = 70%。这并不是一个很好的预测结果,我们需要进一步优化模型。宏平均在处理数据样本不平衡的情况下非常有用

文本聚类

K-Means:是一种无监督的聚类算法,其中的K代表类簇个数,Means代表类簇内数据对象的均值。算法基本原理是:先从样本集中随机选取K个样本作为簇中心,并计算所有样本与这K个“簇中心”的距离;对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中;然后再计算每个簇的新的“簇中心”。迭代进行上述过程,直到达到某个终止条件(如迭代次数、簇中心的移动距离小于某个阈值等)为止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1 import numpy as np
2 from sklearn.cluster import KMeans
3
4 embedding_df pd.read_parquet("data/20newsgroups.parquet")
5
6 matrix np.vstack(embedding_df.embedding.values)
7num_of_clusters =20
8
9 kmeans KMeans(n_clusters=num_of_clusters,init="k-means++",n_init=10, random_state=42)
10 kmeans.fit(matrix)
11 labels kmeans.labels_
12 embedding_df["cluster"]=labels
13
14#统计每个clusteri的数量
15 new_df embedding_df.groupby('cluster')['cluster'].count().reset_ind
16#输出结果
17 from IPython.display import display
18 display(new_df)

上述代码通过numPy的stack函数,把所有的Embedding)放到一个矩阵里面,并设置了要聚
合出来的类的数量,最后调用了一下K-Means:算法的ft方法。


大模型实战-文本分类和聚类
https://chunfei-he.github.io/2024/07/05/大模型实战-文本分类和聚类/
作者
Chunfei He
发布于
2024年7月5日
许可协议