承接之前写的“机器学习之线性模型”的那篇文章,这里运用逻辑回归模型实现对文本的一个大体分类,目的是进一步熟悉逻辑回归的运用和sklearn工具包的使用,理解各参数代表的含义,并没有特意做数据处理、特征工程和模型优化方面的考虑来提高准确度。
数据来源于:https://www.dcjingsai.com/common/cmpt/“达观杯”文本智能处理挑战赛_赛体与数据.html
也可以通过如下网盘下载:
链接:https://pan.baidu.com/s/1P67-jvrI2IhZtsWEQWtwkg
提取码:5uvx
题目的详细说明可以去赛题官网查看,这里简单描述下:
官方赛道给出的数据集包含两个文件,一个是训练集(train_set.csv)用来训练模型,一个是测试集(test_set.csv)用来生成测试结果。训练集中包含四个字段,分别是:文章索引“id”、文章正文字级别“article”、文章词级别“word_seg”、文章标注的类别“class”。对于class,测试集是不包含该字段的,这就是我们需要分类的类别,也就是模型的输出y。
数据集都经过了脱敏处理,也就是说我们打开数据集文件看到的都是一些数字,这些数字其实代表的就是一个字或词或标点符号。
这里,只从词的角度,只分析“word_seg”作为输入特征,“class”作为分类标记进行训练。
逻辑回归实现多分类'''
@Author : 25506
@Time : 2020/4/1 16:37
@File : dc_text_match.py
@Software: PyCharm
@Desc : 达观杯文本分类识别训练赛--Logstic
'''
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
#读取数据,并删除不相关字段
df_train = pd.read_csv('./train_set.csv') #训练集
df_test = pd.read_csv('./test_set.csv') #测试集
df_train.drop(columns=['article', 'id'], inplace=True)
df_test.drop(columns=['article'], inplace=True) #保留id
"""
@ngram_range:词组切分的长度范围
@min_df:参数为int,小于这个值则认为不是关键词
@max_df:参数是float,则表示词出现的次数与语料库文档数的最大百分比
@max_features:默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集
"""
#将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer(ngram_range=(1,2), min_df=3, max_df=0.9, max_features=100000)
#拟合生成标准化词频矩阵
x_train = vectorizer.fit_transform(df_train['word_seg'])
x_test = vectorizer.transform(df_test['word_seg'])
y_train = df_train['class'] - 1 #类别默认是从0开始的,所以这里需要-1
#构建逻辑回归模型
lg = LogisticRegression(C=4, dual=True)
lg.fit(x_train, y_train)
#预测
y_test = lg.predict(x_test)
#保存结果
df_test['class'] = y_test.tolist() #转化为矩阵列表形式存储
df_test['class'] = df_test['class'] + 1 #还原类别+1
df_result = df_test.loc[:, ['id', 'class']] #根据index索引所有行和id,class列
df_result.to_csv('./result.csv', index=False)