1. 程式人生 > 實用技巧 >XGBoost文字多分類記錄

XGBoost文字多分類記錄

1.資料預處理

  xgb 訓練的資料是 DataFream 不能是List

  • 讀取資料

    利用pandas 讀取資料,這裡讀取的是excel資料

    data = pd.read_excel(filename, sheet_name='tabelname')

  • 分詞處理

    利用jieba分詞搞定

    seg1 = jieba.cut(str(table_note[i])) # 這個利用join函式連線分詞後的結果
    seg1 = ' '.join(seg1)
    seg1 = jieba.icut(str(table_note[i])) # 這個返回的是一個列表
  • 去停處理

    寫個函式 將分詞處理完成的資料傳入此函式,一定記得返回字串

    def ting(content):
    content = content.split(" ")
     content = [w for w in content if w not in stopwords]
    return " ".join(content)
  • 分離訓練集與測試集

    x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.2)

  • 這裡使用Tfidf作詞頻-逆向檔案頻率
# CountVectorizer會將文字中的詞語轉換為詞頻矩陣
vectorizer = CountVectorizer(max_features=5000)

# TfidfTransformer用於統計vectorizer中每個詞語的TF-IDF值
tf_idf_transformer = TfidfTransformer()

# vectorizer.fit_transform()計算每個詞出現的次數
# tf_idf_transformer.fit_transform()將詞頻矩陣統計成TF-IDF值
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
x_train_weight = tf_idf.toarray() # 訓練集TF-IDF權重矩陣
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray() # 測試集TF-IDF權重矩陣

2.XGboost實現

  具體參考連結https://blog.csdn.net/hbpartty/article/details/96098495

  引數參考連結https://blog.csdn.net/iyuanshuo/article/details/80142730

  第一步轉化為DMatrix格式的資料

    dtrain = xgb.DMatrix(x_train_weight, label=y_train)
    dtest = xgb.DMatrix(x_test_weight, label=y_test)
 第二步定義引數 開始訓練
param = {'silent': 0,
'eta': 0.3,
'max_depth': 6,
'objective': 'multi:softmax',
'num_class': 16,
'eval_metric': 'merror'} # 引數
evallist = [(dtrain, 'train'), (dtest, 'test')]
num_round = 100 # 迴圈次數
xgb_model = xgb.train(param, dtrain, num_round, evallist)
# 儲存訓練模型
xgb_model.save_model('data/xgb_model')
y_predict = xgb_model.predict(dtest) # 模型預測
label_all = categories
confusion_mat = metrics.confusion_matrix(y_test, y_predict)
df = pd.DataFrame(confusion_mat, columns=label_all)
df.index = label_all
print('準確率:', metrics.accuracy_score(y_test, y_predict))
print('confusion_matrix:', df)
print('分類報告:', metrics.classification_report(y_test, y_predict))