這篇筆記要記錄的演算法是 nb-svm ,nb 是 ***** bayes ,即把 nb 和 svm 結合為乙個演算法來使用。
kaggle 前面結束了一場 toxic comments tagging(因為我啥都不會嘛,所以只能等比賽結束跟著 kernal 區大佬學學方法技巧。fast.ai 的講師 jeremy 給出了乙個很漂亮的 baseline(使用了這種 nb-svm 的變體。基本沒有改動的情況下得分 0.96+,作為 baseline 來說還湊合了。fast.ai 的 machine learning 課程也在製作中, jeremy 講東西很有一套,上課形式和內容都很不錯,真想學這類東西可以好好學學他們的公開課,比報那些不著四六的培訓班靠譜多了。
nb-svm 出自 2012 年斯坦福的一篇**(思想是把 nb 和 svm 的長處綜合一下,構造乙個簡單的線性模型。在幾個情感分析的資料集上結合 bigram 得到的效果不錯。
方法也很簡單,就是用 nb 和 svm 的思想來構造乙個線性分類器: y(
k)=s
ign(
wtx(
k)+b
) y(k
)=si
gn(w
tx(k
)+b)
具體可以拆解成四個部分:
1. 構造權重向量 r r
: r=log(
p/||
p||1
q/||
q||1
)' role="presentation">r
=log(p
/||p
||1q
/||q
||1)
r=log(p
/||p
||1q
/||q
||1)
其中 p=α
+∑i:
y(i)
=1f(
i)p =α
+∑i:
y(i)
=1f(
i)
,q=α+∑
i:y(
i)=−
1f(i
) q=α+
∑i:y
(i)=
−1f(
i)
,αα
是平滑係數,f(
i)j fj(
i)
是第 i
i
個樣本的特徵向量的第
j' role="presentation">j
j個特徵出現的次數。這樣求出的向量 r r
稱為 log-count ratio,對數計數比?
簡單來說就是求正負樣本上所有特徵出現的頻率的比值的對數。這就是模型中的 nb 部分,只不過對二分類問題用正負樣本特徵的頻率比直接替代了分別求概率然後比較的步驟。
2. 多項式 nb
在 mnb 中,x(
k)=f
(k)' role="presentation">x(k
)=f(
k)x(
k)=f
(k),
b=log(n+
/n−)
b
=log(
n+/n
−)
,兩個 n 分別是正樣本和負樣本的數量。作者補充說另一篇文獻發現二值化的 f(
k)f (k
)效果更好,所以 f(
k)f (k
)可以做個二值化。
這一步可以看作上一步的後續優化。
3. svm
把帶 l2 約束的 svm 的優化目標函式寫出來: wt
w+c∑
imax(0
,1−y
(i)(
wtf^
(i)+
b))2
w tw
+c∑i
max(0,
1−y(
i)(w
tf^(
i)+b
))
2經驗證 l2-loss 比 l1-loss 表現好,而且穩定。實現時使用了 liblinear 庫。
4. svm + nb features
怎麼把 nb 和 svm 搓到一起的呢?
目標函式還是 svm 的 l2-loss,但 x(
k)x (k
)這裡變成了 r^
∘f^(
k)r ^∘
f^(k
)。這個圈表示對應位置元素相乘,即所謂的 element-wise product,實際上就是二值化後的輸入又加入了 nb 分類權重。
作者說還可以在 mnb 和 svm 間做個均衡: w′
=(1−
β)w¯
+βw w′=
(1−β
)w¯+
βw
w¯ w
¯是歸一化後的 w w
,β' role="presentation">β
β稱為內插引數,可以理解為一種正則化:相信 nb 的判斷,除非 svm 置信度非常高。
我看到這還是覺得有點亂,為什麼把權重歸一化了?這個式子怎麼就體現了平衡兩種演算法?主要是這個 w w
到底是哪個模型計算出的
w' role="presentation">w
w,沒看明白。好在作者有 matlab 平台的開源**,有興趣的可以看看。我沒啥興趣,只介紹一下 jeremy 怎麼用的。
jeremy 把 svm 的部分替換成對率回歸,把二值化的 bigram 特徵換成了 tf-idf。全部過程參看我只說他 nb-svm 的部分怎麼做的。
變換出 tf-idf 矩陣後,首先是計算先驗 p/q:
def
pr(y_i, y):
p = x[y == y_i].sum(0)
return (p+1)/((y==y_i).sum()+1)
然後得到模型:
def
get_mdl
(y):
y = y.values
r = np.log(pr(1, y)/pr(0, y))
m = logisticregression(c=4, dual=true)
x_nb = x.multiply(r)
return m.fit(x_nb, y), r
計算類別所屬的時候:
m, r = get_mdl(train_data)
preds = m.predict_proba(test_x.multiply(r))[:, 1]
注意上面**不能直接執行,我做了一點改動以方便說明。
可以看到,jeremy 版的 nb-lr 跟 nb-svm 步驟基本一致:計算權重係數
r r
,按元素乘到特徵向量上去得到新的輸入,擬合出乙個 lr 模型(使用了 scikit-learn)。jeremy 表示 tf-idf 表現比二值化的 bigram 特徵效果好得多。
有人提到按這個跑出來的結果是 0.977,跟我的不太一樣,不知道為什麼。
看起來 jeremy 的改動挺隨意的,但結果沒什麼大問題,還是對演算法理解透徹啊。所以做演算法還是要有好的基本功,這些東西都非常熟練、理解透了,才能做到這種隨手寫 baseline 的境界……
《機器學習技法》裡講過乙個 probabilistic svm,先用 svm kernel 方法做乙個變換,然後用 lr 做分類。思想跟這個比較相似。
情感極性 關於中文情感分類的知識
文字分類,就是在預定義的分類體系下,根據文字的特徵 內容或屬性 將給定文字與乙個或多個類別相關聯的過程。1 構建分類類別體系 2 獲取帶有類別標籤的文字 3 文字的特徵選擇及權重計算 4 分類器的選擇與訓練 5 文字的分類應用 對應每乙個類別,都可以訓練出對應的詞特徵檔案。對應到類別的細分或者合併,...
aspect level 的文字情感分類試驗結果1
前段時間準備了資料,試了一下 基於attention model的aspect level文字情感分類 用python keras實現 這篇文章裡面的模型。結果和文章裡差不多,驗證集準確率在75 80 左右。但仔細去看模型 的結果,這個資料其實並不好。剔除掉單個aspect的句子,多aspect句子...
主題模型及其在文字情感分析中的應用
1 比較了多個智慧型手機後選擇了8150,價效比還可以。另外,就是考慮到它是3.7的螢幕,大小比較合適,否則攜帶很不方便。京東 使用者,2011.11.25 2 我以前在杭州做二手房地產,用溫州炒房客的話說 全世界房價降了,杭州的房價永遠不會降,因為他們有一道堅不可摧的屏障,那就是杭州官場的參與。網...