# 如何開發一個單詞級神經語言模型并用它來生成文本
> 原文: [https://machinelearningmastery.com/how-to-develop-a-word-level-neural-language-model-in-keras/](https://machinelearningmastery.com/how-to-develop-a-word-level-neural-language-model-in-keras/)
語言模型可以基于序列中已經觀察到的單詞來預測序列中下一個單詞的概率。
神經網絡模型是開發統計語言模型的首選方法,因為它們可以使用分布式表示,其中具有相似含義的不同單詞具有相似的表示,并且因為它們在進行預測時可以使用最近觀察到的單詞的大的上下文。
在本教程中,您將了解如何使用 Python 中的深度學習開發統計語言模型。
完成本教程后,您將了解:
* 如何準備文本以開發基于單詞的語言模型。
* 如何設計和擬合具有學習嵌入和 LSTM 隱藏層的神經語言模型。
* 如何使用學習的語言模型生成具有與源文本類似的統計屬性的新文本。
讓我們開始吧。
* **Update Apr / 2018** :修正了模型描述中 100 個輸入字與實際模型中 50 個輸入字之間的不匹配。

如何開發一個單詞級神經語言模型并用它來生成文本
照片由 [Carlo Raso](https://www.flickr.com/photos/70125105@N06/32512473990/) 拍攝,保留一些權利。
## 教程概述
本教程分為 4 個部分;他們是:
1. 柏拉圖共和國
2. 數據準備
3. 訓練語言模型
4. 使用語言模型
## 柏拉圖共和國
[共和國](https://en.wikipedia.org/wiki/Republic_(Plato))是古典希臘哲學家柏拉圖最著名的作品。
它被構建為關于城市國家內秩序和正義主題的對話(例如對話)
整個文本在公共領域免費提供。它可以在 [Project Gutenberg 網站](https://www.gutenberg.org/ebooks/1497)上以多種格式獲得。
您可以在此處下載整本書(或書籍)的 ASCII 文本版本:
* [下載柏拉圖共和國](http://www.gutenberg.org/cache/epub/1497/pg1497.txt)
下載書籍文本并將其直接放在當前工作中,文件名為“ _republic.txt_ ”
在文本編輯器中打開文件并刪除前后問題。這包括開頭的書籍詳細信息,長篇分析以及最后的許可證信息。
案文應以:
> 書 I.
>
> 我昨天和阿里斯頓的兒子格勞孔一起去了比雷埃夫斯,
> ......
結束
> ......
> 在這一生和我們一直描述的千年朝圣中,我們都應該好好相處。
將清理后的版本保存為' _republic_clean。當前工作目錄中的 _ txt'。該文件應該是大約 15,802 行文本。
現在我們可以從這個文本開發一個語言模型。
## 數據準備
我們將從準備建模數據開始。
第一步是查看數據。
### 查看文本
在編輯器中打開文本,然后查看文本數據。
例如,這是第一個對話框:
> 書 I.
>
> 我昨天和阿里斯頓的兒子 Glaucon 一起去了比雷埃夫斯,
> 我可以向女神祈禱(Bendis,Thracian
> Artemis。);而且因為我想看看他們以什么樣的方式
> 慶祝這個節日,這是一個新事物。我很滿意居民的
> 游行;但是色雷斯人的情況也是如此,
> 即使不是更多,也是美麗的。當我們完成祈禱并觀看
> 景觀時,我們轉向了城市的方向;在那一瞬間
> Cephalus 的兒子 Polemarchus 偶然在我們回家的路上從
> 的距離看到了我們,并告訴他的仆人
> 跑去讓我們等他。仆人背后披著斗篷
> 抓住我,并說:Polemarchus 希望你等。
>
> 我轉過身,問他的主人在哪里。
>
> 他說,如果你只是等待,那么他就是那個年輕人。
>
> 當然,我們會,Glaucon 說。幾分鐘后,Polemarchus
> 出現了,并與他一起出現了 Glaucon 的兄弟 Adeimantus,Nicias 的兒子 Niceratus 以及其他幾位參加過游行的人。
>
> Polemarchus 對我說:我認為,蘇格拉底,你和你的
> 同伴已經在前往城市的路上。
>
> 我說,你沒錯。
>
> ...
您認為我們在準備數據時需要處理什么?
以下是我從快速瀏覽中看到的內容:
* 書/章標題(例如“BOOK I.”)。
* 英國英語拼寫(例如“榮幸”)
* 標點符號很多(例如“ - ”,“; - ”,“? - ”等)
* 奇怪的名字(例如“Polemarchus”)。
* 一些漫長的獨白,持續數百行。
* 一些引用的對話框(例如'...')
這些觀察以及更多建議以我們可能希望準備文本數據的方式提出。
我們準備數據的具體方式實際上取決于我們打算如何對其進行建模,而這又取決于我們打算如何使用它。
### 語言模型設計
在本教程中,我們將開發一個文本模型,然后我們可以使用它來生成新的文本序列。
語言模型將是統計的,并且將預測給定輸入文本序列的每個單詞的概率。預測的單詞將作為輸入輸入,進而生成下一個單詞。
關鍵的設計決策是輸入序列應該有多長。它們需要足夠長以允許模型學習要預測的單詞的上下文。此輸入長度還將定義在使用模型時用于生成新序列的種子文本的長度。
沒有正確的答案。有了足夠的時間和資源,我們就可以探索模型用不同大小的輸入序列學習的能力。
相反,我們將為輸入序列的長度選擇 50 個字的長度,有點任意。
我們可以處理數據,以便模型只處理自包含的句子并填充或截斷文本以滿足每個輸入序列的這一要求。您可以將此作為本教程的擴展進行探索。
相反,為了使示例保持簡潔,我們將讓所有文本一起流動并訓練模型以預測文本中句子,段落甚至書籍或章節中的下一個單詞。
現在我們有一個模型設計,我們可以看看將原始文本轉換為 50 個輸入字到 1 個輸出字的序列,準備好適合模型。
### 加載文字
第一步是將文本加載到內存中。
我們可以開發一個小函數來將整個文本文件加載到內存中并返回它。該函數名為 _load_doc()_,如下所示。給定文件名,它返回一個加載文本序列。
```py
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
```
使用此函數,我們可以在文件' _republic_clean.txt_ '中加載文檔的清潔版本,如下所示:
```py
# load document
in_filename = 'republic_clean.txt'
doc = load_doc(in_filename)
print(doc[:200])
```
運行此代碼段會加載文檔并打印前 200 個字符作為完整性檢查。
> 書 I.
>
> 我昨天和阿里斯頓的兒子 Glaucon 一起去了比雷埃夫斯,
> 我可以向女神祈禱(Bendis,Thracian
> Artemis。);還因為我想知道什么
到現在為止還挺好。接下來,讓我們清理文本。
### 干凈的文字
我們需要將原始文本轉換為一系列令牌或單詞,我們可以將其用作訓練模型的源。
基于查看原始文本(上文),下面是我們將執行的一些特定操作來清理文本。您可能希望自己探索更多清潔操作作為擴展。
* 將' - '替換為空格,以便我們可以更好地分割單詞。
* 基于空白區域的分詞。
* 從單詞中刪除所有標點符號以減少詞匯量大小(例如'What?'變為'What')。
* 刪除所有非字母的單詞以刪除獨立的標點符號。
* 將所有單詞標準化為小寫以減少詞匯量。
詞匯量大小與語言建模有很大關系。較小的詞匯量會導致較小的模型更快地訓練。
我們可以在一個函數中按此順序實現每個清理操作。下面是函數 _clean_doc()_,它將加載的文檔作為參數并返回一個干凈的標記數組。
```py
import string
# turn a doc into clean tokens
def clean_doc(doc):
# replace '--' with a space ' '
doc = doc.replace('--', ' ')
# split into tokens by white space
tokens = doc.split()
# remove punctuation from each token
table = str.maketrans('', '', string.punctuation)
tokens = [w.translate(table) for w in tokens]
# remove remaining tokens that are not alphabetic
tokens = [word for word in tokens if word.isalpha()]
# make lower case
tokens = [word.lower() for word in tokens]
return tokens
```
我們可以在加載的文檔上運行此清理操作,并打印出一些標記和統計信息作為完整性檢查。
```py
# clean document
tokens = clean_doc(doc)
print(tokens[:200])
print('Total Tokens: %d' % len(tokens))
print('Unique Tokens: %d' % len(set(tokens)))
```
首先,我們可以看到一個很好的令牌列表,它看起來比原始文本更清晰。我們可以刪除' _Book I_ '章節標記等等,但這是一個好的開始。
```py
['book', 'i', 'i', 'went', 'down', 'yesterday', 'to', 'the', 'piraeus', 'with', 'glaucon', 'the', 'son', 'of', 'ariston', 'that', 'i', 'might', 'offer', 'up', 'my', 'prayers', 'to', 'the', 'goddess', 'bendis', 'the', 'thracian', 'artemis', 'and', 'also', 'because', 'i', 'wanted', 'to', 'see', 'in', 'what', 'manner', 'they', 'would', 'celebrate', 'the', 'festival', 'which', 'was', 'a', 'new', 'thing', 'i', 'was', 'delighted', 'with', 'the', 'procession', 'of', 'the', 'inhabitants', 'but', 'that', 'of', 'the', 'thracians', 'was', 'equally', 'if', 'not', 'more', 'beautiful', 'when', 'we', 'had', 'finished', 'our', 'prayers', 'and', 'viewed', 'the', 'spectacle', 'we', 'turned', 'in', 'the', 'direction', 'of', 'the', 'city', 'and', 'at', 'that', 'instant', 'polemarchus', 'the', 'son', 'of', 'cephalus', 'chanced', 'to', 'catch', 'sight', 'of', 'us', 'from', 'a', 'distance', 'as', 'we', 'were', 'starting', 'on', 'our', 'way', 'home', 'and', 'told', 'his', 'servant', 'to', 'run', 'and', 'bid', 'us', 'wait', 'for', 'him', 'the', 'servant', 'took', 'hold', 'of', 'me', 'by', 'the', 'cloak', 'behind', 'and', 'said', 'polemarchus', 'desires', 'you', 'to', 'wait', 'i', 'turned', 'round', 'and', 'asked', 'him', 'where', 'his', 'master', 'was', 'there', 'he', 'is', 'said', 'the', 'youth', 'coming', 'after', 'you', 'if', 'you', 'will', 'only', 'wait', 'certainly', 'we', 'will', 'said', 'glaucon', 'and', 'in', 'a', 'few', 'minutes', 'polemarchus', 'appeared', 'and', 'with', 'him', 'adeimantus', 'glaucons', 'brother', 'niceratus', 'the', 'son', 'of', 'nicias', 'and', 'several', 'others', 'who', 'had', 'been', 'at', 'the', 'procession', 'polemarchus', 'said']
```
我們還獲得了有關干凈文檔的一些統計信息。
我們可以看到,干凈的文字中只有不到 120,000 個單詞,而且詞匯量不到 7,500 個單詞。這個很小,適合這些數據的模型應該可以在適度的硬件上進行管理。
```py
Total Tokens: 118684
Unique Tokens: 7409
```
接下來,我們可以看看將標記整形為序列并將它們保存到文件中。
### 保存干凈的文字
我們可以將長令牌列表組織成 50 個輸入字和 1 個輸出字的序列。
也就是說,51 個單詞的序列。
我們可以通過從令牌 51 開始迭代令牌列表并將先前的 50 個令牌作為序列進行迭代,然后將該過程重復到令牌列表的末尾。
我們將令牌轉換為以空格分隔的字符串,以便以后存儲在文件中。
下面列出了將清潔令牌列表拆分為長度為 51 令牌的序列的代碼。
```py
# organize into sequences of tokens
length = 50 + 1
sequences = list()
for i in range(length, len(tokens)):
# select sequence of tokens
seq = tokens[i-length:i]
# convert into a line
line = ' '.join(seq)
# store
sequences.append(line)
print('Total Sequences: %d' % len(sequences))
```
運行此片段會創建一長串的行。
在列表上打印統計數據,我們可以看到我們將有 118,633 種訓練模式來適應我們的模型。
```py
Total Sequences: 118633
```
接下來,我們可以將序列保存到新文件中以便以后加載。
我們可以定義一個新函數來保存文本行到文件。這個新函數叫做 _save_doc()_,如下所示。它將行和文件名列表作為輸入。這些行以 ASCII 格式寫入,每行一行。
```py
# save tokens to file, one dialog per line
def save_doc(lines, filename):
data = '\n'.join(lines)
file = open(filename, 'w')
file.write(data)
file.close()
```
我們可以調用此函數并將訓練序列保存到文件' _republic_sequences.txt_ '。
```py
# save sequences to file
out_filename = 'republic_sequences.txt'
save_doc(sequences, out_filename)
```
使用文本編輯器查看文件。
你會看到每一行都沿著一個單詞移動,最后一個新單詞被預測;例如,以下是截斷形式的前 3 行:
> 我知道了......看到了
> 我去了......看到我們
> 我從
> 下來......
### 完整的例子
將所有這些結合在一起,下面提供了完整的代碼清單。
```py
import string
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
# turn a doc into clean tokens
def clean_doc(doc):
# replace '--' with a space ' '
doc = doc.replace('--', ' ')
# split into tokens by white space
tokens = doc.split()
# remove punctuation from each token
table = str.maketrans('', '', string.punctuation)
tokens = [w.translate(table) for w in tokens]
# remove remaining tokens that are not alphabetic
tokens = [word for word in tokens if word.isalpha()]
# make lower case
tokens = [word.lower() for word in tokens]
return tokens
# save tokens to file, one dialog per line
def save_doc(lines, filename):
data = '\n'.join(lines)
file = open(filename, 'w')
file.write(data)
file.close()
# load document
in_filename = 'republic_clean.txt'
doc = load_doc(in_filename)
print(doc[:200])
# clean document
tokens = clean_doc(doc)
print(tokens[:200])
print('Total Tokens: %d' % len(tokens))
print('Unique Tokens: %d' % len(set(tokens)))
# organize into sequences of tokens
length = 50 + 1
sequences = list()
for i in range(length, len(tokens)):
# select sequence of tokens
seq = tokens[i-length:i]
# convert into a line
line = ' '.join(seq)
# store
sequences.append(line)
print('Total Sequences: %d' % len(sequences))
# save sequences to file
out_filename = 'republic_sequences.txt'
save_doc(sequences, out_filename)
```
您現在應該將訓練數據存儲在當前工作目錄中的文件' _republic_sequences.txt_ '中。
接下來,讓我們看看如何使語言模型適合這些數據。
## 訓練語言模型
我們現在可以從準備好的數據中訓練統計語言模型。
我們將訓練的模型是神經語言模型。它有一些獨特的特點:
* 它使用單詞的分布式表示,以便具有相似含義的不同單詞具有相似的表示。
* 它在學習模型的同時學習表示。
* 它學會使用最后 100 個單詞的上下文預測下一個單詞的概率。
具體來說,我們將使用嵌入層來學習單詞的表示,并使用長期短期記憶(LSTM)循環神經網絡來學習根據其上下文預測單詞。
讓我們從加載我們的訓練數據開始。
### 加載序列
我們可以使用我們在上一節中開發的 _load_doc()_ 函數加載我們的訓練數據。
加載后,我們可以通過基于新行的拆分將數據拆分為單獨的訓練序列。
下面的代碼段將從當前工作目錄加載' _republic_sequences.txt_ '數據文件。
```py
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
# load
in_filename = 'republic_sequences.txt'
doc = load_doc(in_filename)
lines = doc.split('\n')
```
接下來,我們可以編碼訓練數據。
### 編碼序列
單詞嵌入層要求輸入序列由整數組成。
我們可以將詞匯表中的每個單詞映射到一個唯一的整數,并對輸入序列進行編碼。之后,當我們進行預測時,我們可以將預測轉換為數字并在同一映射中查找其關聯的單詞。
要進行此編碼,我們將使用 Keras API 中的 [Tokenizer 類](https://keras.io/preprocessing/text/#tokenizer)。
首先,必須在整個訓練數據集上訓練 Tokenizer,這意味著它會找到數據中的所有唯一單詞并為每個單詞分配一個唯一的整數。
然后我們可以使用 fit Tokenizer 對所有訓練序列進行編碼,將每個序列從單詞列表轉換為整數列表。
```py
# integer encode sequences of words
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
sequences = tokenizer.texts_to_sequences(lines)
```
我們可以訪問單詞到整數的映射,作為 Tokenizer 對象上名為 word_index 的字典屬性。
我們需要知道稍后定義嵌入層的詞匯表的大小。我們可以通過計算映射字典的大小來確定詞匯表。
為單詞分配從 1 到單詞總數的值(例如 7,409)。嵌入層需要為此詞匯表中的每個單詞分配一個向量表示,從索引 1 到最大索引,并且因為數組的索引是零偏移,所以詞匯結尾的單詞索引將是 7,409;這意味著數組的長度必須為 7,409 + 1。
因此,在為嵌入層指定詞匯表大小時,我們將其指定為比實際詞匯大 1。
```py
# vocabulary size
vocab_size = len(tokenizer.word_index) + 1
```
### 序列輸入和輸出
現在我們已經編碼了輸入序列,我們需要將它們分成輸入( _X_ )和輸出( _y_ )元素。
我們可以通過數組切片來做到這一點。
分離后,我們需要對輸出字進行熱編碼。這意味著將它從整數轉換為 0 值的向量,一個用于詞匯表中的每個單詞,用 1 表示單詞整數值索引處的特定單詞。
這樣,模型學習預測下一個單詞的概率分布,并且除了接下來的實際單詞之外,所有單詞的學習基礎真實為 0。
Keras 提供 _to_categorical()_,可用于對每個輸入 - 輸出序列對的輸出字進行熱編碼。
最后,我們需要為嵌入層指定輸入序列的長度。我們知道有 50 個單詞,因為我們設計了模型,但指定的一個很好的通用方法是使用輸入數據形狀的第二個維度(列數)。這樣,如果在準備數據時更改序列的長度,則無需更改此數據加載代碼;它是通用的。
```py
# separate into input and output
sequences = array(sequences)
X, y = sequences[:,:-1], sequences[:,-1]
y = to_categorical(y, num_classes=vocab_size)
seq_length = X.shape[1]
```
### 適合模型
我們現在可以在訓練數據上定義和擬合我們的語言模型。
如前所述,學習嵌入需要知道詞匯表的大小和輸入序列的長度。它還有一個參數來指定用于表示每個單詞的維度。也就是說,嵌入向量空間的大小。
常用值為 50,100 和 300.我們在這里使用 50,但考慮測試更小或更大的值。
我們將使用兩個 LSTM 隱藏層,每層有 100 個存儲單元。更多的存儲單元和更深的網絡可以獲得更好的結果。
具有 100 個神經元的密集完全連接層連接到 LSTM 隱藏層以解釋從序列提取的特征。輸出層將下一個單詞預測為單個向量,即詞匯表的大小,其中詞匯表中的每個單詞具有概率。 softmax 激活函數用于確保輸出具有歸一化概率的特征。
```py
# define model
model = Sequential()
model.add(Embedding(vocab_size, 50, input_length=seq_length))
model.add(LSTM(100, return_sequences=True))
model.add(LSTM(100))
model.add(Dense(100, activation='relu'))
model.add(Dense(vocab_size, activation='softmax'))
print(model.summary())
```
定義網絡的摘要打印為完整性檢查,以確保我們構建了我們的預期。
```py
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 50, 50) 370500
_________________________________________________________________
lstm_1 (LSTM) (None, 50, 100) 60400
_________________________________________________________________
lstm_2 (LSTM) (None, 100) 80400
_________________________________________________________________
dense_1 (Dense) (None, 100) 10100
_________________________________________________________________
dense_2 (Dense) (None, 7410) 748410
=================================================================
Total params: 1,269,810
Trainable params: 1,269,810
Non-trainable params: 0
_________________________________________________________________
```
接下來,編譯模型,指定擬合模型所需的分類交叉熵損失。從技術上講,該模型正在學習多類分類,這是此類問題的合適損失函數。使用有效的 Adam 實現到小批量梯度下降并且評估模型的準確性。
最后,該模型適用于 100 個訓練時期的數據,適當的批量大小為 128,以加快速度。
沒有 GPU 的現代硬件上的訓練可能需要幾個小時。您可以使用更大的批量大小和/或更少的訓練時期加快速度。
```py
# compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
model.fit(X, y, batch_size=128, epochs=100)
```
在訓練期間,您將看到表現摘要,包括在每次批次更新結束時從訓練數據評估的損失和準確性。
你會得到不同的結果,但是預測序列中下一個單詞的準確度可能只有 50%以上,這也不錯。我們的目標不是 100%準確(例如記憶文本的模型),而是一種捕捉文本本質的模型。
```py
...
Epoch 96/100
118633/118633 [==============================] - 265s - loss: 2.0324 - acc: 0.5187
Epoch 97/100
118633/118633 [==============================] - 265s - loss: 2.0136 - acc: 0.5247
Epoch 98/100
118633/118633 [==============================] - 267s - loss: 1.9956 - acc: 0.5262
Epoch 99/100
118633/118633 [==============================] - 266s - loss: 1.9812 - acc: 0.5291
Epoch 100/100
118633/118633 [==============================] - 270s - loss: 1.9709 - acc: 0.5315
```
### 保存模型
在運行結束時,訓練的模型將保存到文件中。
在這里,我們使用 Keras 模型 API 將模型保存到當前工作目錄中的文件' _model.h5_ '。
之后,當我們加載模型進行預測時,我們還需要將單詞映射到整數。這是在 Tokenizer 對象中,我們也可以使用 Pickle 保存它。
```py
# save the model to file
model.save('model.h5')
# save the tokenizer
dump(tokenizer, open('tokenizer.pkl', 'wb'))
```
### 完整的例子
我們可以把所有這些放在一起;下面列出了擬合語言模型的完整示例。
```py
from numpy import array
from pickle import dump
from keras.preprocessing.text import Tokenizer
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Embedding
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
# load
in_filename = 'republic_sequences.txt'
doc = load_doc(in_filename)
lines = doc.split('\n')
# integer encode sequences of words
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
sequences = tokenizer.texts_to_sequences(lines)
# vocabulary size
vocab_size = len(tokenizer.word_index) + 1
# separate into input and output
sequences = array(sequences)
X, y = sequences[:,:-1], sequences[:,-1]
y = to_categorical(y, num_classes=vocab_size)
seq_length = X.shape[1]
# define model
model = Sequential()
model.add(Embedding(vocab_size, 50, input_length=seq_length))
model.add(LSTM(100, return_sequences=True))
model.add(LSTM(100))
model.add(Dense(100, activation='relu'))
model.add(Dense(vocab_size, activation='softmax'))
print(model.summary())
# compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
model.fit(X, y, batch_size=128, epochs=100)
# save the model to file
model.save('model.h5')
# save the tokenizer
dump(tokenizer, open('tokenizer.pkl', 'wb'))
```
## 使用語言模型
既然我們有一個訓練有素的語言模型,我們就可以使用它。
在這種情況下,我們可以使用它來生成與源文本具有相同統計屬性的新文本序列。
這是不切實際的,至少不是這個例子,但它給出了語言模型學到的具體例子。
我們將再次加載訓練序列。
### 加載數據
我們可以使用上一節中的相同代碼來加載文本的訓練數據序列。
具體來說, _load_doc()_ 功能。
```py
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
# load cleaned text sequences
in_filename = 'republic_sequences.txt'
doc = load_doc(in_filename)
lines = doc.split('\n')
```
我們需要文本,以便我們可以選擇源序列作為模型的輸入,以生成新的文本序列。
該模型將需要 100 個單詞作為輸入。
稍后,我們需要指定預期的輸入長度。我們可以通過計算加載數據的一行的長度從輸入序列中確定這一點,并且對于同一行上的預期輸出字減去 1。
```py
seq_length = len(lines[0].split()) - 1
```
### 加載模型
我們現在可以從文件加載模型。
Keras 提供 _load_model()_ 功能,用于加載模型,隨時可以使用。
```py
# load the model
model = load_model('model.h5')
```
我們還可以使用 Pickle API 從文件加載 tokenizer。
```py
# load the tokenizer
tokenizer = load(open('tokenizer.pkl', 'rb'))
```
我們準備使用加載的模型。
### 生成文本
生成文本的第一步是準備種子輸入。
為此,我們將從輸入文本中選擇一行隨機文本。一旦選定,我們將打印它,以便我們對使用的內容有所了解。
```py
# select a seed text
seed_text = lines[randint(0,len(lines))]
print(seed_text + '\n')
```
接下來,我們可以一次創建一個新單詞。
首先,必須使用我們在訓練模型時使用的相同標記器將種子文本編碼為整數。
```py
encoded = tokenizer.texts_to_sequences([seed_text])[0]
```
該模型可以通過調用 _model.predict_classes()_ 直接預測下一個單詞,該模型將返回具有最高概率的單詞的索引。
```py
# predict probabilities for each word
yhat = model.predict_classes(encoded, verbose=0)
```
然后,我們可以在 Tokenizers 映射中查找索引以獲取關聯的單詞。
```py
out_word = ''
for word, index in tokenizer.word_index.items():
if index == yhat:
out_word = word
break
```
然后,我們可以將此單詞附加到種子文本并重復該過程。
重要的是,輸入序列將變得太長。在輸入序列編碼為整數后,我們可以將其截斷為所需的長度。 Keras 提供了 _pad_sequences()_ 函數,我們可以使用它來執行此截斷。
```py
encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre')
```
我們可以將所有這些包裝成一個名為 _generate_seq()_ 的函數,該函數將模型,標記生成器,輸入序列長度,種子文本和要生成的單詞數作為輸入。然后它返回由模型生成的一系列單詞。
```py
# generate a sequence from a language model
def generate_seq(model, tokenizer, seq_length, seed_text, n_words):
result = list()
in_text = seed_text
# generate a fixed number of words
for _ in range(n_words):
# encode the text as integer
encoded = tokenizer.texts_to_sequences([in_text])[0]
# truncate sequences to a fixed length
encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre')
# predict probabilities for each word
yhat = model.predict_classes(encoded, verbose=0)
# map predicted word index to word
out_word = ''
for word, index in tokenizer.word_index.items():
if index == yhat:
out_word = word
break
# append to input
in_text += ' ' + out_word
result.append(out_word)
return ' '.join(result)
```
我們現在準備在給出一些種子文本的情況下生成一系列新單詞。
```py
# generate new text
generated = generate_seq(model, tokenizer, seq_length, seed_text, 50)
print(generated)
```
綜上所述,下面列出了從學習語言模型生成文本的完整代碼清單。
```py
from random import randint
from pickle import load
from keras.models import load_model
from keras.preprocessing.sequence import pad_sequences
# load doc into memory
def load_doc(filename):
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()
return text
# generate a sequence from a language model
def generate_seq(model, tokenizer, seq_length, seed_text, n_words):
result = list()
in_text = seed_text
# generate a fixed number of words
for _ in range(n_words):
# encode the text as integer
encoded = tokenizer.texts_to_sequences([in_text])[0]
# truncate sequences to a fixed length
encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre')
# predict probabilities for each word
yhat = model.predict_classes(encoded, verbose=0)
# map predicted word index to word
out_word = ''
for word, index in tokenizer.word_index.items():
if index == yhat:
out_word = word
break
# append to input
in_text += ' ' + out_word
result.append(out_word)
return ' '.join(result)
# load cleaned text sequences
in_filename = 'republic_sequences.txt'
doc = load_doc(in_filename)
lines = doc.split('\n')
seq_length = len(lines[0].split()) - 1
# load the model
model = load_model('model.h5')
# load the tokenizer
tokenizer = load(open('tokenizer.pkl', 'rb'))
# select a seed text
seed_text = lines[randint(0,len(lines))]
print(seed_text + '\n')
# generate new text
generated = generate_seq(model, tokenizer, seq_length, seed_text, 50)
print(generated)
```
首先運行示例打印種子文本。
> 當他說一個人長大后可以學到很多東西,因為他不能學到更多東西,因為他可以跑得很多青春是時候任何特殊的辛勞,因此計算和幾何以及所有其他教學要素都是一個
然后打印 50 個生成的文本。
> 辯證法的準備應該以怠惰揮霍者的名義呈現,其他人是多方面的,不公正的,是最好的,另一個是高興的靈魂靈魂的開放,繡花者必須在
你會得到不同的結果。嘗試運行幾代產品。
你可以看到文字看似合理。實際上,添加連接將有助于解釋種子和生成的文本。然而,生成的文本以正確的順序獲得正確的單詞。
嘗試運行幾次示例以查看生成文本的其他示例。如果你看到有趣的話,請在下面的評論中告訴我。
## 擴展
本節列出了一些擴展您可能希望探索的教程的想法。
* **Sentence-Wise Model** 。基于句子分割原始數據并將每個句子填充到固定長度(例如,最長的句子長度)。
* **簡化詞匯**。探索一個更簡單的詞匯,可能會刪除詞干或停止詞。
* **調諧模型**。調整模型,例如隱藏層中嵌入的大小或存儲單元的數量,以查看是否可以開發更好的模型。
* **更深的型號**。擴展模型以具有多個 LSTM 隱藏層,可能具有丟失以查看是否可以開發更好的模型。
* **預訓練單詞嵌入**。擴展模型以使用預先訓練的 word2vec 或 GloVe 向量來查看它是否會產生更好的模型。
## 進一步閱讀
如果您要深入了解,本節將提供有關該主題的更多資源。
* [Gutenberg 項目](https://www.gutenberg.org/)
* [柏拉圖共和國古騰堡項目](https://www.gutenberg.org/ebooks/1497)
* 維基百科上的[共和國(柏拉圖)](https://en.wikipedia.org/wiki/Republic_(Plato))
* 維基百科上的[語言模型](https://en.wikipedia.org/wiki/Language_model)
## 摘要
在本教程中,您了解了如何使用單詞嵌入和循環神經網絡開發基于單詞的語言模型。
具體來說,你學到了:
* 如何準備文本以開發基于單詞的語言模型。
* 如何設計和擬合具有學習嵌入和 LSTM 隱藏層的神經語言模型。
* 如何使用學習的語言模型生成具有與源文本類似的統計屬性的新文本。
你有任何問題嗎?
在下面的評論中提出您的問題,我會盡力回答。
- Machine Learning Mastery 應用機器學習教程
- 5競爭機器學習的好處
- 過度擬合的簡單直覺,或者為什么測試訓練數據是一個壞主意
- 特征選擇簡介
- 應用機器學習作為一個搜索問題的溫和介紹
- 為什么應用機器學習很難
- 為什么我的結果不如我想的那么好?你可能過度擬合了
- 用ROC曲線評估和比較分類器表現
- BigML評論:發現本機學習即服務平臺的聰明功能
- BigML教程:開發您的第一個決策樹并進行預測
- 構建生產機器學習基礎設施
- 分類準確性不夠:可以使用更多表現測量
- 一種預測模型的巧妙應用
- 機器學習項目中常見的陷阱
- 數據清理:將凌亂的數據轉換為整潔的數據
- 機器學習中的數據泄漏
- 數據,學習和建模
- 數據管理至關重要以及為什么需要認真對待它
- 將預測模型部署到生產中
- 參數和超參數之間有什么區別?
- 測試和驗證數據集之間有什么區別?
- 發現特征工程,如何設計特征以及如何獲得它
- 如何開始使用Kaggle
- 超越預測
- 如何在評估機器學習算法時選擇正確的測試選項
- 如何定義機器學習問題
- 如何評估機器學習算法
- 如何獲得基線結果及其重要性
- 如何充分利用機器學習數據
- 如何識別數據中的異常值
- 如何提高機器學習效果
- 如何在競爭機器學習中踢屁股
- 如何知道您的機器學習模型是否具有良好的表現
- 如何布局和管理您的機器學習項目
- 如何為機器學習準備數據
- 如何減少最終機器學習模型中的方差
- 如何使用機器學習結果
- 如何解決像數據科學家這樣的問題
- 通過數據預處理提高模型精度
- 處理機器學習的大數據文件的7種方法
- 建立機器學習系統的經驗教訓
- 如何使用機器學習清單可靠地獲得準確的預測(即使您是初學者)
- 機器學習模型運行期間要做什么
- 機器學習表現改進備忘單
- 來自世界級從業者的機器學習技巧:Phil Brierley
- 模型預測精度與機器學習中的解釋
- 競爭機器學習的模型選擇技巧
- 機器學習需要多少訓練數據?
- 如何系統地規劃和運行機器學習實驗
- 應用機器學習過程
- 默認情況下可重現的機器學習結果
- 10個實踐應用機器學習的標準數據集
- 簡單的三步法到最佳機器學習算法
- 打擊機器學習數據集中不平衡類的8種策略
- 模型表現不匹配問題(以及如何處理)
- 黑箱機器學習的誘惑陷阱
- 如何培養最終的機器學習模型
- 使用探索性數據分析了解您的問題并獲得更好的結果
- 什么是數據挖掘和KDD
- 為什么One-Hot在機器學習中編碼數據?
- 為什么你應該在你的機器學習問題上進行抽樣檢查算法
- 所以,你正在研究機器學習問題......
- Machine Learning Mastery Keras 深度學習教程
- Keras 中神經網絡模型的 5 步生命周期
- 在 Python 迷你課程中應用深度學習
- Keras 深度學習庫的二元分類教程
- 如何用 Keras 構建多層感知器神經網絡模型
- 如何在 Keras 中檢查深度學習模型
- 10 個用于 Amazon Web Services 深度學習的命令行秘籍
- 機器學習卷積神經網絡的速成課程
- 如何在 Python 中使用 Keras 進行深度學習的度量
- 深度學習書籍
- 深度學習課程
- 你所知道的深度學習是一種謊言
- 如何設置 Amazon AWS EC2 GPU 以訓練 Keras 深度學習模型(分步)
- 神經網絡中批量和迭代之間的區別是什么?
- 在 Keras 展示深度學習模型訓練歷史
- 基于 Keras 的深度學習模型中的dropout正則化
- 評估 Keras 中深度學習模型的表現
- 如何評價深度學習模型的技巧
- 小批量梯度下降的簡要介紹以及如何配置批量大小
- 在 Keras 中獲得深度學習幫助的 9 種方法
- 如何使用 Keras 在 Python 中網格搜索深度學習模型的超參數
- 用 Keras 在 Python 中使用卷積神經網絡進行手寫數字識別
- 如何用 Keras 進行預測
- 用 Keras 進行深度學習的圖像增強
- 8 個深度學習的鼓舞人心的應用
- Python 深度學習庫 Keras 簡介
- Python 深度學習庫 TensorFlow 簡介
- Python 深度學習庫 Theano 簡介
- 如何使用 Keras 函數式 API 進行深度學習
- Keras 深度學習庫的多類分類教程
- 多層感知器神經網絡速成課程
- 基于卷積神經網絡的 Keras 深度學習庫中的目標識別
- 流行的深度學習庫
- 用深度學習預測電影評論的情感
- Python 中的 Keras 深度學習庫的回歸教程
- 如何使用 Keras 獲得可重現的結果
- 如何在 Linux 服務器上運行深度學習實驗
- 保存并加載您的 Keras 深度學習模型
- 用 Keras 逐步開發 Python 中的第一個神經網絡
- 用 Keras 理解 Python 中的有狀態 LSTM 循環神經網絡
- 在 Python 中使用 Keras 深度學習模型和 Scikit-Learn
- 如何使用預訓練的 VGG 模型對照片中的物體進行分類
- 在 Python 和 Keras 中對深度學習模型使用學習率調度
- 如何在 Keras 中可視化深度學習神經網絡模型
- 什么是深度學習?
- 何時使用 MLP,CNN 和 RNN 神經網絡
- 為什么用隨機權重初始化神經網絡?
- Machine Learning Mastery 深度學習 NLP 教程
- 深度學習在自然語言處理中的 7 個應用
- 如何實現自然語言處理的波束搜索解碼器
- 深度學習文檔分類的最佳實踐
- 關于自然語言處理的熱門書籍
- 在 Python 中計算文本 BLEU 分數的溫和介紹
- 使用編碼器 - 解碼器模型的用于字幕生成的注入和合并架構
- 如何用 Python 清理機器學習的文本
- 如何配置神經機器翻譯的編碼器 - 解碼器模型
- 如何開始深度學習自然語言處理(7 天迷你課程)
- 自然語言處理的數據集
- 如何開發一種深度學習的詞袋模型來預測電影評論情感
- 深度學習字幕生成模型的溫和介紹
- 如何在 Keras 中定義神經機器翻譯的編碼器 - 解碼器序列 - 序列模型
- 如何利用小實驗在 Keras 中開發字幕生成模型
- 如何從頭開發深度學習圖片標題生成器
- 如何在 Keras 中開發基于字符的神經語言模型
- 如何開發用于情感分析的 N-gram 多通道卷積神經網絡
- 如何從零開始開發神經機器翻譯系統
- 如何在 Python 中用 Keras 開發基于單詞的神經語言模型
- 如何開發一種預測電影評論情感的詞嵌入模型
- 如何使用 Gensim 在 Python 中開發詞嵌入
- 用于文本摘要的編碼器 - 解碼器深度學習模型
- Keras 中文本摘要的編碼器 - 解碼器模型
- 用于神經機器翻譯的編碼器 - 解碼器循環神經網絡模型
- 淺談詞袋模型
- 文本摘要的溫和介紹
- 編碼器 - 解碼器循環神經網絡中的注意力如何工作
- 如何利用深度學習自動生成照片的文本描述
- 如何開發一個單詞級神經語言模型并用它來生成文本
- 淺談神經機器翻譯
- 什么是自然語言處理?
- 牛津自然語言處理深度學習課程
- 如何為機器翻譯準備法語到英語的數據集
- 如何為情感分析準備電影評論數據
- 如何為文本摘要準備新聞文章
- 如何準備照片標題數據集以訓練深度學習模型
- 如何使用 Keras 為深度學習準備文本數據
- 如何使用 scikit-learn 為機器學習準備文本數據
- 自然語言處理神經網絡模型入門
- 對自然語言處理的深度學習的承諾
- 在 Python 中用 Keras 進行 LSTM 循環神經網絡的序列分類
- 斯坦福自然語言處理深度學習課程評價
- 統計語言建模和神經語言模型的簡要介紹
- 使用 Keras 在 Python 中進行 LSTM 循環神經網絡的文本生成
- 淺談機器學習中的轉換
- 如何使用 Keras 將詞嵌入層用于深度學習
- 什么是用于文本的詞嵌入
- Machine Learning Mastery 深度學習時間序列教程
- 如何開發人類活動識別的一維卷積神經網絡模型
- 人類活動識別的深度學習模型
- 如何評估人類活動識別的機器學習算法
- 時間序列預測的多層感知器網絡探索性配置
- 比較經典和機器學習方法進行時間序列預測的結果
- 如何通過深度學習快速獲得時間序列預測的結果
- 如何利用 Python 處理序列預測問題中的缺失時間步長
- 如何建立預測大氣污染日的概率預測模型
- 如何開發一種熟練的機器學習時間序列預測模型
- 如何構建家庭用電自回歸預測模型
- 如何開發多步空氣污染時間序列預測的自回歸預測模型
- 如何制定多站點多元空氣污染時間序列預測的基線預測
- 如何開發時間序列預測的卷積神經網絡模型
- 如何開發卷積神經網絡用于多步時間序列預測
- 如何開發單變量時間序列預測的深度學習模型
- 如何開發 LSTM 模型用于家庭用電的多步時間序列預測
- 如何開發 LSTM 模型進行時間序列預測
- 如何開發多元多步空氣污染時間序列預測的機器學習模型
- 如何開發多層感知器模型進行時間序列預測
- 如何開發人類活動識別時間序列分類的 RNN 模型
- 如何開始深度學習的時間序列預測(7 天迷你課程)
- 如何網格搜索深度學習模型進行時間序列預測
- 如何對單變量時間序列預測的網格搜索樸素方法
- 如何在 Python 中搜索 SARIMA 模型超參數用于時間序列預測
- 如何在 Python 中進行時間序列預測的網格搜索三次指數平滑
- 一個標準的人類活動識別問題的溫和介紹
- 如何加載和探索家庭用電數據
- 如何加載,可視化和探索復雜的多變量多步時間序列預測數據集
- 如何從智能手機數據模擬人類活動
- 如何根據環境因素預測房間占用率
- 如何使用腦波預測人眼是開放還是閉合
- 如何在 Python 中擴展長短期內存網絡的數據
- 如何使用 TimeseriesGenerator 進行 Keras 中的時間序列預測
- 基于機器學習算法的室內運動時間序列分類
- 用于時間序列預測的狀態 LSTM 在線學習的不穩定性
- 用于罕見事件時間序列預測的 LSTM 模型體系結構
- 用于時間序列預測的 4 種通用機器學習數據變換
- Python 中長短期記憶網絡的多步時間序列預測
- 家庭用電機器學習的多步時間序列預測
- Keras 中 LSTM 的多變量時間序列預測
- 如何開發和評估樸素的家庭用電量預測方法
- 如何為長短期記憶網絡準備單變量時間序列數據
- 循環神經網絡在時間序列預測中的應用
- 如何在 Python 中使用差異變換刪除趨勢和季節性
- 如何在 LSTM 中種子狀態用于 Python 中的時間序列預測
- 使用 Python 進行時間序列預測的有狀態和無狀態 LSTM
- 長短時記憶網絡在時間序列預測中的適用性
- 時間序列預測問題的分類
- Python 中長短期記憶網絡的時間序列預測
- 基于 Keras 的 Python 中 LSTM 循環神經網絡的時間序列預測
- Keras 中深度學習的時間序列預測
- 如何用 Keras 調整 LSTM 超參數進行時間序列預測
- 如何在時間序列預測訓練期間更新 LSTM 網絡
- 如何使用 LSTM 網絡的 Dropout 進行時間序列預測
- 如何使用 LSTM 網絡中的特征進行時間序列預測
- 如何在 LSTM 網絡中使用時間序列進行時間序列預測
- 如何利用 LSTM 網絡進行權重正則化進行時間序列預測
- Machine Learning Mastery 線性代數教程
- 機器學習數學符號的基礎知識
- 用 NumPy 陣列輕松介紹廣播
- 如何從 Python 中的 Scratch 計算主成分分析(PCA)
- 用于編碼器審查的計算線性代數
- 10 機器學習中的線性代數示例
- 線性代數的溫和介紹
- 用 NumPy 輕松介紹 Python 中的 N 維數組
- 機器學習向量的溫和介紹
- 如何在 Python 中為機器學習索引,切片和重塑 NumPy 數組
- 機器學習的矩陣和矩陣算法簡介
- 溫和地介紹機器學習的特征分解,特征值和特征向量
- NumPy 對預期價值,方差和協方差的簡要介紹
- 機器學習矩陣分解的溫和介紹
- 用 NumPy 輕松介紹機器學習的張量
- 用于機器學習的線性代數中的矩陣類型簡介
- 用于機器學習的線性代數備忘單
- 線性代數的深度學習
- 用于機器學習的線性代數(7 天迷你課程)
- 機器學習的線性代數
- 機器學習矩陣運算的溫和介紹
- 線性代數評論沒有廢話指南
- 學習機器學習線性代數的主要資源
- 淺談機器學習的奇異值分解
- 如何用線性代數求解線性回歸
- 用于機器學習的稀疏矩陣的溫和介紹
- 機器學習中向量規范的溫和介紹
- 學習線性代數用于機器學習的 5 個理由
- Machine Learning Mastery LSTM 教程
- Keras中長短期記憶模型的5步生命周期
- 長短時記憶循環神經網絡的注意事項
- CNN長短期記憶網絡
- 逆向神經網絡中的深度學習速成課程
- 可變長度輸入序列的數據準備
- 如何用Keras開發用于Python序列分類的雙向LSTM
- 如何開發Keras序列到序列預測的編碼器 - 解碼器模型
- 如何診斷LSTM模型的過度擬合和欠擬合
- 如何開發一種編碼器 - 解碼器模型,注重Keras中的序列到序列預測
- 編碼器 - 解碼器長短期存儲器網絡
- 神經網絡中爆炸梯度的溫和介紹
- 對時間反向傳播的溫和介紹
- 生成長短期記憶網絡的溫和介紹
- 專家對長短期記憶網絡的簡要介紹
- 在序列預測問題上充分利用LSTM
- 編輯器 - 解碼器循環神經網絡全局注意的溫和介紹
- 如何利用長短時記憶循環神經網絡處理很長的序列
- 如何在Python中對一個熱編碼序列數據
- 如何使用編碼器 - 解碼器LSTM來回顯隨機整數序列
- 具有注意力的編碼器 - 解碼器RNN體系結構的實現模式
- 學習使用編碼器解碼器LSTM循環神經網絡添加數字
- 如何學習長短時記憶循環神經網絡回聲隨機整數
- 具有Keras的長短期記憶循環神經網絡的迷你課程
- LSTM自動編碼器的溫和介紹
- 如何用Keras中的長短期記憶模型進行預測
- 用Python中的長短期內存網絡演示內存
- 基于循環神經網絡的序列預測模型的簡要介紹
- 深度學習的循環神經網絡算法之旅
- 如何重塑Keras中長短期存儲網絡的輸入數據
- 了解Keras中LSTM的返回序列和返回狀態之間的差異
- RNN展開的溫和介紹
- 5學習LSTM循環神經網絡的簡單序列預測問題的例子
- 使用序列進行預測
- 堆疊長短期內存網絡
- 什么是教師強制循環神經網絡?
- 如何在Python中使用TimeDistributed Layer for Long Short-Term Memory Networks
- 如何準備Keras中截斷反向傳播的序列預測
- 如何在使用LSTM進行訓練和預測時使用不同的批量大小
- Machine Learning Mastery 機器學習算法教程
- 機器學習算法之旅
- 用于機器學習的裝袋和隨機森林集合算法
- 從頭開始實施機器學習算法的好處
- 更好的樸素貝葉斯:從樸素貝葉斯算法中獲取最多的12個技巧
- 機器學習的提升和AdaBoost
- 選擇機器學習算法:Microsoft Azure的經驗教訓
- 機器學習的分類和回歸樹
- 什么是機器學習中的混淆矩陣
- 如何使用Python從頭開始創建算法測試工具
- 通過創建機器學習算法的目標列表來控制
- 從頭開始停止編碼機器學習算法
- 在實現機器學習算法時,不要從開源代碼開始
- 不要使用隨機猜測作為基線分類器
- 淺談機器學習中的概念漂移
- 溫和介紹機器學習中的偏差 - 方差權衡
- 機器學習的梯度下降
- 機器學習算法如何工作(他們學習輸入到輸出的映射)
- 如何建立機器學習算法的直覺
- 如何實現機器學習算法
- 如何研究機器學習算法行為
- 如何學習機器學習算法
- 如何研究機器學習算法
- 如何研究機器學習算法
- 如何在Python中從頭開始實現反向傳播算法
- 如何用Python從頭開始實現Bagging
- 如何用Python從頭開始實現基線機器學習算法
- 如何在Python中從頭開始實現決策樹算法
- 如何用Python從頭開始實現學習向量量化
- 如何利用Python從頭開始隨機梯度下降實現線性回歸
- 如何利用Python從頭開始隨機梯度下降實現Logistic回歸
- 如何用Python從頭開始實現機器學習算法表現指標
- 如何在Python中從頭開始實現感知器算法
- 如何在Python中從零開始實現隨機森林
- 如何在Python中從頭開始實現重采樣方法
- 如何用Python從頭開始實現簡單線性回歸
- 如何用Python從頭開始實現堆棧泛化(Stacking)
- K-Nearest Neighbors for Machine Learning
- 學習機器學習的向量量化
- 機器學習的線性判別分析
- 機器學習的線性回歸
- 使用梯度下降進行機器學習的線性回歸教程
- 如何在Python中從頭開始加載機器學習數據
- 機器學習的Logistic回歸
- 機器學習的Logistic回歸教程
- 機器學習算法迷你課程
- 如何在Python中從頭開始實現樸素貝葉斯
- 樸素貝葉斯機器學習
- 樸素貝葉斯機器學習教程
- 機器學習算法的過擬合和欠擬合
- 參數化和非參數機器學習算法
- 理解任何機器學習算法的6個問題
- 在機器學習中擁抱隨機性
- 如何使用Python從頭開始擴展機器學習數據
- 機器學習的簡單線性回歸教程
- 有監督和無監督的機器學習算法
- 用于機器學習的支持向量機
- 在沒有數學背景的情況下理解機器學習算法的5種技術
- 最好的機器學習算法
- 教程從頭開始在Python中實現k-Nearest Neighbors
- 通過從零開始實現它們來理解機器學習算法(以及繞過壞代碼的策略)
- 使用隨機森林:在121個數據集上測試179個分類器
- 為什么從零開始實現機器學習算法
- Machine Learning Mastery 機器學習入門教程
- 機器學習入門的四個步驟:初學者入門與實踐的自上而下策略
- 你應該培養的 5 個機器學習領域
- 一種選擇機器學習算法的數據驅動方法
- 機器學習中的分析與數值解
- 應用機器學習是一種精英政治
- 機器學習的基本概念
- 如何成為數據科學家
- 初學者如何在機器學習中弄錯
- 機器學習的最佳編程語言
- 構建機器學習組合
- 機器學習中分類與回歸的區別
- 評估自己作為數據科學家并利用結果建立驚人的數據科學團隊
- 探索 Kaggle 大師的方法論和心態:對 Diogo Ferreira 的采訪
- 擴展機器學習工具并展示掌握
- 通過尋找地標開始機器學習
- 溫和地介紹預測建模
- 通過提供結果在機器學習中獲得夢想的工作
- 如何開始機器學習:自學藍圖
- 開始并在機器學習方面取得進展
- 應用機器學習的 Hello World
- 初學者如何使用小型項目開始機器學習并在 Kaggle 上進行競爭
- 我如何開始機器學習? (簡短版)
- 我是如何開始機器學習的
- 如何在機器學習中取得更好的成績
- 如何從在銀行工作到擔任 Target 的高級數據科學家
- 如何學習任何機器學習工具
- 使用小型目標項目深入了解機器學習工具
- 獲得付費申請機器學習
- 映射機器學習工具的景觀
- 機器學習開發環境
- 機器學習金錢
- 程序員的機器學習
- 機器學習很有意思
- 機器學習是 Kaggle 比賽
- 機器學習現在很受歡迎
- 機器學習掌握方法
- 機器學習很重要
- 機器學習 Q& A:概念漂移,更好的結果和學習更快
- 缺乏自學機器學習的路線圖
- 機器學習很重要
- 快速了解任何機器學習工具(即使您是初學者)
- 機器學習工具
- 找到你的機器學習部落
- 機器學習在一年
- 通過競爭一致的大師 Kaggle
- 5 程序員在機器學習中開始犯錯誤
- 哲學畢業生到機器學習從業者(Brian Thomas 采訪)
- 機器學習入門的實用建議
- 實用機器學習問題
- 使用來自 UCI 機器學習庫的數據集練習機器學習
- 使用秘籍的任何機器學習工具快速啟動
- 程序員可以進入機器學習
- 程序員應該進入機器學習
- 項目焦點:Shashank Singh 的人臉識別
- 項目焦點:使用 Mahout 和 Konstantin Slisenko 進行堆棧交換群集
- 機器學習自學指南
- 4 個自學機器學習項目
- álvaroLemos 如何在數據科學團隊中獲得機器學習實習
- 如何思考機器學習
- 現實世界機器學習問題之旅
- 有關機器學習的有用知識
- 如果我沒有學位怎么辦?
- 如果我不是一個優秀的程序員怎么辦?
- 如果我不擅長數學怎么辦?
- 為什么機器學習算法會處理以前從未見過的數據?
- 是什么阻礙了你的機器學習目標?
- 什么是機器學習?
- 機器學習適合哪里?
- 為什么要進入機器學習?
- 研究對您來說很重要的機器學習問題
- 你這樣做是錯的。為什么機器學習不必如此困難
- Machine Learning Mastery Sklearn 教程
- Scikit-Learn 的溫和介紹:Python 機器學習庫
- 使用 Python 管道和 scikit-learn 自動化機器學習工作流程
- 如何以及何時使用帶有 scikit-learn 的校準分類模型
- 如何比較 Python 中的機器學習算法與 scikit-learn
- 用于機器學習開發人員的 Python 崩潰課程
- 用 scikit-learn 在 Python 中集成機器學習算法
- 使用重采樣評估 Python 中機器學習算法的表現
- 使用 Scikit-Learn 在 Python 中進行特征選擇
- Python 中機器學習的特征選擇
- 如何使用 scikit-learn 在 Python 中生成測試數據集
- scikit-learn 中的機器學習算法秘籍
- 如何使用 Python 處理丟失的數據
- 如何開始使用 Python 進行機器學習
- 如何使用 Scikit-Learn 在 Python 中加載數據
- Python 中概率評分方法的簡要介紹
- 如何用 Scikit-Learn 調整算法參數
- 如何在 Mac OS X 上安裝 Python 3 環境以進行機器學習和深度學習
- 使用 scikit-learn 進行機器學習簡介
- 從 shell 到一本帶有 Fernando Perez 單一工具的書的 IPython
- 如何使用 Python 3 為機器學習開發創建 Linux 虛擬機
- 如何在 Python 中加載機器學習數據
- 您在 Python 中的第一個機器學習項目循序漸進
- 如何使用 scikit-learn 進行預測
- 用于評估 Python 中機器學習算法的度量標準
- 使用 Pandas 為 Python 中的機器學習準備數據
- 如何使用 Scikit-Learn 為 Python 機器學習準備數據
- 項目焦點:使用 Artem Yankov 在 Python 中進行事件推薦
- 用于機器學習的 Python 生態系統
- Python 是應用機器學習的成長平臺
- Python 機器學習書籍
- Python 機器學習迷你課程
- 使用 Pandas 快速和骯臟的數據分析
- 使用 Scikit-Learn 重新調整 Python 中的機器學習數據
- 如何以及何時使用 ROC 曲線和精確調用曲線進行 Python 分類
- 使用 scikit-learn 在 Python 中保存和加載機器學習模型
- scikit-learn Cookbook 書評
- 如何使用 Anaconda 為機器學習和深度學習設置 Python 環境
- 使用 scikit-learn 在 Python 中進行 Spot-Check 分類機器學習算法
- 如何在 Python 中開發可重復使用的抽樣檢查算法框架
- 使用 scikit-learn 在 Python 中進行 Spot-Check 回歸機器學習算法
- 使用 Python 中的描述性統計來了解您的機器學習數據
- 使用 OpenCV,Python 和模板匹配來播放“哪里是 Waldo?”
- 使用 Pandas 在 Python 中可視化機器學習數據
- Machine Learning Mastery 統計學教程
- 淺談計算正態匯總統計量
- 非參數統計的溫和介紹
- Python中常態測試的溫和介紹
- 淺談Bootstrap方法
- 淺談機器學習的中心極限定理
- 淺談機器學習中的大數定律
- 機器學習的所有統計數據
- 如何計算Python中機器學習結果的Bootstrap置信區間
- 淺談機器學習的Chi-Squared測試
- 機器學習的置信區間
- 隨機化在機器學習中解決混雜變量的作用
- 機器學習中的受控實驗
- 機器學習統計學速成班
- 統計假設檢驗的關鍵值以及如何在Python中計算它們
- 如何在機器學習中談論數據(統計學和計算機科學術語)
- Python中數據可視化方法的簡要介紹
- Python中效果大小度量的溫和介紹
- 估計隨機機器學習算法的實驗重復次數
- 機器學習評估統計的溫和介紹
- 如何計算Python中的非參數秩相關性
- 如何在Python中計算數據的5位數摘要
- 如何在Python中從頭開始編寫學生t檢驗
- 如何在Python中生成隨機數
- 如何轉換數據以更好地擬合正態分布
- 如何使用相關來理解變量之間的關系
- 如何使用統計信息識別數據中的異常值
- 用于Python機器學習的隨機數生成器簡介
- k-fold交叉驗證的溫和介紹
- 如何計算McNemar的比較兩種機器學習量詞的測試
- Python中非參數統計顯著性測試簡介
- 如何在Python中使用參數統計顯著性測試
- 機器學習的預測間隔
- 應用統計學與機器學習的密切關系
- 如何使用置信區間報告分類器表現
- 統計數據分布的簡要介紹
- 15 Python中的統計假設檢驗(備忘單)
- 統計假設檢驗的溫和介紹
- 10如何在機器學習項目中使用統計方法的示例
- Python中統計功效和功耗分析的簡要介紹
- 統計抽樣和重新抽樣的簡要介紹
- 比較機器學習算法的統計顯著性檢驗
- 機器學習中統計容差區間的溫和介紹
- 機器學習統計書籍
- 評估機器學習模型的統計數據
- 機器學習統計(7天迷你課程)
- 用于機器學習的簡明英語統計
- 如何使用統計顯著性檢驗來解釋機器學習結果
- 什么是統計(為什么它在機器學習中很重要)?
- Machine Learning Mastery 時間序列入門教程
- 如何在 Python 中為時間序列預測創建 ARIMA 模型
- 用 Python 進行時間序列預測的自回歸模型
- 如何回溯機器學習模型的時間序列預測
- Python 中基于時間序列數據的基本特征工程
- R 的時間序列預測熱門書籍
- 10 挑戰機器學習時間序列預測問題
- 如何將時間序列轉換為 Python 中的監督學習問題
- 如何將時間序列數據分解為趨勢和季節性
- 如何用 ARCH 和 GARCH 模擬波動率進行時間序列預測
- 如何將時間序列數據集與 Python 區分開來
- Python 中時間序列預測的指數平滑的溫和介紹
- 用 Python 進行時間序列預測的特征選擇
- 淺談自相關和部分自相關
- 時間序列預測的 Box-Jenkins 方法簡介
- 用 Python 簡要介紹時間序列的時間序列預測
- 如何使用 Python 網格搜索 ARIMA 模型超參數
- 如何在 Python 中加載和探索時間序列數據
- 如何使用 Python 對 ARIMA 模型進行手動預測
- 如何用 Python 進行時間序列預測的預測
- 如何使用 Python 中的 ARIMA 進行樣本外預測
- 如何利用 Python 模擬殘差錯誤來糾正時間序列預測
- 使用 Python 進行數據準備,特征工程和時間序列預測的移動平均平滑
- 多步時間序列預測的 4 種策略
- 如何在 Python 中規范化和標準化時間序列數據
- 如何利用 Python 進行時間序列預測的基線預測
- 如何使用 Python 對時間序列預測數據進行功率變換
- 用于時間序列預測的 Python 環境
- 如何重構時間序列預測問題
- 如何使用 Python 重新采樣和插值您的時間序列數據
- 用 Python 編寫 SARIMA 時間序列預測
- 如何在 Python 中保存 ARIMA 時間序列預測模型
- 使用 Python 進行季節性持久性預測
- 基于 ARIMA 的 Python 歷史規模敏感性預測技巧分析
- 簡單的時間序列預測模型進行測試,這樣你就不會欺騙自己
- 標準多變量,多步驟和多站點時間序列預測問題
- 如何使用 Python 檢查時間序列數據是否是固定的
- 使用 Python 進行時間序列數據可視化
- 7 個機器學習的時間序列數據集
- 時間序列預測案例研究與 Python:波士頓每月武裝搶劫案
- Python 的時間序列預測案例研究:巴爾的摩的年度用水量
- 使用 Python 進行時間序列預測研究:法國香檳的月銷售額
- 使用 Python 的置信區間理解時間序列預測不確定性
- 11 Python 中的經典時間序列預測方法(備忘單)
- 使用 Python 進行時間序列預測表現測量
- 使用 Python 7 天迷你課程進行時間序列預測
- 時間序列預測作為監督學習
- 什么是時間序列預測?
- 如何使用 Python 識別和刪除時間序列數據的季節性
- 如何在 Python 中使用和刪除時間序列數據中的趨勢信息
- 如何在 Python 中調整 ARIMA 參數
- 如何用 Python 可視化時間序列殘差預測錯誤
- 白噪聲時間序列與 Python
- 如何通過時間序列預測項目
- Machine Learning Mastery XGBoost 教程
- 通過在 Python 中使用 XGBoost 提前停止來避免過度擬合
- 如何在 Python 中調優 XGBoost 的多線程支持
- 如何配置梯度提升算法
- 在 Python 中使用 XGBoost 進行梯度提升的數據準備
- 如何使用 scikit-learn 在 Python 中開發您的第一個 XGBoost 模型
- 如何在 Python 中使用 XGBoost 評估梯度提升模型
- 在 Python 中使用 XGBoost 的特征重要性和特征選擇
- 淺談機器學習的梯度提升算法
- 應用機器學習的 XGBoost 簡介
- 如何在 macOS 上為 Python 安裝 XGBoost
- 如何在 Python 中使用 XGBoost 保存梯度提升模型
- 從梯度提升開始,比較 165 個數據集上的 13 種算法
- 在 Python 中使用 XGBoost 和 scikit-learn 進行隨機梯度提升
- 如何使用 Amazon Web Services 在云中訓練 XGBoost 模型
- 在 Python 中使用 XGBoost 調整梯度提升的學習率
- 如何在 Python 中使用 XGBoost 調整決策樹的數量和大小
- 如何在 Python 中使用 XGBoost 可視化梯度提升決策樹
- 在 Python 中開始使用 XGBoost 的 7 步迷你課程