基於Tensorflow Estimators的文本分類系列之二
來源:AI前線
作者:徐鵬
輸入函數
Estimator框架使用輸入函數從模型本身分割數據管道。無論您的數據是在.csv文件中,還是在pandas.DataFrame中,無論它是否進入內存,都可以使用多種幫助器方法來創建它們。在我們的例子中,我們可以為相關數據集和測試集使用Dataset.from_tensor_slices。
x_len_train = np.array([min(len(x),sentence_size)for x in x_train_variable])
x _len _test = np.array([min(len(x),sentence_size)for x in x_test_variable])
def parser(x,length,y):
特徵= {「x」:x,「len」:長度}
返回特徵,y
def train_input_fn():
dataset = tf.data.Dataset.from_tensor_slices(
(x_train,x_len_train,y_train))
dataset = dataset.shuffle(buffer_size = len(x_train_variable))
dataset = dataset.batch(100)dataset = dataset.map(解析器)
dataset = dataset.repeat()
iterator = dataset.make_one_shot_iterator()
返回iterator.get_next()
def eval_input_fn():
dataset = tf.data.Dataset.from_tensor_slices(
(x_test,x_len_test,y_test))
dataset = dataset.batch(100)dataset = dataset.map(解析器)
iterator = dataset.make_one_shot_iterator()
返回iterator.get_next()
我們對訓練數據進行混洗,並沒有預先定義我們想要訓練的曆元的數量,而我們只需要一個測試數據的信號出現時間進行評估。我們還添加了一個額外的「len」的鍵,該鍵可以捕獲原始未加墊片序列的長度,我們將在稍後使用。
基線建立
對於機器學習來說,一在開始就嘗試基本基線的項目的英文一個很好的做法。越簡單越好,因為擁有簡單而強大的基線是通過增加額外複雜性來準確理解我們在性能方面獲得多少的關鍵。很簡單的解決方案可以滿足我們的要求。
考慮到這一點,讓我們先嘗試一下最簡單的文本分類模型。這將是一個稀疏的線性模型,它為每個令牌賦予權重,並將所有結果相加,而不管順序如何。由於這個模型並不關心句子中單詞的順序,所以我們通常將其稱為一袋詞方法。我們來看看如何使用估計來實現這個模型。
我們首先定義用作分類器輸入的特徵列。正如我們在第2部分中看到的,categorical_column_with_identity是此預處理文本輸入的正確選擇。如果我們提供原始文本標記,其他feature_columns可以為我們做很多預處理。我們現在可以使用預製的LinearClassifier。
column = tf.feature_column.categorical_column_with_identity("x",vocab_size)
最後,我們創建一個簡單的函數來訓練分類器,並創建一個精確回憶曲線。由於我們的目的並不是為了最大限度地發揮其性能,我們只能訓練我們的模型25,000步。
def train_and_evaluate(分類器):
classifier.train(input_fn = train_input_fn,steps = 25000)
eval_results = classifier.evaluate(input_fn = eval_input_fn)
predictions = np.array([p ["logistic"] [0]
for class in classifier.predict(input_fn = eval_input_fn)])
tf.reset_default_graph()
#除了分類器寫入的摘要之外,還要添加一個PR摘要
pr = summary_lib.pr_curve(
"precision_recall",
預測=預測,
labels = y_test.astype(bool),num_thresholds = 21)
用tf.Session()作為sess:
classifier.model_dir,"eval"),sess.graph)
writer.add_summary(sess.run(pr),global_step = 0)
writer.close()
列車 _and _evaluate(分類器)
選擇簡單模型的好處之一是它更易於解釋。模型越複雜,檢查就越困難,而且越容易像黑匣子一樣工作。在這個例子中,我們可以從我們模型的上一個檢查點載入權重,並查看哪些令牌與絕對值最大的權重對應。結果看起來像我們所期望的。
#用張量載入張量
weights = classifier.get_variable_value(
"線性/ linear_model / X /權重")。弄平()
#找到絕對值最大的權重
極端= np.concatenate(
(sorted_indexes [-8:],sorted_indexes [:8]))
#word_inverted_index是一個從索引映射回標記的字典
extreme_weights =排序(
[(權重[i],word_inverted_index [i - index_offset])
因為我在極端]])
#創建繪圖
y_pos = np.arange(len(extreme_weights))
plt.bar(y_pos,[extreme_weights中的pair [pair [0]]),
align ="center",alpha = 0.5)plt.xticks(y_pos,[pair [1]
對extreme_weights],旋轉= 45,哈="右")
plt.ylabel( "體重")
plt.title("最重要的令牌")
plt.show()
一些重要的標誌
正如我們所看到的,「清爽」這種最積極的標記顯然與積極的情緒相關,而具有較大負面代價的標記卻無法引起負面情緒。一個簡單而強大的修改,可以做的改進這個模型是通過他們的TF-IDF分數來加權記號。
- 加入人工智慧學院系統學習 -
※能否代替「決策樹演算法」?
※數據科學家必用的25個深度學習的開放數據集!
TAG:AI講堂 |