掘金 人工智能 14小时前
NLP新闻文本分类
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了一个新闻文本分类项目,旨在根据新闻内容预测其所属类别。项目采用了TF-IDF技术对匿名化的字符级别新闻文本进行特征提取,并构建了包含14个类别的数据集。为了提高分类精度,文章尝试了逻辑回归、随机森林和朴素贝叶斯三种经典的机器学习模型,并通过在验证集上评估各模型的F1分数,进而采用加权投票的方式进行模型融合。最终,融合模型在预测测试集上的表现优于单一模型,并生成了提交文件。整个流程涵盖了数据准备、特征工程、模型训练、验证、融合及预测等关键环节。

🗂️ **数据概览与目标**: 项目处理了大规模新闻文本数据,包含训练集20万条、测试集A和B各5万条,目标是将新闻文本准确分类至14个预设类别(如科技、体育、娱乐等),并以macro F1_score作为评测标准。数据经过字符级别匿名化处理。

⚙️ **特征工程关键**: 采用TF-IDF向量化技术将文本转化为数值特征,并设置`max_features=10000`和`ngram_range=(1, 2)`,旨在捕捉词语和词语组合的权重信息,为后续模型训练提供有效输入。

🚀 **模型选择与训练**: 尝试了逻辑回归、随机森林和朴素贝叶斯三种不同的分类模型。这些模型在处理文本数据方面各有优势,通过在验证集上评估它们的F1分数,为模型融合提供了依据。

🤝 **模型融合策略**: 利用加权投票的方式融合了三个模型的预测结果。权重根据各模型在验证集上的F1分数动态分配,旨在结合各模型的优点,提升整体预测性能,克服单一模型的局限性。

📊 **性能评估与结果**: 通过在验证集上计算F1分数来评估模型的表现,并对比了单模型和融合模型的性能。最终,融合模型被用于预测测试集,并生成了用于提交的预测结果文件。

一、题目

预测提供的新闻数据属于哪个类别。

二、数据

数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。处理后的训练数据如下:

labeltext
657 44 66 56 2 3 3 37 5 41 9 57 44 47 45 33 13 63 58 31 17 47 0 1 1 69 26 60 62 15 21 12 49 18 38 20 50 23 57 44 45 33 25 28 47 22 52 35 30 14 24 69 54 7 48 19 11 51 16 43 26 34 53 27 64 8 4 42 36 46 65 69 29 39 15 37 57 44 45 33 69 54 7 25 40 35 30 66 56 47 55 69 61 10 60 42 36 46 65 37 5 41 32 67 6 59 47 0 1 1 68

在数据集中标签的对应的关系如下:

{'科技': 0, '股票': 1, '体育': 2, '娱乐': 3, '时政': 4, '社会': 5, '教育': 6, '财经': 7, '家居': 8, '游戏': 9, '房产': 10, '时尚': 11, '彩票': 12, '星座': 13}

赛题数据来源为互联网上的新闻,通过收集并匿名处理得到。

三、 评测标准

评价标准为类别f1_score的均值,结果与实际测试集的类别进行对比,结果越大越好。

可以通过sklearn完成f1_score计算:

from sklearn.metrics import f1_scorey_true = [0, 1, 2, 0, 1, 2]y_pred = [0, 2, 1, 0, 0, 1]f1_score(y_true, y_pred, average='macro')

四、代码

