scikit-learn作业题

本文通过scikit-learn库的make_classification创建了一个数据集,并利用KFold进行交叉验证。分别使用了朴素贝叶斯、支持向量机和随机森林三种算法进行训练,并采用精确率、F1值和AUC ROC曲线作为性能评估指标。

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

作业题目:


解题思路:

1.用sklearn的datasets中的make_classification函数创建一个数据集,根据所给提示,我们设置n_samples=1000, n_features=10;

2.用交叉验证分离数据集为10份,用cross_validation的KFolds函数;

3.分别使用三种训练算法:朴素贝叶斯、支持向量机和随机森林;

4.分别使用三种指标评估交叉验证的性能:精确率、F1值、AUC ROC曲线。

代码:

from sklearn import datasets
from sklearn import cross_validation
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics

#创建数据集
dataset = datasets.make_classification(n_samples=1000, n_features=10)

#用交叉验证分离数据
cv = cross_validation.KFold(len(dataset[0]), n_folds=10, shuffle=True)
for train_index, test_index in cv:
    X_train, y_train = dataset[0][train_index], dataset[1][train_index]
    X_test, y_test = dataset[0][test_index], dataset[1][test_index]

#朴素贝叶斯
print('Gaussian NB') 
alg 
LDA(Latent Dirichlet allocation)是一种常用的主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。它是一种无监督学习算法,在训练时仅需要输入文档集并给定主题数量。这一模型目前在文本挖掘,包括文本主题识别、文本分类以及文本相似度计算方面均有应用。请利用week.csv提供的广州八大热门糖水店的评论数据,进一步对评论文本(即cus_comment)进行话题识别与分析。注意,本周使用了两类方法来实现lda(sklearn和gensim),本次作业选自己喜欢的来实现即可。 1. 文档预处理。 一般来讲,LDA在评论等短文本上的效果并不理想,且多数情况下,我们希望给话题赋予时间含义,以讨论其“波动性”。因此,往往先需要按时间进行文档的生成,比如,将某一店铺的评论按年进行合并,即将某店铺某年发布的所有评论视为一个文档。请实现一个模块,其中包含一个或多个函数,其能够读取该数据集并将之分店铺(共8家店铺,可根据shopID进行区分)处理以天(或其他时间单位)为单位的文档集合。 2. 文本的特征表示。 实现一个模块,通过一个或多个函数,将每个文档转变为词频特征表示,以形成文档-词语的词频矩阵,可以选择使用sklearn中的CountVectorizer和TfidfVectorizer两种方式。也可以使用gensim中的dictionary.doc2bow等。 3. 文本的话题分析。 实现一个模块,通过一个或多个函数,借助sklearn.decomposition中的LatentDirichletAllocation构建主题模型(话题数目可以自主指定),并对发现的主题进行分析(每个主题对应的词语可利用model.components_来查看,每篇文档的主题概率分布可通过model.transform来查看)。也可以参考demo里的ldav.py,用gensim进行LDA分析,并进行可视化。 4. 序列化保存。 利用pickle或json对所得到的lda模型、对应的词频矩阵、以及特征表示等进行序列化保存。 5. (附加题)根据困惑度选取最优话题数。 任务3中的超参数k(即话题的数目)变化时,评价LDA模型的一个指标即困惑度(lda.perplexity)会随之波动,尝试绘制困惑度随话题数目k变化的曲线,找到较优的k。 6. (附加题)话题分布的时间趋势分析。 根据评论文档的时间信息,观察特定话题随着时间的变化趋势,即分析某一话题在不同时间段内的出现频率或权重,以便了解该话题在不同时期内的热度变化。 参考材料: 1. https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html 2. https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#sklearn.feature_extraction.text.TfidfVectorizer 3. https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html 4. https://radimrehurek.com/gensim/apiref.html#api-reference
最新发布
03-20
### 文档预处理 为了实现 LDA 主题建模,首先需要对 `week.csv` 文件中的 `cus_comment` 字段进行预处理。这一步骤包括分词、去停用词、过滤无意义的字符以及保留特定长度的词语[^2]。 ```python import pandas as pd import jieba from sklearn.feature_extraction.text import CountVectorizer def text_preprocessing(context, stop_words): """ 对文本进行预处理 """ processed_text = [] words_cut = jieba.lcut(context, cut_all=False) for word in words_cut: if (word not in stop_words) and (not word.isdigit()) and (1 < len(word) < 5): processed_text.append(word) return ' '.join(processed_text) # 加载数据并定义停止词列表 data = pd.read_csv('week.csv') stop_words = set(open('stopwords.txt', encoding='utf-8').read().splitlines()) # 预处理评论数据 data['processed_comments'] = data['cus_comment'].apply(lambda x: text_preprocessing(x, stop_words)) ``` --- ### 构建文档集合 按照时间和店铺划分文档集合可以提高话题分析的相关性和准确性。可以通过 Pandas 的 `groupby` 方法来实现这一目标: ```python # 按照时间和店铺名称聚合评论 document_groups = data.groupby(['time', 'shop_name'])['processed_comments'].agg(' '.join).reset_index() documents = document_groups['processed_comments'].tolist() ``` --- ### 特征表示:生成词频矩阵 使用 `CountVectorizer` 或 Gensim 中的字典方法生成词频矩阵。这里采用 Sklearn 实现向量化过程: ```python vectorizer = CountVectorizer(max_df=0.95, min_df=2, token_pattern=r'\b\w+\b') # 过滤高频和低频词 X = vectorizer.fit_transform(documents) vocab = vectorizer.get_feature_names_out() print(f"词汇表大小: {len(vocab)}") ``` --- ### 构建 LDA 模型 通过 Gensim 或 Sklearn 来训练 LDA 模型。以下是两种方式的具体实现: #### 使用 Sklearn 训练 LDA 模型 ```python from sklearn.decomposition import LatentDirichletAllocation lda_model_sklearn = LatentDirichletAllocation(n_components=8, random_state=42, max_iter=10) lda_output_sklearn = lda_model_sklearn.fit_transform(X) # 打印主题关键词 def display_topics(model, feature_names, no_top_words): for topic_idx, topic in enumerate(model.components_): print(f"Topic #{topic_idx}: {' '.join([feature_names[i] for i in topic.argsort()[:-no_top_words - 1:-1]])}") display_topics(lda_model_sklearn, vocab, 10) ``` #### 使用 Gensim 训练 LDA 模型 Gensim 提供更灵活的功能支持复杂语料库操作: ```python import gensim.corpora as corpora from gensim.models.ldamodel import LdaModel # 将每条评论转换为单词列表 corpus_raw = [doc.split() for doc in documents] # 创建词袋模型 id2word = corpora.Dictionary(corpus_raw) texts = [[token for token in doc if token in id2word.token2id] for doc in corpus_raw] corpus_gensim = [id2word.doc2bow(text) for text in texts] # 训练 LDA 模型 lda_model_gensim = LdaModel( corpus=corpus_gensim, num_topics=8, id2word=id2word, passes=10, alpha='auto', eta='auto' ) # 输出主题关键词 topics = lda_model_gensim.print_topics(num_words=10) for idx, topic in topics: print(f'Topic #{idx} : {topic}') ``` --- ### 序列化保存模型及相关数据 无论是使用 Sklearn 还是 Gensim,都可以将模型及其参数保存到磁盘以便后续加载和继续分析: #### 保存 Sklearn 模型 ```python import joblib joblib.dump(lda_model_sklearn, 'lda_model_sklearn.joblib') joblib.dump(vectorizer, 'count_vectorizer.joblib') ``` #### 保存 Gensim 模型 ```python lda_model_gensim.save('lda_model_gensim.model') id2word.save('dictionary_gensim.dict') ``` --- ### 困惑度评估 计算 LDA 模型的困惑度以衡量其拟合优劣程度: ```python perplexity_sklearn = lda_model_sklearn.perplexity(X) print(f'Sklearn LDA Perplexity: {perplexity_sklearn}') log_perplexity_gensim = lda_model_gensim.log_perplexity(corpus_gensim) print(f'Gensim LDA Log Perplexity: {log_perplexity_gensim}') ``` --- ### 时间趋势分析 对于每个时间段的话题分布变化情况,可通过绘制热力图或折线图展示不同时间点上各话题的比例变化: ```python import matplotlib.pyplot as plt import seaborn as sns # 聚合每个月份的主题比例 monthly_topic_distribution = {} for time_point, group_data in document_groups.groupby('time'): sub_corpus = [id2word.doc2bow(doc.split()) for doc in group_data['processed_comments']] monthly_topic_dist = np.array([lda_model_gensim[sub_doc][0][1] for sub_doc in sub_corpus]).mean(axis=0) monthly_topic_distribution[time_point] = monthly_topic_dist df_time_trend = pd.DataFrame.from_dict(monthly_topic_distribution, orient='index') plt.figure(figsize=(12, 6)) sns.lineplot(data=df_time_trend.T) plt.title('Monthly Topic Distribution Trend Over Time') plt.xlabel('Time Periods') plt.ylabel('Average Topic Proportion') plt.show() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值