train_test_split train test stratify sklearn model_selection python scikit-learn

python - train - Tren estratificado/Prueba de división en scikit-learn



train_test_split stratify (6)

Además de la respuesta aceptada por @Andreas Mueller, solo quiero agregar eso como @tangy mencionado anteriormente:

StratifiedShuffleSplit se parece más a train_test_split ( train_test_split = y) con características adicionales de:

  1. estratificar por defecto
  2. al especificar n_splits , divide repetidamente los datos

Necesito dividir mis datos en un conjunto de entrenamiento (75%) y un conjunto de prueba (25%). Actualmente lo hago con el siguiente código:

X, Xt, userInfo, userInfo_train = sklearn.cross_validation.train_test_split(X, userInfo)

Sin embargo, me gustaría estratificar mi conjunto de datos de entrenamiento. ¿Cómo puedo hacer eso? He estado buscando el método StratifiedKFold , pero no me permite especificar la división del 75% / 25% y solo estratificar el conjunto de datos de entrenamiento.


Aquí hay un ejemplo para datos continuos / de regresión (hasta que se resuelva este problema en GitHub ).

# Your bins need to be appropriate for your output values # e.g. 0 to 50 with 25 bins bins = np.linspace(0, 50, 25) y_binned = np.digitize(y_full, bins) X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y_binned)


Simplemente puede hacerlo con el método train_test_split() disponible en Scikit learn:

from sklearn.model_selection import train_test_split train, test = train_test_split(X, test_size=0.25, stratify=X[''YOUR_COLUMN_LABEL''])

También he preparado un breve GitHub Gist que muestra cómo funciona la opción de stratify :

https://gist.github.com/SHi-ON/63839f3a3647051a180cb03af0f7d0d9


TL; DR: Use StratifiedShuffleSplit con test_size=0.25

Scikit-learn proporciona dos módulos para la división estratificada:

  1. StratifiedKFold : este módulo es útil como operador directo de validación cruzada de pliegue en k: ya que configurará n_folds conjuntos de entrenamiento / prueba de manera que las clases estén igualmente equilibradas en ambos.

Aquí hay un código (directamente de la documentación anterior)

>>> skf = cross_validation.StratifiedKFold(y, n_folds=2) #2-fold cross validation >>> len(skf) 2 >>> for train_index, test_index in skf: ... print("TRAIN:", train_index, "TEST:", test_index) ... X_train, X_test = X[train_index], X[test_index] ... y_train, y_test = y[train_index], y[test_index] ... #fit and predict with X_train/test. Use accuracy metrics to check validation performance

  1. StratifiedShuffleSplit : este módulo crea un único conjunto de entrenamiento / prueba que tiene clases igualmente equilibradas (estratificadas). Esencialmente, esto es lo que quieres con n_iter=1 . Puede mencionar el tamaño de prueba aquí igual que en train_test_split

Código:

>>> sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0) >>> len(sss) 1 >>> for train_index, test_index in sss: ... print("TRAIN:", train_index, "TEST:", test_index) ... X_train, X_test = X[train_index], X[test_index] ... y_train, y_test = y[train_index], y[test_index] >>> # fit and predict with your classifier using the above X/y train/test


[actualización para 0.17]

Vea los documentos de sklearn.model_selection.train_test_split :

from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.25)

[/ actualización para 0.17]

Hay una solicitud de extracción here . Pero simplemente puede hacer train, test = next(iter(StratifiedKFold(...))) y usar los índices train y test si lo desea.


#train_size is 1 - tst_size - vld_size tst_size=0.15 vld_size=0.15 X_train_test, X_valid, y_train_test, y_valid = train_test_split(df.drop(y, axis=1), df.y, test_size = vld_size, random_state=13903) X_train_test_V=pd.DataFrame(X_train_test) X_valid=pd.DataFrame(X_valid) X_train, X_test, y_train, y_test = train_test_split(X_train_test, y_train_test, test_size=tst_size, random_state=13903)