在NLP中結合文本和數字特徵進行機器學習

2021-01-11 騰訊網

應用於自然語言處理的機器學習數據通常包含文本和數字輸入。例如,當您通過twitter或新聞構建一個模型來預測產品未來的銷售時,在考慮文本的同時考慮過去的銷售數據、訪問者數量、市場趨勢等將會更有效。您不會僅僅根據新聞情緒來預測股價的波動,而是會利用它來補充基於經濟指標和歷史價格的模型。這篇文章展示了如何在scikit-learn(對於Tfidf)和pytorch(對於LSTM / BERT)中組合文本輸入和數字輸入。

scikit-learn(例如用於Tfidf)

當你有一個包含數字欄位和文本的訓練dataframe ,並應用一個來自scikit-lean或其他等價的簡單模型時,最簡單的方法之一是使用sklearn.pipeline的FeatureUnion管道。

下面的示例假定X_train是一個dataframe ,它由許多數字欄位和最後一列的文本欄位組成。然後,您可以創建一個FunctionTransformer來分隔數字列和文本列。傳遞給這個FunctionTransformer的函數可以是任何東西,因此請根據輸入數據修改它。這裡它只返回最後一列作為文本特性,其餘的作為數字特性。然後在文本上應用Tfidf矢量化並輸入分類器。該樣本使用RandomForest作為估計器,並使用GridSearchCV在給定參數中搜索最佳模型,但它可以是其他任何參數。

import numpy as np

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.pipeline import Pipeline, FeatureUnion

from sklearn.ensemble import RandomForestClassifier

from sklearn.preprocessing import FunctionTransformer

from sklearn.model_selection import GridSearchCV, StratifiedKFold

# Create Function Transformer to use Feature Union

def get_numeric_data(x):

return [record[:-2].astype(float) for record in x]

def get_text_data(x):

return [record[-1] for record in x]

transfomer_numeric = FunctionTransformer(get_numeric_data)

transformer_text = FunctionTransformer(get_text_data)

# Create a pipeline to concatenate Tfidf Vector and Numeric data

# Use RandomForestClassifier as an example

pipeline = Pipeline([

('features', FeatureUnion([

('numeric_features', Pipeline([

('selector', transfomer_numeric)

])),

('text_features', Pipeline([

('selector', transformer_text),

('vec', TfidfVectorizer(analyzer='word'))

]))

])),

('clf', RandomForestClassifier())

])

# Grid Search Parameters for RandomForest

param_grid = {'clf__n_estimators': np.linspace(1, 100, 10, dtype=int),

'clf__min_samples_split': [3, 10],

'clf__min_samples_leaf': [3],

'clf__max_features': [7],

'clf__max_depth': [None],

'clf__criterion': ['gini'],

'clf__bootstrap': [False]}

# Training config

kfold = StratifiedKFold(n_splits=7)

scoring = {'Accuracy': 'accuracy', 'F1': 'f1_macro'}

refit = 'F1'

# Perform GridSearch

rf_model = GridSearchCV(pipeline, param_grid=param_grid, cv=kfold, scoring=scoring,

refit=refit, n_jobs=-1, return_train_score=True, verbose=1)

rf_model.fit(X_train, Y_train)

rf_best = rf_model.best_estimator_

Scikit-learn提供了很好的api來管理ML管道,它只完成工作,還可以以同樣的方式執行更複雜的步驟。

Pytorch(例如LSTM, BERT)

如果您應用深度神經網絡,更常見的是使用Tensorflow/Keras或Pytorch來定義層。兩者都有類似的api,並且可以以相同的方式組合文本和數字輸入,下面的示例使用pytorch。

要在神經網絡中處理文本,首先它應該以模型所期望的方式嵌入。有一個dropout 層也是常見的,以避免過擬合。該模型在與數字特徵連接之前添加一個稠密層(即全連接層),以平衡特徵的數量。最後,應用稠密層輸出所需的輸出數量。

class LSTMTextClassifier(nn.Module):

def __init__(self, vocab_size, embed_size, lstm_size, dense_size, numeric_feature_size, output_size, lstm_layers=1, dropout=0.1):

