承接之前寫的“機器學習之線性模型”的那篇文章,這裏運用邏輯迴歸模型實現對文本的一個大體分類,目的是進一步熟悉邏輯迴歸的運用和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)