# 读取数据print("读取数据...")train_df = pd.read_csv('data/train_set.csv', sep='\t')test_df = pd.read_csv('data/test_a.csv', sep='\t')# 查看数据基本信息print(f"训练集大小: {train_df.shape}")print(f"测试集大小: {test_df.shape}")print(f"训练集列名: {train_df.columns.tolist()}")print(f"训练集标签分布:\n{train_df['label'].value_counts()}")# 特征工程:使用TF-IDF向量化文本print("文本向量化...")vectorizer = TfidfVectorizer(max_features=10000, ngram_range=(1, 2))X_train = vectorizer.fit_transform(train_df['text'])X_test = vectorizer.transform(test_df['text'])y_train = train_df['label']# 划分训练集和验证集X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(    X_train, y_train, test_size=0.2, random_state=42, stratify=y_train)# 模型调参和训练print("训练模型...")# 模型1: 逻辑回归model1 = LogisticRegression(random_state=42, max_iter=1000)model1.fit(X_train_split, y_train_split)# 模型2: 随机森林model2 = RandomForestClassifier(n_estimators=100, random_state=42)model2.fit(X_train_split, y_train_split)# 模型3: 朴素贝叶斯model3 = MultinomialNB()model3.fit(X_train_split, y_train_split)# 验证模型print("验证模型...")y_val_pred1 = model1.predict(X_val_split)y_val_pred2 = model2.predict(X_val_split)y_val_pred3 = model3.predict(X_val_split)f1_1 = f1_score(y_val_split, y_val_pred1, average='macro')f1_2 = f1_score(y_val_split, y_val_pred2, average='macro')f1_3 = f1_score(y_val_split, y_val_pred3, average='macro')print(f"逻辑回归模型F1得分: {f1_1}")print(f"随机森林模型F1得分: {f1_2}")print(f"朴素贝叶斯模型F1得分: {f1_3}")# 模型融合print("模型融合...")# 使用加权平均进行模型融合y_val_pred_ensemble = []for i in range(len(y_val_pred1)):    # 根据验证集表现分配权重    weights = [f1_1, f1_2, f1_3]    weights = [w / sum(weights) for w in weights]  # 归一化权重        # 统计每个类别的加权票数    votes = {}    for model_idx, pred in enumerate([y_val_pred1[i], y_val_pred2[i], y_val_pred3[i]]):        if pred not in votes:            votes[pred] = 0        votes[pred] += weights[model_idx]        # 选择得票最多的类别    ensemble_pred = max(votes, key=votes.get)    y_val_pred_ensemble.append(ensemble_pred)f1_ensemble = f1_score(y_val_split, y_val_pred_ensemble, average='macro')print(f"融合模型F1得分: {f1_ensemble}")# 预测测试集print("预测测试集...")y_test_pred1 = model1.predict(X_test)y_test_pred2 = model2.predict(X_test)y_test_pred3 = model3.predict(X_test)# 模型融合预测y_test_pred_ensemble = []for i in range(len(y_test_pred1)):    # 根据验证集表现分配权重    weights = [f1_1, f1_2, f1_3]    weights = [w / sum(weights) for w in weights]  # 归一化权重        # 统计每个类别的加权票数    votes = {}    for model_idx, pred in enumerate([y_test_pred1[i], y_test_pred2[i], y_test_pred3[i]]):        if pred not in votes:            votes[pred] = 0        votes[pred] += weights[model_idx]        # 选择得票最多的类别    ensemble_pred = max(votes, key=votes.get)    y_test_pred_ensemble.append(ensemble_pred)# 生成提交文件print("生成提交文件...")submission = pd.DataFrame({'label': y_test_pred_ensemble})submission.to_csv('data/submission.csv', index=False)print("完成!提交文件已保存为 data/submission.csv")

代码分析

1. 数据准备与预处理

数据加载

数据探索

2. 特征工程

文本向量化

3. 模型训练与验证

数据集划分

模型选择与训练

实现了三种不同的分类模型:

    逻辑回归(LogisticRegression)

      线性模型,适合高维稀疏特征设置max_iter=1000确保收敛

    随机森林(RandomForestClassifier)

      集成方法,能捕捉非线性关系使用100棵树(n_estimators=100)

    朴素贝叶斯(MultinomialNB)

      适合文本数据的概率模型计算高效,适合大规模数据

模型评估

4. 模型融合

加权投票融合

融合效果验证

预测结果

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

文本分类 TF-IDF 模型融合 机器学习 新闻数据
相关文章