-
任务与数据
建立模型通过长文本数据正文(article),预测文本对应的类别(class)。
数据包含2个csv文件:
train_set.csv:此数据集用于训练模型,每一行对应一篇文章。文章分别在“字”和“词”的级别上做了脱敏处理。共有四列: 第一列是文章的索引(id),第二列是文章正文在“字”级别上的表示,即字符相隔正文(article);第三列是在“词”级别上的表示,即词语相隔正文(word_seg);第四列是这篇文章的标注(class)。 注:每一个数字对应一个“字”,或“词”,或“标点符号”。“字”的编号与“词”的编号是独立的!
test_set.csv:此数据用于测试。数据格式同train_set.csv,但不包含class。 注:test_set与train_test中文章id的编号是独立的。
-
思路
基于N-gram和LogisticRegression的文本分类。
只使用词表示(word_seg),不使用字表示(article)。
语言模型由sklearn包中的CountVectorizer模块并设置参数ngram_range来实现,逻辑回归由sklearn包中的LogisticRegression模块实现。
CountVectorizer模块:
LogisticRegression模块:
-
实验步骤
1.导入包
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline
2.读取数据
# 训练集
df_train = pd.read_csv('./new_data/train_set.csv')
# 测试集
df_test = pd.read_csv('./new_data/test_set.csv')
# 训练集样本
X = df_train['word_seg']
# 训练集标签
Y = df_train['class']
3.使用Pipeline拟合训练数据
pipe = Pipeline([('vec', CountVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, max_features=100000)),
('clf', LogisticRegression(C=4, dual=True))])
clf = pipe.fit(X, Y)
由于数据预处理部分可能需要先fit_transform再transform,相对较为繁琐,此时可以通过Pipeline(管道)进行流水线处理。
考虑到词袋模型太简单,而对于1.4GB的训练集来说三元模型计算量又太大,设置ngram_range=(1,2)同时使用词袋模型和二元模型提取特征。
设置min_df=3,max_df=0.9,max_features=100000,用来减少训练时间并防止过拟合。
分类器使用逻辑回归模型。dual代表对偶或者原始方法。dual只适用于正则化相为l2的‘liblinear’的情况,通常样本数大于特征数的情况下,默认为False。这里设置为True。
C为正则化系数λ的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。这里设置为4
4.对测试集数据进行预测
X_test = df_test['word_seg']
Y_test = clf.predict(X_test)
df_test['class'] = Y_test.tolist()
df_result = df_test.loc[:, ['id', 'class']]
df_result.to_csv('./result.csv', index=False)
将预测标签与对应的id一起存入result.csv文件中,上传至达观杯网站查看得分。
下一步准备利用CNN/RNN的方法提高分数。