2017-08-02 1 views
3

J'essaie de résoudre un problème de classification binaire où 80% des données appartiennent à la classe x et 20% des données appartiennent à la classe y. Tous mes modèles (AdaBoost, réseaux neuronaux et SVC) prédisent simplement que toutes les données font partie de la classe x car c'est la précision la plus élevée qu'elles peuvent atteindre.Machine Learning: Move Treshhold

Mon objectif est d'obtenir une plus grande précision pour toutes les entrées de la classe x et peu importe le nombre d'entrées faussement classées pour faire partie de la classe y. Mon idée serait simplement de mettre des entrées dans la classe x quand le modèle est sur sur eux et de les mettre dans la classe y sinon.

Comment pourrais-je y parvenir? Existe-t-il un moyen de déplacer le seuil de sorte que seules les entrées très évidentes soient classées en classe x?

J'utilise python et sklearn

Exemple de code:

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]]) 

Répondre

2

Dans SVM, une façon de déplacer le seuil est de choisir class_weight de telle sorte que vous mettez beaucoup plus de poids sur les données points de la classe y. Prenons l'exemple ci-dessous, extrait de SVM: Separating hyperplane for unbalanced classes:

enter image description here

La ligne droite est la limite de la décision que vous obtenez lorsque vous utilisez SVC avec des poids de classe par défaut (même poids pour chaque classe). La ligne pointillée est la limite de décision que vous obtenez lorsque vous utilisez class_weight={1: 10} (c'est-à-dire, mettez beaucoup plus de poids sur la classe 1, par rapport à la classe 0).

poids de classe ajuster besically le paramètre de pénalité SVM:

class_weight: {dict, 'équilibré'}, option

Réglez le paramètre C de la classe i à class_weight [i] * C pour SVC. Si ce n'est pas donné, toutes les classes sont censées avoir un poids. Le mode « équilibré » utilise les valeurs de y pour ajuster automatiquement le poids inversement proportionnelle à la fréquence des classes dans les données d'entrée comme N_SAMPLES/ (n_classes * np.bincount (y))

4

Utilisation AdaBoostClassifier peut être édité les probabilités de classe et puis seuil les à l'aide predict_proba au lieu de 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 

en utilisant cette approche, vous pouvez aussi vérifier (juste l'impression de débogage, ou peut-être genre et l'intrigue sur un graphique) comment les niveaux de confiance varient dans votre modèle final o n les données de test pour aider à décider si cela vaut la peine d'aller plus loin.

Il existe cependant plusieurs façons d'aborder votre problème. Par exemple, voyez Miriam Farber's answer qui cherche à repondérer le classificateur pour ajuster votre déséquilibre de classe 80/20 pendant l'entraînement. Vous pourriez avoir d'autres problèmes, y compris peut-être que les classificateurs que vous utilisez ne peuvent séparer les classes x et y de manière réaliste compte tenu de vos données actuelles. Traversant toutes les possibilités d'un problème de données comme celui-ci pourrait prendre quelques approches différentes.

Si vous avez d'autres questions au sujet des problèmes avec votre problème de données par opposition au code, il y a des sites Stack Exchange qui pourraient vous aider ainsi que le débordement de pile (ne pas lire les directives du site avant de poster): Data Science et Cross Validated .