2015-03-27 1 views
1

J'ai un grand jeu de données non étiqueté multidimensionnel de voitures (prix, kilométrage, puissance, ...) pour lequel je veux trouver des valeurs aberrantes. J'ai décidé d'utiliser le sklearn OneClassSVM pour construire une limite de décision et avoir deux problèmes principaux avec mon approche:Apprentissage semi-supervisé avec sklearn

  • Mon jeu de données contient beaucoup de valeurs manquantes. Existe-t-il un moyen de classer svm les données avec des entités manquantes en tant que valeur inlier si des valeurs possibles pour les entités manquantes sont inlier?
  • Je veux maintenant ajouter une boucle de rétroaction des valeurs aberrantes manuelles modérées. Les données modérées manuellement devraient améliorer la classification du SVM. J'ai lu à propos du modèle LabelSpreading pour l'apprentissage semi-supervisé. Serait-il possible de transmettre la sortie de classification de OneClassSVM au modèle LabelSpreading et de recycler ce modèle lorsqu'une quantité suffisante d'enregistrements est validée manuellement?

Répondre

0

Pour la première question. Vous pouvez utiliser un sklearn.preprocessing.imputer pour imputer les valeurs manquantes par moyenne ou médiane:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html

Vous pouvez ajouter quelques fonctionnalités booléennes recoder si certains des autres caractéristiques avaient NaN. Donc, si vous avez des caractéristiques X_1, X_2 vous ajoutez les fonctions booléennes

X_1_was_NaN et X_2_was_NaN

qui sont 1 si X_1 == NaN ou X_2 == NaN. Si X est votre pd.DataFrame original, vous pouvez le créer par

X = pd.DataFrame() 
# Create your features here 

# Get the locations of the NaNs 
X_2 = 1.0 * X.isnull() 

# Rename columns 
X_2.rename(columns=lambda x: str(x)+"_has_NaN", inplace=True) 

# Paste them together 
X = pd.concat([X, X_2], axis=1)