2013-11-24 22 views
2

我有一個標有4個不同類別概率值的數據,我也想用這種方式進行預測。然而,我找不到任何算法處理這些數據,並預測每個類的概率值而不是binariez的順序。我可以在這樣的問題中使用什麼?什麼使用多類概率標籤數據和sklearn相同類型的預測?

+0

在scikit-learn中沒有將概率分佈作爲'y'的估計量。如果你在概率問題的'argmax'上訓練,那麼logistic迴歸,樸素貝葉斯和一些樹集合估計量應該可以工作。 –

+0

@larsmans在我們訓練「argmax」時不會失去信息嗎? –

+0

@AbhishekThakur:是的,有些信息丟失了。我現在纔想到的另一種方法是以概率「p」向訓練算法提供兩次樣本:一次使用標籤1和一個'sample_weight'使用'p',一次使用標籤0和一個'sample_weight' '1-p'。不過,在多類別案例中,這可能會變得複雜。 –

回答

4

scikit-learn分類器不支持開箱即用的概率分佈訓練。解決方法是將示例K時間饋送到用於K類的訓練算法,使用概率分佈作爲sample_weight。並不是所有的分類器都支持這一點,但SGDClassifier確實並且適合具有正確設置的邏輯迴歸模型。

爲了舉例,我們做一個隨機訓練集。

>>> X = np.random.randn(10, 6) 
>>> p_pos = np.random.random_sample(10) 
>>> p_pos 
array([ 0.19751302, 0.01538067, 0.87723187, 0.63745719, 0.38188726, 
     0.62435933, 0.3706495 , 0.12011895, 0.61787941, 0.82476533]) 

現在養活這邏輯迴歸模型SGD訓練有素,兩次

>>> lr = SGDClassifier(loss="log") 
>>> y = p_pos > .5 
>>> lr.fit(np.vstack([X, X]), np.hstack([np.ones(10), np.zeros(10)]), 
...  sample_weight=np.hstack([p_pos, 1 - p_pos])) 
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0, 
     fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', 
     loss='log', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5, 
     random_state=None, shuffle=False, verbose=0, warm_start=False) 

前面的例子是針對二進制LR的。 Multiclass LR稍微複雜一點。比方說,你有n_samples概率分佈,每一個行向量一個矩陣P:

>>> P = np.abs(np.random.randn(10, 4)) 
>>> P /= P.sum(axis=1).reshape(-1, 1) # normalize 
>>> P 
array([[ 0.22411769, 0.06275884, 0.25062665, 0.46249682], 
     [ 0.20659542, 0.06153031, 0.03973449, 0.69213978], 
     [ 0.20214651, 0.084988 , 0.12751119, 0.5853543 ], 
     [ 0.35839192, 0.30211805, 0.01093208, 0.32855796], 
     [ 0.34267131, 0.07151225, 0.09413323, 0.4916832 ], 
     [ 0.26670351, 0.30988833, 0.22118608, 0.20222208], 
     [ 0.00694437, 0.68845955, 0.18413326, 0.12046281], 
     [ 0.34344352, 0.27397581, 0.34626692, 0.03631376], 
     [ 0.29315434, 0.25683875, 0.14935136, 0.30065555], 
     [ 0.19147437, 0.22572122, 0.57924412, 0.00356029]]) 

現在我們有四個班,所以我們需要養活的培訓設置爲估計的四倍。

>>> n_classes = P.shape[1] 
>>> X4 = np.vstack([X for i in xrange(n_classes)]) 
>>> y = np.arange(n_classes).repeat(10) 
>>> sample_weight = P.T.ravel() 
>>> lr.fit(X4, y, sample_weight=sample_weight) 
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0, 
     fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', 
     loss='log', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5, 
     random_state=None, shuffle=False, verbose=0, warm_start=False) 
相關問題