2017-08-25 46 views
0

我目前正試圖瞭解某些高級別的分類問題,並且遇到了2012年運行的Kaggle競賽的一些代碼。競賽討論板是(here),獲獎代碼是(here)。幾乎在223行代碼的末尾,兩個數組列表中的預測值分別乘以0.4和0.6,然後相加。這是行final_pred = preds[0] * 0.4 + preds[1] * 0.6。我的問題是,爲什麼數值在作爲數組返回到調用函數之前相乘?數組返回後,其值將被保存爲CSV,因此不再進行「處理」。使用的模型是Logistic Regression和SVM.svc,但是在所有模型完成數據業務並使用pred = model.predict_proba(X_test)預測數據之後,會發生這種情況。Logistic迴歸和SVM預測爲什麼在最後乘以常數?

任何人都可以請給我一些信息,爲什麼發生這種情況?

EDIT添加函數的代碼爲完整起見 該代碼是預測(二進制[0,1])的文本作爲任一種損傷或非損傷較長方案的一部分。原始代碼的鏈接包含在我的原始文章中。

def runClassifiers(X_train, y_train, X_test, y_test = None, verbose = True): 

models = [ linear_model.LogisticRegression(C=3), 
      svm.SVC(C=0.3,kernel='linear', probability=True)] 
# another two classifiers are commented out by the original author 

dense = [False, False, True, True] # if model needs dense matrix 

X_train_dense = X_train.todense() 
X_test_dense = X_test.todense() 

preds = [] 
for ndx, model in enumerate(models): 
    t0 = time() 
    print "Training: ", model, 20 * '_'   
    if dense[ndx]: 
     model.fit(X_train_dense, y_train) 
     pred = model.predict_proba(X_test_dense)  
    else: 
     model.fit(X_train, y_train) 
     pred = model.predict_proba(X_test)  
    print "Training time: %0.3fs" % (time() - t0) 
    preds.append(array(pred[:,1])) 

final_pred = preds[0]*0.4 + preds[1]*0.6 
return final_pred 
+1

我還沒有看過整個代碼。但是從你的帖子中,preds列表是在每個模型下發生事件的概率。然後,他使用加權平均來組合兩種方法(對preds [1]加重權重),然後返回最終的加權概率。 – Vico

+0

@Vico:據我所知,他在比賽討論板上比較重視支持向量機,他說支持向量機分類器可能會有一個與使用LR的競爭。但我很好奇如何決定體重值;例如,爲什麼不是0.3和0.7,還是會給第二個分類器帶來太多的偏好而造成偏見?謝謝。 – salvu

回答

2

這只是一個使用兩個子預測器(LogReg和SVM)的元預測器。

有很多方法結合多個預測模型,這個convex-combination是最簡單的方法之一。

這些值也可能用一些交叉驗證方法進行訓練,導致這些數字在SVM分類器被更嚴重地考慮!

我不確定究竟是什麼任務,但我認爲類的數量應該是2(0和1或-1和1;至少在此預測步驟中;可能有一些外部OvO或OvA計劃)在這裏有意義。

+0

你是對的,程序預測[0,1]的二元問題的值。我已經包含了分類器和預測發生的功能。謝謝您的回覆。 – salvu