使用逻辑回归对文本进行分类 To classify text content by logistic regression[达观杯1]

in #cn6 years ago (edited)

最近在参加达观杯的文本分类大赛,使用了几种方法对文本进行分类,在这里做一个记录 :)

gongsi-daerguan.png

比赛大概介绍

比赛地址:http://www.dcjingsai.com/common/cmpt/%E2%80%9C%E8%BE%BE%E8%A7%82%E6%9D%AF%E2%80%9D%E6%96%87%E6%9C%AC%E6%99%BA%E8%83%BD%E5%A4%84%E7%90%86%E6%8C%91%E6%88%98%E8%B5%9B_%E8%B5%9B%E4%BD%93%E4%B8%8E%E6%95%B0%E6%8D%AE.html

1530871575831665.png

数据

“train_set.csv:此数据集用于训练模型,每一行对应一篇文章。文章分别在“字”和“词”的级别上做了脱敏处理。共有四列:
第一列是文章的索引(id),第二列是文章正文在“字”级别上的表示,即字符相隔正文(article);第三列是在“词”级别上的表示,即词语相隔正文(word_seg);第四列是这篇文章的标注(class)。
注:每一个数字对应一个“字”,或“词”,或“标点符号”。“字”的编号与“词”的编号是独立的”

“test_set.csv” 里是只有id, article 和 word_seg

参赛者的工作就是建立一个模型,根据article或者word_seg 去预测文字的Class

第一次尝试使用sklearn里的逻辑回归进行预测,代码如下:

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer

print('start')
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)

vectorier = CountVectorizer(ngram_range=(1,2),min_df=3,max_df=0.9,max_features=100000)
vectorier.fit(df_train['word_seg'])
x_train = vectorier.transform(df_train['word_seg'])
x_test = vectorier.transform(df_test['word_seg'])
y_train = df_train['class']-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
df_result = df_test.loc[:,['id','class']]
df_result.to_csv('./result.csv',index = False)

print('end')
```

将预测结果提交到网站,正确率大概是0.73

接下来考虑将vectorier 从CountVectorizer 改成tfidf

代码如下(其实只改了一行哈哈)

```
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

print('start')
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)


#vctorizer = CountVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, max_features=100000)
print('inprocess1')
vctorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, max_features=100000)
vctorizer.fit(df_train['word_seg'])
x_train = vctorizer.transform(df_train['word_seg'])
x_test = vctorizer.transform(df_test['word_seg'])
y_train = df_train['class']-1

print('inprocess2')
lg = LogisticRegression(C = 4, dual=True)
lg.fit(x_train,y_train)

y_test = lg.predict(x_test)

print('inprocess3')

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('end')
```

提交代码以后,正确率从0.73升为了0.76,还是不错的,目前的排名在100多,排名第一的大哥是0.8几。感兴趣的朋友也可以去试一下:)
Sort:  

您好,歡迎加入新手村。

Posted using Partiko Android

欢迎~~居然是理科女生

你好,大佬
微信图片_20180821093025.jpg

我不是大佬,我只是比你旧一点的新人。你要去新手村吗?

微信图片_20180821093025.jpg

还有新手村?!求指路!

你有微信吗?你可以先加我微信IMG_20180818_135435.jpg

Coin Marketplace

STEEM 0.19
TRX 0.12
JST 0.027
BTC 61265.20
ETH 3320.34
USDT 1.00
SBD 2.48