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

2021-01-08 騰訊網

應用於自然語言處理的機器學習數據通常包含文本和數字輸入。例如,當您通過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中的文本分析和特徵工程
    語言檢測,文本清理,長度測量,情緒分析,命名實體識別,n字頻率,詞向量,主題建模前言在本文中,我將使用NLP和Python解釋如何分析文本數據並為機器學習模型提取特徵。NLP(自然語言處理)是人工智慧的一個領域,研究計算機和人類語言之間的交互,特別是如何編程計算機來處理和分析大量的自然語言數據。NLP經常被應用於文本數據的分類。文本分類是根據文本數據的內容給文本數據分配類別的問題。文本分類最重要的部分是特徵工程:從原始文本數據為機器學習模型創建特徵的過程。
  • 性能媲美BERT,但參數量僅為1/300,這是谷歌最新的NLP模型
    pQRNN 的新穎之處在於,它將簡單的投影運算與 quasi-RNN 編碼器相結合,以進行快速、並行的處理。該研究表明,pQRNN 模型能夠在文本分類任務上實現 BERT 級別的性能,但參數量僅為原來的 1/300。
  • PTMs|2020最新NLP預訓練模型綜述
    例如nlp中的log-linear、CRF模型等,cv中各種抽取特徵的模型,如sift特徵等。深度學習中本質上是一種表示學習,能夠一定程度上避免手動的特徵工程。究其原因,主要得益於深度學習中一系列很強大的特徵提取器,如CNN、RNN、Transformer等,這些特徵提取器能夠有效地捕獲原始輸入數據中所蘊含的特點和規律。
  • 如何對非結構化文本數據進行特徵工程操作?這裡有妙招!
    在本文中,我們將通過實踐的方法,探索從文本數據提取出有意義的特徵的一些普遍且有效的策略,提取出的特徵極易用來構建機器學習或深度學習模型。研究動機想要構建性能優良的機器學習模型,特徵工程必不可少。有時候,可能只需要一個優秀的特徵,你就能贏得 Kaggle 挑戰賽的勝利!對於非結構化的文本數據來說,特徵工程更加重要,因為我們需要將文本流轉化為機器學習算法能理解的數字表示。
  • 刷新五項SOTA,百度ActBERT:基於動作和局部物體視頻文本特徵模型
    這篇 Oral 論文中,百度提出了 ActBERT,該模型可以學習敘述性視頻進行無監督視頻文本關係,並提出糾纏編碼器對局部區域、全局動作與語言文字進行編碼。最終在 5 項相關測評任務上取得了 SOTA 結果。
  • 國內自然語言處理(NLP)研究組
    智能計算研究中心icrc.hitsz.edu.cn東北大學自然語言處理實驗室Natural Language Processing Laboratory at Northeastern University|東北大學自然語言處理實驗室|機器翻譯
  • 深度學習概述:NLP vs CNN
    現在,每家公司都希望在其系統中實現這一尖端技術,以降低成本、節省時間,並通過自動化使整個工作流程更加高效。最初的人工智慧和深度學習算法比較簡單,就像我們所知的簡單感知器模型和單層神經網絡一樣。隨著時間的推移和更加專注的研究,我們已經擁有了具有多層結構的複雜神經網絡。一些公司在他們的軟體和服務中使用了LSTMs、GANs、變分自編碼器等算法。
  • NLP之文本分類:「Tf-Idf、Word2Vec和BERT」三種模型比較
    NLP(自然語言處理)是人工智慧的一個領域,它研究計算機和人類語言之間的交互作用,特別是如何通過計算機編程來處理和分析大量的自然語言數據。NLP常用於文本數據的分類。文本分類是指根據文本數據內容對其進行分類的問題。我們有多種技術從原始文本數據中提取信息,並用它來訓練分類模型。
  • excel數據提取技巧:從混合文本中提取數字的萬能公式
    有沒有能把任何文本中包含的所有數字都提取出來的公式?當然是有的,今天就給大家帶來提取數字的萬能公式,不管數字在文本中的位置是否有規律,不管文本中數字有多少,它都能把數字提取出來。趕緊來看看吧!學習更多技巧,請收藏關注部落窩教育excel圖文教程。在上一篇文章中,小花講解了通過觀察混合文本特徵,設置特定公式,完成數據提取的三種情景。
  • 腦機接口利器,從腦波到文本,只需要一個機器翻譯模型
    這裡需要重點強調一下「任意」,因為輸入和輸出序列的長度是變化的,並且彼此之間並不必須有確定性的一一對應關係。在Joseph 等人的這項工作中,他們嘗試一次解碼一個句子,這和現在基於深度學習的端到端機器翻譯算法類似。兩者相同的地方是,都會映射到相同類型的輸出,即一個句子的詞序列。
  • NLP能否像人腦一樣工作?CMU、MIT三篇論文詳解機器和大腦範疇下NLP...
    作者對 fMRI 中的每個體素(voxel)和 MEG 中的每個傳感器/時間點進行了多次分類,得到了最終的平均分類準確性評估。作者稱這種將編碼模型的預測與正確的大腦記錄相匹配的準確性為「預測準確性」。體素(voxel)是體積元素 (volumepixel) 的簡稱,是指三維空間中值的體積元素(體積和像素),也是數字數據在三維空間中的最小單位。
  • NLP三大特徵提取器全梳理:RNN vs CNN vs Transformer
    機器之心原創編輯:陳萍在進行 NLP 模型訓練前,請先選擇一個好的特徵提取器。在上一篇文章中我們介紹了自然語言處理的基礎問題——文本預處理的常用步驟。本文將進階講述特徵提取方面的相關算法。但經過池化之後,可映射到相同的特徵長度(如上圖中深紅色卷積核是 4 × 5,對於輸入值為 7 × 5 的輸入值,卷積之後的輸出值就是 4 × 1,最大池化之後就是 1 × 1;深綠色的卷積核是 3 × 5,卷積之後的輸出值是 5 × 1,最大池化之後就是 1 × 1)。之後將池化後的值進行組合,就得到 5 個池化後的特徵組合。
  • OCR在NLP場景中的應用
    二值化的做法一般分為以下幾種:版面分析:是將掃描得到的圖像,將文本按照不同的屬性劃分出區域塊。對於各個不同的區域塊,如:橫排正文、豎排正文、表格、圖片等。字符切割:對圖像中的文本進行字符級的切割,需要注意的是字符粘連等問題。
  • 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和...
    文本分類問題所在的自然語言領域自然也有其特有的特徵處理邏輯,傳統分本分類任務大部分工作也在此處。文本特徵工程分為文本預處理、特徵提取、文本表示三個部分,最終目的是把文本轉換成計算機可理解的格式,並封裝足夠用於分類的信息,即很強的特徵表達能力。1)文本預處理文本預處理過程是在文本中提取關鍵詞表示文本的過程,中文文本處理中主要包括文本分詞和去停用詞兩個階段。
  • scikit-learn中的自動模型選擇和複合特徵空間
    使用scikit-learn管道自動組合文本和數字數據有時,機器學習模型的可能配置即使沒有上千種,也有數百種,這使得手工找到最佳配置的可能性變得不可能,因此自動化是必不可少的。在處理複合特徵空間時尤其如此,在複合特徵空間中,我們希望對數據集中的不同特徵應用不同的轉換。
  • NLP像人腦一樣工作?CMU、MIT三篇論文詳解機器大腦範疇下NLP關係
    隨著研究的深入,一些學者開始探討機器中的自然語言處理和大腦中的自然語言處理是否存在著一些聯繫,進而延伸至神經科學與 BERT 等 NLP 預訓練方法的交叉點。本文選取 CMU Wehbe 研究小組(2 篇)和 MIT Roger P. Levy 教授組(1 篇)的三篇文章,對這一主題進行了詳細的解析和討論。
  • Kaggle Grandmaster 的 NLP 方法
    對數據的深入研究可以找出任何缺失的值,讓你知道需要清理多少數據,並有助於在稍後的問題中通知你的模型構建決策。Abhishek 還提醒我們,我們正在處理一個多類文本分類問題,最好不要忽視我們正在努力實現的目標!他會注意到什麼樣的評價指標將用於評分。在這次競賽中,Kaggle 使用多類對數損失來衡量提交模型的性能。理想情況下,我們的多分類模型的對數損失為 0。
  • 2019 年 NLP 領域都發生了哪些大事件?
    Code2Seq 可以實現諸如自動化代碼摘要和文檔生成。不知各位有沒有想過為生物醫學文本挖掘任務訓練一個生物醫學語言模型?2019 年,研究人員提出了一種從生物醫學文獻中提取出重要信息的語境化方法—— BioBERT。
  • ACL2020|使用強化學習為機器翻譯生成對抗樣本
    再者,強化學習是基於「探索&利用」(explore & exploit)原理進行的無監督學習,當前已在許多人工智慧挑戰中取得很好的成績。其核心在於建模環境交互,以訓練能完成特定目的的智能體(agent)。