丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給skura
發(fā)送

0

Kaggle Grandmaster 的 NLP 方法

本文作者: skura 2019-09-07 08:54
導語:Kaggle Grandmaster 的 NLP Kernel

雷鋒網(wǎng) AI 開發(fā)者按,相信很多數(shù)據(jù)科學從業(yè)者都會去參加 kaggle 競賽,提高自己的能力。在 Kaggle Competitions 排行榜中,有一個頭銜是眾多用戶都十分向往的,那就是「Kaggle Grandmaster」,指的是排名 0.1‰ 的頂級高手。數(shù)據(jù)科學新手 Dean Sublett 和數(shù)據(jù)科學家,Kaggle Grandmaster  Abhishek 進行了交流,并寫了一篇關(guān)于他的 kaggle Kernel 的文章,AI 開發(fā)者編譯整理。

Kaggle Grandmaster 的 NLP 方法

個人經(jīng)歷

在進入德國各大公司開始數(shù)據(jù)科學家的工作之前,Abhishek Thakur 先后在 NIT Surat 和人 Bonn 大學獲得了電氣工程學士學位和計算機科學碩士學位。目前,他擔任挪威 Boost.a i 的首席數(shù)據(jù)科學家,這是一家「專門研究會話人工智能(ai)的軟件公司」,但我對 Abhishek 印象最深的地方在于他的 Kaggle 影響力。

你可以在這里查看他的 Kaggle 檔案,以下是他曾經(jīng)獲得的榮譽:

  • 比賽總冠軍(17 枚金牌,歷史最高排名世界第 3)

  • Kernel 專家(他在 Kaggler 的前 1% 之內(nèi))

  • 討論大師(65 枚金牌,有史以來最高排名是第 2)

Kaggle Grandmaster 的 NLP 方法

我想看看 Abhishek 的經(jīng)驗,了解任何關(guān)于 kaggle 的 NLP 問題。我選擇了 Abhishek 的 kernel。我一直在努力學習更多關(guān)于自然語言處理的知識,怎么能錯過學習 Abhishek 的 Halloween-themed Spooky Authors 數(shù)據(jù)集呢?

Abhishek 的 NLP 方法

我強烈建議你打開 kernel 閱讀本文。如果你真的想要對 NLP 或者一般的數(shù)據(jù)科學有更深入的了解,那么在閱讀 Abhishek 的 kernel 時,一定要自己動手編程來理解它的每一行代碼。

所以我們不要忘記,我們的任務是確定測試集中每個句子的作者(EAP—Edgar Allen Poe; HPL—H.P. Lovecraft; MWS—Mary Wollstonecraft Shelley)。

1.探索數(shù)據(jù)并理解問題

在導入必要的 python 模塊和數(shù)據(jù)之后,Abhishek 對數(shù)據(jù)調(diào)用 head()方法,以查看前五行是什么樣子的。由于 Abhishek 是一個專家,這是一個 NLP 問題,與涉及數(shù)值數(shù)據(jù)的問題相比,探索性數(shù)據(jù)分析(通常被稱為 EDA)是很膚淺的。但是數(shù)據(jù)科學新手可能會從 EDA 中受益。對數(shù)據(jù)的深入研究可以找出任何缺失的值,讓你知道需要清理多少數(shù)據(jù),并有助于在稍后的問題中通知你的模型構(gòu)建決策。

Abhishek 還提醒我們,我們正在處理一個多類文本分類問題,最好不要忽視我們正在努力實現(xiàn)的目標!他會注意到什么樣的評價指標將用于評分。在這次競賽中,Kaggle 使用多類對數(shù)損失來衡量提交模型的性能。理想情況下,我們的多分類模型的對數(shù)損失為 0。如果你感興趣的話,這里有更多關(guān)于對數(shù)損失的信息。

2.預處理

接下來,Abhishek 使用 Scikit Learn 中的 labelencoder()方法為每個作者分配一個整數(shù)值。通過使用整數(shù)值(0、1、2)對作者列中的值的文本標簽進行編碼使數(shù)據(jù)更容易被他的分類模型理解。

對作者標簽進行編碼后,Abhishek 使用 Scikit Learn 中的 train_test_split 將數(shù)據(jù)拆分為訓練集和驗證集。他打算對數(shù)據(jù)集中 90% 的句子進行模型訓練,然后根據(jù)剩余 10% 的數(shù)據(jù)評估模型的準確性。

3.建立模型

