京公网安备 11010802034615号
经营许可证编号:京B2-20210330
短文本主题建模方法
1. 引言
许多数据分析应用都会涉及到从短文本中提取出潜在的主题,比如微博、短信、日志文件或者评论数据。一方面,提取出潜在的主题有助于下一步的分析,比如情感评分或者文本分类模型。另一方面,短文本数据存在一定的特殊性,我们无法直接用传统的主题模型算法来处理它。短文本数据的主要难点在于:
短文本数据中经常存在多词一义的现象[1],比如 “dollar”, “$”, “$$”, “fee”, “charges” 拥有相同的含义,但是受限于文本篇幅的原因,我们很难直接从短文本数据中提取出这些信息。
与长文档不同的地方在于,短文本数据中通常只包含一个主题。这看似很好处理,但是传统的主题模型算法都假设一篇文档中包含多个主题,这给建模分析带来了不小的麻烦。
主题提取模型通常包含多个流程,比如文本预处理、文本向量化、主题挖掘和主题表示过程。每个流程中都有多种处理方法,不同的组合方法将会产生不同的建模结果。
本文将主要从实际操作的角度来介绍不同的短文本主题建模算法的优缺点,更多理论上的探讨可以参考以下文章。
下文中我将自己创建一个数据集,并利用 Python scikit-learn 来拟合相应的主题模型。
2. 主题发现模型
本文主要介绍三个主题模型, LDA(Latent Dirichlet Allocation), NMF(Non-Negative Matrix Factorization)和SVD(Singular Value Decomposition)。本文主要采用 scikit-learn 来实现这三个模型。
除了这三个模型外,还有其他一些模型也可以用来发现文档的结构。其中最重要的一个模型就是 KMeans 聚类模型,本文将对比 KMeans 聚类模型和其他主题模型的拟合效果。
In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD, NMF, LatentDirichletAllocation
from sklearn.cluster import KMeans
首先,我们需要构建文本数据集。本文将以四个自己构建的文本数据集为例来构建主题模型:
clearcut topics: 该数据集中只包含两个主题—— “berger-lovers” 和 “sandwich-haters”。
unbalanced topics: 该数据集与第一个数据集包含的主题信息一致,但是此数据集的分布是有偏的。
semantic topics: 该数据集包含四个主题,分别是 “berger-lovers”, “berger-haters”,”sandwich-lovers” 和 “sandwich-haters”。此外,该数据集中还包含了两个潜在的主题 “food” 和 “feelings”。
noisy topics: 正如前文所说的,短文本数据中经常存在多词一义的现象,该数据集主要用于模拟两个主题不同类型的文本。该数据集文本的篇幅小于其他三个数据集,这可以用来检验模型是否能够很好地处理短文本数据。
In [2]:
def generate_clearcut_topics():
## for demostration purpose, don't take it personally : )
return np.repeat(["we love bergers", "we hate sandwiches"], [1000, 1000])
def generate_unbalanced_topics():
return np.repeat(["we love bergers", "we hate sandwiches"], [10, 1000])
def generate_semantic_context_topics():
return np.repeat(["we love bergers"
, "we hate bergers"
, "we love sandwiches"
, "we hate sandwiches"], 1000)
def generate_noisy_topics():
def _random_typos(word, n):
typo_index = np.random.randint(0, len(word), n)
return [word[:i]+"X"+word[i+1:] for i in typo_index]
t1 = ["we love %s" % w for w in _random_typos("bergers", 15)]
t2 = ["we hate %s" % w for w in _random_typos("sandwiches", 15)]
return np.r_[t1, t2]
sample_texts = {
"clearcut topics": generate_clearcut_topics()
, "unbalanced topics": generate_unbalanced_topics()
, "semantic topics": generate_semantic_context_topics()
, "noisy topics": generate_noisy_topics()
}
In [3]:
from collections import Counter
for desc, texts in sample_texts.items():
print desc
print Counter(texts).most_common()
print ""
noisy topics
[('we love bergerX', 4), ('we love berXers', 4), ('we love Xergers', 3), ('we hate sandwiXhes', 3), ('we hate sandXiches', 3), ('we love bergXrs', 2), ('we hate sanXwiches', 2), ('we hate sandwicheX', 2), ('we hate saXdwiches', 2), ('we hate sXndwiches', 1), ('we hate sandwXches', 1), ('we love bXrgers', 1), ('we hate Xandwiches', 1), ('we love bergeXs', 1)]
clearcut topics
[('we love bergers', 1000), ('we hate sandwiches', 1000)]
unbalanced topics
[('we hate sandwiches', 1000), ('we love bergers', 10)]
semantic topics
[('we love bergers', 1000), ('we love sandwiches', 1000), ('we hate sandwiches', 1000), ('we hate bergers', 1000)]
首先,我们需要考虑下如何评估一个主题模型建模效果的好坏程度。多数情况下,每个主题中的关键词有以下两个特征:
关键词出现的频率得足够大
足以区分不同的主题
一些研究表明:关键词还需具备以下两个特征:
相同主题的文档中关键词共同出现的频率应该差不多
每个主题中关键词的语义应该十分接近,比如水果主题中的 “apples” 和 “oranges”,或者情感主题中的 “love” 和 “hate”。
接下来,我们将介绍如何实现上述的四个模型——NMF, SVD, LDA 和 KMEANS。对于每个主题模型,我们将分别采用两种文本向量化的方法—— TF(Term Frequence) 和 TFIDF(Term-frequence-inverse-document-frequence)。通常情况下,如果你的数据集中有许多词语在多篇文档中都频繁出现,那么你应该选择采用 TFIDF 的向量化方法。此时这些频繁出现的词语将被视为噪声数据,这些数据会影响模型的拟合效果。然而对于短文本数据而言,TF和TFIDF方法并没有显著的区别,因为短文本数据集中很难碰到上述情况。如何将文本数据向量化是个非常热门的研究领域,比如 基于word embedding模型的方法——word2vec和doc2vec。
主题模型将选择主题词语分布中频率最高的词语作为该主题的关键词,但是对于 SVD 和 KMEANS 算法来说,模型得到的主题词语矩阵中既包含正向值也包含负向值,我们很难直接从中准确地提取出主题关键词。为了解决这个问题,我选择从中挑出绝对数值最大的几个词语作为关键词,并且根据正负值的情况加上相应的标签,即对负向词语加上 “^” 的前缀,比如“^bergers”。
In [4]:
def find_topic(texts, topic_model, n_topics, vec_model="tf", thr=1e-2, **kwargs):
"""Return a list of topics from texts by topic models - for demostration of simple data
texts: array-like strings
topic_model: {"nmf", "svd", "lda", "kmeans"} for LSA_NMF, LSA_SVD, LDA, KMEANS (not actually a topic model)
n_topics: # of topics in texts
vec_model: {"tf", "tfidf"} for term_freq, term_freq_inverse_doc_freq
thr: threshold for finding keywords in a topic model
"""
## 1. vectorization
vectorizer = CountVectorizer() if vec_model == "tf" else TfidfVectorizer()
text_vec = vectorizer.fit_transform(texts)
words = np.array(vectorizer.get_feature_names())
## 2. topic finding
topic_models = {"nmf": NMF, "svd": TruncatedSVD, "lda": LatentDirichletAllocation, "kmeans": KMeans}
topicfinder = topic_models[topic_model](n_topics, **kwargs).fit(text_vec)
topic_dists = topicfinder.components_ if topic_model is not "kmeans" else topicfinder.cluster_centers_
topic_dists /= topic_dists.max(axis = 1).reshape((-1, 1))
## 3. keywords for topics
## Unlike other models, LSA_SVD will generate both positive and negative values in topic_word distribution,
## which makes it more ambiguous to choose keywords for topics. The sign of the weights are kept with the
## words for a demostration here
def _topic_keywords(topic_dist):
keywords_index = np.abs(topic_dist) >= thr
keywords_prefix = np.where(np.sign(topic_dist) > 0, "", "^")[keywords_index]
keywords = " | ".join(map(lambda x: "".join(x), zip(keywords_prefix, words[keywords_index])))
return keywords
topic_keywords = map(_topic_keywords, topic_dists)
return "n".join("Topic %i: %s" % (i, t) for i, t in enumerate(topic_keywords))
2.1 SVD: 正交分解
sklearn 中的 truncated SVD implementation 类似于主成分分析算法,它们都试图利用正交分解的方法选择出具有最大方差的变量信息。
对于 clearcut-topic 数据集来说,我们分别利用 TF 和 TFIDF方法来向量化文本数据,并构建 SVD 模型,模型的拟合结果如下所示。正如我们之前所提到的,SVD 模型所提取的关键词中包含正负向词语。为了简单起见, 我们可以理解为该主题包含正向词语,不包含负向的词语。
比如,对于 "Topic 1: bergers | ^hate | love | ^sandwiches" 来说,该文本的主题中包含 “love bergers” 但是不包含 “hate sandwiches”。
由于模型的随机效应,所以每次运行模型得到的结果都会存在细微的差异。在 SVD 的拟合结果中我们发现发现 Topic 3: bergers | ^hate | ^love | sandwiches 成功地提取了 “food” 的主题。
In [9]:
print(find_topic(sample_texts["clearcut topics"], "svd", 4, vec_model="tf"))
Topic 0: bergers | hate | love | sandwiches | we
Topic 1: bergers | ^hate | love | ^sandwiches
Topic 2: bergers | hate | love | sandwiches | ^we
Topic 3: bergers | ^hate | ^love | sandwiches
In [10]:
print(find_topic(sample_texts["clearcut topics"], "svd", 4, vec_model="tfidf"))
Topic 0: bergers | hate | love | sandwiches | we
Topic 1: bergers | ^hate | love | ^sandwiches
Topic 2: bergers | hate | love | sandwiches | ^we
Topic 3: bergers | ^hate | ^love | sandwiches
在上述的例子中,我们设定了过多的主题数量,这是因为大多数时候我们无法事先知道某个文档包含多少个主题。如果我们令主题个数等于2,可以得到下述结果:
In [11]:
print(find_topic(sample_texts["clearcut topics"], "svd", 2, vec_model="tfidf"))
Topic 0: bergers | hate | love | sandwiches | we
Topic 1: bergers | ^hate | love | ^sandwiches
当我们在解释 SVD 模拟的拟合结果时,我们需要对比多个主题的信息。比如上述的模型拟合结果可以解释成:数据集中文档的主要差异是文档中包含 “love bergers” 但不包含 “hate sandwiches”。
接下来我们将利用 SVD 来拟合 unbalanced topic 数据集,检验该模型处理非平衡数据集的效果。
In [12]:
print(find_topic(sample_texts["unbalanced topics"], "svd", 3, vec_model="tf"))
Topic 0: hate | sandwiches | we
Topic 1: bergers | ^hate | love | ^sandwiches | we
Topic 2: bergers | hate | love | sandwiches | ^we
从下述结果中可以看出,SVD无法处理噪声数据,即无法从中提取出主题信息。
In [13]:
print(find_topic(sample_texts["noisy topics"], "svd", 2, vec_model="tf"))
Topic 0: bergerx | bergexs | bergxrs | berxers | bxrgers | hate | love | sandwichex | sandwixhes | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches | xergers
Topic 1: ^bergerx | ^bergexs | ^bergxrs | ^berxers | ^bxrgers | hate | ^love | sandwichex | sandwixhes | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches | ^xergers
2.2 LDA: 根据词语的共现频率来提取主题
LDA 是最常用的主题提取模型之一,因为该模型能够处理多种类型的文本数据,而且模拟的拟合效果非常易于解释。
直观上来看,LDA 根据不同文档中词语的共现频率来提取文本中潜在的主题信息。另一方面,具有相同主题结构的文本之间往往非常相似,因此我们可以根据潜在的主题空间来推断词语之间的相似性和文档之间的相似性。
LDA 算法中主要有两类参数:
每个主题中各个关键词的分布参数
每篇文档中各个主题的分布参数
接下来我们将研究这些参数是如何影响 LDA 模型的计算过程,人们更多的是根据经验来选择最佳参数。
与 SVD 模型不同的是,LDA 模型所提取的主题非常好解释。以 clearcut-topics 数据集为例,LDA 模型中每个主题都有明确的关键词,它和SVD主要有以下两个区别:
LDA 模型中可能存在重复的主题
不同的主题可以共享相同的关键词,比如单词 “we” 在所有的主题中都出现了。
此外,对 LDA 模型来说,采用不同的文本向量化方法也会得到不同的结果。
In [14]:
print(find_topic(sample_texts["clearcut topics"], "lda", 4, vec_model="tf"))
Topic 0: bergers | love | we
Topic 1: bergers | love | we
Topic 2: hate | sandwiches | we
Topic 3: bergers | love | we
In [15]:
print(find_topic(sample_texts["clearcut topics"], "lda", 4, vec_model="tfidf"))
Topic 0: bergers | love | we
Topic 1: bergers | love | we
Topic 2: bergers | love | we
Topic 3: hate | sandwiches | we
在 sklearn 中,参数 topic_word_prior 和 doc_topic_prior 分别用来控制 LDA 模型的两类参数。
其中 topic_word_prior 的默认值是 1n_topics1n_topics,这意味着主题中的每个词语服从均匀分布。
In [16]:
print(find_topic(sample_texts["unbalanced topics"], "lda", 4, vec_model="tf"))
Topic 0: bergers | hate | love | sandwiches | we
Topic 1: hate | sandwiches | we
Topic 2: bergers | hate | love | sandwiches | we
Topic 3: hate | sandwiches | we
选择更小的 topic_word_prior 参数值可以提取粒度更小的主题信息,因为每个主题中都会选择更少的词语。
In [17]:
print(find_topic(sample_texts["unbalanced topics"], "lda", 4, vec_model="tf", topic_word_prior=1e-5))
Topic 0: bergers | love | we
Topic 1: hate | sandwiches | we
Topic 2: hate | sandwiches | we
Topic 3: hate | sandwiches | we
LDA 模型同样无法很好地处理 noisy topics 数据集,从下述结果中可以看出 LDA 模型提取的主题相当模糊:
In [18]:
print find_topic(sample_texts["noisy topics"],"lda",3, vec_model = "tfidf")
Topic 0: bergerx | bergexs | bergxrs | berxers | bxrgers | hate | love | sandwichex | sandwixhes | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches | xergers
Topic 1: bergerx | bergexs | bergxrs | berxers | bxrgers | hate | love | sandwichex | sandwixhes | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches | xergers
Topic 2: bergerx | bergexs | bergxrs | berxers | bxrgers | hate | love | sandwichex | sandwixhes | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches | xergers
2.3 NMF
NMF 可以视为 LDA模型的特例,从理论上来说,这两个模型之间的联系非常复杂。但是在实际应用中,NMF 经常被视为参数固定且可以获得稀疏解的 LDA 模型。虽然 NMF 模型的灵活性不如 LDA 模型,但是该模型可以很好地处理短文本数据集。
另一方面,NMF 最大的缺点是拟合结果的不一致——当我们设置过大的主题个数时,NMF 拟合的结果非常糟糕。相比之下,LDA模型的拟合结果更为稳健。
首先我们来看下 NMF 模型不一致的拟合结果。对于 clearcut topics 数据集来说,当我们设置提取5个主题时,其结果和真实结果非常相似:
In [19]:
print(find_topic(sample_texts["clearcut topics"], "nmf", 5, vec_model="tf"))
Topic 0: bergers | love | we
Topic 1: hate | sandwiches | we
Topic 2: bergers | love | we
Topic 3: bergers | love | we
Topic 4: hate | sandwiches | we
但是当我们增加主题个数时(远大于真实主题数2),NMF 模型将会得到一些奇异的结果:
In [20]:
print(find_topic(sample_texts["clearcut topics"], "nmf", 25, vec_model="tf"))
Topic 0: we
Topic 1: bergers | love | we
Topic 2: hate | sandwiches | we
Topic 3: bergers | love | we
Topic 4: hate | sandwiches | we
Topic 5: bergers | love | we
Topic 6: bergers | love | we
Topic 7: bergers | love | we
Topic 8: hate | sandwiches | we
Topic 9: hate | sandwiches | we
Topic 10: hate | sandwiches | we
Topic 11: bergers | love | we
Topic 12: we
Topic 13: hate | sandwiches
Topic 14: we
Topic 15: we
Topic 16: bergers | love | we
Topic 17: sandwiches | we
Topic 18: we
Topic 19: bergers | love | we
Topic 20: hate | sandwiches | we
Topic 21: sandwiches | we
Topic 22: bergers | love | we
Topic 23: we
Topic 24: bergers | love | we
相比之下,LDA模型的结果十分稳健。
In [21]:
print(find_topic(sample_texts["clearcut topics"], "lda", 25, vec_model="tf"))
Topic 0: bergers | love | we
Topic 1: bergers | love | we
Topic 2: hate | sandwiches | we
Topic 3: bergers | hate | love | sandwiches | we
Topic 4: bergers | love | we
Topic 5: bergers | love | we
Topic 6: bergers | love | we
Topic 7: bergers | love | we
Topic 8: bergers | hate | love | sandwiches | we
Topic 9: bergers | hate | love | sandwiches | we
Topic 10: bergers | hate | love | sandwiches | we
Topic 11: hate | sandwiches | we
Topic 12: bergers | hate | love | sandwiches | we
Topic 13: bergers | love | we
Topic 14: hate | sandwiches | we
Topic 15: bergers | love | we
Topic 16: bergers | love | we
Topic 17: bergers | hate | love | sandwiches | we
Topic 18: hate | sandwiches | we
Topic 19: bergers | love | we
Topic 20: bergers | love | we
Topic 21: bergers | hate | love | sandwiches | we
Topic 22: hate | sandwiches | we
Topic 23: bergers | love | we
Topic 24: hate | sandwiches | we
对于非平衡数据集,设置好合适的主题个数,NMF 可以很好地提取出文档中的主题信息。
In [22]:
print(find_topic(sample_texts["unbalanced topics"], "nmf", 5, vec_model="tfidf"))
Topic 0: hate | sandwiches | we
Topic 1: hate | sandwiches | we
Topic 2: hate | sandwiches | we
Topic 3: hate | sandwiches | we
Topic 4: bergers | love | we
值得注意的是,NMF 是本文提到的四个模型中唯一一个能够较好地处理 noisy topics 数据的模型:
In [23]:
print find_topic(sample_texts["noisy topics"],"nmf",5, vec_model = "tfidf",)
Topic 0: bergerx | bergexs | bergxrs | bxrgers | love | we
Topic 1: bergxrs | hate | sandwichex | sandwxches | sandxiches | sanxwiches | saxdwiches | sxndwiches | we | xandwiches
Topic 2: bergexs | bergxrs | berxers | bxrgers | love | we
Topic 3: bergexs | bergxrs | bxrgers | love | we | xergers
Topic 4: hate | sandwixhes | sandwxches | sxndwiches | we | xandwiches
2.4 KMeans
类似于 KMeans 模型的聚类方法能够根据文档的向量形式对其进行分组。然而这个模型无法看成是主题模型,因为我们很难解释聚类结果中的关键词信息。
但是如果结合 TF或TFIDF方法,我们可以将 KMeans 模型的聚类中心视为一堆词语的概率组合:
In [24]:
print find_topic(sample_texts["clearcut topics"],"kmeans",10, vec_model = "tf",)
Topic 0: hate | sandwiches | we
Topic 1: bergers | love | we
Topic 2: hate | sandwiches | we
Topic 3: bergers | love | we
Topic 4: bergers | love | we
Topic 5: bergers | love | we
Topic 6: bergers | love | we
Topic 7: bergers | love | we
Topic 8: bergers | love | we
Topic 9: bergers | love | we
In [25]:
print find_topic(sample_texts["unbalanced topics"],"kmeans",10, vec_model = "tf",)
Topic 0: hate | sandwiches | we
Topic 1: bergers | love | we
Topic 2: hate | sandwiches | we
Topic 3: hate | sandwiches | we
Topic 4: hate | sandwiches | we
Topic 5: hate | sandwiches | we
Topic 6: hate | sandwiches | we
Topic 7: hate | sandwiches | we
Topic 8: hate | sandwiches | we
Topic 9: hate | sandwiches | we
In [26]:
print find_topic(sample_texts["noisy topics"],"kmeans",10, vec_model = "tf",)
Topic 0: hate | sandwxches | sxndwiches | we | xandwiches
Topic 1: bergexs | berxers | bxrgers | love | we
Topic 2: bergerx | love | we
Topic 3: hate | sandxiches | we
Topic 4: love | we | xergers
Topic 5: hate | sandwixhes | we
Topic 6: hate | sandwichex | we
Topic 7: bergxrs | love | we
Topic 8: hate | sanxwiches | we
Topic 9: hate | saxdwiches | we
2.5 寻找具有高语义相关的主题
最后,我将简单比较下不同的主题提取模型。大多数情况下,我们倾向于根据文档的主题分布情况对其进行分组,并根据关键词的分布情况来提取主题的信息。
大多数研究者都认为词语的语义信息是由其上下文信息所决定的,比如 “love” 和 “hate”可以看成是语义相似的词语,因为这两个词都可以用在 “I _ apples” 的语境中。事实上,词向量最重要的一个研究就是如何构建词语、短语或者文档的向量形式,使得新的向量空间中仍然保留着语义信息。
找寻语义相同的词语不同于计算词语的共现频率。从下述的结果中可以看出,大多数主题提取模型只涉及到词语的共现频率,并没有考虑词语的语义信息,只有 SVD 模型简单涉及到语义信息。
需要注意的是,本文所采用的数据集是根据一定的规则随机生成的,所以下述结果更多的是用于说明不同模型之间的区别:
In [27]:
print(find_topic(sample_texts["semantic topics"], "svd", 4, vec_model="tfidf"))
Topic 0: bergers | hate | love | sandwiches | we
Topic 1: ^hate | love
Topic 2: bergers | ^sandwiches
Topic 3: ^bergers | ^hate | ^love | ^sandwiches | we
In [28]:
print(find_topic(sample_texts["semantic topics"], "nmf", 5, vec_model="tfidf"))
Topic 0: bergers | hate
Topic 1: love | sandwiches | we
Topic 2: hate | we
Topic 3: hate | sandwiches | we
Topic 4: bergers | love | we
In [29]:
print(find_topic(sample_texts["semantic topics"], "lda", 5, vec_model="tfidf"))
Topic 0: love | sandwiches | we
Topic 1: bergers | love | we
Topic 2: bergers | hate | we
Topic 3: bergers | love | we
Topic 4: bergers | love | we
In [30]:
print(find_topic(sample_texts["semantic topics"], "kmeans", 5, vec_model="tfidf"))
Topic 0: hate | sandwiches | we
Topic 1: bergers | hate | we
Topic 2: bergers | love | we
Topic 3: love | sandwiches | we
Topic 4: hate | sandwiches | we
3. 总结
短文本数据集具有其独特的性质,建模时需要特别注意。
模型的选择依赖于主题的定义(共现频率高或者语义相似性)和主题提取的目的(文档表示或者是异常值检验)
我们可以首先采用 KMeans 或者 NMF 模型来快速获取文档的结构信息:
主题中词语的分布情况
文档中主题的分布情况
主题个数
每个主题中词语的个数
LDA 模型具有很好的灵活性,可以处理多种类型的文本数据。但是调参过程需要很好地理解数据结构,因此如果你想构建 LDA 模型,你最好先构建一个基准模型(KMEANS 或 NMF)
SVD 模型可以很好地提取出文本的主要信息。比如 SVD 模型可以很好地分析半结构化的数据(模板数据、截图或者html中的表格数据)。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据分析、质量控制、科研实验等场景中,数据波动性(离散程度)的精准衡量是判断数据可靠性、稳定性的核心环节。标准差(Stan ...
2026-01-29在数据分析、质量检测、科研实验等领域,判断数据间是否存在本质差异是核心需求,而t检验、F检验是实现这一目标的经典统计方法。 ...
2026-01-29统计制图(数据可视化)是数据分析的核心呈现载体,它将抽象的数据转化为直观的图表、图形,让数据规律、业务差异与潜在问题一目 ...
2026-01-29箱线图(Box Plot)作为数据分布可视化的核心工具,能清晰呈现数据的中位数、四分位数、异常值等关键统计特征,广泛应用于数据分 ...
2026-01-28在回归分析、机器学习建模等数据分析场景中,多重共线性是高频数据问题——当多个自变量间存在较强的线性关联时,会导致模型系数 ...
2026-01-28数据分析的价值落地,离不开科学方法的支撑。六种核心分析方法——描述性分析、诊断性分析、预测性分析、规范性分析、对比分析、 ...
2026-01-28在机器学习与数据分析领域,特征是连接数据与模型的核心载体,而特征重要性分析则是挖掘数据价值、优化模型性能、赋能业务决策的 ...
2026-01-27关联分析是数据挖掘领域中挖掘数据间潜在关联关系的经典方法,广泛应用于零售购物篮分析、电商推荐、用户行为路径挖掘等场景。而 ...
2026-01-27数据分析的基础范式,是支撑数据工作从“零散操作”走向“标准化落地”的核心方法论框架,它定义了数据分析的核心逻辑、流程与目 ...
2026-01-27在数据分析、后端开发、业务运维等工作中,SQL语句是操作数据库的核心工具。面对复杂的表结构、多表关联逻辑及灵活的查询需求, ...
2026-01-26支持向量机(SVM)作为机器学习中经典的分类算法,凭借其在小样本、高维数据场景下的优异泛化能力,被广泛应用于图像识别、文本 ...
2026-01-26在数字化浪潮下,数据分析已成为企业决策的核心支撑,而CDA数据分析师作为标准化、专业化的数据人才代表,正逐步成为连接数据资 ...
2026-01-26数据分析的核心价值在于用数据驱动决策,而指标作为数据的“载体”,其选取的合理性直接决定分析结果的有效性。选对指标能精准定 ...
2026-01-23在MySQL查询编写中,我们习惯按“SELECT → FROM → WHERE → ORDER BY”的语法顺序组织语句,直觉上认为代码顺序即执行顺序。但 ...
2026-01-23数字化转型已从企业“可选项”升级为“必答题”,其核心本质是通过数据驱动业务重构、流程优化与模式创新,实现从传统运营向智能 ...
2026-01-23CDA持证人已遍布在世界范围各行各业,包括世界500强企业、顶尖科技独角兽、大型金融机构、国企事业单位、国家行政机关等等,“CDA数据分析师”人才队伍遵守着CDA职业道德准则,发挥着专业技能,已成为支撑科技发展的核心力量。 ...
2026-01-22在数字化时代,企业积累的海量数据如同散落的珍珠,而数据模型就是串联这些珍珠的线——它并非简单的数据集合,而是对现实业务场 ...
2026-01-22在数字化运营场景中,用户每一次点击、浏览、交互都构成了行为轨迹,这些轨迹交织成海量的用户行为路径。但并非所有路径都具备业 ...
2026-01-22在数字化时代,企业数据资产的价值持续攀升,数据安全已从“合规底线”升级为“生存红线”。企业数据安全管理方法论以“战略引领 ...
2026-01-22在SQL数据分析与业务查询中,日期数据是高频处理对象——订单创建时间、用户注册日期、数据统计周期等场景,都需对日期进行格式 ...
2026-01-21