基於TfidfVectorizer、Xgboost的新聞文本數據分類


一. 算法介紹

1.1. 算法簡介

​ Xgboost從名字中可以看出是屬於booting算法。Boosting就是一個強分類器,它是由若干個弱分類器(樹模型)組合而成。這里的樹模型是CART(分類回歸樹)模型。

1.2 .算法思想

​ 通過不斷地添加樹,不斷地進行特征分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。當我們訓練完成得到k棵樹,我們要預測一個樣本的分數,其實就是根據這個樣本的特征,在每棵樹中會落到對應的一個葉子節點,每個葉子節點就對應一個分數,最后只需要將每棵樹對應的分數加起來就是該樣本的預測值 。

1.3. 程序運行環境

  • Windows 或者Liniux 平台
  • Python3+
  • 安裝包: jieba, Xgboost, sklearn

1.4. Xgboost與jieba安裝

pip install xgboost

pip install jieba

pip install sklearn

二. 數據准備

2.1. 數據示例

數據分為2部分,sohu_train.txt(24000行,12個標簽) 停用詞數據:stopword1.txt

標簽 = ["體育", "健康", "女人", "娛樂", "房地產", "教育", "文化", "新聞", "旅游", "汽車", "科技", "財經"]

訓練數據分為兩列,第一列是類別標簽,第二列是新聞內容

1561944022045

統計訓練集/測試集每個標簽對應的新聞數據的數量:

import pandas as pd
train_data = pd.read_csv('./data/sohu_train.txt', sep='\t', header=None)  # 

for name, group in train_data.groupby(0):
    print(name, len(group))
    
"""
統計結果:
體育 2000
健康 2000
女人 2000
娛樂 2000
房地產 2000
教育 2000
文化 2000
新聞 2000
旅游 2000
汽車 2000
科技 2000
財經 2000

2.2. 數據准備

  • 新聞文本去除停用詞

    # 停用詞示例
    """
    caption
    [-
    ╳
    ╲
    ╱
    ╰
    ╮
    ╯
    ╬
    ╭
    ╪
    ╫
    ╨
    ╩
    ╦
    ╧
    """
    
    # 去除停用詞
    def stop_word_list():
        stopwords = [line.strip() for line in open(self.data_dir + 'stopwords.txt', encoding='utf-8').readlines()]
        return stopwords
    
  • 新聞數據分詞

    def clean_str(string):
        strings = re.sub(r'[^\u4e00-\u9fa5]', " ", string)
        string = ' '.join(strings.split())
        return string.strip()
    
    
    def seg_depart(sentence):
        sentence_depart = jieba.cut(sentence.strip())
        stopwords = stop_word_list()
        outstr = ''
        for word in sentence_depart:
            if word not in stopwords:
                outstr += word
                outstr += " "
        return clean_str(outstr)
    

    經過分詞得到文件:sohu_train_seg.txt, 數據分為兩列,第一列是分詞后的新聞數據,第二列是新聞類別標簽,如下示例:

    1561953566977

  • 數據集划分:把數據划分為訓練集train.txt和測試集test.txt

    # 構造訓練集、測試集
    def get_train_test_data(data_name):
        data_X = []
        data_y = []
        with open(data_path + data_name, encoding='UTF-8') as f:
            data_list = f.readlines()
            random.shuffle(data_list)
            for line in data_list:
                row = line.rstrip('\n').split('\t')
                if len(row) < 2:
                    continue
                feature = row[0]
                data_X.append(feature)
                data_y.append(row[1])
    
            X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, test_size=0.2)
            return X_train, X_test, y_train, y_test
    

三. 數據建模

3.1. 特征工程

CountModel = CountVectorizer(max_features=3000).fit(X_train)

用CountVectorizer進行文本特征向量化,對於每一個訓練文本,它只考慮每種詞匯在該訓練文本中出現的頻率。max_features=3000 表示對所有關鍵詞的term frequency進行降序排序,只取前3000個作為關鍵詞集[1]

3.2 實例化模型對象

Tf_IdfModel = TfidfTransformer().fit(CountModel.transform(X_train))

3.3 統計詞頻

訓練集用fit_transform,測試集用transform

train_data = CountModel.fit_transform(X_train)
test_data = CountModel.transform(X_test)

3.4 保存向量化的文本和實例化對象

joblib.dump(CountModel, model_path + count_model)
joblib.dump(Tf_IdfModel, model_path + tfidf_model)

3.5 模型訓練與保存[2]

    def train_model_xgboost(model_name):
        train_data, test_data = tranform_train_test('sohu-CountModel.pkl', 'sohu-TFIDF-Model.pkl')
        clf = XGBClassifier(learning_rate=0.1, max_depth=3, scale_pos_weight=1) 
        clf.fit(train_data, y_train)
        joblib.dump(clf, self.model_dir + model_name)
        clf = joblib.load(self.model_dir + model_name)  # 模型保存

        print('Xgboost Result:', clf.score(test_data, y_test))
打印出准確率:  
"""
Xgboost Result: 0.83875
"""

3.6 模型評估

print('Xgboost Result:', clf.score(test_data, y_test))

"""
Xgboost Result: 0.83875
"""

准確率:0.83875

參考:

[1] https://blog.csdn.net/weixin_38278334/article/details/82320307

[2] http://sklearn.apachecn.org/#/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM