完美解释交叉熵

本文通过硬币猜测游戏的例子,介绍了熵的概念及其在衡量不确定性中的作用,并进一步解释了交叉熵的意义及其在机器学习分类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

通过几个简单的例子来解释和总结什么是交叉熵( Cross Entropy) 以及机器学习分类问题中为什么使用交叉熵。

 

第一个例子

假设随机从一个口袋里取硬币, 口袋里有一个蓝色的, 一个红色的, 一个绿色的, 一个橘色的。

 

取出一个硬币之后, 每次问一个问题, 然后做出判断, 目标是, 问最少的问题, 得到正确答案. 其中一个最好的设计问题的策略如下:

 

每一个硬币有1/4的概率被选中, 1/4(机率) * 2道题目 * 4颗球 = 2,平均需要问两道题目才能找出不同颜色的球,也就是说期望值为2,就是熵(entropy)。

第二个例子

例子变了, 变成了袋子中1/8的硬币是绿色的, 1/8 的是橘色的, 1/4 是红色的, 1/2 是蓝色的, 这时最优的问题的策略如下:

 

1/2 的概率是蓝色, 只需要1个问题就可以知道是或者不是, 1/4 的概率是红色, 需要2个问题, 按照这个逻辑, 猜中硬币需要的问题的期望是 1/2×1+1/4×2+1/8×3+1/8×3=1.75

第三个例子

假设袋子中全部是蓝色的硬币, 那么, 这时候, 需要 0 个问题就可以猜到硬币, 即 log21=0。 需要注意的是, 只有当知道袋子中全部是蓝色的硬币的时候需要的问题是 0 个.

总结上面的例子, 假设一种硬币出现的概率是 p, 那么, 猜中该硬币的所需要的问题数是 log2(1/Pi)。例如, p=1/4, log24=2。

在这个问题中, 问题个数的期望是

 

这个式子就是熵的表达式. 简单来说, 其意义就是在最优化策略下, 猜到颜色所需要的问题的个数。熵代表的是随机变量或整个系统的不确定性,熵越大,随机变量或系统的不确定性就越大。

现在已经了解了熵是什么, 那么, 下面解释交叉熵(cross entropy) 的含义.对于第二个例子, 如果仍然使用第一个例子中的策略, 如下图:

 

1/8 的概率, 硬币是橘色, 需要两个问题, 1/2 的概率是蓝色, 仍然需要两个问题, 也就是说,认为小球的分布为(1/4,1/4,1/4,1/4),这个分布就是非真实分布。平均来说, 需要的问题数是 1/8×2+1/8×2+1/4×2+1/2×2=2。 因此, 在例子二中使用例子一的策略是一个比较差的策略. 其中2是这个方案中的交叉熵。而最优方案的交叉熵是1.75。

给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普遍的说,交叉熵用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出成本的大小。交叉的字面意思在于:真实分布与非真实分布的交叉。给定一个方案, 越优的策略, 最终的交叉熵越低。具有最低的交叉熵的策略就是最优化策略,也就是上面定义的熵。因此, 在机器学习中, 我们需要最小化交叉熵。

数学上来讲, 交叉熵就是

 

其中, p 是真正的概率, 例如例子二中, 橘色和绿色是 1/8, 红色是 1/4, 蓝色是 1/2。p^是错误地假设了的概率, 例如, 在例子二中我们错误地假设了所有的颜色的概率都是 1/4。p和 p^ 可能有点容易混淆. 记住一点, log是用来计算在 你的策略下猜中所需要的问题数, 因此, log中需要的是你的预测概率p^。在决策树中, 如果建立的树不是最优的, 结果就是对于输出的概率分布的假设是错误地, 导致的直接结果就是交叉熵很高。交叉熵不仅仅应用在决策树中, 在其他的分类问题中也有应用。

分类问题

在二分类问题中, 标签 y 是 1 的似然是对于标签 y 的预测 y^, 同样的, 标签是 0 的似然是 1y^. 我们需要最大化似然函数, 而且, 由于二分类问题的特殊性, 根据伯努力分布(Bernoulli distribution),可以把似然函数写成

 

当 y=1 的时候, 第二项为 1, 因此, 优化的是 y^

当 y=0 的时候, 第一项为 1, 优化的是 1y^.对上面的似然函数取对数, 结果是:

 

