Submuestreo + clasificación utilizando scikit-learn

Estoy usando Scikit-learn para una tarea de clasificación binaria … y tengo: Clase 0: con 200 observaciones Clase 1: con 50 observaciones

Y porque tengo datos desbalanceados … quiero tomar una submuestra aleatoria de la clase mayoritaria en la que el número de observaciones será el mismo que la clase minoritaria y quiero usar el nuevo conjunto de datos obtenido como entrada para el clasificador. el proceso de submuestreo y clasificación se puede repetir muchas veces … Tengo el siguiente código para el submuestreo, principalmente con la ayuda de Ami Tavory

docs_train=load_files(rootdir,categories=categories, encoding='latin-1') X_train = docs_train.data y_train = docs_train.target majority_x,majority_y=x[y==0,:],y[y==0] # assuming that class 0 is the majority class minority_x,minority_y=x[y==1,:],y[y==1] inds=np.random.choice(range(majority_x.shape[0]),50) majority_x=majority_x[inds,:] majority_y=majority_y[inds] 

Funciona como un hechizo, sin embargo, al final del procesamiento de mayor_x y mayoría_y quiero poder reemplazar el conjunto antiguo que representa la clase0 en X_train, y_train con el nuevo conjunto más pequeño para pasarlo como sigue al clasificador o la tubería:

 pipeline = Pipeline([ ('vectorizer', CountVectorizer( tokenizer=tokens, binary=True)), ('classifier',SVC(C=1,kernel='linear')) ]) pipeline.fit(X_train, y_train) 

Lo que he hecho para resolver esto: desde las matrices de resultados donde hay varias matrices, y porque soy nuevo en toda el área y realmente estoy tratando de aprender. He tratado de combinar las dos matrices de resultados mayoritariamente. + minoría_x para formar los datos de entrenamiento que quiero .. No pude dar algunos errores que estoy tratando de resolver hasta ahora … pero incluso si pudiera … ¿cómo puedo mantener su índice para la mayoría? y minoría_y será verdad también!

Después de procesar mayoría_x y minoritaria_y puede combinar sus conjuntos de entrenamiento con

 X_train = np.concatenate((majority_x,minority_x)) y_train = np.concatenate((majority_y,minority_y)) 

Ahora X_train y y_train contendrán primero las muestras elegidas con y = 0 y luego las muestras con y = 1.

Una idea para su pregunta relacionada : haga su elección de las muestras mayoritarias creando un vector de permutación aleatorio de la longitud del número de sus muestras mayoritarias. Luego elija los primeros 50 índices de ese vector, luego los siguientes 50 y así sucesivamente. Cuando haya terminado con ese vector, cada muestra se habrá elegido exactamente una vez. Si desea más iteraciones o el vector de permutación restante es demasiado corto, puede volver a la elección aleatoria.

Como mencioné en mi comentario, es posible que también desee agregar el parámetro “replace = False” en su np.random.choice, si desea evitar tener la misma muestra varias veces en una iteración.