在創(chuàng)建第一個模型之前,Abhishek 在數(shù)據(jù)上使用了 TF-IDF (Term Frequency—Inverse Document Frequency)。TF-IDF 將為文本列句子中出現(xiàn)的單詞賦予權(quán)重。因此,TF-IDF 將幫助我們理解當我們試圖確定哪位作者寫了一個特定的句子時,哪些詞是重要的?!竧he」等詞對于作者分類不重要,因為「the」經(jīng)常出現(xiàn),并且不透露太多信息,但一個詞, 例如,E「cthulhu」在對 H.P.Lovecraft 寫的句子進行分類時非常重要。關(guān)于 TF-IDF 的更多信息可以在這里找到。

在數(shù)據(jù)上運行 TF-IDF 是一種特征提取的形式。在這里,我們需要推導出數(shù)據(jù)的某種重要的預測因子或特征,幫助我們找出哪位作者寫了一個特定的句子。有了 TF-IDF,我們就可以統(tǒng)計出一個詞的重要性,從而幫助我們預測句子的作者。

在訓練集和驗證集上擬合 TF-IDF 后,Abhishek 建立了一個邏輯回歸模型。如果這種類型的分類模型對你來說是新的,請在繼續(xù)之前閱讀它的介紹。在擬合了邏輯回歸模型后,Abhishek 計算了其邏輯回歸模型的對數(shù)損失(回想一下,他在內(nèi)核開始附近編寫了多類對數(shù)損失函數(shù))。對于邏輯回歸模型,多類對數(shù)損失函數(shù)返回 0.626 的對數(shù)損失值。雖然將 TF-IDF 與邏輯回歸模型相結(jié)合可以為我們提供一個良好的開端,但我們可以提高這個對數(shù)損失分數(shù)。

4.模型調(diào)整

因此,我們對 0.626 的對數(shù)損失分數(shù)不滿意,希望優(yōu)化這個評估指標。從這里,我們有很多方法可以嘗試,這正是 Abhishek 所做的。在我們研究和預處理了數(shù)據(jù)之后,我們得到了許多不同的特征提取和模型擬合組合。例如,Abhishek 使用字數(shù)來提取特征,而不是使用 TF-IDF。使用這種特征提取技術(shù),他的邏輯回歸模型的對數(shù)損失分數(shù)從 0.626 提高到 0.528,提高了 0.098!

總結(jié)

由于 Abhishek 的 kernel 從這里開始變得越來越細節(jié),我將讓他完成解釋其他分類模型這項繁重的工作。

以下是我們討論的內(nèi)容:

  • EDA:如果我們想了解數(shù)據(jù)集,探索性數(shù)據(jù)分析(Exploratory data analysis,EDA)是至關(guān)重要的,而且 EDA 可以在我們開始構(gòu)建模型時為我們節(jié)省時間。

  • 多分類問題:這種類型的問題要求我們預測哪些觀測結(jié)果屬于哪個類別,每個觀測結(jié)果可以屬于三個或更多類別中的任何一個類別。

  • 預處理:在建立任何模型之前,我們必須對數(shù)據(jù)進行預處理。在這個例子中,為了模型,我們需要使用 labelendcoder()將文本標簽轉(zhuǎn)換為整數(shù)值。

  • 特征提?。好慨斘覀冇幸粋€原始數(shù)據(jù)集(在我們的示例中是句子摘錄)時,我們就需要推導一些預測因子來幫助我們確定如何對觀察結(jié)果進行分類。Abhishek 教我們?nèi)绾问褂?TF-IDF 和字數(shù)。

從這里開始,我們就要提取具有高預測能力的特性,選擇與問題匹配的模型,并優(yōu)化我們所關(guān)注的度量標準。不要害怕麻煩,多嘗試幾個模型——通過更多實驗,你很可能找到適合優(yōu)化你的評估指標的模型。我希望在閱讀了這篇文章之后,你能更好地理解如何處理 NLP 問題,并且你也很欣賞 Abhishek 的工作。

附錄

上面是本文中提到的所有 Abhishek 的代碼。我要重申的是,這不是我自己的工作,這篇文章是為了幫助初學者學習 Abhishek 的 NLP 教程。

# This gist is a collection of code from Abhishek Thakur's Kaggle NLP tutorial, which can be found here:    


# https://www.kaggle.com/abhishek/approaching-almost-any-nlp-problem-on-kaggle   


# 1. Exploring the Data and Understanding the Problem #    


