「達觀杯」文本分類挑戰賽新手入門代碼

image

任務

創建模型經過長文本數據正文(article),預測文本對應的類別(class)python

數據

注 : 報名參賽或加入隊伍後,可獲取數據下載權限。ios

數據包含 2 個 csv 文件:算法

train_set.csv:此數據集用於訓練模型,每一行對應一篇文章。 文章分別在「字」和「詞」的級別上作了脫敏處理。 共有四列:機器學習

  1. 第一列是文章的索引(id),
  2. 第二列是文章正文在「字」級別上的表示,即字符相隔正文(article);
  3. 第三列是在「詞」級別上的表示,即詞語相隔正文(word_seg);
  4. 第四列是這篇文章的標註(class)。

注:每個數字對應一個「字」,或「詞」,或「標點符號」。「字」的編號與「詞」的編號是獨立的!函數

test_set.csv:此數據用於測試。 數據格式同 train_set.csv,但不包含 class性能

注:test_set與train_test中文章id的編號是獨立的。 友情提示:請不要嘗試用excel打開這些文件!因爲一篇文章太長,excel可能沒法完整地讀入某一行!學習

評分標準

評分算法

binary-classification測試

採用各個品類F1指標的算術平均值,它是 PrecisionRecall 的調和平均數。spa

image

其中,Pi 是表示第 i 個種類對應的 PrecisionRi 是表示第 i 個種類對應 RecallAB 榜的劃分方式和比例: 【1】評分採用AB榜形式,提交文件必須包含測試集中全部用戶的預測值。排行榜顯示A榜成績,競賽結束後2小時切換成B榜單。B榜成績以選定的兩次提交或者默認的最後兩次提交的最高分爲準,最終比賽成績以B榜單爲準。 【2】此題目的AB榜是隨機劃分,A榜數據佔50%,B榜使用全量測試集,即佔100%。.net

挑戰賽任務背景

文本分類

  • 這個比賽的任務就是文本分類,是天然語言處理 (NLP) 領域裏一項 最最基本的任務。
  • 但這個任務的難點就是在於,文本的長度很是長, 大約3000個詞,通常任務也就300詞。
  • 而文本的長度過長對文本的 智能解析帶來了不少挑戰。

概念

  1. 中文分詞

用傳統的監督學習模型對一段文 本進行分類的基本過程

這裏提早假設: 已經有了一個學習的機器學習模型 f,供你使用

注:函數輸出的類別是咱們事先人爲約定好,好比我讓數字4表明政治類, 數字3表明科技類,...

比賽數據

訓練數據集

測試數據集

求解問題的本質

求一個數學函數(又可稱爲機器學習模型):

y=f\left(x_{1}, x_{2}, x_{3}, \ldots, x_{6}\right)

使模型預測能力更強

哪些機器學習算法

  • 傳統的監督學習算法(西瓜書各章節都有對應)
    • 好比,對數概率迴歸/支持向量機/樸素貝葉斯/決策樹/集成學習
  • 深度學習
    • 好比 cnn/rnn/attention 等模型

源碼解析

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" Created on Thu Jun 20 21:17:51 2019 @author: iosdevlog """

""" 導入所須要的軟件包 """
import pandas as pd 
from sklearn.linear_model import LogisticRegression #導入線性迴歸庫
from sklearn.feature_extraction.text import CountVectorizer #導入特徵提取庫


print("開始")

""" @ 代碼功能簡介: 從硬盤上讀取已下載好的數據,並進行簡單處理 @ 知識點定位:數據預處理 """
#讀取文件,而且刪除無關東西
df_train = pd.read_csv("./train_set.csv")
df_test = pd.read_csv("./test_set.csv")
df_train.drop(columns =["article", "id"], inplace = True ) # 爲何要刪除這兩個列? id 列無心義,不須要用 article,可直接刪除
df_test.drop(columns =["article"], inplace = True ) 

""" @ 代碼功能簡介:將數據集中的字符文本轉換成數字向量,以便計算機可以進行處理 (一段數字 ---> 一個向量) @ 知識點定位:特徵工程 """
# 獲取特徵向量
vectorizer = CountVectorizer(ngram_range = (1,2), min_df = 3, max_df = 0.9, max_features = 100000) # 特徵提取
vectorizer.fit(df_train["word_seg"]) # 爲何要訓練這一列內容? 要先學習整個數據集的詞的 DF(文檔詞頻)
x_train = vectorizer.transform(df_train["word_seg"]) #特徵轉爲特徵向量
x_test = vectorizer.transform(df_test["word_seg"])
y_train = df_train["class"] - 1  # 這裏爲啥要給全部的類別都減去 1? 減 1 是代碼習慣問題,讓 class 從 0 計數

""" @ 代碼功能簡介:訓練一個分類器 @ 知識點定位:傳統堅督學習 之 線性邏輯迴歸模型 """
lg = LogisticRegression(C = 4, dual = True) # 邏輯迴歸初始化
lg.fit(x_train, y_train) # 進行訓練,模型保存在 lg 裏面

""" 根據上面訓練好的分類器對測試集的每一個樣本進行預測 """
y_test = lg.predict(x_test) # 用模型進行測試

""" 將測試集的預測結果保存至本地 """
# 根據上面訓練好的分類器對測試集的每一個樣本進行預測
df_test["class"] = y_test.tolist() # 測試結果轉爲列表,而且放入測試文檔的類別裏面。問題5:測試文檔沒有類別這個列。這行代碼會自動給測試文檔添加一個類別列。
df_test["class"] = df_test["class"] + 1  # 爲何又要給全部類別分別加 1
df_result = df_test.loc[:, ["id", "class"]]  # 從測試集裏面拿到 ["id", "class"] 列的內容
df_result.to_csv("./result.csv", index = False) #測試結果轉爲提交的CSV格式

print("結束")
複製代碼

如何提升模型性能

  1. 數據預處理
  2. 特徵工程
  3. 機器學習算法
  4. 模型集成

參考:

「達觀杯」文本智能處理挑戰賽_賽體與數據 Kaggle: Starter:「達觀杯」文本分類挑戰賽新手入門代碼 深度之眼

AIDevLog.png
相關文章
相關標籤/搜索