#达观杯文本分类比赛#
这部分内容只是先简单试水,起到的大概是baseline的作用。后续再思考从各方面进行改进。
特征工程
使用sklearn库中的CountVectorizer,将原始数据中的文本信息转化成向量。
原始数据中有‘article’和‘Word’两个特征,先选择‘Word’,因为‘Word’是显然的有用,而‘article’的作用暂时未知。
逻辑回归
1.先使用logistics regression模型来进行文本分类,观察其准确率,试试水,然后再思考改善模型和其他等提升模型效果的工作。
##程序分析##
print('start..................')
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')
#如果内存不够可以尝试分批读进来,以下程序只是做个示范,先读1000行数据进来
'''
df_train = pd.read_csv('train_set.csv', nrows = 1000)
df_test = pd.read_csv('test_set.csv', nrows = 1000)
'''
df_train.drop(columns = ['article', 'id'], inplace = True)
df_test.drop(columns = ['article'], inplace = True)
删除‘article’和‘ID’是因为我们暂时不用这两个特征来构建模型,而‘ID’是没什么用,直接去掉。
vectorizer = CountVectorizer(ngram_range = (1,2), min_df = 3, max_df = 0.9, max_features = 100000)
#vectorizer.fit(df_train['word_seg'])
x_train = vectorizer.fit_transform(df_train['word_seg'])
x_test = vectorizer.fit_transform(df_test['word_seg'])
y_train = df_train['class'] - 1 #之所以class-1是为了让label从0开始,好预测
将文本信息转化成向量,其中的‘fit_transform’就等同于先’fit’方法,然后再‘transform’方法。
lg = LogisticRegression(C=4, dual = True)
lg.fit(x_train, y_train)
y_test = lg.predict(x_test)
调用LogisticRegression回归模型,用train set训练数据,并对test set数据进行预测。
注意模型中间的参数,C是用来确定模型对分类错误样本的敏感程度的,越小越不允许分错;dual表示采用对偶方法求解
df_test['class'] = y_test.tolist()
df_test['class'] = df_test['class'] + 1
df_result = df_test.loc[:, ['id', 'class']]
df_result.to_csv('./result.csv', index = False)
print('finished...............')
将预测结果保存到本地。
##总结##
做的过程中发现,直接采用逻辑回归,准确率大概能达到70%,还算不错。但是没有使用‘article这一特征信息,也并没有深入的做特生工程,另外,模型也并没有改进,并没有使用集成学习的方法等等,后续改进。
匆忙写下这些,若有错误欢迎指正。