import pandas as pd    


import numpy as np    


import xgboost as xgb    


from tqdm import tqdm    


from sklearn.svm import SVC    


from keras.models import Sequential    


from keras.layers.recurrent import LSTM, GRU    


from keras.layers.core import Dense, Activation, Dropout    


from keras.layers.embeddings import Embedding    


from keras.layers.normalization import BatchNormalization    


from keras.utils import np_utils    


from sklearn import preprocessing, decomposition, model_selection, metrics, pipeline    


from sklearn.model_selection import GridSearchCV    


from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer    


from sklearn.decomposition import TruncatedSVD    


from sklearn.linear_model import LogisticRegression    


from sklearn.model_selection import train_test_split    


from sklearn.naive_bayes import MultinomialNB    


from keras.layers import GlobalMaxPooling1D, Conv1D, MaxPooling1D, Flatten, Bidirectional, SpatialDropout1D    


from keras.preprocessing import sequence, text    


from keras.callbacks import EarlyStopping    


from nltk import word_tokenize    


from nltk.corpus import stopwords    


stop_words = stopwords.words('english')   





train = pd.read_csv('../input/train.csv')    


test = pd.read_csv('../input/test.csv')    


sample = pd.read_csv('../input/sample_submission.csv')   





train.head()   





test.head()   





sample.head()   





def multiclass_logloss(actual, predicted, eps=1e-15):    


        """Multi class version of Logarithmic Loss metric.    


          :param actual: Array containing the actual target classes    


          :param predicted: Matrix with class predictions, one probability per class    


          """    


       # Convert 'actual' to a binary array if it's not already:    


       if len(actual.shape) == 1:    


              actual2 = np.zeros((actual.shape[0], predicted.shape[1]))    


              for i, val in enumerate(actual):    


                     actual2[i, val] = 1    


              actual = actual2   





       clip = np.clip(predicted, eps, 1 - eps)    


       rows = actual.shape[0]    


       vsota = np.sum(actual * np.log(clip))    


       return -1.0 / rows * vsota   





# 2. Preprocessing #    


lbl_enc = preprocessing.LabelEncoder()    


y = lbl_enc.fit_transform(train.author.values)   





xtrain, xvalid, ytrain, yvalid = train_test_split(train.text.values, y,    


                                                                       stratify=y,    


                                                                      random_state=42,    


                                                                      test_size=0.1, shuffle=True)    


print (xtrain.shape)    


print (xvalid.shape)   





# 3. Building a Model #    


# Always start with these features. They work (almost) everytime!    


tfv = TfidfVectorizer(min_df=3,  max_features=None,    


                   strip_accents='unicode', analyzer='word',token_pattern=r'\w{1,}',    


                   ngram_range=(1, 3), use_idf=1,smooth_idf=1,sublinear_tf=1,    


                   stop_words = 'english')   





# Fitting TF-IDF to both training and test sets (semi-supervised learning)    


tfv.fit(list(xtrain) + list(xvalid))    


xtrain_tfv =  tfv.transform(xtrain)    


xvalid_tfv = tfv.transform(xvalid)   





# Fitting a simple Logistic Regression on TFIDF    


clf = LogisticRegression(C=1.0)    


clf.fit(xtrain_tfv, ytrain)    


predictions = clf.predict_proba(xvalid_tfv)   





print ("logloss: %0.3f " % multiclass_logloss(yvalid, predictions))   





# 4. Model Tweaking #    


ctv = CountVectorizer(analyzer='word',token_pattern=r'\w{1,}',    


                ngram_range=(1, 3), stop_words = 'english')   





# Fitting Count Vectorizer to both training and test sets (semi-supervised learning)    


ctv.fit(list(xtrain) + list(xvalid))    


xtrain_ctv =  ctv.transform(xtrain)    


xvalid_ctv = ctv.transform(xvalid)   





# Fitting a simple Logistic Regression on Counts    


clf = LogisticRegression(C=1.0)    


clf.fit(xtrain_ctv, ytrain)    


predictions = clf.predict_proba(xvalid_ctv)   





print ("logloss: %0.3f " % multiclass_logloss(yvalid, predictions))

# NOTE: THIS IS NOT MY OWN WORK    


地址:https://towardsdatascience.com/what-i-learned-from-abhishek-thakur-4b905ac0fd55

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

Kaggle Grandmaster 的 NLP 方法

分享:
相關(guān)文章
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說