2017-08-02 61 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