super().__init__()

self.vocab_size = vocab_size

self.embed_size = embed_size

self.lstm_size = lstm_size

self.output_size = output_size

self.lstm_layers = lstm_layers

self.dropout = dropout

self.embedding = nn.Embedding(vocab_size, embed_size)

self.lstm = nn.LSTM(embed_size, lstm_size, lstm_layers, dropout=dropout, batch_first=False)

self.dropout = nn.Dropout(0.2)

self.fc1 = nn.Linear(lstm_size, dense_size)

self.fc2 = nn.Linear(dense_size + numeric_feature_size, output_size)

self.softmax = nn.LogSoftmax(dim=1)

def init_hidden(self, batch_size):

weight = next(self.parameters()).data

hidden = (weight.new(self.lstm_layers, batch_size, self.lstm_size).zero_(),

weight.new(self.lstm_layers, batch_size, self.lstm_size).zero_())

return hidden

def forward(self, nn_input_text, nn_input_meta, hidden_state):

batch_size = nn_input_text.size(0)

nn_input_text = nn_input_text.long()

embeds = self.embedding(nn_input_text)

lstm_out, hidden_state = self.lstm(embeds, hidden_state)

lstm_out = lstm_out[-1,:,:]

lstm_out = self.dropout(lstm_out)

dense_out = self.fc1(lstm_out)

concat_layer = torch.cat((dense_out, nn_input_meta.float()), 1)

out = self.fc2(concat_layer)

logps = self.softmax(out)

return logps, hidden_state

class BertTextClassifier(nn.Module):

def __init__(self, hidden_size, dense_size, numeric_feature_size, output_size, dropout=0.1):

super().__init__()

self.output_size = output_size

self.dropout = dropout

# Use pre-trained BERT model

self.bert = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True, output_attentions=True)

for param in self.bert.parameters():

param.requires_grad = True

self.weights = nn.Parameter(torch.rand(13, 1))

self.dropout = nn.Dropout(dropout)

self.fc1 = nn.Linear(hidden_size, dense_size)

self.fc2 = nn.Linear(dense_size + numeric_feature_size, output_size)

self.softmax = nn.LogSoftmax(dim=1)

def forward(self, input_ids, nn_input_meta):

all_hidden_states, all_attentions = self.bert(input_ids)[-2:]

batch_size = input_ids.shape[0]

ht_cls = torch.cat(all_hidden_states)[:, :1, :].view(13, batch_size, 1, 768)

atten = torch.sum(ht_cls * self.weights.view(13, 1, 1, 1), dim=[1, 3])

atten = F.softmax(atten.view(-1), dim=0)

feature = torch.sum(ht_cls * atten.view(13, 1, 1, 1), dim=[0, 2])

dense_out = self.fc1(self.dropout(feature))

concat_layer = torch.cat((dense_out, nn_input_meta.float()), 1)

out = self.fc2(concat_layer)

logps = self.softmax(out)

return logps

以上代碼在前向傳播時使用torch.cat將數字特徵和文本特徵進行組合,並輸入到後續的分類器中進行處理。

作者:Yuki Takahashi

原文地址:https://towardsdatascience.com/how-to-combine-textual-and-numerical-features-for-machine-learning-in-python-dc1526ca94d9

deephub翻譯組