最大化似然函数, 就是对上面表达式取负然后最小化。也是交叉熵的表达式。 交叉熵有时候也被称为对数损失函数。注意与上边例子区别是多了个负号,上边例子是消除不确定性需要付出的成本;而现在这个加了负号的交叉熵,则是最终的目标函数。

举例来说, 假设我有 3 枚硬币, 正正反, 记为 1,1,0. 预测结果是 0.8, 0.9, 0.3, 那么, 交叉熵的均值是:

1/3(1×log0.8+1×log0.9+(10)×log(10.3))

假设有一个完美的算法, 直接预测出了 1,1,0, 那么交叉熵的结果就是 0.

<think>嗯,用户需要基于京东智能学习机的在线评论数据集,构建LSTM特征分类模型、LSTM情感分析模型,以及应用Apriori关联规则算法。这需要详细的步骤和完整代码,还有每个处理阶段的结果展示。首先,我得理清楚整个流程,从数据预处理到模型构建,再到关联规则分析。 首先,数据预处理是关键。用户提到了数据清洗、分词、停用词处理、向量化等步骤。对于中文评论,分词是必须的,可能需要用jieba库。停用词处理的话,需要加载停用词表,去除无关词汇。然后向量化部分,LSTM通常需要将文本转换为序列,比如使用Tokenizer。这里要注意,特征分类和情感分析可能需要不同的标签处理,比如特征分类可能有多个标签,而情感分析通常是二分类(正面/负面)或多分类。 接下来是LSTM模型的构建。特征分类模型和情感分析模型结构可能类似,但输出层和损失函数会不同。特征分类如果是多标签的话,可能需要用sigmoid激活和二元交叉熵,而情感分析如果是二分类则用sigmoid,多分类用softmax。需要确保模型结构正确,比如嵌入层、LSTM层、全连接层的设置。 然后是Apriori关联规则算法。这部分需要从处理后的数据中提取频繁项集和关联规则。可能需要将评论中的特征词作为事务集,比如每个评论的特征词组合成一个事务,然后应用Apriori找出频繁项集。这里要注意最小支持度和置信度的设置,以及如何展示结果。 代码实现部分,需要分步骤写,并且每个步骤后展示运行结果。比如数据清洗后显示示例,分词后的结果,向量化后的序列长度等。模型训练部分需要展示损失和准确率的变化,以及评估结果。Apriori部分需要展示找到的频繁项集和关联规则。 还要考虑数据集的具体情况,比如评论是否有标签,如果没有情感标签,可能需要用情感词典或其他方法打标签。但用户可能已经处理好了标签,所以假设数据集中有对应的特征和情感标签。 可能遇到的问题包括数据不平衡、分词效果不佳、模型过拟合等。需要在代码中加入适当的处理,比如数据均衡、调整分词策略、添加Dropout层等。此外,Apriori算法在处理大量数据时可能效率低,需要适当调整参数或使用优化算法。 最后,确保代码可运行,并且结果清晰展示。可能需要使用TensorFlow/Keras构建LSTM,用mlxtend库实现Apriori。同时,注释详细,步骤解释清楚,方便用户理解。 需要检查引用内容是否相关,用户提供的引用中有关于情感分析和语言模型的内容,可以适当引用到情感分析模型的部分,比如引用[3]提到情感分析是NLP中的常见应用,可以支持模型选择的部分。 总结一下,步骤应该是: 1. 数据预处理(清洗、分词、去停用词) 2. 特征工程和向量化 3. 构建和训练LSTM模型(特征分类和情感分析) 4. 应用Apriori算法进行关联分析 5. 结果展示和评估 每个步骤的代码要分块,并展示中间结果,比如处理后的数据样例、模型结构摘要、训练过程的输出、关联规则的结果等。同时,解释每一步的目的和关键参数,确保用户能复现流程。</think>### 基于京东评论的LSTM与Apriori全流程实现 #### 一、数据预处理(以1000条评论为例) ```python import pandas as pd import jieba from keras.preprocessing.text import Tokenizer # 加载数据集 df = pd.read_csv('jd_comment.csv') print("原始数据示例:\n", df.head(2)) # 数据清洗 df['clean_text'] = df['content'].str.replace('[^\u4e00-\u9fa5]', '', regex=True) # 去除非中文字符 print("\n清洗后示例:\n", df['clean_text'][:2]) # 分词处理 df['cut_text'] = df['clean_text'].apply(lambda x: ' '.join(jieba.cut(x))) print("\n分词示例:\n", df['cut_text'][0]) # 停用词过滤 stopwords = set(open('stopwords.txt').read().splitlines()) df['filter_text'] = df['cut_text'].apply(lambda x: ' '.join([w for w in x.split() if w not in stopwords])) print("\n去停用词示例:\n", df['filter_text'][0]) # 向量化处理 tokenizer = Tokenizer(num_words=5000) tokenizer.fit_on_texts(df['filter_text']) sequences = tokenizer.texts_to_sequences(df['filter_text']) print("\n向量化示例:\n", sequences[0]) ``` #### 二、LSTM特征分类模型 ```python from keras.models import Sequential from keras.layers import Embedding, LSTM, Dense from keras.preprocessing.sequence import pad_sequences # 数据准备 X = pad_sequences(sequences, maxlen=50) y = pd.get_dummies(df['category']).values # 假设有3个特征类别 # 模型构建 model = Sequential() model.add(Embedding(5000, 128, input_length=50)) model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) # 模型训练 history = model.fit(X, y, batch_size=32, epochs=5, validation_split=0.2) # 结果示例 """ Epoch 1/5 25/25 [==============================] - 8s 192ms/step - loss: 1.0782 - accuracy: 0.4388 - val_loss: 1.0082 - val_accuracy: 0.5125 ... Epoch 5/5 25/25 [==============================] - 4s 165ms/step - loss: 0.4521 - accuracy: 0.8362 - val_loss: 0.6821 - val_accuracy: 0.7625 """ ``` #### 三、LSTM情感分析模型 ```python from keras.layers import Bidirectional # 标签处理(假设已有sentiment标签) y_sentiment = df['sentiment'].values # 0=负面,1=正面 # 模型构建 sent_model = Sequential() sent_model.add(Embedding(5000, 128, input_length=50)) sent_model.add(Bidirectional(LSTM(64))) sent_model.add(Dense(1, activation='sigmoid')) sent_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练结果示例 """ Epoch 3/5 25/25 [==============================] - 6s 225ms/step - loss: 0.3254 - accuracy: 0.8725 - val_loss: 0.4012 - val_accuracy: 0.8250 """ ``` #### 四、Apriori关联规则分析 ```python from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori, association_rules # 构建事务集 transactions = [text.split() for text in df['filter_text']] # 编码转换 te = TransactionEncoder() te_ary = te.fit(transactions).transform(transactions) df_apriori = pd.DataFrame(te_ary, columns=te.columns_) # 挖掘频繁项集 freq_items = apriori(df_apriori, min_support=0.05, use_colnames=True) print("\n频繁项集示例:\n", freq_items.sort_values('support', ascending=False).head(3)) # 生成关联规则 rules = association_rules(freq_items, metric="confidence", min_threshold=0.7) print("\n关联规则示例:\n", rules[['antecedents', 'consequents', 'support', 'confidence']].head(2)) ``` #### 五、关键步骤输出示例 1. 数据预处理结果: ``` 原始数据示例: rating content 0 5 屏幕清晰度超出预期,运行流畅 1 4 续航时间稍短,但AI辅导功能很实用 清洗后示例: 0 屏幕清晰度超出预期运行流畅 1 续航时间稍短但AI辅导功能很实用 分词示例: 屏幕 清晰度 超出 预期 运行 流畅 去停用词示例: 屏幕 清晰度 超出 预期 运行 流畅 向量化示例: [12, 345, 78, 901, 234, 56] ``` 2. Apriori输出示例: ``` 频繁项集示例: support itemsets 0 0.158 (屏幕) 1 0.132 (清晰度) 2 0.098 (屏幕, 清晰度) 关联规则示例: antecedents consequents support confidence 0 (屏幕) (清晰度) 0.098 0.62 1 (运行速度) (流畅) 0.087 0.79 ``` #### 六、技术选择依据 1. LSTM选用双向结构能更好捕捉上下文语义特征[^2] 2. Apriori设置最小支持度0.05保证规则显著性[^3] 3. 词向量维度选择128维平衡计算效率与表征能力[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值