2017-08-02 90 views
3

我試圖解決一個二進制分類問題,其中80%的數據屬於類x和20%的數據屬於類y。我的所有模型(AdaBoost,神經網絡和SVC)都預測所有數據都是類x的一部分,因爲這是他們可以達到的最高精度。機器學習:移動Treshhold

我的目標是爲類x的所有條目實現更高的精度,我不在乎有多少條目被錯誤地歸類爲類y的一部分。

我的想法是將模型中的條目放入類x中,然後將其放入類y中。

我該怎麼做到這一點?有沒有辦法移動閾值,以便只有非常明顯的條目被歸類爲類x?

我使用Python和sklearn

示例代碼:

adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_prediction = adaboost.predict(X_test) 

confusion_matrix(adaboost_prediction,y_test) outputs: 

array([[ 0, 0], 
     [10845, 51591]]) 

回答

2

在SVM,移動門檻的一種方式是選擇class_weight在你把數據更加重這種方式分類y。考慮下面的例子,從SVM: Separating hyperplane for unbalanced classes採取:

enter image description here

直線是決策邊界,你得到當您使用SVC與默認的類權重(同重量的每一個類)。虛線是您在使用class_weight={1: 10}時獲得的決策邊界(即,對類別1的重視程度比對類別0的重要得多)。

類的權重besically調整懲罰參數在SVM

class_weight:{字典, '平衡'},任選

設置類的參數C i到class_weight [I] *對C SVC。如果不是 給出,所有類都應該有一個重量。 「平衡」 模式使用y的值來自動調節權重成反比 成正比類的頻率在輸入數據作爲N_SAMPLES次/ (n_classes * np.bincount(Y))

4

AdaBoostClassifier使用可以輸出一流的概率和通過predict_proba代替predict然後將它們門檻:

adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_probs = adaboost.predict_proba(X_test) 

threshold = 0.8 # for example  
thresholded_adaboost_prediction = adaboost_probs > threshold 

使用這種方法,你也可以檢查(只是調試打印,或也許排序和情節上圖)的信心水平在你的最終模型如何變化Ø ❖測試數據有助於決定是否值得進一步考慮。

雖然有多種方法可以解決您的問題。例如,請參閱Miriam Farber's answer,其中着重於分類器的重新加權,以便在訓練期間調整80/20類別的不平衡。你可能會發現你還有其他問題,包括你正在使用的分類器在給定你當前的數據的情況下不能實際分離x和y類。審視這樣的數據問題的所有可能性可能需要幾種不同的方法。

如果您有問題,你數據問題而不是代碼更多的問題,也有堆棧交易所網站,可以幫助你以及堆棧溢出(發佈前務必閱讀網站指南):Data ScienceCross Validated