相關焦點

  • 深度學習在NLP中的運用?從分詞、詞性到機器翻譯、對話系統
    本文將基於竹間智能的一些經驗和探索,從分詞、詞性等基礎模塊,到機器翻譯、知識問答等領域,列舉並分析一些深度學習在 NLP 領域的具體運用,希望對大家研究深度學習和 NLP 有所幫助。事實上,從分詞、詞性、語法解析、信息抽取等基礎模塊,到自然語言生成、機器翻譯、對話管理、知識問答等高層的 NLP 領域,幾乎都可以應用以 CNN、RNN 為代表的深度學習模型,且確實能夠取得不錯的效果。
  • NLP的文本分析與特徵工程
    摘要在本文中,我將使用NLP和Python解釋如何為機器學習模型分析文本數據和提取特徵。自然語言處理(NLP)是人工智慧的一個研究領域,它研究計算機與人類語言之間的相互作用,特別是如何對計算機進行編程以處理和分析大量自然語言數據。NLP常用於文本數據的分類。
  • NLP之文本分類:「Tf-Idf、Word2Vec和BERT」三種模型比較
    我們有多種技術從原始文本數據中提取信息,並用它來訓練分類模型。本教程比較了傳統的詞袋法(與簡單的機器學習算法一起使用)、流行的詞嵌入模型(與深度學習神經網絡一起使用)和最先進的語言模型(和基於attention的transformers模型中的遷移學習一起使用),語言模型徹底改變了NLP的格局。
  • Excel數字提取技巧:從混合文本中提取數字的方法
    前面我們分享了不用函數公式提取數字的5種方法。今天我們分享用簡單公式從混合文本中提取數字的方法。因為採用的公式很簡單,所以總體來說只適合數字在文本中的位置有一定規律的情況。如果想用公式提取沒有位置規律的數字,那就得看我們下一篇教程。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
  • PTMs|2020最新NLP預訓練模型綜述
    例如nlp中的log-linear、CRF模型等,cv中各種抽取特徵的模型,如sift特徵等。深度學習中本質上是一種表示學習,能夠一定程度上避免手動的特徵工程。究其原因,主要得益於深度學習中一系列很強大的特徵提取器,如CNN、RNN、Transformer等,這些特徵提取器能夠有效地捕獲原始輸入數據中所蘊含的特點和規律。
  • excel文本函數應用:單元格中的數字和字母,如何判斷?
    如何快速判斷單元格字符是否包含數字和字母呢?在規範編碼、密碼、用戶名的時候,我們經常要查證某一類字符串是否包含數字、英文、數字與英文的組合,甚至字符串的開頭是否是數字等。很簡單,利用Code、Char、Find、Search文本函數搭配Count函數即可解決這個問題。另外,關於轉換字母大小寫、刪除字符前後兩端的空格等,我們今天也會介紹。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
  • NLP三大特徵提取器全梳理:RNN vs CNN vs Transformer
    機器之心原創編輯:陳萍在進行 NLP 模型訓練前,請先選擇一個好的特徵提取器。在上一篇文章中我們介紹了自然語言處理的基礎問題——文本預處理的常用步驟。本文將進階講述特徵提取方面的相關算法。但經過池化之後,可映射到相同的特徵長度(如上圖中深紅色卷積核是 4 × 5,對於輸入值為 7 × 5 的輸入值,卷積之後的輸出值就是 4 × 1,最大池化之後就是 1 × 1;深綠色的卷積核是 3 × 5,卷積之後的輸出值是 5 × 1,最大池化之後就是 1 × 1)。之後將池化後的值進行組合,就得到 5 個池化後的特徵組合。
  • scikit-learn中的自動模型選擇和複合特徵空間
    使用scikit-learn管道自動組合文本和數字數據有時,機器學習模型的可能配置即使沒有上千種,也有數百種,這使得手工找到最佳配置的可能性變得不可能,因此自動化是必不可少的。在處理複合特徵空間時尤其如此,在複合特徵空間中,我們希望對數據集中的不同特徵應用不同的轉換。
  • 2019 年 NLP 領域都發生了哪些大事件?
    Code2Seq 可以實現諸如自動化代碼摘要和文檔生成。不知各位有沒有想過為生物醫學文本挖掘任務訓練一個生物醫學語言模型?2019 年,研究人員提出了一種從生物醫學文獻中提取出重要信息的語境化方法—— BioBERT。
  • 科普丨什麼是NLP(自然語言處理)
    情感分析情感分析是種有趣的NLP和數據挖掘任務,對文本數據中包含的情緒進行解析和分類,衡量人們的觀點傾向。例如被用來分析觀眾對電影的評論或由該電影引起的情緒狀態,又例如將在線客戶對產品或服務的反饋按照正面或負面的體驗進行分類。
  • 文本分類六十年
    在信息爆炸時代,對海量的文本數據進行人工手動處理和分類,既費時又存在許多操作困難。除此之外,人工文本分類的準確性很容易受到人為因素的影響,例如疲勞和專業知識。因此,我們渴望使用機器學習的方法來使文本分類過程自動化,以產生結果更可靠、判定更少主觀的結果。此外,通過從文本中定位所需信息,可以用來幫助提高信息檢索效率並緩解信息過載的問題。
  • 李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用
    但這個例子展示了在短短幾秒鐘裡,我們跟數個機器學習模型進行了交互。如果你從來沒有使用過機器學習,你會想,這個不就是編程嗎?或者,到底機器學習是什麼?首先,我們確實是使用程式語言來實現機器學習模型,我們跟計算機其他領域一樣,使用同樣的程式語言和硬體。但不是每個程序都用了機器學習。對於第二個問題,精確定義機器學習就像定義什麼是數學一樣難,但我們試圖在這章提供一些直觀的解釋。
  • 準備開始學習NLP,我該系統地看哪些書和課程?
    我實際上是為我的博士專門研究信息檢索和機器學習技術的,尤其是它們如何應用於社交計算和計算語言學,同時還開發了從大規模基於文本的數據中高效提取信息的方法。我很幸運有將經典機器學習應用於NLP的經驗,並親眼目睹了該領域深度學習的爆炸式增長。許多學生一直在要求我為如何開始自然語言處理準備指南。
  • 先看看這份2019機器學習與NLP年度盤點吧
    眾多 BERT 的變體已經在多模態場景下被應用,這些場景主要涉及文本及其相關的圖像、視頻(如下圖所示)。無監督訓練也開始滲透到過去監督學習統治的領域。在生物信息學領域中,Transformer 語言模型的預訓練也開始被應用在蛋白質序列預測上了(Rives et al., 2019)。
  • 深度 | 結合Logistic回歸構建最大熵馬爾科夫模型
    Batista機器之心編譯參與:乾樹、劉曉坤這是應用於 NLP 的連續監督學習系列博文的第二篇。當用於解決 NLP 任務時,它通過從輸入文本中提取特徵併線性組合它們來估計 p(y | x),即,將每個特徵乘以一個權重,然後將它們相加,然後將指數函數應用於該線性組合:
  • Facebook 自然語言處理新突破:新模型能力趕超人類 & 超難 NLP 新...
    Facebook 通過使用半監督和自監督學習技術,利用未標記的數據來提高純監督系統的性能。在第四屆機器翻譯大會(WMT19)比賽中,Facebook 採用了一種新型的半監督訓練方法,並在多種語言翻譯任務中獲得了第一名。Facebook 還引入了一種新的自我監督的預訓練方法——RoBERTa。它在一些語言理解任務上超過了所有現有的 NLU 系統。
  • 微博機器學習平臺雲上最佳實踐
    本文講述了微博機器學習平臺和深度學習平臺的業務功能和雲上實踐,剖析了阿里雲大數據在微博這兩大學習平臺的架構建設上所起到的作用。微博機器學習平臺(WML)優勢微博機器學習平臺的特點是樣本規模大,百億級樣本,實時性比較高,是分鐘級,然後模型規模是百億級,模型實時性根據不同場景有小時級、分鐘級和秒級。作業的穩定性的話要求是三個9,平臺業務多,場景豐富迭代快。
  • NLP中的Transformer 簡介
    編碼器和解碼器中的每個子層都有一個殘差連接,然後進行layer normalization(層標準化)。編碼器和解碼器的輸入所有編碼器/解碼器的輸入和輸出標記都使用學習過的嵌入轉換成向量。然後將這些輸入嵌入傳入進行位置編碼。
  • 機器翻譯:谷歌翻譯是如何對幾乎所有語言進行翻譯的?
    它使用人工神經網絡來預測某個單詞序列的概率,通常在單個集成模型中對整個句子進行建模。憑藉神經網絡的強大功能,神經網絡機器翻譯已經成為翻譯領域最強大的算法。這種最先進的算法是深度學習的一項應用,其中大量已翻譯句子的數據集用於訓練能夠在任意語言對之間的翻譯模型。