這裡嘗試使用sklearn庫中的logisticregression類來做問題分類。
對於logisticregression多分類問題可以理解如下:
給定m個類,訓練m個二元分類器(將選取任意一類,再將其它所有類看成是一類,構建乙個兩類分類器)。分類器j使類j的元組為正類,其餘為負類,進行訓練。為了對未知元組x進行分類,分類器作為乙個組合分類器投票。
例如,如果分類器j**x為正類,則類j得到一票。如果測x為負類,則除j以外的每乙個類都得到一票(相當於此類的票數減一)。得票最多的指派給x。這種方法簡單有效,而且使用類似logistic這種有概率值大小可以比較的情況下,類邊界其實是個有範圍的值,可以增加正確率。而且當k(類別數量)很大時,通過投票的方式解決了一部分不平衡性問題。
實驗中嘗試了使用詞袋和ti-idf兩種特徵來做分類。詞袋:小類: 0.782,大類: 0.902,tf-id: 小類: 0.791,大類: 0.909,相差不多且都取得了較好的效果。
實驗步驟如下:
(1)使用jieba分詞工具對訓練資料和測試資料的問題進行分詞
with
open
(file
[i][0]
,'r'
, encoding=
'utf-8'
)as f:
for line in f.readlines():
attr = line.strip(
).split(
'\t'
)"{}\t{}\n"
.format
(attr[0]
,' '
.join(jieba.cut(attr[1]
))))
with
open
(file
[i][1]
,'w'
, encoding=
'utf-8'
)as f:
f.writelines(result)
(2)載入資料,指定細粒度還是粗粒度,這對標籤的處理不同
if size ==
'rough':0
].split(
'_')[0
])else:0
])
(3)特徵提取,可選擇sklearn.feature_extraction.text中的tfidfvectorizer或 countvectorizer
x_train, y_train, x_test, y_test = load_data(size=
'rough'
)# tv = tfidfvectorizer(token_pattern=r"(?u)\b\w+\b")
tv = countvectorizer(token_pattern=r"(?u)\b\w+\b"
)
(4)網格搜尋邏輯回歸最優引數
lr = logisticregression(
)parameters =
x_train, y_train, x_test, y_test = load_data(size=
'rough'
)tv = countvectorizer(token_pattern=r"(?u)\b\w+\b"
)train_data = tv.fit_transform(x_train)
test_data = tv.transform(x_test)
clf = gridsearchcv(lr, parameters, cv=
10, n_jobs=10)
clf.fit(train_data, y_train)
means = clf.cv_results_[
'mean_test_score'
]params = clf.cv_results_[
'params'
]
使用詞袋特徵的最下引數如下:c=10000
使用tf-idf特徵的最下引數如下:c=5000
(5)進行訓練並測試準確率
train_data = tv.fit_transform(x_train)
# fit與transform的結合,先fit後transform
test_data = tv.transform(x_test)
lr = logisticregression(c=
5000
, solver=
'liblinear'
, multi_class=
'ovr'
)lr.fit(train_data, y_train)
# 擬合模型,用來訓練lr分類器,其中x是訓練樣本,y是對應的標記向量
print
(lr.score(test_data, y_test)
)
這裡特別講解一下logisticregression中的solver引數和multi_class引數:
1.solver引數:,即選擇邏輯回歸損失函式優化演算法的引數。預設情況是使用『liblinear』演算法。
對於小型資料集來說,選擇『liblinear』更好;對於大型資料集來說,『saga』或者『sag』會更快一些。
2.multi_class引數:str, , default: 『ovr』即選擇分類方式的引數,可選引數有『ovr』和『multinomial』,str型別,預設為『ovr』。
『ovr』即one-vs-rest(ovr),而『multinomial』即many-vs-many(mvm)。
ovr每次將乙個類的樣例作為正例,所有其他類的樣例作為反例來訓練,在測試中若僅有乙個分類器**為正類,則對應的類別標記為最終結果;若有多個分類器**為正類,則考慮每個分類器的置信度,置信度高的類別作為分類結果。mvm則是每次將若干類作為正例,若干其他類作為反例。
3.2.3實驗結果
採用分類精確率(accuracy)評價問題分類效果,accuracy的定義如下
svm小類截圖(詞袋特徵):
svm大類截圖(詞袋特徵):
邏輯回歸大類截圖(詞袋特徵):
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-cosbl8ay-1586090663978)(pic/l1.png)]
邏輯回歸小類截圖(詞袋特徵):
邏輯回歸大類截圖(tf-idf特徵):
邏輯回歸小類截圖(tf-idf特徵):
整理如下:
svm嘗試了幾種特徵的組合
——大類
小類詞袋
89.7
74.3
詞袋+詞性
88.9
71.5
詞袋+詞性+句法
87.4
71.0
邏輯回歸
——大類
小類詞袋
90.3
78.1
tf-idf
90.8
79.4
實驗分析:
實驗中我還比較了使用詞性特徵和使用詞袋特徵在libsvm(rbf)、libsvm(linear)兩個分類器上的分類精度,結果發現使用詞性特徵較之使用詞袋特徵出現了一定程度的精度下降。
由此,可得出乙個結論,對於svm分類器,通常情況下當資料的維度比較大時,其處理的效能會有一定的提高。但是將詞性與對應的詞作為乙個整體來表示以後,由於出現了一定程度的特徵稀疏而導致最終的分類精度有所下降。所以對於問題分類關鍵在於如何選取好的特徵。
機器學習 邏輯回歸 Python實現邏輯回歸
coding utf 8 author 蔚藍的天空tom import numpy as np import os import matplotlib.pyplot as plt from sklearn.datasets import make blobs global variable path...
邏輯回歸模型 SAS邏輯回歸模型訓練
邏輯回歸模型是金融信貸行業製作各類評分卡模型的核心,幾乎80 的機器學習 統計學習模型演算法都是邏輯回歸模型,按照邏輯美國金融公司總結的sas建模過程,大致總結如下 一般通用模型訓練過程 a 按照指定需求和模型要求製作driver資料集,包含欄位有user id,dep b 其中,空值賦預設值即 c...
線性回歸與邏輯回歸
cost functionj 12m i 1m h x i y i hypothesish x tx 梯度下降求解 為了最小化j j j 1m i 1m h x i y i x i j 每一次迭代更新 j j 1m i 1m h x i y i x i j 正規方程求解 最小二乘法 xtx 1x t...